ng-easycommerce 0.0.612 → 0.0.613

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 (595) hide show
  1. package/README.md +969 -964
  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 +519 -519
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +295 -295
  10. package/assets/ec-i18n/en.json +8 -1
  11. package/assets/ec-i18n/es.json +411 -404
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +295 -295
  14. package/assets/ec-i18n/pr.json +295 -295
  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 +19681 -19658
  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 +16 -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 +414 -414
  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 +115 -115
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +192 -192
  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 +168 -168
  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 +140 -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 +404 -404
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +152 -152
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +424 -424
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +103 -99
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +146 -146
  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 +66 -66
  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 +82 -80
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +199 -197
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +244 -244
  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 +172 -172
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +140 -140
  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 +133 -133
  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/place-to-pay-ec/place-to-pay-ec.component.js +125 -125
  123. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +99 -99
  124. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  125. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  129. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  130. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  131. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  132. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  133. package/esm2015/lib/ec-directive/index.js +36 -36
  134. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  135. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  136. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  137. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  138. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  141. package/esm2015/lib/ec-pipe/index.js +13 -13
  142. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  143. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  144. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  145. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  146. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  147. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  148. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  149. package/esm2015/lib/interfaces/Script.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  153. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  154. package/esm2015/lib/interfaces/block.js +1 -1
  155. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  156. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  157. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  158. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  159. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  160. package/esm2015/lib/interfaces/cookies.js +1 -1
  161. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  162. package/esm2015/lib/interfaces/coupon.js +1 -1
  163. package/esm2015/lib/interfaces/deserializable.js +1 -1
  164. package/esm2015/lib/interfaces/faqs.js +1 -1
  165. package/esm2015/lib/interfaces/filter.js +1 -1
  166. package/esm2015/lib/interfaces/filterStep.js +1 -1
  167. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  168. package/esm2015/lib/interfaces/paginate.js +1 -1
  169. package/esm2015/lib/interfaces/parameters.js +1 -1
  170. package/esm2015/lib/interfaces/selection.js +4 -4
  171. package/esm2015/lib/interfaces/step.js +1 -1
  172. package/esm2015/lib/interfaces/store.js +1 -1
  173. package/esm2015/lib/ng-easycommerce.module.js +181 -181
  174. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  175. package/esm2015/lib/services/account/orders.service.js +102 -102
  176. package/esm2015/lib/services/analytics.service.js +57 -57
  177. package/esm2015/lib/services/auth.service.js +352 -352
  178. package/esm2015/lib/services/banner.service.js +72 -72
  179. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  180. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  181. package/esm2015/lib/services/captcha.service.js +130 -130
  182. package/esm2015/lib/services/cart.service.js +574 -573
  183. package/esm2015/lib/services/channel-config.service.js +105 -105
  184. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  185. package/esm2015/lib/services/checkout/checkout.service.js +233 -233
  186. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  187. package/esm2015/lib/services/checkout/payment.service.js +79 -79
  188. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  189. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  190. package/esm2015/lib/services/cookies.service.js +208 -208
  191. package/esm2015/lib/services/currency.service.js +161 -161
  192. package/esm2015/lib/services/dataform.service.js +46 -46
  193. package/esm2015/lib/services/filters.service.js +122 -122
  194. package/esm2015/lib/services/gift-card.service.js +61 -61
  195. package/esm2015/lib/services/ip-address.service.js +34 -34
  196. package/esm2015/lib/services/options.service.js +275 -275
  197. package/esm2015/lib/services/pagination.service.js +73 -73
  198. package/esm2015/lib/services/parameters.service.js +72 -72
  199. package/esm2015/lib/services/products/product-detail.service.js +432 -432
  200. package/esm2015/lib/services/products/products.service.js +287 -287
  201. package/esm2015/lib/services/reviews.service.js +107 -107
  202. package/esm2015/lib/services/stores.service.js +37 -37
  203. package/esm2015/lib/services/windows.service.js +52 -52
  204. package/esm2015/lib/services/wishlist.service.js +70 -70
  205. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  206. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  207. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  208. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  209. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  210. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  211. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  212. package/esm2015/lib/utils/order-util.service.js +72 -72
  213. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  214. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  215. package/esm2015/lib/utils/toast.service.js +42 -42
  216. package/esm2015/lib/utils/utils.service.js +20 -20
  217. package/esm2015/ng-easycommerce.js +34 -34
  218. package/esm2015/public-api.js +146 -146
  219. package/esm5/lib/api/connection.service.js +90 -90
  220. package/esm5/lib/classes/checkout/step-service.js +74 -74
  221. package/esm5/lib/classes/checkout/step.js +25 -25
  222. package/esm5/lib/classes/checkout-process-state.js +2 -2
  223. package/esm5/lib/classes/component-helper.js +22 -18
  224. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  225. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  226. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  227. package/esm5/lib/classes/filters/Filter.js +78 -78
  228. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  229. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  230. package/esm5/lib/classes/user-role-type.js +1 -1
  231. package/esm5/lib/classes/user.js +120 -120
  232. package/esm5/lib/core.consts.js +434 -434
  233. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  234. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +169 -169
  235. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +209 -209
  236. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  237. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  238. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  239. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  240. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +185 -185
  241. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  242. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +170 -166
  244. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  245. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  246. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  247. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  248. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  249. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  250. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  251. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  252. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +488 -488
  253. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +169 -169
  254. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +509 -509
  255. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +120 -116
  256. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +236 -236
  257. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  258. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  259. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +83 -83
  260. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  261. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  262. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  263. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  264. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  265. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  267. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  268. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  269. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  270. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  271. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  272. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +113 -109
  273. package/esm5/lib/ec-component/header-ec/header-ec.component.js +260 -256
  274. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  275. package/esm5/lib/ec-component/index.js +244 -244
  276. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  277. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  278. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  279. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +199 -199
  280. package/esm5/lib/ec-component/product-ec/product-ec.component.js +158 -158
  281. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  282. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  283. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  284. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  285. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  286. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  287. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +136 -136
  288. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  289. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  290. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  291. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  292. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  293. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  294. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  295. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  296. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  297. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  298. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  299. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  300. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  302. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  303. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  304. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  305. package/esm5/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +143 -143
  306. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +120 -120
  307. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  308. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  309. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  310. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  311. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  312. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  313. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  314. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  315. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  316. package/esm5/lib/ec-directive/index.js +36 -36
  317. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  318. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  319. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  320. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  321. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  322. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  323. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  324. package/esm5/lib/ec-pipe/index.js +13 -13
  325. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  326. package/esm5/lib/guards/auth-guard.service.js +37 -37
  327. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  328. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  329. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  330. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  331. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  332. package/esm5/lib/interfaces/Script.js +1 -1
  333. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  334. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  335. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  336. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  337. package/esm5/lib/interfaces/block.js +1 -1
  338. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  339. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  340. package/esm5/lib/interfaces/checkout-data.js +1 -1
  341. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  342. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  343. package/esm5/lib/interfaces/cookies.js +1 -1
  344. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  345. package/esm5/lib/interfaces/coupon.js +1 -1
  346. package/esm5/lib/interfaces/deserializable.js +1 -1
  347. package/esm5/lib/interfaces/faqs.js +1 -1
  348. package/esm5/lib/interfaces/filter.js +1 -1
  349. package/esm5/lib/interfaces/filterStep.js +1 -1
  350. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  351. package/esm5/lib/interfaces/paginate.js +1 -1
  352. package/esm5/lib/interfaces/parameters.js +1 -1
  353. package/esm5/lib/interfaces/selection.js +4 -4
  354. package/esm5/lib/interfaces/step.js +1 -1
  355. package/esm5/lib/interfaces/store.js +1 -1
  356. package/esm5/lib/ng-easycommerce.module.js +185 -185
  357. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  358. package/esm5/lib/services/account/orders.service.js +120 -120
  359. package/esm5/lib/services/analytics.service.js +60 -60
  360. package/esm5/lib/services/auth.service.js +426 -426
  361. package/esm5/lib/services/banner.service.js +81 -81
  362. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  363. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  364. package/esm5/lib/services/captcha.service.js +132 -132
  365. package/esm5/lib/services/cart.service.js +705 -702
  366. package/esm5/lib/services/channel-config.service.js +107 -107
  367. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  368. package/esm5/lib/services/checkout/checkout.service.js +316 -316
  369. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  370. package/esm5/lib/services/checkout/payment.service.js +129 -129
  371. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  372. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  373. package/esm5/lib/services/cookies.service.js +222 -222
  374. package/esm5/lib/services/currency.service.js +205 -205
  375. package/esm5/lib/services/dataform.service.js +48 -48
  376. package/esm5/lib/services/filters.service.js +125 -125
  377. package/esm5/lib/services/gift-card.service.js +63 -63
  378. package/esm5/lib/services/ip-address.service.js +35 -35
  379. package/esm5/lib/services/options.service.js +376 -376
  380. package/esm5/lib/services/pagination.service.js +79 -79
  381. package/esm5/lib/services/parameters.service.js +74 -74
  382. package/esm5/lib/services/products/product-detail.service.js +497 -497
  383. package/esm5/lib/services/products/products.service.js +345 -345
  384. package/esm5/lib/services/reviews.service.js +116 -116
  385. package/esm5/lib/services/stores.service.js +39 -39
  386. package/esm5/lib/services/windows.service.js +79 -79
  387. package/esm5/lib/services/wishlist.service.js +71 -71
  388. package/esm5/lib/strategies/standard.strategy.js +44 -44
  389. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  390. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  391. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  392. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  393. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  394. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  395. package/esm5/lib/utils/order-util.service.js +75 -75
  396. package/esm5/lib/utils/payment-utils.service.js +37 -37
  397. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  398. package/esm5/lib/utils/toast.service.js +61 -61
  399. package/esm5/lib/utils/utils.service.js +22 -22
  400. package/esm5/ng-easycommerce.js +34 -34
  401. package/esm5/public-api.js +146 -146
  402. package/fesm2015/ng-easycommerce.js +16657 -16644
  403. package/fesm2015/ng-easycommerce.js.map +1 -1
  404. package/fesm5/ng-easycommerce.js +19685 -19662
  405. package/fesm5/ng-easycommerce.js.map +1 -1
  406. package/lib/api/connection.service.d.ts +28 -28
  407. package/lib/classes/checkout/step-service.d.ts +28 -28
  408. package/lib/classes/checkout/step.d.ts +14 -14
  409. package/lib/classes/checkout-process-state.d.ts +12 -12
  410. package/lib/classes/component-helper.d.ts +8 -8
  411. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  412. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  413. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  414. package/lib/classes/filters/Filter.d.ts +19 -19
  415. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  416. package/lib/classes/filters/SortFilter.d.ts +15 -15
  417. package/lib/classes/user-role-type.d.ts +5 -5
  418. package/lib/classes/user.d.ts +68 -68
  419. package/lib/core.consts.d.ts +216 -216
  420. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  421. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +33 -33
  422. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +84 -84
  423. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  424. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  425. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  426. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  427. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  428. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  429. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  430. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  432. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  433. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  434. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  435. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  436. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  437. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  438. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  439. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +59 -59
  440. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +43 -43
  441. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +100 -100
  442. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +27 -26
  443. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +57 -57
  444. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  445. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  446. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +33 -33
  447. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  448. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  449. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  450. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  451. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  452. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  453. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  454. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  455. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  456. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  457. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  458. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  459. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  460. package/lib/ec-component/header-ec/header-ec.component.d.ts +66 -66
  461. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  462. package/lib/ec-component/index.d.ts +81 -81
  463. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  464. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  465. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  466. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +60 -60
  467. package/lib/ec-component/product-ec/product-ec.component.d.ts +52 -52
  468. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  469. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  470. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  471. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  472. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  473. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  474. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +29 -29
  475. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  476. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  477. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  478. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  479. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  480. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  481. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  482. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  483. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  484. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  485. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  486. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  487. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  488. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  489. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  490. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  491. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  492. package/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.d.ts +34 -34
  493. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +31 -31
  494. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  495. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  496. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  497. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  498. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  499. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  500. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  501. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  502. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  503. package/lib/ec-directive/index.d.ts +6 -6
  504. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  505. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  506. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  507. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  508. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  509. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  510. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  511. package/lib/ec-pipe/index.d.ts +4 -4
  512. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  513. package/lib/guards/auth-guard.service.d.ts +8 -8
  514. package/lib/guards/checkout-ready.service.d.ts +8 -8
  515. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  516. package/lib/guards/user-role-guard.service.d.ts +8 -8
  517. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  518. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  519. package/lib/interfaces/Script.d.ts +5 -5
  520. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  521. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  522. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  523. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  524. package/lib/interfaces/block.d.ts +33 -33
  525. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  526. package/lib/interfaces/cart-item.d.ts +8 -8
  527. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  528. package/lib/interfaces/checkout-data.d.ts +6 -6
  529. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  530. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  531. package/lib/interfaces/cookies.d.ts +49 -49
  532. package/lib/interfaces/core.interfaces.d.ts +4 -4
  533. package/lib/interfaces/coupon.d.ts +5 -5
  534. package/lib/interfaces/currencyConfig.d.ts +10 -10
  535. package/lib/interfaces/deserializable.d.ts +3 -3
  536. package/lib/interfaces/faqs.d.ts +12 -12
  537. package/lib/interfaces/filter.d.ts +51 -51
  538. package/lib/interfaces/filterStep.d.ts +29 -29
  539. package/lib/interfaces/navbar-items.d.ts +9 -9
  540. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  541. package/lib/interfaces/paginate.d.ts +1 -1
  542. package/lib/interfaces/parameters.d.ts +10 -10
  543. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  544. package/lib/interfaces/product.d.ts +46 -46
  545. package/lib/interfaces/selection.d.ts +10 -10
  546. package/lib/interfaces/step.d.ts +8 -8
  547. package/lib/interfaces/store.d.ts +17 -17
  548. package/lib/ng-easycommerce.module.d.ts +5 -5
  549. package/lib/pipes/order-by.pipe.d.ts +5 -5
  550. package/lib/services/account/orders.service.d.ts +29 -29
  551. package/lib/services/analytics.service.d.ts +21 -21
  552. package/lib/services/auth.service.d.ts +116 -116
  553. package/lib/services/banner.service.d.ts +26 -26
  554. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  555. package/lib/services/blocks/blocks.service.d.ts +25 -25
  556. package/lib/services/captcha.service.d.ts +76 -76
  557. package/lib/services/cart.service.d.ts +140 -139
  558. package/lib/services/channel-config.service.d.ts +35 -35
  559. package/lib/services/checkout/addressing.service.d.ts +239 -239
  560. package/lib/services/checkout/checkout.service.d.ts +71 -71
  561. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  562. package/lib/services/checkout/payment.service.d.ts +34 -34
  563. package/lib/services/checkout/shipment.service.d.ts +58 -58
  564. package/lib/services/concatenated-associations.service.d.ts +57 -57
  565. package/lib/services/cookies.service.d.ts +66 -66
  566. package/lib/services/currency.service.d.ts +65 -65
  567. package/lib/services/dataform.service.d.ts +13 -13
  568. package/lib/services/filters.service.d.ts +48 -48
  569. package/lib/services/gift-card.service.d.ts +19 -19
  570. package/lib/services/ip-address.service.d.ts +10 -10
  571. package/lib/services/options.service.d.ts +61 -61
  572. package/lib/services/pagination.service.d.ts +30 -30
  573. package/lib/services/parameters.service.d.ts +18 -18
  574. package/lib/services/products/product-detail.service.d.ts +115 -115
  575. package/lib/services/products/products.service.d.ts +101 -101
  576. package/lib/services/reviews.service.d.ts +71 -71
  577. package/lib/services/stores.service.d.ts +11 -11
  578. package/lib/services/windows.service.d.ts +13 -13
  579. package/lib/services/wishlist.service.d.ts +13 -13
  580. package/lib/strategies/standard.strategy.d.ts +12 -12
  581. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  582. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  583. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  584. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  585. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  586. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  587. package/lib/utils/order-util.service.d.ts +12 -12
  588. package/lib/utils/payment-utils.service.d.ts +5 -5
  589. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  590. package/lib/utils/toast.service.d.ts +15 -15
  591. package/lib/utils/utils.service.d.ts +4 -4
  592. package/ng-easycommerce.d.ts +34 -34
  593. package/ng-easycommerce.metadata.json +1 -1
  594. package/package.json +1 -1
  595. package/public-api.d.ts +144 -144
@@ -1,432 +1,432 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- 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;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
- return new (P || (P = Promise))(function (resolve, reject) {
10
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
- step((generator = generator.apply(thisArg, _arguments || [])).next());
14
- });
15
- };
16
- import { Injectable } from '@angular/core';
17
- import { BehaviorSubject } from 'rxjs';
18
- import { ProductsService } from './products.service';
19
- import { CartService } from '../cart.service';
20
- import { ToastService } from '../../utils/toast.service';
21
- import { Constants } from '../../core.consts';
22
- import _ from "lodash";
23
- import { AnalyticsService } from '../analytics.service';
24
- import { CurrencyService } from '../currency.service';
25
- let ProductDetailService = class ProductDetailService {
26
- constructor(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
27
- this.productsService = productsService;
28
- this.cartService = cartService;
29
- this.toastrService = toastrService;
30
- this.constants = constants;
31
- this.analyticsService = analyticsService;
32
- this.currencyService = currencyService;
33
- this.productSubject = new BehaviorSubject({});
34
- this.optionsSubject = new BehaviorSubject({});
35
- this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
36
- this.variants = [];
37
- this.product$ = this.productSubject.asObservable();
38
- this.options$ = this.optionsSubject.asObservable();
39
- this.asociatedData$ = this.asociatedDataSubject.asObservable();
40
- /**
41
- * @param code Identificador del producto
42
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
43
- *
44
- * Carga el producto solicitado asyncronicamente sin respuesta
45
- */
46
- this.loadProduct = (code, variant = false) => this.productsService.getSpecificProduct(code, variant).toPromise().then(res => variant ? this.initialize(res, code) : this.initialize(res), err => this.productSubject.next(null));
47
- /**
48
- * @param product_id Identificador del producto
49
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
50
- * @async
51
- *
52
- * A diferencia del metodo loadProduct, este retorna un valor cuando termina
53
- */
54
- this.getProduct = (product_id, variant = false) => __awaiter(this, void 0, void 0, function* () {
55
- let result = yield this.productsService.getSpecificProduct(product_id, variant).toPromise();
56
- if (!result || result.error)
57
- this.productSubject.next(null);
58
- else
59
- variant ? this.initialize(result, product_id) : this.initialize(result);
60
- return true;
61
- });
62
- this.initialize = (product, variant_code) => {
63
- this.productSubject.next(product);
64
- this.optionsSubject.next(this.getOptions());
65
- variant_code ? this.updateVariants(variant_code) : this.updateVariants();
66
- this.variants.length && this.generateAsociatedDataFromVariants();
67
- this.fetchCartData();
68
- //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
69
- // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
70
- };
71
- this.setProduct = (product) => this.isProductValid(product) && this.initialize(product);
72
- this.isReady = () => this.variants.length == 1;
73
- this.setOption = (option_code, option_value) => {
74
- let options = this.optionsSubject.value;
75
- let option = options.find(element => element.code == option_code).values.find(value => value.name == option_value);
76
- option.selected = !option.selected;
77
- options.find(element => element.code == option_code).values.forEach(value => { if (value.name != option.name)
78
- value.selected = false; });
79
- this.optionsSubject.next(options);
80
- this.updateVariants();
81
- if (this.variants.length > 0) {
82
- // Habilitar todos los botones con la clase 'addCartButton'
83
- const submitButtons = document.querySelectorAll('.addCartButton');
84
- submitButtons.forEach(button => {
85
- button.disabled = false;
86
- });
87
- this.generateAsociatedDataFromVariants();
88
- }
89
- else {
90
- this.toastrService.show('selection-not-available');
91
- // Deshabilitar todos los botones con la clase 'submit-button'
92
- const submitButtons = document.querySelectorAll('.addCartButton');
93
- submitButtons.forEach(button => {
94
- button.disabled = true;
95
- });
96
- }
97
- };
98
- this.changePicture = (picture) => {
99
- let data = this.asociatedDataSubject.value;
100
- data.picture = picture;
101
- this.asociatedDataSubject.next(data);
102
- };
103
- this.handleError = (error) => {
104
- // Whathever we need to do with error
105
- };
106
- this.addToCartPromise = (quantity) => __awaiter(this, void 0, void 0, function* () {
107
- quantity = parseInt(quantity);
108
- if (!this.variants.length) {
109
- return { error: true, message: 'cant-buy' };
110
- }
111
- let product_selected = _.clone(this.productSubject.value);
112
- if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
113
- if (this.variants.length == 0)
114
- return { error: true, message: 'no-variants' };
115
- else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
116
- return { error: true, message: 'variants-left' };
117
- else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
118
- return { error: true, message: 'out-of-stock' };
119
- }
120
- if (!this.validateQuantity(quantity))
121
- return;
122
- let result = yield this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code);
123
- return (result && !(result.error));
124
- });
125
- this.getOptions = (product_received) => {
126
- let product = product_received || this.productSubject.value;
127
- let options = [];
128
- product.options.forEach(element => {
129
- options.push(this.toOption(element));
130
- });
131
- return options;
132
- };
133
- this.toOption = (preoption) => {
134
- return {
135
- name: preoption.label,
136
- code: preoption.code,
137
- type: preoption.type,
138
- values: preoption.values.map(value => ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }))
139
- };
140
- };
141
- this.updateVariants = (code) => {
142
- let variants = this.productSubject.value.variants;
143
- if (!code) {
144
- this.optionsSubject.value.forEach(option => {
145
- option.values.forEach(value => {
146
- if (value.selected) {
147
- variants = variants.filter(variant => {
148
- return variant.options.some(variant_option => {
149
- return (option.code in variant_option && variant_option[option.code] == value.name);
150
- });
151
- });
152
- }
153
- });
154
- });
155
- }
156
- else {
157
- variants = variants.filter(variant => variant.code == code);
158
- }
159
- this.variants = variants;
160
- code && this.updateOptions();
161
- };
162
- this.updateOptions = () => {
163
- let { options } = this.variants.length && this.variants[0];
164
- options && options.forEach(option => Object.keys(option).forEach(key => this.setOption(key, option[key])));
165
- };
166
- this.generateAsociatedDataFromVariants = () => {
167
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
168
- let asociated = {};
169
- if (this.isReady()) {
170
- asociated.stock = this.variants[0].stock;
171
- asociated.price = this.variants[0].price.toString();
172
- asociated.saleprice = this.variants[0].saleprice && this.variants[0].saleprice.toString() || undefined;
173
- asociated.discount = ((_a = this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
174
- asociated.properties = this.variants[0].properties ? this.beautifyProperties(this.variants[0].properties) : undefined;
175
- asociated.uniqueExternalCode = ((_b = this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
176
- asociated.multipleQuantity = ((_c = this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
177
- }
178
- else {
179
- asociated.price = this.cratePrice();
180
- asociated.saleprice = this.crateSalePrice();
181
- asociated.stock = (this.variants.map(variant => variant.stock)).reduce((a, b) => a + b);
182
- asociated.discount = this.crateDiscount();
183
- }
184
- ('images' in this.variants[0] && this.variants[0].images.length > 0)
185
- ? asociated.picture = this.variants[0].images[0]
186
- : asociated.picture = (this.asociatedDataSubject.value.picture || this.productSubject.value.picturesdefault[0]);
187
- asociated.maximumAmount = ((_d = this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
188
- asociated.minimumAmount = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
189
- asociated.maximumItemsQuantity = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
190
- asociated.minimumItemsQuantity = ((_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
191
- && ((_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
192
- asociated.finalConsumer = {
193
- finalConsumerPrice: (_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
194
- originalFinalConsumerPrice: (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
195
- };
196
- asociated.taxes = {
197
- taxIncluded: (_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
198
- taxCategory: (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
199
- };
200
- asociated.taxeAmount = ((_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxes) || undefined;
201
- asociated.taxRate = ((_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxRate) || undefined;
202
- asociated.priceWithoutTaxes = ((_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.priceWithoutTaxes) || undefined;
203
- this.asociatedDataSubject.next(asociated);
204
- };
205
- /**
206
- * @description Recibe las propiedades de una variante y por cada item arma un objeto con
207
- * el name=clave y value=valor de ese item.
208
- * @param properties
209
- * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
210
- */
211
- this.beautifyProperties = (properties) => {
212
- let beautifyData = [];
213
- properties.forEach(prop => {
214
- for (let key in prop) {
215
- beautifyData.push({ name: key, value: prop[key] });
216
- }
217
- });
218
- return beautifyData;
219
- };
220
- this.crateDiscount = () => {
221
- try {
222
- let all_discount = '';
223
- this.variants.forEach(variant => {
224
- variant.discount && (all_discount = all_discount + ', ' + variant.discount);
225
- });
226
- if (all_discount == '') {
227
- return undefined;
228
- }
229
- return all_discount;
230
- }
231
- catch (error) {
232
- return undefined;
233
- }
234
- };
235
- this.cratePrice = () => {
236
- let min_price = 0;
237
- let max_price = 0;
238
- let all_prices = [];
239
- this.variants.forEach(variant => {
240
- all_prices.push(variant.price);
241
- });
242
- min_price = all_prices.reduce((a, b) => Math.min(a, b));
243
- max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
244
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
245
- };
246
- this.crateSalePrice = () => {
247
- let min_price = 0;
248
- let max_price = 0;
249
- let all_prices = [];
250
- this.variants.forEach(variant => {
251
- variant.saleprice && all_prices.push(variant.saleprice);
252
- });
253
- if (!all_prices.length) {
254
- return undefined;
255
- }
256
- min_price = all_prices.reduce((a, b) => Math.min(a, b));
257
- max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
258
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
259
- };
260
- this.inRange = (quantity, min, max) => ((quantity - min) * (quantity - max) <= 0);
261
- this.validateQuantity = (quantity) => {
262
- const actualQuantity = this.cartService.getCountFromItemInCart(this.variants[0].code);
263
- const asociatedData = this.asociatedDataSubject.value;
264
- console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
265
- if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
266
- this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
267
- return false;
268
- }
269
- if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
270
- this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
271
- return false;
272
- }
273
- return true;
274
- };
275
- this.validatePriceAndCredits = (price) => {
276
- if (this.creditAmount === null) {
277
- console.log('No hay configuración de créditos para este usuario.');
278
- return true;
279
- }
280
- if (this.remainingCredits === undefined) {
281
- return false;
282
- }
283
- if (price > this.remainingCredits) {
284
- this.toastrService.show('not-enough-credits');
285
- return false;
286
- }
287
- return true;
288
- };
289
- this.fetchCartData = () => {
290
- this.cartService.getTotalAmount().subscribe((totalAmount) => {
291
- this.currentTotalAmount = totalAmount;
292
- });
293
- this.cartService.getCreditAmount().subscribe((creditAmount) => {
294
- this.creditAmount = creditAmount;
295
- });
296
- this.cartService.getRemainingCredits().subscribe((remainingCredits) => {
297
- this.remainingCredits = remainingCredits;
298
- });
299
- };
300
- // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
301
- this.isProductValid = (product) => true;
302
- /**
303
- *
304
- * @param product producto el cual se quiere desdoblar por variantes por una opción.
305
- * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
306
- * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
307
- * @returns arreglo con el producto desdoblado por la variante solicitada.
308
- * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
309
- */
310
- this.getProductWithUniqueVariant = (product, withOption) => {
311
- return this.productsService.getProductsWithUniqueVariant([product], withOption);
312
- };
313
- }
314
- /**
315
- * @description agrega/actualiza un item en el carrito
316
- * @param quantity cantidad a agregar
317
- * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
318
- * @returns
319
- */
320
- addToCart(quantity, variant_code) {
321
- quantity = parseInt(quantity);
322
- if (!this.variants.length) {
323
- this.toastrService.show('cant-buy');
324
- return;
325
- }
326
- let product_selected = _.clone(this.productSubject.value);
327
- let variant;
328
- switch (this.variants.length) {
329
- case 0:
330
- this.toastrService.show('no-variants');
331
- break;
332
- case 1:
333
- this.asociatedDataSubject.value.stock == 0 ?
334
- this.toastrService.show('out-of-stock') :
335
- variant = this.variants[0];
336
- break;
337
- default:
338
- if (variant_code) {
339
- variant = this.variants.find(variant => variant.code === variant_code);
340
- if (variant.stock == 0) {
341
- this.toastrService.show('out-of-stock');
342
- variant = undefined;
343
- }
344
- }
345
- else {
346
- this.toastrService.show('variants-left');
347
- }
348
- break;
349
- }
350
- if (!variant)
351
- return;
352
- if (!this.validateQuantity(quantity))
353
- return;
354
- const priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
355
- if (!this.validatePriceAndCredits(priceToValidate))
356
- return;
357
- this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
358
- }
359
- ;
360
- makeAffordableProduct(product_selected) {
361
- product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
362
- product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
363
- product_selected.options = {};
364
- this.variants[0].options.forEach(option => product_selected.options = Object.assign(Object.assign({}, product_selected.options), option));
365
- return product_selected;
366
- }
367
- /**
368
- *
369
- * @param options Array de Variantes y sus valores
370
- *
371
- * @description Retorna una lista filtrada de las variantes que estan seleccionadas
372
- */
373
- getVariantsSelected(options, optionsException) {
374
- let variantsSelected = [];
375
- options.forEach(v => {
376
- if (v.values && v.values.length) {
377
- v.values.forEach(val => {
378
- if (val.selected && !optionsException.find(op => op.toUpperCase() == v.code.toUpperCase())) {
379
- variantsSelected[v.code] = val.name;
380
- }
381
- });
382
- }
383
- });
384
- return variantsSelected;
385
- }
386
- /**
387
- *
388
- * @param options Array de Variantes y sus valores
389
- * @param variants Todas las variantes disponibles del producto
390
- *
391
- * @description retorna todas las variantes disponibles a seleccion y su stock
392
- */
393
- getVariantsAvailable(options, variants, optionsException) {
394
- let variantsSelected = this.getVariantsSelected(options, optionsException);
395
- let variantsAvailable = [];
396
- variants.map(v => {
397
- let aux = {};
398
- if (v.options && v.options.length) {
399
- v.options.map(op => {
400
- Object.assign(aux, op, { stock: v.stock });
401
- });
402
- }
403
- variantsAvailable.push(aux);
404
- });
405
- return variantsAvailable.filter(va => this.constants.containsAll(Object.assign({}, variantsSelected), va));
406
- }
407
- /**
408
- *
409
- * @param options Array de variantes y sus valores
410
- * @param code Codigo de la variante a buscar
411
- * @param name nombre de la variante a buscar
412
- * @param variants variantes del producto
413
- *
414
- * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
415
- */
416
- existVariantAndHasStock(options, code, name, variants, optionsException = []) {
417
- return this.getVariantsAvailable(options, variants, optionsException).find(va => va.hasOwnProperty(code) && va[code] === name && va.stock > 0);
418
- }
419
- };
420
- ProductDetailService.ctorParameters = () => [
421
- { type: ProductsService },
422
- { type: CartService },
423
- { type: ToastService },
424
- { type: Constants },
425
- { type: AnalyticsService },
426
- { type: CurrencyService }
427
- ];
428
- ProductDetailService = __decorate([
429
- Injectable()
430
- ], ProductDetailService);
431
- export { ProductDetailService };
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBb0I7SUFlN0IsWUFDWSxlQUFnQyxFQUFVLFdBQXdCLEVBQVUsYUFBMkIsRUFDdkcsU0FBb0IsRUFBUyxnQkFBa0MsRUFBUyxlQUFnQztRQUR4RyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQ3ZHLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBZjVHLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJ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QWNKLENBQUE7O1lBamJnQyxlQUFlO1lBQXVCLFdBQVc7WUFBeUIsWUFBWTtZQUM1RixTQUFTO1lBQTJCLGdCQUFnQjtZQUEwQixlQUFlOztBQWpCM0csb0JBQW9CO0lBRGhDLFVBQVUsRUFBRTtHQUNBLG9CQUFvQixDQWljaEM7U0FqY1ksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBwYXJ0aXRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi9wcm9kdWN0cy5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IF8gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL2FuYWx5dGljcy5zZXJ2aWNlJztcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XG5pbXBvcnQgeyBDdXJyZW5jeVNlcnZpY2UgfSBmcm9tICcuLi9jdXJyZW5jeS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFByb2R1Y3REZXRhaWxTZXJ2aWNlIHtcblxuICAgIHByaXZhdGUgcHJvZHVjdFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3Q+KHt9KTtcbiAgICBwcml2YXRlIG9wdGlvbnNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcbiAgICBwcml2YXRlIGFzb2NpYXRlZERhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHsgcHJpY2U6ICcnLCBzdG9jazogMCwgcGljdHVyZTogJycgfSk7XG5cbiAgICBwcml2YXRlIHZhcmlhbnRzID0gW11cblxuICAgIHB1YmxpYyBwcm9kdWN0JCA9IHRoaXMucHJvZHVjdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIG9wdGlvbnMkID0gdGhpcy5vcHRpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgYXNvY2lhdGVkRGF0YSQgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHByaXZhdGUgY3VycmVudFRvdGFsQW1vdW50OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBjcmVkaXRBbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgcHJpdmF0ZSByZW1haW5pbmdDcmVkaXRzOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBwcm9kdWN0c1NlcnZpY2U6IFByb2R1Y3RzU2VydmljZSwgcHJpdmF0ZSBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsIHByaXZhdGUgdG9hc3RyU2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLCBwdWJsaWMgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSwgcHVibGljIGN1cnJlbmN5U2VydmljZTogQ3VycmVuY3lTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBAcGFyYW0gY29kZSBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xuICAgICogQHBhcmFtIHZhcmlhbnQgSW5kaWNhIHNpIHNlIGVzdMOhIHNvbGljaXRhbmRvIHVuIHByb2R1Y3RvIHBvciBzdSBjb2RpZ28sIG8gcG9yIGVsIGNvZGlnbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgZGUgc3VzIHZhcmlhbnRlc1xuICAgICogIFxuICAgICogQ2FyZ2EgZWwgcHJvZHVjdG8gc29saWNpdGFkbyBhc3luY3JvbmljYW1lbnRlIHNpbiByZXNwdWVzdGEgXG4gICAgKi9cbiAgICBsb2FkUHJvZHVjdCA9IChjb2RlLCB2YXJpYW50OiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChjb2RlLCB2YXJpYW50KS50b1Byb21pc2UoKS50aGVuKFxuICAgICAgICAgICAgcmVzID0+IHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzLCBjb2RlKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXMpLFxuICAgICAgICAgICAgZXJyID0+IHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKVxuICAgICAgICApXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gcHJvZHVjdF9pZCBJZGVudGlmaWNhZG9yIGRlbCBwcm9kdWN0b1xuICAgICAqIEBwYXJhbSB2YXJpYW50IEluZGljYSBzaSBzZSBlc3TDoSBzb2xpY2l0YW5kbyB1biBwcm9kdWN0byBwb3Igc3UgY29kaWdvLCBvIHBvciBlbCBjb2RpZ28gY29ycmVzcG9uZGllbnRlIGEgdW5hIGRlIHN1cyB2YXJpYW50ZXNcbiAgICAgKiBAYXN5bmNcbiAgICAgKiAgXG4gICAgICogQSBkaWZlcmVuY2lhIGRlbCBtZXRvZG8gbG9hZFByb2R1Y3QsIGVzdGUgcmV0b3JuYSB1biB2YWxvciBjdWFuZG8gdGVybWluYSBcbiAgICAgKi9cbiAgICBnZXRQcm9kdWN0ID0gYXN5bmMgKHByb2R1Y3RfaWQsIHZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KHByb2R1Y3RfaWQsIHZhcmlhbnQpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKTtcbiAgICAgICAgZWxzZSB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlc3VsdCwgcHJvZHVjdF9pZCkgOiB0aGlzLmluaXRpYWxpemUocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0aWFsaXplID0gKHByb2R1Y3QsIHZhcmlhbnRfY29kZT8pID0+IHtcbiAgICAgICAgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KHByb2R1Y3QpO1xuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQodGhpcy5nZXRPcHRpb25zKCkpXG4gICAgICAgIHZhcmlhbnRfY29kZSA/IHRoaXMudXBkYXRlVmFyaWFudHModmFyaWFudF9jb2RlKSA6IHRoaXMudXBkYXRlVmFyaWFudHMoKTtcbiAgICAgICAgdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcbiAgICAgICAgdGhpcy5mZXRjaENhcnREYXRhKClcbiAgICAgICAgLy90aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXG4gICAgICAgIC8vIHZhcmlhbnRfY29kZSAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXG4gICAgfVxuXG4gICAgc2V0UHJvZHVjdCA9IChwcm9kdWN0KSA9PiB0aGlzLmlzUHJvZHVjdFZhbGlkKHByb2R1Y3QpICYmIHRoaXMuaW5pdGlhbGl6ZShwcm9kdWN0KTtcblxuICAgIGlzUmVhZHkgPSAoKSA9PiB0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAxO1xuXG4gICAgc2V0T3B0aW9uID0gKG9wdGlvbl9jb2RlLCBvcHRpb25fdmFsdWUpID0+IHtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgb3B0aW9uID0gb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5uYW1lID09IG9wdGlvbl92YWx1ZSk7XG4gICAgICAgIG9wdGlvbi5zZWxlY3RlZCA9ICFvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICAgIG9wdGlvbnMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQuY29kZSA9PSBvcHRpb25fY29kZSkudmFsdWVzLmZvckVhY2goXG4gICAgICAgICAgICB2YWx1ZSA9PiB7IGlmICh2YWx1ZS5uYW1lICE9IG9wdGlvbi5uYW1lKSB2YWx1ZS5zZWxlY3RlZCA9IGZhbHNlIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC5uZXh0KG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIEhhYmlsaXRhciB0b2RvcyBsb3MgYm90b25lcyBjb24gbGEgY2xhc2UgJ2FkZENhcnRCdXR0b24nXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcbiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICAgICAgICAgIChidXR0b24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc2VsZWN0aW9uLW5vdC1hdmFpbGFibGUnKTtcblxuICAgICAgICAgICAgLy8gRGVzaGFiaWxpdGFyIHRvZG9zIGxvcyBib3RvbmVzIGNvbiBsYSBjbGFzZSAnc3VibWl0LWJ1dHRvbidcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGNoYW5nZVBpY3R1cmUgPSAocGljdHVyZSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XG4gICAgICAgIGRhdGEucGljdHVyZSA9IHBpY3R1cmU7XG4gICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QubmV4dChkYXRhKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvciA9IChlcnJvcikgPT4ge1xuICAgICAgICAvLyBXaGF0aGV2ZXIgd2UgbmVlZCB0byBkbyB3aXRoIGVycm9yXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGFncmVnYS9hY3R1YWxpemEgdW4gaXRlbSBlbiBlbCBjYXJyaXRvIFxuICAgICAqIEBwYXJhbSBxdWFudGl0eSBjYW50aWRhZCBhIGFncmVnYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudF9jb2RlICoqKG9wY2lvbmFsKSoqIGNvZGlnbyBkZSBsYSB2YXJpYW50ZSBzZWxlY2Npb25hZGEgZGVsIHByb2R1Y3RvLlxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFkZFRvQ2FydChxdWFudGl0eSwgdmFyaWFudF9jb2RlPzogc3RyaW5nKSB7XG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xuXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdjYW50LWJ1eScpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwcm9kdWN0X3NlbGVjdGVkID0gXy5jbG9uZSh0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlKTtcblxuICAgICAgICBsZXQgdmFyaWFudDogYW55O1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm8tdmFyaWFudHMnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDAgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJykgOlxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdGhpcy52YXJpYW50c1swXVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudF9jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzLmZpbmQodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT09IHZhcmlhbnRfY29kZSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQuc3RvY2sgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygndmFyaWFudHMtbGVmdCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhcmlhbnQpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUXVhbnRpdHkocXVhbnRpdHkpKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcHJpY2VUb1ZhbGlkYXRlID0gcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgPyBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSAqIHF1YW50aXR5IDogcHJvZHVjdF9zZWxlY3RlZC5wcmljZSAqIHF1YW50aXR5O1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMocHJpY2VUb1ZhbGlkYXRlKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9DYXJ0KHRoaXMubWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQpLCBxdWFudGl0eSwgdmFyaWFudC5jb2RlKTtcbiAgICB9O1xuXG5cblxuICAgIGFkZFRvQ2FydFByb21pc2UgPSBhc3luYyAocXVhbnRpdHkpID0+IHtcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnY2FudC1idXknIH07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xuICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPiAxIHx8IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDAgfHwgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5zdG9jayA9PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPT0gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICduby12YXJpYW50cycgfTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID4gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICd2YXJpYW50cy1sZWZ0JyB9O1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggIT0gMCAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnb3V0LW9mLXN0b2NrJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0NhcnRQcm9taXNlKHRoaXMubWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQpLCBxdWFudGl0eSwgdGhpcy52YXJpYW50c1swXS5jb2RlKTtcbiAgICAgICAgcmV0dXJuIChyZXN1bHQgJiYgIShyZXN1bHQuZXJyb3IpKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRPcHRpb25zID0gKHByb2R1Y3RfcmVjZWl2ZWQ/OiBQcm9kdWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9kdWN0ID0gcHJvZHVjdF9yZWNlaXZlZCB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlO1xuICAgICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgICAgICBwcm9kdWN0Lm9wdGlvbnMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLnRvT3B0aW9uKGVsZW1lbnQpKTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0b09wdGlvbiA9IChwcmVvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHByZW9wdGlvbi5sYWJlbCxcbiAgICAgICAgICAgIGNvZGU6IHByZW9wdGlvbi5jb2RlLFxuICAgICAgICAgICAgdHlwZTogcHJlb3B0aW9uLnR5cGUsXG4gICAgICAgICAgICB2YWx1ZXM6IHByZW9wdGlvbi52YWx1ZXMubWFwKHZhbHVlID0+ICh7IG5hbWU6IHZhbHVlLmNvZGUsIGRlc2NyaXB0aW9uOiB2YWx1ZS5uYW1lLCBpbWFnZTogdmFsdWUuaW1hZ2UsIG1vYmlsZUltYWdlOiB2YWx1ZS5tb2JpbGVJbWFnZSwgc2VsZWN0ZWQ6IGZhbHNlIH0pKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZDogUHJvZHVjdCkge1xuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucHJpY2UpO1xuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMgPSB7fTtcbiAgICAgICAgdGhpcy52YXJpYW50c1swXS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHsgLi4ucHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zLCAuLi5vcHRpb24gfSlcbiAgICAgICAgcmV0dXJuIHByb2R1Y3Rfc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVWYXJpYW50cyA9IChjb2RlPykgPT4ge1xuICAgICAgICBsZXQgdmFyaWFudHMgPSB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlLnZhcmlhbnRzO1xuICAgICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWUuZm9yRWFjaChvcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgIG9wdGlvbi52YWx1ZXMuZm9yRWFjaCh2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhbnQub3B0aW9ucy5zb21lKHZhcmlhbnRfb3B0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcHRpb24uY29kZSBpbiB2YXJpYW50X29wdGlvbiAmJiB2YXJpYW50X29wdGlvbltvcHRpb24uY29kZV0gPT0gdmFsdWUubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhcmlhbnRzID0gdmFyaWFudHMuZmlsdGVyKHZhcmlhbnQgPT4gdmFyaWFudC5jb2RlID09IGNvZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFyaWFudHMgPSB2YXJpYW50cztcbiAgICAgICAgY29kZSAmJiB0aGlzLnVwZGF0ZU9wdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZU9wdGlvbnMgPSAoKSA9PiB7XG4gICAgICAgIGxldCB7IG9wdGlvbnMgfSA9IHRoaXMudmFyaWFudHMubGVuZ3RoICYmIHRoaXMudmFyaWFudHNbMF07XG4gICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goa2V5ID0+IHRoaXMuc2V0T3B0aW9uKGtleSwgb3B0aW9uW2tleV0pKSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cyA9ICgpID0+IHtcbiAgICAgICAgbGV0IGFzb2NpYXRlZDogYW55ID0ge307XG4gICAgICAgIGlmICh0aGlzLmlzUmVhZHkoKSkge1xuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gdGhpcy52YXJpYW50c1swXS5zdG9ja1xuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy52YXJpYW50c1swXS5wcmljZS50b1N0cmluZygpXG4gICAgICAgICAgICBhc29jaWF0ZWQuc2FsZXByaWNlID0gdGhpcy52YXJpYW50c1swXS5zYWxlcHJpY2UgJiYgdGhpcy52YXJpYW50c1swXS5zYWxlcHJpY2UudG9TdHJpbmcoKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQuZGlzY291bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5kaXNjb3VudCB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQucHJvcGVydGllcyA9IHRoaXMudmFyaWFudHNbMF0ucHJvcGVydGllcyA/IHRoaXMuYmVhdXRpZnlQcm9wZXJ0aWVzKHRoaXMudmFyaWFudHNbMF0ucHJvcGVydGllcykgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBhc29jaWF0ZWQudW5pcXVlRXh0ZXJuYWxDb2RlID0gdGhpcy52YXJpYW50c1swXT8udW5pcXVlRXh0ZXJuYWxDb2RlIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5tdWx0aXBsZVF1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2UgPSB0aGlzLmNyYXRlUHJpY2UoKVxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMuY3JhdGVTYWxlUHJpY2UoKVxuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gKHRoaXMudmFyaWFudHMubWFwKHZhcmlhbnQgPT4gdmFyaWFudC5zdG9jaykpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIpXG4gICAgICAgICAgICBhc29jaWF0ZWQuZGlzY291bnQgPSB0aGlzLmNyYXRlRGlzY291bnQoKVxuICAgICAgICB9XG5cbiAgICAgICAgKCdpbWFnZXMnIGluIHRoaXMudmFyaWFudHNbMF0gJiYgdGhpcy52YXJpYW50c1swXS5pbWFnZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgID8gYXNvY2lhdGVkLnBpY3R1cmUgPSB0aGlzLnZhcmlhbnRzWzBdLmltYWdlc1swXVxuICAgICAgICAgICAgOiBhc29jaWF0ZWQucGljdHVyZSA9ICh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnBpY3R1cmUgfHwgdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS5waWN0dXJlc2RlZmF1bHRbMF0pO1xuXG5cbiAgICAgICAgYXNvY2lhdGVkLm1heGltdW1BbW91bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5tYXhpbXVtQW1vdW50IHx8IDBcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1BbW91bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtQW1vdW50IHx8IDBcblxuICAgICAgICBhc29jaWF0ZWQubWF4aW11bUl0ZW1zUXVhbnRpdHkgPSB0aGlzLnZhcmlhbnRzWzBdPy5zdG9jayA+IDAgJiYgJ21heGltdW1JdGVtc1F1YW50aXR5JyBpbiB0aGlzLnZhcmlhbnRzWzBdID8gdGhpcy52YXJpYW50c1swXT8ubWF4aW11bUl0ZW1zUXVhbnRpdHkgOiB0aGlzLnZhcmlhbnRzWzBdPy5zdG9ja1xuICAgICAgICBhc29jaWF0ZWQubWluaW11bUl0ZW1zUXVhbnRpdHkgPSB0aGlzLnZhcmlhbnRzWzBdPy5zdG9jayA+IDAgJiYgJ21pbmltdW1JdGVtc1F1YW50aXR5JyBpbiB0aGlzLnZhcmlhbnRzWzBdXG4gICAgICAgICAgICAmJiB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eSA+IDAgPyB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eVxuICAgICAgICAgICAgOiAodGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSA/IHRoaXMudmFyaWFudHNbMF0/Lm11bHRpcGxlUXVhbnRpdHkgOiAxKVxuXG4gICAgICAgIGFzb2NpYXRlZC5maW5hbENvbnN1bWVyID0ge1xuICAgICAgICAgICAgZmluYWxDb25zdW1lclByaWNlOiB0aGlzLnZhcmlhbnRzWzBdPy5maW5hbF9jb25zdW1lcl9wcmljZSxcbiAgICAgICAgICAgIG9yaWdpbmFsRmluYWxDb25zdW1lclByaWNlOiB0aGlzLnZhcmlhbnRzWzBdPy5vcmlnaW5hbF9maW5hbF9jb25zdW1lcl9wcmljZSxcbiAgICAgICAgfVxuXG4gICAgICAgIGFzb2NpYXRlZC50YXhlcyA9IHtcbiAgICAgICAgICAgIHRheEluY2x1ZGVkOiB0aGlzLnZhcmlhbnRzWzBdPy50YXhJbmNsdWRlZCxcbiAgICAgICAgICAgIHRheENhdGVnb3J5OiB0aGlzLnZhcmlhbnRzWzBdPy50YXhDYXRlZ29yeSxcbiAgICAgICAgfVxuICAgICAgICBhc29jaWF0ZWQudGF4ZUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LnRheGVzIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgYXNvY2lhdGVkLnRheFJhdGUgPSB0aGlzLnZhcmlhbnRzWzBdPy50YXhSYXRlIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgYXNvY2lhdGVkLnByaWNlV2l0aG91dFRheGVzID0gdGhpcy52YXJpYW50c1swXT8ucHJpY2VXaXRob3V0VGF4ZXMgfHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QubmV4dChhc29jaWF0ZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZWNpYmUgbGFzIHByb3BpZWRhZGVzIGRlIHVuYSB2YXJpYW50ZSB5IHBvciBjYWRhIGl0ZW0gYXJtYSB1biBvYmpldG8gY29uIFxuICAgICAqIGVsIG5hbWU9Y2xhdmUgeSB2YWx1ZT12YWxvciBkZSBlc2UgaXRlbS4gIFxuICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIFxuICAgICAqIEByZXR1cm5zIFVuIGFycmVnbG8gY29uIGxhcyBwcm9waWVkYWRlcyBkZSBsYSBmb3JtYSB7IG5hbWUgPSAuLi4gLCB2YWx1ZSA9IC4uLn1cbiAgICAgKi9cbiAgICBwcml2YXRlIGJlYXV0aWZ5UHJvcGVydGllcyA9IChwcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIGxldCBiZWF1dGlmeURhdGEgPSBbXVxuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gcHJvcCkge1xuICAgICAgICAgICAgICAgIGJlYXV0aWZ5RGF0YS5wdXNoKHsgbmFtZToga2V5LCB2YWx1ZTogcHJvcFtrZXldIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYmVhdXRpZnlEYXRhXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmF0ZURpc2NvdW50ID0gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGFsbF9kaXNjb3VudCA9ICcnO1xuICAgICAgICAgICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKHZhcmlhbnQgPT4ge1xuICAgICAgICAgICAgICAgIHZhcmlhbnQuZGlzY291bnQgJiYgKGFsbF9kaXNjb3VudCA9IGFsbF9kaXNjb3VudCArICcsICcgKyB2YXJpYW50LmRpc2NvdW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGFsbF9kaXNjb3VudCA9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhbGxfZGlzY291bnRcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JhdGVQcmljZSA9ICgpID0+IHtcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XG4gICAgICAgIGxldCBtYXhfcHJpY2UgPSAwO1xuICAgICAgICBsZXQgYWxsX3ByaWNlcyA9IFtdO1xuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XG4gICAgICAgICAgICBhbGxfcHJpY2VzLnB1c2godmFyaWFudC5wcmljZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xuICAgICAgICBtYXhfcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmF0ZVNhbGVQcmljZSA9ICgpID0+IHtcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XG4gICAgICAgIGxldCBtYXhfcHJpY2UgPSAwO1xuICAgICAgICBsZXQgYWxsX3ByaWNlcyA9IFtdO1xuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XG4gICAgICAgICAgICB2YXJpYW50LnNhbGVwcmljZSAmJiBhbGxfcHJpY2VzLnB1c2godmFyaWFudC5zYWxlcHJpY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFhbGxfcHJpY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgICAgIG1pbl9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSk7XG4gICAgICAgIG1heF9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XG4gICAgICAgIHJldHVybiBtaW5fcHJpY2UgPT0gbWF4X3ByaWNlID8gbWF4X3ByaWNlLnRvU3RyaW5nKCkgOiBtaW5fcHJpY2UgKyAnIC0gJyArIG1heF9wcmljZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluUmFuZ2UgPSAocXVhbnRpdHksIG1pbiwgbWF4KSA9PiAoKHF1YW50aXR5IC0gbWluKSAqIChxdWFudGl0eSAtIG1heCkgPD0gMClcblxuICAgIHByaXZhdGUgdmFsaWRhdGVRdWFudGl0eSA9IChxdWFudGl0eTogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdHVhbFF1YW50aXR5ID0gdGhpcy5jYXJ0U2VydmljZS5nZXRDb3VudEZyb21JdGVtSW5DYXJ0KHRoaXMudmFyaWFudHNbMF0uY29kZSk7XG4gICAgICAgIGNvbnN0IGFzb2NpYXRlZERhdGEgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlO1xuICAgICAgICBjb25zb2xlLmxvZygnTGEgY2FudGlkYWQgcXVlIGxsZWdvOiAnLCBxdWFudGl0eSwgJyB5IGxhIGNhbnRpZGFkIGFjdHVhbDogJywgYWN0dWFsUXVhbnRpdHkpO1xuICAgICAgICBpZiAoKGFjdHVhbFF1YW50aXR5ICsgcXVhbnRpdHkpID4gYXNvY2lhdGVkRGF0YS5tYXhpbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA8IGFzb2NpYXRlZERhdGEubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdtaW5pbXVtLWl0ZW1zLXF1YW50aXR5JywgeyBxdWFudGl0eTogYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSB9KVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyA9IChwcmljZTogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNyZWRpdEFtb3VudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIGhheSBjb25maWd1cmFjacOzbiBkZSBjcsOpZGl0b3MgcGFyYSBlc3RlIHVzdWFyaW8uJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaWNlID4gdGhpcy5yZW1haW5pbmdDcmVkaXRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIGZldGNoQ2FydERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0VG90YWxBbW91bnQoKS5zdWJzY3JpYmUoKHRvdGFsQW1vdW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldENyZWRpdEFtb3VudCgpLnN1YnNjcmliZSgoY3JlZGl0QW1vdW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWRpdEFtb3VudCA9IGNyZWRpdEFtb3VudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5nZXRSZW1haW5pbmdDcmVkaXRzKCkuc3Vic2NyaWJlKChyZW1haW5pbmdDcmVkaXRzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbWFpbmluZ0NyZWRpdHMgPSByZW1haW5pbmdDcmVkaXRzO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ3VhbmRvIGhheWEgbW9kZWxvcyBkZSByZXNwdWVzdGEsIHZhbGlkYW1vcyBxdWUgbm8gc2UgaW50ZW50ZSBjYXJnYXIgdW4gcHJvZHVjdG8gaW5jb21wbGV0b1xuICAgIHByaXZhdGUgaXNQcm9kdWN0VmFsaWQgPSAocHJvZHVjdDogUHJvZHVjdCkgPT4gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgdW5hIGxpc3RhIGZpbHRyYWRhIGRlIGxhcyB2YXJpYW50ZXMgcXVlIGVzdGFuIHNlbGVjY2lvbmFkYXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9uczogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogQXJyYXk8T2JqZWN0PiB7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHYudmFsdWVzICYmIHYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5zZWxlY3RlZCAmJiAhb3B0aW9uc0V4Y2VwdGlvbi5maW5kKG9wID0+IG9wLnRvVXBwZXJDYXNlKCkgPT0gdi5jb2RlLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50c1NlbGVjdGVkW3YuY29kZV0gPSB2YWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YXJpYW50c1NlbGVjdGVkO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgVG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBkZWwgcHJvZHVjdG9cbiAgICAgKiBcbiAgICAgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSB0b2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGEgc2VsZWNjaW9uIHkgc3Ugc3RvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9uczogYW55LCB2YXJpYW50czogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogYW55IHtcblxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IHRoaXMuZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zLCBvcHRpb25zRXhjZXB0aW9uKTtcblxuICAgICAgICBsZXQgdmFyaWFudHNBdmFpbGFibGUgPSBbXTtcblxuICAgICAgICB2YXJpYW50cy5tYXAodiA9PiB7XG5cbiAgICAgICAgICAgIGxldCBhdXggPSB7fTtcbiAgICAgICAgICAgIGlmICh2Lm9wdGlvbnMgJiYgdi5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYub3B0aW9ucy5tYXAob3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF1eCwgb3AsIHsgc3RvY2s6IHYuc3RvY2sgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhcmlhbnRzQXZhaWxhYmxlLnB1c2goYXV4KTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzQXZhaWxhYmxlLmZpbHRlcih2YSA9PiB0aGlzLmNvbnN0YW50cy5jb250YWluc0FsbCh7IC4uLnZhcmlhbnRzU2VsZWN0ZWQgfSwgdmEpKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgdmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gY29kZSBDb2RpZ28gZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gbmFtZSBub21icmUgZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgdmFyaWFudGVzIGRlbCBwcm9kdWN0b1xuICAgICAqIFxuICAgICAqIEBkZXNjcmlwdGlvbiBidXNjYSBlbiBsYSBsaXN0YSBkZSB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgc2kgaGF5IGRlIGVzZSBjb2RpZ28sIGVzZSBub21icmUgeSBjb24gc3RvY2sgXG4gICAgICovXG4gICAgcHVibGljIGV4aXN0VmFyaWFudEFuZEhhc1N0b2NrKG9wdGlvbnMsIGNvZGUsIG5hbWUsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uID0gW10pOiBib29sZWFuIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbikuZmluZCh2YSA9PlxuICAgICAgICAgICAgdmEuaGFzT3duUHJvcGVydHkoY29kZSkgJiYgdmFbY29kZV0gPT09IG5hbWUgJiYgdmEuc3RvY2sgPiAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcm9kdWN0IHByb2R1Y3RvIGVsIGN1YWwgc2UgcXVpZXJlIGRlc2RvYmxhciBwb3IgdmFyaWFudGVzIHBvciB1bmEgb3BjacOzbi5cbiAgICAgKiBAcGFyYW0gd2l0aE9wdGlvbiAndHlwZScgdGlwbyBkZSBvcGNpw7NuLCBjb2RlOiBjw7NkaWdvIGRlIGxhIG9wY2nDs24uICdkZWZhdWx0Rmlyc3RPcHRpb24nOiBlbiBjYXNvIGRlIHF1ZSBubyBzZSBwdWVkYSBkZXNkb2JsYXIgcG9yIGxhIG9wY2nDs24gaW5kaWNhZGEgc2kgZWwgdmFsb3IgZXMgdmVyZGFkZXJvIHNlIGludGVudGFyYSBkZXNkb2JsYXIgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0by5cbiAgICAgKiAnY2hlY2tJZlN0b2NrJzogZW4gY2FzbyBkZSBxdWUgZXN0YSB2YWxvciBzZWEgdmVyZGFkZXJvIHNlIHJlYWxpemEgdW4gY29udHJvbCBkZSBxdWUgbGEgdmFyaWFudGVzIGN1ZW50ZW4gY29uIHN0b2NrIHBhcmEgc2VyIHVuIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlLCBzaSBlbCB2YWxvciBlcyBmYWxzbyBubyBzZSByZWFsaXphIGRpY2hvIGNvbnRyb2wgeSBlbCBwcm9kdWN0byBzZSBkZXNkb2JsYXJhIGNvbiBzdG9jayBlbiAwLlxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGVsIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlIHNvbGljaXRhZGEuXG4gICAgICogKG9wY2nDs24gcG9yIGRlZmVjdG8gcXVlIHNlIGludGVudGEgaGFjZXIgZWwgZGVzZG9ibGFtaWVudG8gJ2NvbG9yJywgbyBiaWVuIHNpIGVuIGxlIHBhcsOhbWV0cm8gd2l0aE9wdGlvbiBlbCBhdHJpYnV0byAnZGVmYXVsdEZpcnN0T3B0aW9uJyBlcyB2ZXJkYWRlcm8gc2UgZGVzZG9ibGEgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0byApIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0LCB3aXRoT3B0aW9uPzogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChbcHJvZHVjdF0sIHdpdGhPcHRpb24pXG4gICAgfVxuXG59Il19
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { Injectable } from '@angular/core';
17
+ import { BehaviorSubject } from 'rxjs';
18
+ import { ProductsService } from './products.service';
19
+ import { CartService } from '../cart.service';
20
+ import { ToastService } from '../../utils/toast.service';
21
+ import { Constants } from '../../core.consts';
22
+ import _ from "lodash";
23
+ import { AnalyticsService } from '../analytics.service';
24
+ import { CurrencyService } from '../currency.service';
25
+ let ProductDetailService = class ProductDetailService {
26
+ constructor(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
27
+ this.productsService = productsService;
28
+ this.cartService = cartService;
29
+ this.toastrService = toastrService;
30
+ this.constants = constants;
31
+ this.analyticsService = analyticsService;
32
+ this.currencyService = currencyService;
33
+ this.productSubject = new BehaviorSubject({});
34
+ this.optionsSubject = new BehaviorSubject({});
35
+ this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
36
+ this.variants = [];
37
+ this.product$ = this.productSubject.asObservable();
38
+ this.options$ = this.optionsSubject.asObservable();
39
+ this.asociatedData$ = this.asociatedDataSubject.asObservable();
40
+ /**
41
+ * @param code Identificador del producto
42
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
43
+ *
44
+ * Carga el producto solicitado asyncronicamente sin respuesta
45
+ */
46
+ this.loadProduct = (code, variant = false) => this.productsService.getSpecificProduct(code, variant).toPromise().then(res => variant ? this.initialize(res, code) : this.initialize(res), err => this.productSubject.next(null));
47
+ /**
48
+ * @param product_id Identificador del producto
49
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
50
+ * @async
51
+ *
52
+ * A diferencia del metodo loadProduct, este retorna un valor cuando termina
53
+ */
54
+ this.getProduct = (product_id, variant = false) => __awaiter(this, void 0, void 0, function* () {
55
+ let result = yield this.productsService.getSpecificProduct(product_id, variant).toPromise();
56
+ if (!result || result.error)
57
+ this.productSubject.next(null);
58
+ else
59
+ variant ? this.initialize(result, product_id) : this.initialize(result);
60
+ return true;
61
+ });
62
+ this.initialize = (product, variant_code) => {
63
+ this.productSubject.next(product);
64
+ this.optionsSubject.next(this.getOptions());
65
+ variant_code ? this.updateVariants(variant_code) : this.updateVariants();
66
+ this.variants.length && this.generateAsociatedDataFromVariants();
67
+ this.fetchCartData();
68
+ //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
69
+ // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
70
+ };
71
+ this.setProduct = (product) => this.isProductValid(product) && this.initialize(product);
72
+ this.isReady = () => this.variants.length == 1;
73
+ this.setOption = (option_code, option_value) => {
74
+ let options = this.optionsSubject.value;
75
+ let option = options.find(element => element.code == option_code).values.find(value => value.name == option_value);
76
+ option.selected = !option.selected;
77
+ options.find(element => element.code == option_code).values.forEach(value => { if (value.name != option.name)
78
+ value.selected = false; });
79
+ this.optionsSubject.next(options);
80
+ this.updateVariants();
81
+ if (this.variants.length > 0) {
82
+ // Habilitar todos los botones con la clase 'addCartButton'
83
+ const submitButtons = document.querySelectorAll('.addCartButton');
84
+ submitButtons.forEach(button => {
85
+ button.disabled = false;
86
+ });
87
+ this.generateAsociatedDataFromVariants();
88
+ }
89
+ else {
90
+ this.toastrService.show('selection-not-available');
91
+ // Deshabilitar todos los botones con la clase 'submit-button'
92
+ const submitButtons = document.querySelectorAll('.addCartButton');
93
+ submitButtons.forEach(button => {
94
+ button.disabled = true;
95
+ });
96
+ }
97
+ };
98
+ this.changePicture = (picture) => {
99
+ let data = this.asociatedDataSubject.value;
100
+ data.picture = picture;
101
+ this.asociatedDataSubject.next(data);
102
+ };
103
+ this.handleError = (error) => {
104
+ // Whathever we need to do with error
105
+ };
106
+ this.addToCartPromise = (quantity) => __awaiter(this, void 0, void 0, function* () {
107
+ quantity = parseInt(quantity);
108
+ if (!this.variants.length) {
109
+ return { error: true, message: 'cant-buy' };
110
+ }
111
+ let product_selected = _.clone(this.productSubject.value);
112
+ if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
113
+ if (this.variants.length == 0)
114
+ return { error: true, message: 'no-variants' };
115
+ else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
116
+ return { error: true, message: 'variants-left' };
117
+ else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
118
+ return { error: true, message: 'out-of-stock' };
119
+ }
120
+ if (!this.validateQuantity(quantity))
121
+ return;
122
+ let result = yield this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code);
123
+ return (result && !(result.error));
124
+ });
125
+ this.getOptions = (product_received) => {
126
+ let product = product_received || this.productSubject.value;
127
+ let options = [];
128
+ product.options.forEach(element => {
129
+ options.push(this.toOption(element));
130
+ });
131
+ return options;
132
+ };
133
+ this.toOption = (preoption) => {
134
+ return {
135
+ name: preoption.label,
136
+ code: preoption.code,
137
+ type: preoption.type,
138
+ values: preoption.values.map(value => ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }))
139
+ };
140
+ };
141
+ this.updateVariants = (code) => {
142
+ let variants = this.productSubject.value.variants;
143
+ if (!code) {
144
+ this.optionsSubject.value.forEach(option => {
145
+ option.values.forEach(value => {
146
+ if (value.selected) {
147
+ variants = variants.filter(variant => {
148
+ return variant.options.some(variant_option => {
149
+ return (option.code in variant_option && variant_option[option.code] == value.name);
150
+ });
151
+ });
152
+ }
153
+ });
154
+ });
155
+ }
156
+ else {
157
+ variants = variants.filter(variant => variant.code == code);
158
+ }
159
+ this.variants = variants;
160
+ code && this.updateOptions();
161
+ };
162
+ this.updateOptions = () => {
163
+ let { options } = this.variants.length && this.variants[0];
164
+ options && options.forEach(option => Object.keys(option).forEach(key => this.setOption(key, option[key])));
165
+ };
166
+ this.generateAsociatedDataFromVariants = () => {
167
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
168
+ let asociated = {};
169
+ if (this.isReady()) {
170
+ asociated.stock = this.variants[0].stock;
171
+ asociated.price = this.variants[0].price.toString();
172
+ asociated.saleprice = this.variants[0].saleprice && this.variants[0].saleprice.toString() || undefined;
173
+ asociated.discount = ((_a = this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
174
+ asociated.properties = this.variants[0].properties ? this.beautifyProperties(this.variants[0].properties) : undefined;
175
+ asociated.uniqueExternalCode = ((_b = this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
176
+ asociated.multipleQuantity = ((_c = this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
177
+ }
178
+ else {
179
+ asociated.price = this.cratePrice();
180
+ asociated.saleprice = this.crateSalePrice();
181
+ asociated.stock = (this.variants.map(variant => variant.stock)).reduce((a, b) => a + b);
182
+ asociated.discount = this.crateDiscount();
183
+ }
184
+ ('images' in this.variants[0] && this.variants[0].images.length > 0)
185
+ ? asociated.picture = this.variants[0].images[0]
186
+ : asociated.picture = (this.asociatedDataSubject.value.picture || this.productSubject.value.picturesdefault[0]);
187
+ asociated.maximumAmount = ((_d = this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
188
+ asociated.minimumAmount = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
189
+ asociated.maximumItemsQuantity = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
190
+ asociated.minimumItemsQuantity = ((_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
191
+ && ((_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
192
+ asociated.finalConsumer = {
193
+ finalConsumerPrice: (_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
194
+ originalFinalConsumerPrice: (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
195
+ };
196
+ asociated.taxes = {
197
+ taxIncluded: (_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
198
+ taxCategory: (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
199
+ };
200
+ asociated.taxeAmount = ((_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxes) || undefined;
201
+ asociated.taxRate = ((_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxRate) || undefined;
202
+ asociated.priceWithoutTaxes = ((_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.priceWithoutTaxes) || undefined;
203
+ this.asociatedDataSubject.next(asociated);
204
+ };
205
+ /**
206
+ * @description Recibe las propiedades de una variante y por cada item arma un objeto con
207
+ * el name=clave y value=valor de ese item.
208
+ * @param properties
209
+ * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
210
+ */
211
+ this.beautifyProperties = (properties) => {
212
+ let beautifyData = [];
213
+ properties.forEach(prop => {
214
+ for (let key in prop) {
215
+ beautifyData.push({ name: key, value: prop[key] });
216
+ }
217
+ });
218
+ return beautifyData;
219
+ };
220
+ this.crateDiscount = () => {
221
+ try {
222
+ let all_discount = '';
223
+ this.variants.forEach(variant => {
224
+ variant.discount && (all_discount = all_discount + ', ' + variant.discount);
225
+ });
226
+ if (all_discount == '') {
227
+ return undefined;
228
+ }
229
+ return all_discount;
230
+ }
231
+ catch (error) {
232
+ return undefined;
233
+ }
234
+ };
235
+ this.cratePrice = () => {
236
+ let min_price = 0;
237
+ let max_price = 0;
238
+ let all_prices = [];
239
+ this.variants.forEach(variant => {
240
+ all_prices.push(variant.price);
241
+ });
242
+ min_price = all_prices.reduce((a, b) => Math.min(a, b));
243
+ max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
244
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
245
+ };
246
+ this.crateSalePrice = () => {
247
+ let min_price = 0;
248
+ let max_price = 0;
249
+ let all_prices = [];
250
+ this.variants.forEach(variant => {
251
+ variant.saleprice && all_prices.push(variant.saleprice);
252
+ });
253
+ if (!all_prices.length) {
254
+ return undefined;
255
+ }
256
+ min_price = all_prices.reduce((a, b) => Math.min(a, b));
257
+ max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
258
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
259
+ };
260
+ this.inRange = (quantity, min, max) => ((quantity - min) * (quantity - max) <= 0);
261
+ this.validateQuantity = (quantity) => {
262
+ const actualQuantity = this.cartService.getCountFromItemInCart(this.variants[0].code);
263
+ const asociatedData = this.asociatedDataSubject.value;
264
+ console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
265
+ if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
266
+ this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
267
+ return false;
268
+ }
269
+ if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
270
+ this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
271
+ return false;
272
+ }
273
+ return true;
274
+ };
275
+ this.validatePriceAndCredits = (price) => {
276
+ if (this.creditAmount === null) {
277
+ console.log('No hay configuración de créditos para este usuario.');
278
+ return true;
279
+ }
280
+ if (this.remainingCredits === undefined) {
281
+ return false;
282
+ }
283
+ if (price > this.remainingCredits) {
284
+ this.toastrService.show('not-enough-credits');
285
+ return false;
286
+ }
287
+ return true;
288
+ };
289
+ this.fetchCartData = () => {
290
+ this.cartService.getTotalAmount().subscribe((totalAmount) => {
291
+ this.currentTotalAmount = totalAmount;
292
+ });
293
+ this.cartService.getCreditAmount().subscribe((creditAmount) => {
294
+ this.creditAmount = creditAmount;
295
+ });
296
+ this.cartService.getRemainingCredits().subscribe((remainingCredits) => {
297
+ this.remainingCredits = remainingCredits;
298
+ });
299
+ };
300
+ // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
301
+ this.isProductValid = (product) => true;
302
+ /**
303
+ *
304
+ * @param product producto el cual se quiere desdoblar por variantes por una opción.
305
+ * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
306
+ * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
307
+ * @returns arreglo con el producto desdoblado por la variante solicitada.
308
+ * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
309
+ */
310
+ this.getProductWithUniqueVariant = (product, withOption) => {
311
+ return this.productsService.getProductsWithUniqueVariant([product], withOption);
312
+ };
313
+ }
314
+ /**
315
+ * @description agrega/actualiza un item en el carrito
316
+ * @param quantity cantidad a agregar
317
+ * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
318
+ * @returns
319
+ */
320
+ addToCart(quantity, variant_code) {
321
+ quantity = parseInt(quantity);
322
+ if (!this.variants.length) {
323
+ this.toastrService.show('cant-buy');
324
+ return;
325
+ }
326
+ let product_selected = _.clone(this.productSubject.value);
327
+ let variant;
328
+ switch (this.variants.length) {
329
+ case 0:
330
+ this.toastrService.show('no-variants');
331
+ break;
332
+ case 1:
333
+ this.asociatedDataSubject.value.stock == 0 ?
334
+ this.toastrService.show('out-of-stock') :
335
+ variant = this.variants[0];
336
+ break;
337
+ default:
338
+ if (variant_code) {
339
+ variant = this.variants.find(variant => variant.code === variant_code);
340
+ if (variant.stock == 0) {
341
+ this.toastrService.show('out-of-stock');
342
+ variant = undefined;
343
+ }
344
+ }
345
+ else {
346
+ this.toastrService.show('variants-left');
347
+ }
348
+ break;
349
+ }
350
+ if (!variant)
351
+ return;
352
+ if (!this.validateQuantity(quantity))
353
+ return;
354
+ const priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
355
+ if (!this.validatePriceAndCredits(priceToValidate))
356
+ return;
357
+ this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
358
+ }
359
+ ;
360
+ makeAffordableProduct(product_selected) {
361
+ product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
362
+ product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
363
+ product_selected.options = {};
364
+ this.variants[0].options.forEach(option => product_selected.options = Object.assign(Object.assign({}, product_selected.options), option));
365
+ return product_selected;
366
+ }
367
+ /**
368
+ *
369
+ * @param options Array de Variantes y sus valores
370
+ *
371
+ * @description Retorna una lista filtrada de las variantes que estan seleccionadas
372
+ */
373
+ getVariantsSelected(options, optionsException) {
374
+ let variantsSelected = [];
375
+ options.forEach(v => {
376
+ if (v.values && v.values.length) {
377
+ v.values.forEach(val => {
378
+ if (val.selected && !optionsException.find(op => op.toUpperCase() == v.code.toUpperCase())) {
379
+ variantsSelected[v.code] = val.name;
380
+ }
381
+ });
382
+ }
383
+ });
384
+ return variantsSelected;
385
+ }
386
+ /**
387
+ *
388
+ * @param options Array de Variantes y sus valores
389
+ * @param variants Todas las variantes disponibles del producto
390
+ *
391
+ * @description retorna todas las variantes disponibles a seleccion y su stock
392
+ */
393
+ getVariantsAvailable(options, variants, optionsException) {
394
+ let variantsSelected = this.getVariantsSelected(options, optionsException);
395
+ let variantsAvailable = [];
396
+ variants.map(v => {
397
+ let aux = {};
398
+ if (v.options && v.options.length) {
399
+ v.options.map(op => {
400
+ Object.assign(aux, op, { stock: v.stock });
401
+ });
402
+ }
403
+ variantsAvailable.push(aux);
404
+ });
405
+ return variantsAvailable.filter(va => this.constants.containsAll(Object.assign({}, variantsSelected), va));
406
+ }
407
+ /**
408
+ *
409
+ * @param options Array de variantes y sus valores
410
+ * @param code Codigo de la variante a buscar
411
+ * @param name nombre de la variante a buscar
412
+ * @param variants variantes del producto
413
+ *
414
+ * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
415
+ */
416
+ existVariantAndHasStock(options, code, name, variants, optionsException = []) {
417
+ return this.getVariantsAvailable(options, variants, optionsException).find(va => va.hasOwnProperty(code) && va[code] === name && va.stock > 0);
418
+ }
419
+ };
420
+ ProductDetailService.ctorParameters = () => [
421
+ { type: ProductsService },
422
+ { type: CartService },
423
+ { type: ToastService },
424
+ { type: Constants },
425
+ { type: AnalyticsService },
426
+ { type: CurrencyService }
427
+ ];
428
+ ProductDetailService = __decorate([
429
+ Injectable()
430
+ ], ProductDetailService);
431
+ export { ProductDetailService };
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBb0I7SUFlN0IsWUFDWSxlQUFnQyxFQUFVLFdBQXdCLEVBQVUsYUFBMkIsRUFDdkcsU0FBb0IsRUFBUyxnQkFBa0MsRUFBUyxlQUFnQztRQUR4RyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQ3ZHLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBZjVHLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJ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QWNKLENBQUE7O1lBamJnQyxlQUFlO1lBQXVCLFdBQVc7WUFBeUIsWUFBWTtZQUM1RixTQUFTO1lBQTJCLGdCQUFnQjtZQUEwQixlQUFlOztBQWpCM0csb0JBQW9CO0lBRGhDLFVBQVUsRUFBRTtHQUNBLG9CQUFvQixDQWljaEM7U0FqY1ksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHBhcnRpdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9wcm9kdWN0JztcclxuaW1wb3J0IHsgUHJvZHVjdHNTZXJ2aWNlIH0gZnJvbSAnLi9wcm9kdWN0cy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi9jYXJ0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vY29yZS5jb25zdHMnO1xyXG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XHJcbmltcG9ydCB7IEFuYWx5dGljc1NlcnZpY2UgfSBmcm9tICcuLi9hbmFseXRpY3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XHJcbmltcG9ydCB7IEN1cnJlbmN5U2VydmljZSB9IGZyb20gJy4uL2N1cnJlbmN5LnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdERldGFpbFNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgcHJvZHVjdFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByb2R1Y3Q+KHt9KTtcclxuICAgIHByaXZhdGUgb3B0aW9uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xyXG4gICAgcHJpdmF0ZSBhc29jaWF0ZWREYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7IHByaWNlOiAnJywgc3RvY2s6IDAsIHBpY3R1cmU6ICcnIH0pO1xyXG5cclxuICAgIHByaXZhdGUgdmFyaWFudHMgPSBbXVxyXG5cclxuICAgIHB1YmxpYyBwcm9kdWN0JCA9IHRoaXMucHJvZHVjdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgb3B0aW9ucyQgPSB0aGlzLm9wdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHVibGljIGFzb2NpYXRlZERhdGEkID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgY3VycmVudFRvdGFsQW1vdW50OiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGNyZWRpdEFtb3VudDogbnVtYmVyIHwgbnVsbDtcclxuICAgIHByaXZhdGUgcmVtYWluaW5nQ3JlZGl0czogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcHJvZHVjdHNTZXJ2aWNlOiBQcm9kdWN0c1NlcnZpY2UsIHByaXZhdGUgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLCBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLCBwdWJsaWMgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSwgcHVibGljIGN1cnJlbmN5U2VydmljZTogQ3VycmVuY3lTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBwYXJhbSBjb2RlIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXHJcbiAgICAqIEBwYXJhbSB2YXJpYW50IEluZGljYSBzaSBzZSBlc3TDoSBzb2xpY2l0YW5kbyB1biBwcm9kdWN0byBwb3Igc3UgY29kaWdvLCBvIHBvciBlbCBjb2RpZ28gY29ycmVzcG9uZGllbnRlIGEgdW5hIGRlIHN1cyB2YXJpYW50ZXNcclxuICAgICogIFxyXG4gICAgKiBDYXJnYSBlbCBwcm9kdWN0byBzb2xpY2l0YWRvIGFzeW5jcm9uaWNhbWVudGUgc2luIHJlc3B1ZXN0YSBcclxuICAgICovXHJcbiAgICBsb2FkUHJvZHVjdCA9IChjb2RlLCB2YXJpYW50OiBib29sZWFuID0gZmFsc2UpID0+XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KGNvZGUsIHZhcmlhbnQpLnRvUHJvbWlzZSgpLnRoZW4oXHJcbiAgICAgICAgICAgIHJlcyA9PiB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlcywgY29kZSkgOiB0aGlzLmluaXRpYWxpemUocmVzKSxcclxuICAgICAgICAgICAgZXJyID0+IHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKVxyXG4gICAgICAgIClcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0X2lkIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXHJcbiAgICAgKiBAYXN5bmNcclxuICAgICAqICBcclxuICAgICAqIEEgZGlmZXJlbmNpYSBkZWwgbWV0b2RvIGxvYWRQcm9kdWN0LCBlc3RlIHJldG9ybmEgdW4gdmFsb3IgY3VhbmRvIHRlcm1pbmEgXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3QgPSBhc3luYyAocHJvZHVjdF9pZCwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChwcm9kdWN0X2lkLCB2YXJpYW50KS50b1Byb21pc2UoKTtcclxuICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKTtcclxuICAgICAgICBlbHNlIHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzdWx0LCBwcm9kdWN0X2lkKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZSA9IChwcm9kdWN0LCB2YXJpYW50X2NvZGU/KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KHByb2R1Y3QpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dCh0aGlzLmdldE9wdGlvbnMoKSlcclxuICAgICAgICB2YXJpYW50X2NvZGUgPyB0aGlzLnVwZGF0ZVZhcmlhbnRzKHZhcmlhbnRfY29kZSkgOiB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmZldGNoQ2FydERhdGEoKVxyXG4gICAgICAgIC8vdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtJywgeyAuLi5wcm9kdWN0LCBjdXJyZW5jeTogdGhpcy5jb25zdGFudHMuY3VycmVuY3kuY29kZSB9KVxyXG4gICAgICAgIC8vIHZhcmlhbnRfY29kZSAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvZHVjdCA9IChwcm9kdWN0KSA9PiB0aGlzLmlzUHJvZHVjdFZhbGlkKHByb2R1Y3QpICYmIHRoaXMuaW5pdGlhbGl6ZShwcm9kdWN0KTtcclxuXHJcbiAgICBpc1JlYWR5ID0gKCkgPT4gdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMTtcclxuXHJcbiAgICBzZXRPcHRpb24gPSAob3B0aW9uX2NvZGUsIG9wdGlvbl92YWx1ZSkgPT4ge1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZTtcclxuICAgICAgICBsZXQgb3B0aW9uID0gb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5uYW1lID09IG9wdGlvbl92YWx1ZSk7XHJcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gIW9wdGlvbi5zZWxlY3RlZDtcclxuICAgICAgICBvcHRpb25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT0gb3B0aW9uX2NvZGUpLnZhbHVlcy5mb3JFYWNoKFxyXG4gICAgICAgICAgICB2YWx1ZSA9PiB7IGlmICh2YWx1ZS5uYW1lICE9IG9wdGlvbi5uYW1lKSB2YWx1ZS5zZWxlY3RlZCA9IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dChvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBIYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdhZGRDYXJ0QnV0dG9uJ1xyXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcclxuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc2VsZWN0aW9uLW5vdC1hdmFpbGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIC8vIERlc2hhYmlsaXRhciB0b2RvcyBsb3MgYm90b25lcyBjb24gbGEgY2xhc2UgJ3N1Ym1pdC1idXR0b24nXHJcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xyXG4gICAgICAgICAgICBzdWJtaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcclxuICAgICAgICAgICAgICAgIChidXR0b24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VQaWN0dXJlID0gKHBpY3R1cmUpID0+IHtcclxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XHJcbiAgICAgICAgZGF0YS5waWN0dXJlID0gcGljdHVyZTtcclxuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBXaGF0aGV2ZXIgd2UgbmVlZCB0byBkbyB3aXRoIGVycm9yXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYWdyZWdhL2FjdHVhbGl6YSB1biBpdGVtIGVuIGVsIGNhcnJpdG8gXHJcbiAgICAgKiBAcGFyYW0gcXVhbnRpdHkgY2FudGlkYWQgYSBhZ3JlZ2FyXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudF9jb2RlICoqKG9wY2lvbmFsKSoqIGNvZGlnbyBkZSBsYSB2YXJpYW50ZSBzZWxlY2Npb25hZGEgZGVsIHByb2R1Y3RvLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FydChxdWFudGl0eSwgdmFyaWFudF9jb2RlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhbnQtYnV5Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgdmFyaWFudDogYW55O1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHRoaXMudmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby12YXJpYW50cycpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCA/XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpIDpcclxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdGhpcy52YXJpYW50c1swXVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudF9jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHRoaXMudmFyaWFudHMuZmluZCh2YXJpYW50ID0+IHZhcmlhbnQuY29kZSA9PT0gdmFyaWFudF9jb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW50LnN0b2NrID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCd2YXJpYW50cy1sZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF2YXJpYW50KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUXVhbnRpdHkocXVhbnRpdHkpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHByaWNlVG9WYWxpZGF0ZSA9IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlID8gcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgKiBxdWFudGl0eSA6IHByb2R1Y3Rfc2VsZWN0ZWQucHJpY2UgKiBxdWFudGl0eTtcclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMocHJpY2VUb1ZhbGlkYXRlKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydCh0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKSwgcXVhbnRpdHksIHZhcmlhbnQuY29kZSk7XHJcbiAgICB9O1xyXG5cclxuXHJcblxyXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChxdWFudGl0eSkgPT4ge1xyXG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xyXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdjYW50LWJ1eScgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgfHwgdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMCB8fCB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnbm8tdmFyaWFudHMnIH07XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID4gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICd2YXJpYW50cy1sZWZ0JyB9O1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCAhPSAwICYmIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdvdXQtb2Ytc3RvY2snIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydFByb21pc2UodGhpcy5tYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZCksIHF1YW50aXR5LCB0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xyXG4gICAgICAgIHJldHVybiAocmVzdWx0ICYmICEocmVzdWx0LmVycm9yKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZ2V0T3B0aW9ucyA9IChwcm9kdWN0X3JlY2VpdmVkPzogUHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGxldCBwcm9kdWN0ID0gcHJvZHVjdF9yZWNlaXZlZCB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gW107XHJcbiAgICAgICAgcHJvZHVjdC5vcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLnRvT3B0aW9uKGVsZW1lbnQpKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9PcHRpb24gPSAocHJlb3B0aW9uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmFtZTogcHJlb3B0aW9uLmxhYmVsLFxyXG4gICAgICAgICAgICBjb2RlOiBwcmVvcHRpb24uY29kZSxcclxuICAgICAgICAgICAgdHlwZTogcHJlb3B0aW9uLnR5cGUsXHJcbiAgICAgICAgICAgIHZhbHVlczogcHJlb3B0aW9uLnZhbHVlcy5tYXAodmFsdWUgPT4gKHsgbmFtZTogdmFsdWUuY29kZSwgZGVzY3JpcHRpb246IHZhbHVlLm5hbWUsIGltYWdlOiB2YWx1ZS5pbWFnZSwgbW9iaWxlSW1hZ2U6IHZhbHVlLm1vYmlsZUltYWdlLCBzZWxlY3RlZDogZmFsc2UgfSkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQ6IFByb2R1Y3QpIHtcclxuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcclxuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XHJcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy52YXJpYW50c1swXS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHsgLi4ucHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zLCAuLi5vcHRpb24gfSlcclxuICAgICAgICByZXR1cm4gcHJvZHVjdF9zZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhcmlhbnRzID0gKGNvZGU/KSA9PiB7XHJcbiAgICAgICAgbGV0IHZhcmlhbnRzID0gdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS52YXJpYW50cztcclxuICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZS5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb24udmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50cyA9IHZhcmlhbnRzLmZpbHRlcih2YXJpYW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMuc29tZSh2YXJpYW50X29wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcHRpb24uY29kZSBpbiB2YXJpYW50X29wdGlvbiAmJiB2YXJpYW50X29wdGlvbltvcHRpb24uY29kZV0gPT0gdmFsdWUubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT0gY29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFyaWFudHMgPSB2YXJpYW50cztcclxuICAgICAgICBjb2RlICYmIHRoaXMudXBkYXRlT3B0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlT3B0aW9ucyA9ICgpID0+IHtcclxuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLnZhcmlhbnRzWzBdO1xyXG4gICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goa2V5ID0+IHRoaXMuc2V0T3B0aW9uKGtleSwgb3B0aW9uW2tleV0pKSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cyA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYXNvY2lhdGVkOiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gdGhpcy52YXJpYW50c1swXS5zdG9ja1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnByaWNlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlICYmIHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlLnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQuZGlzY291bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5kaXNjb3VudCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcm9wZXJ0aWVzID0gdGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzID8gdGhpcy5iZWF1dGlmeVByb3BlcnRpZXModGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnVuaXF1ZUV4dGVybmFsQ29kZSA9IHRoaXMudmFyaWFudHNbMF0/LnVuaXF1ZUV4dGVybmFsQ29kZSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5tdWx0aXBsZVF1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy5jcmF0ZVByaWNlKClcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMuY3JhdGVTYWxlUHJpY2UoKVxyXG4gICAgICAgICAgICBhc29jaWF0ZWQuc3RvY2sgPSAodGhpcy52YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnN0b2NrKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYilcclxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy5jcmF0ZURpc2NvdW50KClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICgnaW1hZ2VzJyBpbiB0aGlzLnZhcmlhbnRzWzBdICYmIHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgID8gYXNvY2lhdGVkLnBpY3R1cmUgPSB0aGlzLnZhcmlhbnRzWzBdLmltYWdlc1swXVxyXG4gICAgICAgICAgICA6IGFzb2NpYXRlZC5waWN0dXJlID0gKHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucGljdHVyZSB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlLnBpY3R1cmVzZGVmYXVsdFswXSk7XHJcblxyXG5cclxuICAgICAgICBhc29jaWF0ZWQubWF4aW11bUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1BbW91bnQgfHwgMFxyXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUFtb3VudCB8fCAwXHJcblxyXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtSXRlbXNRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrID4gMCAmJiAnbWF4aW11bUl0ZW1zUXVhbnRpdHknIGluIHRoaXMudmFyaWFudHNbMF0gPyB0aGlzLnZhcmlhbnRzWzBdPy5tYXhpbXVtSXRlbXNRdWFudGl0eSA6IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrXHJcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtaW5pbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXVxyXG4gICAgICAgICAgICAmJiB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eSA+IDAgPyB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eVxyXG4gICAgICAgICAgICA6ICh0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5ID8gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSA6IDEpXHJcblxyXG4gICAgICAgIGFzb2NpYXRlZC5maW5hbENvbnN1bWVyID0ge1xyXG4gICAgICAgICAgICBmaW5hbENvbnN1bWVyUHJpY2U6IHRoaXMudmFyaWFudHNbMF0/LmZpbmFsX2NvbnN1bWVyX3ByaWNlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbEZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8ub3JpZ2luYWxfZmluYWxfY29uc3VtZXJfcHJpY2UsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc29jaWF0ZWQudGF4ZXMgPSB7XHJcbiAgICAgICAgICAgIHRheEluY2x1ZGVkOiB0aGlzLnZhcmlhbnRzWzBdPy50YXhJbmNsdWRlZCxcclxuICAgICAgICAgICAgdGF4Q2F0ZWdvcnk6IHRoaXMudmFyaWFudHNbMF0/LnRheENhdGVnb3J5LFxyXG4gICAgICAgIH1cclxuICAgICAgICBhc29jaWF0ZWQudGF4ZUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LnRheGVzIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBhc29jaWF0ZWQudGF4UmF0ZSA9IHRoaXMudmFyaWFudHNbMF0/LnRheFJhdGUgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGFzb2NpYXRlZC5wcmljZVdpdGhvdXRUYXhlcyA9IHRoaXMudmFyaWFudHNbMF0/LnByaWNlV2l0aG91dFRheGVzIHx8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGFzb2NpYXRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjaWJlIGxhcyBwcm9waWVkYWRlcyBkZSB1bmEgdmFyaWFudGUgeSBwb3IgY2FkYSBpdGVtIGFybWEgdW4gb2JqZXRvIGNvbiBcclxuICAgICAqIGVsIG5hbWU9Y2xhdmUgeSB2YWx1ZT12YWxvciBkZSBlc2UgaXRlbS4gIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgXHJcbiAgICAgKiBAcmV0dXJucyBVbiBhcnJlZ2xvIGNvbiBsYXMgcHJvcGllZGFkZXMgZGUgbGEgZm9ybWEgeyBuYW1lID0gLi4uICwgdmFsdWUgPSAuLi59XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmVhdXRpZnlQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXMpID0+IHtcclxuICAgICAgICBsZXQgYmVhdXRpZnlEYXRhID0gW11cclxuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICBiZWF1dGlmeURhdGEucHVzaCh7IG5hbWU6IGtleSwgdmFsdWU6IHByb3Bba2V5XSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGJlYXV0aWZ5RGF0YVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JhdGVEaXNjb3VudCA9ICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWxsX2Rpc2NvdW50ID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHZhcmlhbnQuZGlzY291bnQgJiYgKGFsbF9kaXNjb3VudCA9IGFsbF9kaXNjb3VudCArICcsICcgKyB2YXJpYW50LmRpc2NvdW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChhbGxfZGlzY291bnQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWxsX2Rpc2NvdW50XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyYXRlUHJpY2UgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnByaWNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xyXG4gICAgICAgIG1heF9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JhdGVTYWxlUHJpY2UgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhbnQuc2FsZXByaWNlICYmIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnNhbGVwcmljZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFhbGxfcHJpY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pbl9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSk7XHJcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcclxuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpblJhbmdlID0gKHF1YW50aXR5LCBtaW4sIG1heCkgPT4gKChxdWFudGl0eSAtIG1pbikgKiAocXVhbnRpdHkgLSBtYXgpIDw9IDApXHJcblxyXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVF1YW50aXR5ID0gKHF1YW50aXR5OiBudW1iZXIpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxRdWFudGl0eSA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0Q291bnRGcm9tSXRlbUluQ2FydCh0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xyXG4gICAgICAgIGNvbnN0IGFzb2NpYXRlZERhdGEgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdMYSBjYW50aWRhZCBxdWUgbGxlZ286ICcsIHF1YW50aXR5LCAnIHkgbGEgY2FudGlkYWQgYWN0dWFsOiAnLCBhY3R1YWxRdWFudGl0eSk7XHJcbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA+IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5IH0pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA8IGFzb2NpYXRlZERhdGEubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzID0gKHByaWNlOiBudW1iZXIpOiBib29sZWFuID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jcmVkaXRBbW91bnQgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIGhheSBjb25maWd1cmFjacOzbiBkZSBjcsOpZGl0b3MgcGFyYSBlc3RlIHVzdWFyaW8uJyk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMucmVtYWluaW5nQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChwcmljZSA+IHRoaXMucmVtYWluaW5nQ3JlZGl0cykge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbm90LWVub3VnaC1jcmVkaXRzJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSBmZXRjaENhcnREYXRhID0gKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0VG90YWxBbW91bnQoKS5zdWJzY3JpYmUoKHRvdGFsQW1vdW50KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFRvdGFsQW1vdW50ID0gdG90YWxBbW91bnQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0Q3JlZGl0QW1vdW50KCkuc3Vic2NyaWJlKChjcmVkaXRBbW91bnQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jcmVkaXRBbW91bnQgPSBjcmVkaXRBbW91bnQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0UmVtYWluaW5nQ3JlZGl0cygpLnN1YnNjcmliZSgocmVtYWluaW5nQ3JlZGl0cykgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnJlbWFpbmluZ0NyZWRpdHMgPSByZW1haW5pbmdDcmVkaXRzO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBDdWFuZG8gaGF5YSBtb2RlbG9zIGRlIHJlc3B1ZXN0YSwgdmFsaWRhbW9zIHF1ZSBubyBzZSBpbnRlbnRlIGNhcmdhciB1biBwcm9kdWN0byBpbmNvbXBsZXRvXHJcbiAgICBwcml2YXRlIGlzUHJvZHVjdFZhbGlkID0gKHByb2R1Y3Q6IFByb2R1Y3QpID0+IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXHJcbiAgICAgKiBcclxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXRvcm5hIHVuYSBsaXN0YSBmaWx0cmFkYSBkZSBsYXMgdmFyaWFudGVzIHF1ZSBlc3RhbiBzZWxlY2Npb25hZGFzXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zOiBhbnksIG9wdGlvbnNFeGNlcHRpb246IEFycmF5PGFueT4pOiBBcnJheTxPYmplY3Q+IHtcclxuXHJcbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSBbXTtcclxuICAgICAgICBvcHRpb25zLmZvckVhY2godiA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2LnZhbHVlcyAmJiB2LnZhbHVlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHYudmFsdWVzLmZvckVhY2godmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnNlbGVjdGVkICYmICFvcHRpb25zRXhjZXB0aW9uLmZpbmQob3AgPT4gb3AudG9VcHBlckNhc2UoKSA9PSB2LmNvZGUudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHNTZWxlY3RlZFt2LmNvZGVdID0gdmFsLm5hbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdmFyaWFudHNTZWxlY3RlZDtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgVG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBkZWwgcHJvZHVjdG9cclxuICAgICAqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIHJldG9ybmEgdG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBhIHNlbGVjY2lvbiB5IHN1IHN0b2NrXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zOiBhbnksIHZhcmlhbnRzOiBhbnksIG9wdGlvbnNFeGNlcHRpb246IEFycmF5PGFueT4pOiBhbnkge1xyXG5cclxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IHRoaXMuZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zLCBvcHRpb25zRXhjZXB0aW9uKTtcclxuXHJcbiAgICAgICAgbGV0IHZhcmlhbnRzQXZhaWxhYmxlID0gW107XHJcblxyXG4gICAgICAgIHZhcmlhbnRzLm1hcCh2ID0+IHtcclxuXHJcbiAgICAgICAgICAgIGxldCBhdXggPSB7fTtcclxuICAgICAgICAgICAgaWYgKHYub3B0aW9ucyAmJiB2Lm9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB2Lm9wdGlvbnMubWFwKG9wID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF1eCwgb3AsIHsgc3RvY2s6IHYuc3RvY2sgfSk7XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhcmlhbnRzQXZhaWxhYmxlLnB1c2goYXV4KTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiB2YXJpYW50c0F2YWlsYWJsZS5maWx0ZXIodmEgPT4gdGhpcy5jb25zdGFudHMuY29udGFpbnNBbGwoeyAuLi52YXJpYW50c1NlbGVjdGVkIH0sIHZhKSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIHZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXHJcbiAgICAgKiBAcGFyYW0gY29kZSBDb2RpZ28gZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcclxuICAgICAqIEBwYXJhbSBuYW1lIG5vbWJyZSBkZSBsYSB2YXJpYW50ZSBhIGJ1c2NhclxyXG4gICAgICogQHBhcmFtIHZhcmlhbnRzIHZhcmlhbnRlcyBkZWwgcHJvZHVjdG9cclxuICAgICAqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIGJ1c2NhIGVuIGxhIGxpc3RhIGRlIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBzaSBoYXkgZGUgZXNlIGNvZGlnbywgZXNlIG5vbWJyZSB5IGNvbiBzdG9jayBcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4aXN0VmFyaWFudEFuZEhhc1N0b2NrKG9wdGlvbnMsIGNvZGUsIG5hbWUsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uID0gW10pOiBib29sZWFuIHtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9ucywgdmFyaWFudHMsIG9wdGlvbnNFeGNlcHRpb24pLmZpbmQodmEgPT5cclxuICAgICAgICAgICAgdmEuaGFzT3duUHJvcGVydHkoY29kZSkgJiYgdmFbY29kZV0gPT09IG5hbWUgJiYgdmEuc3RvY2sgPiAwKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCBwcm9kdWN0byBlbCBjdWFsIHNlIHF1aWVyZSBkZXNkb2JsYXIgcG9yIHZhcmlhbnRlcyBwb3IgdW5hIG9wY2nDs24uXHJcbiAgICAgKiBAcGFyYW0gd2l0aE9wdGlvbiAndHlwZScgdGlwbyBkZSBvcGNpw7NuLCBjb2RlOiBjw7NkaWdvIGRlIGxhIG9wY2nDs24uICdkZWZhdWx0Rmlyc3RPcHRpb24nOiBlbiBjYXNvIGRlIHF1ZSBubyBzZSBwdWVkYSBkZXNkb2JsYXIgcG9yIGxhIG9wY2nDs24gaW5kaWNhZGEgc2kgZWwgdmFsb3IgZXMgdmVyZGFkZXJvIHNlIGludGVudGFyYSBkZXNkb2JsYXIgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0by5cclxuICAgICAqICdjaGVja0lmU3RvY2snOiBlbiBjYXNvIGRlIHF1ZSBlc3RhIHZhbG9yIHNlYSB2ZXJkYWRlcm8gc2UgcmVhbGl6YSB1biBjb250cm9sIGRlIHF1ZSBsYSB2YXJpYW50ZXMgY3VlbnRlbiBjb24gc3RvY2sgcGFyYSBzZXIgdW4gcHJvZHVjdG8gZGVzZG9ibGFkbyBwb3IgbGEgdmFyaWFudGUsIHNpIGVsIHZhbG9yIGVzIGZhbHNvIG5vIHNlIHJlYWxpemEgZGljaG8gY29udHJvbCB5IGVsIHByb2R1Y3RvIHNlIGRlc2RvYmxhcmEgY29uIHN0b2NrIGVuIDAuXHJcbiAgICAgKiBAcmV0dXJucyBhcnJlZ2xvIGNvbiBlbCBwcm9kdWN0byBkZXNkb2JsYWRvIHBvciBsYSB2YXJpYW50ZSBzb2xpY2l0YWRhLlxyXG4gICAgICogKG9wY2nDs24gcG9yIGRlZmVjdG8gcXVlIHNlIGludGVudGEgaGFjZXIgZWwgZGVzZG9ibGFtaWVudG8gJ2NvbG9yJywgbyBiaWVuIHNpIGVuIGxlIHBhcsOhbWV0cm8gd2l0aE9wdGlvbiBlbCBhdHJpYnV0byAnZGVmYXVsdEZpcnN0T3B0aW9uJyBlcyB2ZXJkYWRlcm8gc2UgZGVzZG9ibGEgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0byApIFxyXG4gICAgICovXHJcbiAgICBnZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQgPSAocHJvZHVjdCwgd2l0aE9wdGlvbj86IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChbcHJvZHVjdF0sIHdpdGhPcHRpb24pXHJcbiAgICB9XHJcblxyXG59Il19