ng-easycommerce 0.0.593 → 0.0.595

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (592) hide show
  1. package/README.md +915 -910
  2. package/assets/bamboo.html +145 -145
  3. package/assets/bancardCatastro.html +49 -49
  4. package/assets/bancardFrameBase.html +104 -104
  5. package/assets/cecaFrameRedirectBase.html +172 -172
  6. package/assets/decidirFormEc.html +516 -516
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +282 -282
  10. package/assets/ec-i18n/en.json +3 -1
  11. package/assets/ec-i18n/es.json +393 -391
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +282 -282
  14. package/assets/ec-i18n/pr.json +282 -282
  15. package/assets/images/whatsapp.png +0 -0
  16. package/assets/mpFrameRedirectBase.html +114 -114
  17. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  18. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  19. package/assets/recaptcha/recaptcha-sites.json +52 -52
  20. package/assets/redirect.html +62 -62
  21. package/assets/redsysAuthVdosBase.html +78 -78
  22. package/assets/redsysAuthVunoBase.html +84 -84
  23. package/assets/redsysFrameRedirectBase.html +102 -102
  24. package/assets/redsysFrameRedirectOutBase.html +102 -102
  25. package/assets/redsysFrameSendBase.html +71 -71
  26. package/assets/redsysProBase.html +399 -399
  27. package/assets/redsysStateBase.html +63 -63
  28. package/assets/scss/_colors.scss +17 -17
  29. package/assets/scss/_styles.scss +22 -22
  30. package/assets/svg/chevron-left-black.svg +61 -61
  31. package/assets/svg/chevron-right-black.svg +61 -61
  32. package/bundles/ng-easycommerce.umd.js +19241 -19232
  33. package/bundles/ng-easycommerce.umd.js.map +1 -1
  34. package/bundles/ng-easycommerce.umd.min.js +1 -1
  35. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  36. package/esm2015/lib/api/connection.service.js +77 -77
  37. package/esm2015/lib/classes/checkout/step-service.js +39 -39
  38. package/esm2015/lib/classes/checkout/step.js +22 -22
  39. package/esm2015/lib/classes/checkout-process-state.js +2 -2
  40. package/esm2015/lib/classes/component-helper.js +14 -14
  41. package/esm2015/lib/classes/filters/AttributesFilter.js +61 -61
  42. package/esm2015/lib/classes/filters/CategoryFilter.js +54 -54
  43. package/esm2015/lib/classes/filters/DinamycsFilter.js +58 -58
  44. package/esm2015/lib/classes/filters/Filter.js +75 -75
  45. package/esm2015/lib/classes/filters/PriceRangeFilter.js +51 -51
  46. package/esm2015/lib/classes/filters/SortFilter.js +79 -79
  47. package/esm2015/lib/classes/user-role-type.js +1 -1
  48. package/esm2015/lib/classes/user.js +108 -108
  49. package/esm2015/lib/core.consts.js +402 -402
  50. package/esm2015/lib/ec-component/account-ec/account-ec.component.js +45 -45
  51. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +112 -112
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +188 -188
  53. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +115 -115
  54. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +44 -44
  55. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +58 -58
  56. package/esm2015/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +108 -108
  57. package/esm2015/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +166 -166
  58. package/esm2015/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +165 -165
  59. package/esm2015/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +78 -78
  60. package/esm2015/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +138 -138
  61. package/esm2015/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +110 -110
  62. package/esm2015/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +138 -138
  63. package/esm2015/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +38 -38
  64. package/esm2015/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +152 -152
  65. package/esm2015/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +119 -119
  66. package/esm2015/lib/ec-component/blocks-ec/blocks-ec.component.js +70 -70
  67. package/esm2015/lib/ec-component/build-your-ec/build-your-ec.component.js +305 -305
  68. package/esm2015/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +85 -85
  69. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +383 -383
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +146 -146
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +354 -354
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +78 -78
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +127 -127
  74. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +112 -112
  75. package/esm2015/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +53 -53
  76. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +65 -65
  77. package/esm2015/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +80 -80
  78. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +220 -220
  79. package/esm2015/lib/ec-component/compared-products-ec/compared-products-ec.component.js +186 -186
  80. package/esm2015/lib/ec-component/cookies-ec/cookies-ec.component.js +109 -109
  81. package/esm2015/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +32 -32
  82. package/esm2015/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +34 -34
  83. package/esm2015/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +34 -34
  84. package/esm2015/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +35 -35
  85. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +53 -53
  86. package/esm2015/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +49 -49
  87. package/esm2015/lib/ec-component/filters-ec/filters-ec.component.js +152 -152
  88. package/esm2015/lib/ec-component/filters-top-ec/filters-top-ec.component.js +102 -102
  89. package/esm2015/lib/ec-component/footer-ec/footer-ec.component.js +80 -80
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +186 -186
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +241 -241
  93. package/esm2015/lib/ec-component/login-ec/login-ec.component.js +102 -102
  94. package/esm2015/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +90 -90
  95. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +103 -103
  96. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +165 -165
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +123 -123
  98. package/esm2015/lib/ec-component/related-products-ec/related-products-ec.component.js +94 -94
  99. package/esm2015/lib/ec-component/reviews-ec/reviews-ec.component.js +69 -69
  100. package/esm2015/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +138 -138
  101. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +86 -86
  102. package/esm2015/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +130 -130
  103. package/esm2015/lib/ec-component/share-block-ec/share-block-ec.component.js +149 -149
  104. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +117 -117
  105. package/esm2015/lib/ec-component/stores-ec/stores-ec.component.js +192 -192
  106. package/esm2015/lib/ec-component/variants-ec/variants-ec.component.js +56 -56
  107. package/esm2015/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +205 -205
  108. package/esm2015/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +296 -296
  109. package/esm2015/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +154 -154
  110. package/esm2015/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +144 -144
  111. package/esm2015/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +49 -49
  112. package/esm2015/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +133 -133
  113. package/esm2015/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +152 -152
  114. package/esm2015/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +175 -175
  115. package/esm2015/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +30 -30
  116. package/esm2015/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +26 -26
  117. package/esm2015/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +21 -21
  118. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +156 -156
  119. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +368 -368
  120. package/esm2015/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +151 -151
  121. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +178 -178
  122. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +44 -44
  123. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  124. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  125. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  129. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  130. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  131. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  132. package/esm2015/lib/ec-directive/index.js +36 -36
  133. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  134. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  135. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  136. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  137. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  138. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/index.js +13 -13
  141. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  142. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  143. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  144. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  145. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  146. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  147. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  148. package/esm2015/lib/interfaces/Script.js +1 -1
  149. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  153. package/esm2015/lib/interfaces/block.js +1 -1
  154. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  155. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  156. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  157. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  158. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  159. package/esm2015/lib/interfaces/cookies.js +1 -1
  160. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  161. package/esm2015/lib/interfaces/coupon.js +1 -1
  162. package/esm2015/lib/interfaces/deserializable.js +1 -1
  163. package/esm2015/lib/interfaces/faqs.js +1 -1
  164. package/esm2015/lib/interfaces/filter.js +1 -1
  165. package/esm2015/lib/interfaces/filterStep.js +1 -1
  166. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  167. package/esm2015/lib/interfaces/paginate.js +1 -1
  168. package/esm2015/lib/interfaces/parameters.js +1 -1
  169. package/esm2015/lib/interfaces/selection.js +4 -4
  170. package/esm2015/lib/interfaces/step.js +1 -1
  171. package/esm2015/lib/interfaces/store.js +1 -1
  172. package/esm2015/lib/ng-easycommerce.module.js +179 -179
  173. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  174. package/esm2015/lib/services/account/orders.service.js +102 -102
  175. package/esm2015/lib/services/analytics.service.js +57 -57
  176. package/esm2015/lib/services/auth.service.js +339 -339
  177. package/esm2015/lib/services/banner.service.js +72 -72
  178. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  179. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  180. package/esm2015/lib/services/captcha.service.js +130 -130
  181. package/esm2015/lib/services/cart.service.js +572 -563
  182. package/esm2015/lib/services/channel-config.service.js +105 -105
  183. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  184. package/esm2015/lib/services/checkout/checkout.service.js +233 -235
  185. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  186. package/esm2015/lib/services/checkout/payment.service.js +77 -77
  187. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  188. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  189. package/esm2015/lib/services/cookies.service.js +208 -208
  190. package/esm2015/lib/services/currency.service.js +161 -161
  191. package/esm2015/lib/services/dataform.service.js +46 -46
  192. package/esm2015/lib/services/filters.service.js +122 -122
  193. package/esm2015/lib/services/gift-card.service.js +61 -61
  194. package/esm2015/lib/services/ip-address.service.js +34 -34
  195. package/esm2015/lib/services/options.service.js +275 -275
  196. package/esm2015/lib/services/pagination.service.js +73 -73
  197. package/esm2015/lib/services/parameters.service.js +72 -72
  198. package/esm2015/lib/services/products/product-detail.service.js +429 -429
  199. package/esm2015/lib/services/products/products.service.js +287 -287
  200. package/esm2015/lib/services/reviews.service.js +107 -107
  201. package/esm2015/lib/services/stores.service.js +37 -37
  202. package/esm2015/lib/services/windows.service.js +52 -52
  203. package/esm2015/lib/services/wishlist.service.js +70 -70
  204. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  205. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  206. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  207. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  208. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  209. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  210. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  211. package/esm2015/lib/utils/order-util.service.js +72 -72
  212. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  213. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  214. package/esm2015/lib/utils/toast.service.js +42 -42
  215. package/esm2015/lib/utils/utils.service.js +20 -20
  216. package/esm2015/ng-easycommerce.js +33 -33
  217. package/esm2015/public-api.js +146 -146
  218. package/esm5/lib/api/connection.service.js +90 -90
  219. package/esm5/lib/classes/checkout/step-service.js +74 -74
  220. package/esm5/lib/classes/checkout/step.js +25 -25
  221. package/esm5/lib/classes/checkout-process-state.js +2 -2
  222. package/esm5/lib/classes/component-helper.js +18 -18
  223. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  224. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  225. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  226. package/esm5/lib/classes/filters/Filter.js +78 -78
  227. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  228. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  229. package/esm5/lib/classes/user-role-type.js +1 -1
  230. package/esm5/lib/classes/user.js +120 -120
  231. package/esm5/lib/core.consts.js +422 -422
  232. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  233. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +166 -166
  234. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +205 -205
  235. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  236. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  237. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  238. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  239. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +183 -183
  240. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +182 -182
  241. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  242. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +166 -166
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  244. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  245. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  246. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  247. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  248. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  249. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  250. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  251. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +467 -467
  252. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +163 -163
  253. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +439 -439
  254. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +95 -95
  255. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +217 -217
  256. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  257. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  258. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +82 -82
  259. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  260. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  261. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  262. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  263. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  264. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  265. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  267. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  268. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  269. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  270. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  271. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +109 -109
  272. package/esm5/lib/ec-component/header-ec/header-ec.component.js +245 -245
  273. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  274. package/esm5/lib/ec-component/index.js +241 -241
  275. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  276. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  277. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  278. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +192 -192
  279. package/esm5/lib/ec-component/product-ec/product-ec.component.js +141 -141
  280. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  281. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  282. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  283. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  284. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  285. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  286. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +120 -120
  287. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  288. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  289. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  290. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  291. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  292. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  293. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  294. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  295. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  296. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  297. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  298. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  299. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  300. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  302. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  303. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  304. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +60 -60
  305. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  306. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  307. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  308. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  309. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  310. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  311. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  312. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  313. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  314. package/esm5/lib/ec-directive/index.js +36 -36
  315. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  316. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  317. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  318. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  319. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  320. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  321. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  322. package/esm5/lib/ec-pipe/index.js +13 -13
  323. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  324. package/esm5/lib/guards/auth-guard.service.js +37 -37
  325. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  326. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  327. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  328. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  329. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  330. package/esm5/lib/interfaces/Script.js +1 -1
  331. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  332. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  333. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  334. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  335. package/esm5/lib/interfaces/block.js +1 -1
  336. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  337. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  338. package/esm5/lib/interfaces/checkout-data.js +1 -1
  339. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  340. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  341. package/esm5/lib/interfaces/cookies.js +1 -1
  342. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  343. package/esm5/lib/interfaces/coupon.js +1 -1
  344. package/esm5/lib/interfaces/deserializable.js +1 -1
  345. package/esm5/lib/interfaces/faqs.js +1 -1
  346. package/esm5/lib/interfaces/filter.js +1 -1
  347. package/esm5/lib/interfaces/filterStep.js +1 -1
  348. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  349. package/esm5/lib/interfaces/paginate.js +1 -1
  350. package/esm5/lib/interfaces/parameters.js +1 -1
  351. package/esm5/lib/interfaces/selection.js +4 -4
  352. package/esm5/lib/interfaces/step.js +1 -1
  353. package/esm5/lib/interfaces/store.js +1 -1
  354. package/esm5/lib/ng-easycommerce.module.js +183 -183
  355. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  356. package/esm5/lib/services/account/orders.service.js +120 -120
  357. package/esm5/lib/services/analytics.service.js +60 -60
  358. package/esm5/lib/services/auth.service.js +413 -413
  359. package/esm5/lib/services/banner.service.js +81 -81
  360. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  361. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  362. package/esm5/lib/services/captcha.service.js +132 -132
  363. package/esm5/lib/services/cart.service.js +701 -690
  364. package/esm5/lib/services/channel-config.service.js +107 -107
  365. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  366. package/esm5/lib/services/checkout/checkout.service.js +316 -318
  367. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  368. package/esm5/lib/services/checkout/payment.service.js +125 -125
  369. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  370. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  371. package/esm5/lib/services/cookies.service.js +222 -222
  372. package/esm5/lib/services/currency.service.js +205 -205
  373. package/esm5/lib/services/dataform.service.js +48 -48
  374. package/esm5/lib/services/filters.service.js +125 -125
  375. package/esm5/lib/services/gift-card.service.js +63 -63
  376. package/esm5/lib/services/ip-address.service.js +35 -35
  377. package/esm5/lib/services/options.service.js +376 -376
  378. package/esm5/lib/services/pagination.service.js +79 -79
  379. package/esm5/lib/services/parameters.service.js +74 -74
  380. package/esm5/lib/services/products/product-detail.service.js +494 -494
  381. package/esm5/lib/services/products/products.service.js +345 -345
  382. package/esm5/lib/services/reviews.service.js +116 -116
  383. package/esm5/lib/services/stores.service.js +39 -39
  384. package/esm5/lib/services/windows.service.js +79 -79
  385. package/esm5/lib/services/wishlist.service.js +71 -71
  386. package/esm5/lib/strategies/standard.strategy.js +44 -44
  387. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  388. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  389. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  390. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  391. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  392. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  393. package/esm5/lib/utils/order-util.service.js +75 -75
  394. package/esm5/lib/utils/payment-utils.service.js +37 -37
  395. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  396. package/esm5/lib/utils/toast.service.js +61 -61
  397. package/esm5/lib/utils/utils.service.js +22 -22
  398. package/esm5/ng-easycommerce.js +33 -33
  399. package/esm5/public-api.js +146 -146
  400. package/fesm2015/ng-easycommerce.js +16252 -16245
  401. package/fesm2015/ng-easycommerce.js.map +1 -1
  402. package/fesm5/ng-easycommerce.js +19245 -19236
  403. package/fesm5/ng-easycommerce.js.map +1 -1
  404. package/lib/api/connection.service.d.ts +28 -28
  405. package/lib/classes/checkout/step-service.d.ts +28 -28
  406. package/lib/classes/checkout/step.d.ts +14 -14
  407. package/lib/classes/checkout-process-state.d.ts +12 -12
  408. package/lib/classes/component-helper.d.ts +8 -8
  409. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  410. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  411. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  412. package/lib/classes/filters/Filter.d.ts +19 -19
  413. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  414. package/lib/classes/filters/SortFilter.d.ts +15 -15
  415. package/lib/classes/user-role-type.d.ts +5 -5
  416. package/lib/classes/user.d.ts +68 -68
  417. package/lib/core.consts.d.ts +211 -211
  418. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  419. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +31 -31
  420. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +82 -82
  421. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  422. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  423. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  424. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  425. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  426. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  427. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  428. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  429. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  430. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  432. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  433. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  434. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  435. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  436. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  437. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +52 -52
  438. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +42 -42
  439. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +92 -92
  440. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +20 -20
  441. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +51 -51
  442. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  443. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  444. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +32 -32
  445. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  446. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  447. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  448. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  449. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  450. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  451. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  452. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  453. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  454. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  455. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  456. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  457. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  458. package/lib/ec-component/header-ec/header-ec.component.d.ts +65 -65
  459. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  460. package/lib/ec-component/index.d.ts +80 -80
  461. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  462. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  463. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  464. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +58 -58
  465. package/lib/ec-component/product-ec/product-ec.component.d.ts +46 -46
  466. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  467. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  468. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  469. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  470. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  471. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  472. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +23 -23
  473. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  474. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  475. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  476. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  477. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  478. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  479. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  480. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  481. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  482. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  483. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  484. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  485. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  486. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  487. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  488. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  489. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  490. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +12 -12
  491. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  492. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  493. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  494. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  495. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  496. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  497. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  498. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  499. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  500. package/lib/ec-directive/index.d.ts +6 -6
  501. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  502. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  503. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  504. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  505. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  506. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  507. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  508. package/lib/ec-pipe/index.d.ts +4 -4
  509. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  510. package/lib/guards/auth-guard.service.d.ts +8 -8
  511. package/lib/guards/checkout-ready.service.d.ts +8 -8
  512. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  513. package/lib/guards/user-role-guard.service.d.ts +8 -8
  514. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  515. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  516. package/lib/interfaces/Script.d.ts +5 -5
  517. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  518. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  519. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  520. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  521. package/lib/interfaces/block.d.ts +33 -33
  522. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  523. package/lib/interfaces/cart-item.d.ts +8 -8
  524. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  525. package/lib/interfaces/checkout-data.d.ts +6 -6
  526. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  527. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  528. package/lib/interfaces/cookies.d.ts +49 -49
  529. package/lib/interfaces/core.interfaces.d.ts +4 -4
  530. package/lib/interfaces/coupon.d.ts +5 -5
  531. package/lib/interfaces/currencyConfig.d.ts +10 -10
  532. package/lib/interfaces/deserializable.d.ts +3 -3
  533. package/lib/interfaces/faqs.d.ts +12 -12
  534. package/lib/interfaces/filter.d.ts +51 -51
  535. package/lib/interfaces/filterStep.d.ts +29 -29
  536. package/lib/interfaces/navbar-items.d.ts +9 -9
  537. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  538. package/lib/interfaces/paginate.d.ts +1 -1
  539. package/lib/interfaces/parameters.d.ts +10 -10
  540. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  541. package/lib/interfaces/product.d.ts +46 -46
  542. package/lib/interfaces/selection.d.ts +10 -10
  543. package/lib/interfaces/step.d.ts +8 -8
  544. package/lib/interfaces/store.d.ts +17 -17
  545. package/lib/ng-easycommerce.module.d.ts +5 -5
  546. package/lib/pipes/order-by.pipe.d.ts +5 -5
  547. package/lib/services/account/orders.service.d.ts +29 -29
  548. package/lib/services/analytics.service.d.ts +21 -21
  549. package/lib/services/auth.service.d.ts +116 -116
  550. package/lib/services/banner.service.d.ts +26 -26
  551. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  552. package/lib/services/blocks/blocks.service.d.ts +25 -25
  553. package/lib/services/captcha.service.d.ts +76 -76
  554. package/lib/services/cart.service.d.ts +139 -139
  555. package/lib/services/channel-config.service.d.ts +35 -35
  556. package/lib/services/checkout/addressing.service.d.ts +239 -239
  557. package/lib/services/checkout/checkout.service.d.ts +71 -71
  558. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  559. package/lib/services/checkout/payment.service.d.ts +32 -32
  560. package/lib/services/checkout/shipment.service.d.ts +58 -58
  561. package/lib/services/concatenated-associations.service.d.ts +57 -57
  562. package/lib/services/cookies.service.d.ts +66 -66
  563. package/lib/services/currency.service.d.ts +65 -65
  564. package/lib/services/dataform.service.d.ts +13 -13
  565. package/lib/services/filters.service.d.ts +48 -48
  566. package/lib/services/gift-card.service.d.ts +19 -19
  567. package/lib/services/ip-address.service.d.ts +10 -10
  568. package/lib/services/options.service.d.ts +61 -61
  569. package/lib/services/pagination.service.d.ts +30 -30
  570. package/lib/services/parameters.service.d.ts +18 -18
  571. package/lib/services/products/product-detail.service.d.ts +115 -115
  572. package/lib/services/products/products.service.d.ts +101 -101
  573. package/lib/services/reviews.service.d.ts +71 -71
  574. package/lib/services/stores.service.d.ts +11 -11
  575. package/lib/services/windows.service.d.ts +13 -13
  576. package/lib/services/wishlist.service.d.ts +13 -13
  577. package/lib/strategies/standard.strategy.d.ts +12 -12
  578. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  579. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  580. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  581. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  582. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  583. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  584. package/lib/utils/order-util.service.d.ts +12 -12
  585. package/lib/utils/payment-utils.service.d.ts +5 -5
  586. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  587. package/lib/utils/toast.service.d.ts +15 -15
  588. package/lib/utils/utils.service.d.ts +4 -4
  589. package/ng-easycommerce.d.ts +33 -33
  590. package/ng-easycommerce.metadata.json +1 -1
  591. package/package.json +1 -1
  592. package/public-api.d.ts +144 -144
@@ -1,422 +1,422 @@
1
- var __assign = (this && this.__assign) || function () {
2
- __assign = Object.assign || function(t) {
3
- for (var s, i = 1, n = arguments.length; i < n; i++) {
4
- s = arguments[i];
5
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
- t[p] = s[p];
7
- }
8
- return t;
9
- };
10
- return __assign.apply(this, arguments);
11
- };
12
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
- return c > 3 && r && Object.defineProperty(target, key, r), r;
17
- };
18
- var __param = (this && this.__param) || function (paramIndex, decorator) {
19
- return function (target, key) { decorator(target, key, paramIndex); }
20
- };
21
- import { Injectable, Inject } from '@angular/core';
22
- import { Router } from '@angular/router';
23
- import { TranslateService } from '@ngx-translate/core';
24
- import { ReplaySubject } from 'rxjs';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "../public-api";
27
- import * as i2 from "@ngx-translate/core";
28
- import * as i3 from "@angular/router";
29
- var Constants = /** @class */ (function () {
30
- function Constants(translate, router, env) {
31
- var _this = this;
32
- this.translate = translate;
33
- this.router = router;
34
- this.env = env;
35
- this.LOCALE = 'LOCALE';
36
- this.CHANNEL = 'CHANNEL';
37
- this.searchValue = '';
38
- this.channelConfigSubject = new ReplaySubject();
39
- this.channelConfig$ = this.channelConfigSubject.asObservable();
40
- this.channelConfigAPI = function (channel) { return '/shop-api/' + channel + 'channel'; };
41
- this.browserWindow = window || {};
42
- this.browserWindowEnv = this.browserWindow['__env'] || {};
43
- // private urlBase: string = 'http://testing.backend.easycommercetech.com/';
44
- this.urlBase = this.browserWindowEnv['apiUrl'] ? this.browserWindowEnv['apiUrl'] : (this.env.apiUrl || 'http://backend.easycommerce.devp/');
45
- this.urlAssets = this.browserWindowEnv['urlAssets'] ? this.browserWindowEnv['urlAssets'] : (this.env.urlAssets || this.urlBase);
46
- this.urlFrontend = this.browserWindowEnv['urlFrontend'] ? this.browserWindowEnv['urlFrontend'] : (this.env.urlFrontend || 'https://elden.easycommercetech.com/');
47
- this.locale = localStorage.getItem(this.LOCALE) ? localStorage.getItem(this.LOCALE) : this.browserWindowEnv['locale'] ? this.browserWindowEnv['locale'] : (this.env.locale || 'es_AR');
48
- this.channel = localStorage.getItem(this.CHANNEL) ? localStorage.getItem(this.CHANNEL) : this.browserWindowEnv['channel'] ? this.browserWindowEnv['channel'] : (this.env.channel || 'minorista');
49
- this.blocksCacheTime = this.browserWindowEnv['blocksCacheTime'] ? this.browserWindowEnv['blocksCacheTime'] : (this.env.blocksCacheTime || null);
50
- this.modalConfig = { title: 'Example', class: 'modal-xl modal-dialog-centered', keyboard: false };
51
- this.setModalConfig = function (config) { return _this.modalConfig = config; };
52
- this.getModalConfig = function () { return _this.modalConfig; };
53
- this.version = 'v1';
54
- this.routes = [/^home$/g, /^(\/?)collection(\/?)([\w\.\/\?]*)$/g, /^contact$/g];
55
- /* Get rid of this ASAP! */
56
- this.masterChannel = null;
57
- this.getMasterChannel = function () {
58
- if (!_this.masterChannel)
59
- _this.masterChannel = localStorage.getItem('MASTER_CHANNEL');
60
- return _this.masterChannel;
61
- };
62
- this.setMasterChannel = function (channel) {
63
- _this.masterChannel = channel;
64
- localStorage.setItem('MASTER_CHANNEL', channel);
65
- };
66
- this.isProduction = function () { return _this.browserWindowEnv['production'] ? _this.browserWindowEnv['production'] : (_this.env.production || false); };
67
- this.setUrlBase = function (url) { return _this.urlBase = url; };
68
- this.setUrlAssets = function (url) { return _this.urlAssets = url; };
69
- /**
70
- * @param next Function to execute
71
- * @param params That function needs
72
- *
73
- * Execute the function passed as params, if the frontend is in production mode
74
- */
75
- this.onlyIfProduction = function (next, params) { return _this.isProduction() && next(params); };
76
- /**
77
- * @description Devuelve la url base donde se alojan los archivos multimedia
78
- * @param postMedia carpeta donde se guardan los archivos
79
- * @returns
80
- */
81
- this.mediaUrl = function (postMedia) { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + (postMedia ? postMedia : "image/"); };
82
- this.mediaBannerUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "banner-image/"; };
83
- this.mediaStoreUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "store-image/"; };
84
- this.getProductsListRoute = function () { return 'collection/'; };
85
- this.getSectionsRoute = function () { return 'section/'; };
86
- this.getUrlBase = function () { return _this.urlBase; };
87
- this.getUrlFrontend = function () { return _this.urlFrontend; };
88
- this.getBlocksCacheTime = function () { return _this.blocksCacheTime && parseInt(_this.blocksCacheTime); };
89
- // getLocale = () => this.locale;
90
- // setLocale = (locale) => this.locale = locale;
91
- this.getLocale = function () {
92
- if (localStorage.getItem(_this.LOCALE)) {
93
- _this.locale = localStorage.getItem(_this.LOCALE);
94
- }
95
- return _this.locale;
96
- };
97
- this.getLocaleTranslate = function () {
98
- return _this.getLocale().split('_')[0];
99
- };
100
- this.setLocale = function (locale) {
101
- localStorage.setItem(_this.LOCALE, locale);
102
- _this.translate.use(locale.split('_')[0]);
103
- _this.locale = locale;
104
- };
105
- this.getChannel = function () {
106
- if (localStorage.getItem(_this.CHANNEL)) {
107
- _this.channel = localStorage.getItem(_this.CHANNEL);
108
- }
109
- return _this.channel;
110
- };
111
- this.setChannel = function (channel) {
112
- localStorage.setItem(_this.CHANNEL, channel);
113
- _this.channel = channel;
114
- };
115
- this.getVersion = function () { return _this.version; };
116
- this.loginExtraData = function () {
117
- return {
118
- client_id: 'demo_client',
119
- client_secret: 'secret_demo_client',
120
- grant_type: 'password'
121
- };
122
- };
123
- this.isCollection = function (path) { return (/^(\/?)collection(\/?)([\w\.\/\?]*)$/g).test(path); };
124
- /**
125
- * Utilities
126
- */
127
- this.mobile = function () { return window.innerWidth < 750; };
128
- this.strictTypeChannel = function () { return _this.env.strictTypeChannel || 'b2b2c'; };
129
- this.toDecimal = function (total) { return (total - Math.floor(total) == 0) ? total / 100 : total; };
130
- /**
131
- * Elementos para manejo de lista de rutas reutilizables
132
- */
133
- this.addRouteToReuse = function (route) { return route && _this.routes.push(route); };
134
- this.removeRouteToReuse = function (route) {
135
- var index = _this.routes.indexOf(route);
136
- if (index > -1) {
137
- _this.routes.splice(index, 1);
138
- }
139
- };
140
- this.getRoutesToReuse = function () { return _this.routes; };
141
- /**
142
- * @public ejemplo de uso <img *ngFor="let item of consts.getRatingStar(product.rating,'assets/images/star.png','assets/images/notStar.png')" [src]="item">
143
- * @description funcion que dado un valor entre 1 .. 5, y star: notStar:
144
- * (deben ser el path del archivo local a la implementacion).
145
- * retorna un arreglo con con la valoracion correspondiente.
146
- */
147
- this.getRatingStar = function (rating, star, notStar) {
148
- try {
149
- var urlStar = [];
150
- var cantStar = Number(rating) || 0;
151
- for (var index = 0; index < 5; index++) {
152
- urlStar.push(cantStar > 0
153
- ? star
154
- : notStar);
155
- cantStar--;
156
- }
157
- return urlStar;
158
- }
159
- catch (error) {
160
- console.error("getRatingStar produjo un error -> ", error);
161
- }
162
- };
163
- /**
164
- * @public ejemplo de uso (keypress)="inputValidationByExpressions($event,'[0-9]{1,9}')" en el DOM.
165
- * @description funcion que dado un manejandor de evento, y una expresion regular esta es
166
- * evaluada sobre los valores que el manejador de eventos nos envia.
167
- * En el caso en el que se envie el parametro 'condition' este puede ser para
168
- * anular el evento como condicion adicional a la evaluacion de la entrada.
169
- */
170
- this.inputValidationByExpressions = function (e, patron, condition) {
171
- if (condition === void 0) { condition = null; }
172
- try {
173
- var tecla = (document) ? e.keyCode : e.which;
174
- if (tecla == 8)
175
- return true;
176
- var patronReg = new RegExp(patron);
177
- var tecla_final = String.fromCharCode(tecla);
178
- if (condition != null) {
179
- return patronReg.test(tecla_final) && condition;
180
- }
181
- return patronReg.test(tecla_final);
182
- }
183
- catch (error) {
184
- console.error("inputValidationByExpressions produjo un error -> ", error);
185
- }
186
- };
187
- /**
188
- * Propiedad que se utiliza para tomar como configuración para el tipo de moneda que se utiliza en el sitio.
189
- * Estos valores son utilizados para el pipe currencyPrice
190
- */
191
- this.currency = {
192
- code: 'ARG',
193
- symbol: '$',
194
- position: 'Left',
195
- withoutDecimal: false
196
- };
197
- /**
198
- * Arreglo de valores usados para el pipe currencyPrice
199
- */
200
- this.currencyTypeConfig = [
201
- {
202
- code: 'EUR',
203
- symbol: '€',
204
- position: 'Right',
205
- withoutDecimal: false
206
- },
207
- {
208
- code: 'ARG',
209
- symbol: '$',
210
- position: 'Left',
211
- withoutDecimal: false
212
- },
213
- {
214
- code: 'ARS',
215
- symbol: '$',
216
- position: 'Left',
217
- withoutDecimal: false
218
- },
219
- {
220
- code: 'USD',
221
- symbol: '$',
222
- position: 'Left',
223
- withoutDecimal: false
224
- },
225
- {
226
- code: 'PYG',
227
- symbol: 'Gs.',
228
- position: 'Left',
229
- withoutDecimal: false
230
- },
231
- {
232
- code: 'PEN',
233
- symbol: 'S/',
234
- position: 'Left',
235
- withoutDecimal: false
236
- },
237
- {
238
- code: 'SEK',
239
- symbol: 'SEK',
240
- position: 'Right',
241
- withoutDecimal: true
242
- },
243
- ];
244
- this.setCurrencyTypeConfig = function (currencyTypeConfig) {
245
- _this.currencyTypeConfig = currencyTypeConfig;
246
- };
247
- /**
248
- * @description Reemplaza los valores de una moneda.
249
- * @param currencyTypeFind Tipo de currency que se desea modificar
250
- * @param customType Los nuevos valores. Todas las key son opcionales
251
- * @example customType = { code: 'ARG', symbol: '$', position: 'Left' , withoutDecimal: false }
252
- */
253
- this.replaceCurrencyTypeConfig = function (currencyTypeFind, customType) {
254
- var _a, _b, _c, _d;
255
- var currencyType = _this.currencyTypeConfig.find(function (type) { return type.code == currencyTypeFind; });
256
- if (currencyType) {
257
- currencyType.symbol = ((_a = customType) === null || _a === void 0 ? void 0 : _a.symbol) || currencyType.symbol;
258
- currencyType.code = ((_b = customType) === null || _b === void 0 ? void 0 : _b.code) || currencyType.code;
259
- currencyType.position = ((_c = customType) === null || _c === void 0 ? void 0 : _c.position) || currencyType.position;
260
- currencyType.withoutDecimal = ((_d = customType) === null || _d === void 0 ? void 0 : _d.withoutDecimal) || currencyType.withoutDecimal;
261
- }
262
- //Reveer en el futuro si se empiezan a agregar otro tipos de monedas
263
- /* else{
264
- this.currencyTypeConfig.push({...customType })
265
- } */
266
- };
267
- /**
268
- *
269
- * @param currencyTypeFind Definir el code del tipo de moneda que se quiera utilizar.
270
- * Si el tipo es CUSTOM se toman los valores del segundo parametro donde se puede definir la simbología y posesión que se quiera.
271
- * @param customType Formato del parámetro ejemplo { code: 'ARG', symbol: '$', position: 'L' , withoutDecimals: false } ,
272
- * todas las key son opcionales y por defecto se toman los valores del ejemplo.
273
- * @returns se retorna la configuración que se seteo a la propiedad currency del servicio.
274
- */
275
- this.setCurrency = function (currencyTypeFind, customType) {
276
- _this.currency = _this.currencyTypeConfig.find(function (ct) { return ct.code == currencyTypeFind.toUpperCase(); }) || _this.currency;
277
- customType && (_this.currency = __assign(__assign({}, _this.currency), customType));
278
- return _this.currency;
279
- };
280
- this.modifyChannelConfig = function (channelConfig) {
281
- if (channelConfig.channel || channelConfig.code)
282
- _this.setChannel(channelConfig.channel || channelConfig.code);
283
- if (channelConfig.locale || channelConfig.locales.code)
284
- _this.setLocale(channelConfig.locale || channelConfig.locales.code);
285
- if (channelConfig.currency || channelConfig.baseCurrency)
286
- _this.setCurrency(channelConfig.currency || channelConfig.baseCurrency);
287
- return channelConfig;
288
- };
289
- /**
290
- * @description Se utiliza para configurar los filtros por defecto que se aplicaran en la seccion 'Collection'
291
- * cuando se ingresa a la misma.
292
- */
293
- this.defaultFilters = [];
294
- /**
295
- * @description Settea el valor de la variable defaulFilters.
296
- * @param filters
297
- */
298
- this.setDefaultFilters = function (filters) {
299
- _this.defaultFilters = filters;
300
- };
301
- this.getDefaultFilters = function () { return _this.defaultFilters; };
302
- /**
303
- * @description Se utiliza para configurar tanto los filtros por defectos que ya seran aplicados, como tambien
304
- * los filtros que se mostraran en la seccion collection, su orden, etc.
305
- */
306
- this.filterConfig = {
307
- defaultFilters: [],
308
- filters: ['category', 'attributes', 'dynamics', 'price_range']
309
- };
310
- this.setFilterConfig = function (filterConfig) {
311
- filterConfig.defaultFilters ? _this.filterConfig.defaultFilters = filterConfig.defaultFilters : null;
312
- filterConfig.filters ? _this.filterConfig.filters = filterConfig.filters : null;
313
- };
314
- this.getFilterConfig = function () { return _this.filterConfig.filters; };
315
- /**
316
- * @description contiene un arreglo de string cuyo contenido son los codigos de los paises.
317
- * @example ['AR','ES','GB']
318
- */
319
- this.countries = [];
320
- /**
321
- *
322
- * @param countries debe contener los codigos de los paises que se quiere mostrar
323
- * @example ['AR','ES','GB']
324
- * @returns
325
- */
326
- this.setCountries = function (countries) { return _this.countries = countries; };
327
- this.getCountries = function () { return _this.countries; };
328
- /**
329
- * @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
330
- * variantes el listado de productos.
331
- * @param {string}type tipo de options
332
- * @param {string}code codigo de options
333
- * @param {boolean}defaultFirstOption `true` toma el primer option del producto en general
334
- * @param {boolean}checkIfStock `true` se realiza un chequeo de si la variante tiene stock para mostrarla
335
- * @example ```javascript
336
- * {
337
- type: 'color',
338
- code: 'color',
339
- defaultFirstOption: false ,
340
- checkIfStock:true
341
- } ```
342
- */
343
- this.paramsProductsWithUniqueVariant = {
344
- type: 'color',
345
- code: 'color',
346
- defaultFirstOption: false,
347
- checkIfStock: true
348
- };
349
- this.setParamsProductsWithUniqueVariant = function (value) {
350
- _this.paramsProductsWithUniqueVariant = __assign(__assign({}, _this.paramsProductsWithUniqueVariant), value);
351
- };
352
- this.getParamsProductsWithUniqueVariant = function () { return _this.paramsProductsWithUniqueVariant; };
353
- /**
354
- * @description se utiliza para configurar que filtros del tipo `SortFilter` se quiere mostrar en la vista.
355
- * Se usan los codigo de los filtros para indicar cuales se deben mostrar.
356
- */
357
- this.sortFilters = ['price', 'order-alph', 'recent'];
358
- /**
359
- *
360
- * @param filtersCode arreglo de strings con los codigos de los filtros.
361
- * Si se le pasa el parametro **all** este mostrara todos.
362
- * @example price | order-alph | recent | update | all
363
- * @returns
364
- */
365
- this.setSortFilters = function (filtersCode) {
366
- if (filtersCode === void 0) { filtersCode = ['all']; }
367
- return _this.sortFilters = filtersCode;
368
- };
369
- this.getSortFilters = function () { return _this.sortFilters; };
370
- }
371
- /**
372
- *
373
- * @param needles (agujas) object con claves valor a filtrar
374
- * @param haystack (pajar) objecto en el que buscar
375
- *
376
- * @description funcion que busca en el haystack (pajar) todos los objetos que contentan
377
- * todas las claves de los needles(agujas) que contengan el mismo valor
378
- */
379
- Constants.prototype.containsAll = function (needles, haystack) {
380
- var result = true;
381
- if (!!needles && !!haystack) {
382
- Object.entries(needles).forEach(function (value) {
383
- if (!(haystack.hasOwnProperty(value[0]) && haystack[value[0]] == value[1]))
384
- result = false;
385
- });
386
- }
387
- return result;
388
- };
389
- /**
390
- * devuelve true si existe el elemento "search" en el array de parametros "params"
391
- *
392
- * @param params Array de parametros entre los que buscar
393
- * @param searched Elemento que buscar
394
- * @param prefix prefijo del string a buscar (ejemplo: "link_")
395
- * @param suffix sufijo del string a buscar (ejemplo: "link_")
396
- * @param casesensitive determina si se evalua con sensibilidad entre mayuscula y minuscula
397
- * @returns retorna true o false si se encontro o no el parametro en el array
398
- */
399
- Constants.prototype.hasParams = function (params, searched, prefix, suffix, casesensitive) {
400
- if (prefix === void 0) { prefix = ''; }
401
- if (suffix === void 0) { suffix = ''; }
402
- if (casesensitive === void 0) { casesensitive = false; }
403
- return casesensitive ? params.find(function (param) { return (param.code).toLowerCase() == (prefix + searched + suffix).toLowerCase() || (param.code).toLowerCase() == (searched).toLowerCase(); })
404
- : params.find(function (param) { return param.code == (prefix + searched + suffix) || param.code == searched; });
405
- };
406
- ;
407
- Constants.ctorParameters = function () { return [
408
- { type: TranslateService },
409
- { type: Router },
410
- { type: undefined, decorators: [{ type: Inject, args: ['env',] }] }
411
- ]; };
412
- Constants.ɵprov = i0.ɵɵdefineInjectable({ factory: function Constants_Factory() { return new i1.Constants(i0.ɵɵinject(i2.TranslateService), i0.ɵɵinject(i3.Router), i0.ɵɵinject("env")); }, token: i1.Constants, providedIn: "root" });
413
- Constants = __decorate([
414
- Injectable({
415
- providedIn: 'root'
416
- }),
417
- __param(2, Inject('env'))
418
- ], Constants);
419
- return Constants;
420
- }());
421
- export { Constants };
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvY29yZS5jb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBWXREO0lBRUksbUJBQW1CLFNBQTJCLEVBQVUsTUFBYyxFQUF5QixHQUFHO1FBQWxHLGlCQUF1RztRQUFwRixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBeUIsUUFBRyxHQUFILEdBQUcsQ0FBQTtRQUVqRixXQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFeEIseUJBQW9CLEdBQUcsSUFBSSxhQUFhLEVBQU8sQ0FBQztRQUNqRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxVQUFDLE9BQU8sSUFBSyxPQUFBLFlBQVksR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUFsQyxDQUFrQyxDQUFDO1FBRW5FLGtCQUFhLEdBQVcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyRSxnRkFBZ0Y7UUFDeEUsWUFBTyxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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ckIsQ0FBQztRQUcyRSxXQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtPQUY3RSxTQUFTLENBK2JyQjtvQkEvY0Q7Q0ErY0MsQUEvYkQsSUErYkM7U0EvYlksU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29ubmVjdGlvblNlcnZpY2UgfSBmcm9tICcuL2FwaS9jb25uZWN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXJyZW5jeUNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9jdXJyZW5jeUNvbmZpZyc7XHJcbmltcG9ydCB7IERlZmF1bHRGaWx0ZXIsIEZpbHRlckNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXInO1xyXG5pbXBvcnQgeyBQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3BhcmFtc0ludGVyZmFjZXMvcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCc7XHJcbnR5cGUgY3VycmVuY3lUeXBlID0gJ0VVUicgfCAnQVJHJyB8ICdVU0QnIHwgJ1BZRycgfCAnUEVOJyB8ICdTRUsnIHwgJ0NVU1RPTSc7XHJcbnR5cGUgcG9zaXRpb25UeXBlID0gJ0wnIHwgJ1InO1xyXG50eXBlIGNoYW5uZWxUeXBlcyA9ICdiMmInIHwgJ2IyYjJjJyB8ICdiMmMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb25zdGFudHMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIEBJbmplY3QoJ2VudicpIHByaXZhdGUgZW52KSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IExPQ0FMRSA9ICdMT0NBTEUnO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnO1xyXG4gICAgcHVibGljIHNlYXJjaFZhbHVlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8YW55PigpO1xyXG4gICAgcHVibGljIGNoYW5uZWxDb25maWckID0gdGhpcy5jaGFubmVsQ29uZmlnU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcml2YXRlIGNoYW5uZWxDb25maWdBUEkgPSAoY2hhbm5lbCkgPT4gJy9zaG9wLWFwaS8nICsgY2hhbm5lbCArICdjaGFubmVsJztcclxuXHJcbiAgICBwcml2YXRlIGJyb3dzZXJXaW5kb3c6IG9iamVjdCA9IHdpbmRvdyB8fCB7fTtcclxuICAgIHByaXZhdGUgYnJvd3NlcldpbmRvd0Vudjogb2JqZWN0ID0gdGhpcy5icm93c2VyV2luZG93WydfX2VudiddIHx8IHt9O1xyXG5cclxuICAgIC8vICAgICBwcml2YXRlIHVybEJhc2U6IHN0cmluZyA9ICdodHRwOi8vdGVzdGluZy5iYWNrZW5kLmVhc3ljb21tZXJjZXRlY2guY29tLyc7XHJcbiAgICBwcml2YXRlIHVybEJhc2U6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYXBpVXJsJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2FwaVVybCddIDogKHRoaXMuZW52LmFwaVVybCB8fCAnaHR0cDovL2JhY2tlbmQuZWFzeWNvbW1lcmNlLmRldnAvJyk7XHJcbiAgICBwcml2YXRlIHVybEFzc2V0czogc3RyaW5nID0gdGhpcy5icm93c2VyV2luZG93RW52Wyd1cmxBc3NldHMnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsQXNzZXRzJ10gOiAodGhpcy5lbnYudXJsQXNzZXRzIHx8IHRoaXMudXJsQmFzZSk7XHJcbiAgICBwcml2YXRlIHVybEZyb250ZW5kOiBzdHJpbmcgPSB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3VybEZyb250ZW5kJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3VybEZyb250ZW5kJ10gOiAodGhpcy5lbnYudXJsRnJvbnRlbmQgfHwgJ2h0dHBzOi8vZWxkZW4uZWFzeWNvbW1lcmNldGVjaC5jb20vJyk7XHJcbiAgICBwcml2YXRlIGxvY2FsZTogc3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpIDogdGhpcy5icm93c2VyV2luZG93RW52Wydsb2NhbGUnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnbG9jYWxlJ10gOiAodGhpcy5lbnYubG9jYWxlIHx8ICdlc19BUicpO1xyXG4gICAgcHJpdmF0ZSBjaGFubmVsOiBzdHJpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMKSA6IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnY2hhbm5lbCddID8gdGhpcy5icm93c2VyV2luZG93RW52WydjaGFubmVsJ10gOiAodGhpcy5lbnYuY2hhbm5lbCB8fCAnbWlub3Jpc3RhJylcclxuICAgIHByaXZhdGUgYmxvY2tzQ2FjaGVUaW1lOiBzdHJpbmcgPSB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2Jsb2Nrc0NhY2hlVGltZSddID8gdGhpcy5icm93c2VyV2luZG93RW52WydibG9ja3NDYWNoZVRpbWUnXSA6ICh0aGlzLmVudi5ibG9ja3NDYWNoZVRpbWUgfHwgbnVsbCk7XHJcblxyXG4gICAgcHJpdmF0ZSBtb2RhbENvbmZpZyA9IHsgdGl0bGU6ICdFeGFtcGxlJywgY2xhc3M6ICdtb2RhbC14bCBtb2RhbC1kaWFsb2ctY2VudGVyZWQnLCBrZXlib2FyZDogZmFsc2UgfTtcclxuICAgIHNldE1vZGFsQ29uZmlnID0gKGNvbmZpZzogYW55KSA9PiB0aGlzLm1vZGFsQ29uZmlnID0gY29uZmlnO1xyXG4gICAgZ2V0TW9kYWxDb25maWcgPSAoKSA9PiB0aGlzLm1vZGFsQ29uZmlnO1xyXG5cclxuICAgIHByaXZhdGUgdmVyc2lvbjogc3RyaW5nID0gJ3YxJztcclxuXHJcbiAgICBwcml2YXRlIHJvdXRlcyA9IFsvXmhvbWUkL2csIC9eKFxcLz8pY29sbGVjdGlvbihcXC8/KShbXFx3XFwuXFwvXFw/XSopJC9nLCAvXmNvbnRhY3QkL2ddO1xyXG5cclxuICAgIC8qIEdldCByaWQgb2YgdGhpcyBBU0FQISAqL1xyXG4gICAgcHJpdmF0ZSBtYXN0ZXJDaGFubmVsID0gbnVsbFxyXG5cclxuICAgIHB1YmxpYyBnZXRNYXN0ZXJDaGFubmVsID0gKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5tYXN0ZXJDaGFubmVsKSB0aGlzLm1hc3RlckNoYW5uZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTUFTVEVSX0NIQU5ORUwnKVxyXG4gICAgICAgIHJldHVybiB0aGlzLm1hc3RlckNoYW5uZWxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0TWFzdGVyQ2hhbm5lbCA9IGNoYW5uZWwgPT4ge1xyXG4gICAgICAgIHRoaXMubWFzdGVyQ2hhbm5lbCA9IGNoYW5uZWxcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTUFTVEVSX0NIQU5ORUwnLCBjaGFubmVsKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNQcm9kdWN0aW9uID0gKCkgPT4gdGhpcy5icm93c2VyV2luZG93RW52Wydwcm9kdWN0aW9uJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3Byb2R1Y3Rpb24nXSA6ICh0aGlzLmVudi5wcm9kdWN0aW9uIHx8IGZhbHNlKTtcclxuXHJcbiAgICBzZXRVcmxCYXNlID0gKHVybCkgPT4gdGhpcy51cmxCYXNlID0gdXJsO1xyXG4gICAgc2V0VXJsQXNzZXRzID0gKHVybCkgPT4gdGhpcy51cmxBc3NldHMgPSB1cmw7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0gbmV4dCBGdW5jdGlvbiB0byBleGVjdXRlXHJcbiAgICAgKiBAcGFyYW0gcGFyYW1zIFRoYXQgZnVuY3Rpb24gbmVlZHNcclxuICAgICAqXHJcbiAgICAgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbiBwYXNzZWQgYXMgcGFyYW1zLCBpZiB0aGUgZnJvbnRlbmQgaXMgaW4gcHJvZHVjdGlvbiBtb2RlXHJcbiAgICAgKi9cclxuICAgIG9ubHlJZlByb2R1Y3Rpb24gPSAobmV4dCwgcGFyYW1zKSA9PiB0aGlzLmlzUHJvZHVjdGlvbigpICYmIG5leHQocGFyYW1zKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXZ1ZWx2ZSBsYSB1cmwgYmFzZSBkb25kZSBzZSBhbG9qYW4gbG9zIGFyY2hpdm9zIG11bHRpbWVkaWFcclxuICAgICAqIEBwYXJhbSBwb3N0TWVkaWEgY2FycGV0YSBkb25kZSBzZSBndWFyZGFuIGxvcyBhcmNoaXZvc1xyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgbWVkaWFVcmwgPSAocG9zdE1lZGlhPzpzdHJpbmcpID0+IHRoaXMudXJsQXNzZXRzICsgKHRoaXMudXJsQXNzZXRzID09IHRoaXMudXJsQmFzZSA/ICdtZWRpYS8nIDogJycpICsgKCBwb3N0TWVkaWEgPyBwb3N0TWVkaWEgOiBcImltYWdlL1wiKTtcclxuICAgIG1lZGlhQmFubmVyVXJsID0gKCkgPT4gdGhpcy51cmxBc3NldHMgKyAodGhpcy51cmxBc3NldHMgPT0gdGhpcy51cmxCYXNlID8gJ21lZGlhLycgOiAnJykgKyBcImJhbm5lci1pbWFnZS9cIjtcclxuICAgIG1lZGlhU3RvcmVVcmwgPSAoKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArIFwic3RvcmUtaW1hZ2UvXCI7XHJcblxyXG4gICAgZ2V0UHJvZHVjdHNMaXN0Um91dGUgPSAoKSA9PiAnY29sbGVjdGlvbi8nO1xyXG5cclxuICAgIGdldFNlY3Rpb25zUm91dGUgPSAoKSA9PiAnc2VjdGlvbi8nO1xyXG5cclxuICAgIGdldFVybEJhc2UgPSAoKSA9PiB0aGlzLnVybEJhc2U7XHJcbiAgICBnZXRVcmxGcm9udGVuZCA9ICgpID0+IHRoaXMudXJsRnJvbnRlbmQ7XHJcblxyXG4gICAgZ2V0QmxvY2tzQ2FjaGVUaW1lID0gKCk6IG51bWJlciA9PiB0aGlzLmJsb2Nrc0NhY2hlVGltZSAmJiBwYXJzZUludCh0aGlzLmJsb2Nrc0NhY2hlVGltZSk7XHJcblxyXG4gICAgLy8gZ2V0TG9jYWxlID0gKCkgPT4gdGhpcy5sb2NhbGU7XHJcbiAgICAvLyBzZXRMb2NhbGUgPSAobG9jYWxlKSA9PiB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcclxuXHJcbiAgICBnZXRMb2NhbGUgPSAoKSA9PiB7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuTE9DQUxFKSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuTE9DQUxFKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVcclxuICAgIH1cclxuXHJcbiAgICBnZXRMb2NhbGVUcmFuc2xhdGUgPSAoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRMb2NhbGUgPSBsb2NhbGUgPT4ge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuTE9DQUxFLCBsb2NhbGUpXHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxvY2FsZS5zcGxpdCgnXycpWzBdKVxyXG4gICAgICAgIHRoaXMubG9jYWxlID0gbG9jYWxlXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2hhbm5lbCA9ICgpID0+IHtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWxcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0Q2hhbm5lbCA9IGNoYW5uZWwgPT4ge1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ0hBTk5FTCwgY2hhbm5lbClcclxuICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmVyc2lvbiA9ICgpID0+IHRoaXMudmVyc2lvbjtcclxuXHJcbiAgICBsb2dpbkV4dHJhRGF0YSA9ICgpID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbGllbnRfaWQ6ICdkZW1vX2NsaWVudCcsXHJcbiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6ICdzZWNyZXRfZGVtb19jbGllbnQnLFxyXG4gICAgICAgICAgICBncmFudF90eXBlOiAncGFzc3dvcmQnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlzQ29sbGVjdGlvbiA9IChwYXRoKSA9PiAoL14oXFwvPyljb2xsZWN0aW9uKFxcLz8pKFtcXHdcXC5cXC9cXD9dKikkL2cpLnRlc3QocGF0aCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVdGlsaXRpZXNcclxuICAgICAqL1xyXG5cclxuICAgIG1vYmlsZSA9ICgpID0+IHdpbmRvdy5pbm5lcldpZHRoIDwgNzUwO1xyXG5cclxuICAgIHN0cmljdFR5cGVDaGFubmVsID0gKCkgPT4gdGhpcy5lbnYuc3RyaWN0VHlwZUNoYW5uZWwgfHwgJ2IyYjJjJztcclxuXHJcbiAgICB0b0RlY2ltYWwgPSAodG90YWwpID0+ICh0b3RhbCAtIE1hdGguZmxvb3IodG90YWwpID09IDApID8gdG90YWwgLyAxMDAgOiB0b3RhbDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEVsZW1lbnRvcyBwYXJhIG1hbmVqbyBkZSBsaXN0YSBkZSBydXRhcyByZXV0aWxpemFibGVzXHJcbiAgICAgKi9cclxuXHJcbiAgICBhZGRSb3V0ZVRvUmV1c2UgPSAocm91dGU6IFJlZ0V4cCkgPT4gcm91dGUgJiYgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSk7XHJcblxyXG4gICAgcmVtb3ZlUm91dGVUb1JldXNlID0gKHJvdXRlOiBSZWdFeHApID0+IHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucm91dGVzLmluZGV4T2Yocm91dGUpO1xyXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm91dGVzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFJvdXRlc1RvUmV1c2UgPSAoKTogUmVnRXhwW10gPT4gdGhpcy5yb3V0ZXM7XHJcblxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqICBAcHVibGljIGVqZW1wbG8gZGUgdXNvIDxpbWcgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29uc3RzLmdldFJhdGluZ1N0YXIocHJvZHVjdC5yYXRpbmcsJ2Fzc2V0cy9pbWFnZXMvc3Rhci5wbmcnLCdhc3NldHMvaW1hZ2VzL25vdFN0YXIucG5nJylcIiBbc3JjXT1cIml0ZW1cIj5cclxuICAgICAqICBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgZGFkbyB1biB2YWxvciBlbnRyZSAxIC4uIDUsIHkgc3Rhcjogbm90U3RhcjpcclxuICAgICAqICAgICAgKGRlYmVuIHNlciBlbCBwYXRoIGRlbCBhcmNoaXZvIGxvY2FsIGEgbGEgaW1wbGVtZW50YWNpb24pLlxyXG4gICAgICogICAgICByZXRvcm5hIHVuIGFycmVnbG8gY29uIGNvbiBsYSB2YWxvcmFjaW9uIGNvcnJlc3BvbmRpZW50ZS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmF0aW5nU3RhciA9IChyYXRpbmc6IGFueSwgc3RhcjogU3RyaW5nLCBub3RTdGFyOiBTdHJpbmcpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgdXJsU3RhciA9IFtdO1xyXG4gICAgICAgICAgICBsZXQgY2FudFN0YXIgPSBOdW1iZXIocmF0aW5nKSB8fCAwO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgNTsgaW5kZXgrKykge1xyXG4gICAgICAgICAgICAgICAgdXJsU3Rhci5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIGNhbnRTdGFyID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBub3RTdGFyXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgY2FudFN0YXItLTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdXJsU3RhcjtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZ2V0UmF0aW5nU3RhciBwcm9kdWpvIHVuIGVycm9yIC0+IFwiLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgQHB1YmxpYyBlamVtcGxvIGRlIHVzbyAoa2V5cHJlc3MpPVwiaW5wdXRWYWxpZGF0aW9uQnlFeHByZXNzaW9ucygkZXZlbnQsJ1swLTldezEsOX0nKVwiIGVuIGVsIERPTS5cclxuICAgICAqICBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgZGFkbyB1biBtYW5lamFuZG9yIGRlIGV2ZW50bywgeSB1bmEgZXhwcmVzaW9uIHJlZ3VsYXIgZXN0YSBlc1xyXG4gICAgICogICAgICAgICAgZXZhbHVhZGEgc29icmUgbG9zIHZhbG9yZXMgcXVlIGVsIG1hbmVqYWRvciBkZSBldmVudG9zIG5vcyBlbnZpYS5cclxuICAgICAqICAgICAgICAgIEVuIGVsIGNhc28gZW4gZWwgcXVlIHNlIGVudmllIGVsIHBhcmFtZXRybyAnY29uZGl0aW9uJyBlc3RlIHB1ZWRlIHNlciBwYXJhXHJcbiAgICAgKiAgICAgICAgICBhbnVsYXIgZWwgZXZlbnRvIGNvbW8gY29uZGljaW9uIGFkaWNpb25hbCBhIGxhIGV2YWx1YWNpb24gZGUgbGEgZW50cmFkYS5cclxuICAgICAqL1xyXG4gICAgaW5wdXRWYWxpZGF0aW9uQnlFeHByZXNzaW9ucyA9IChlLCBwYXRyb24sIGNvbmRpdGlvbiA9IG51bGwgKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHRlY2xhID0gKGRvY3VtZW50KSA/IGUua2V5Q29kZSA6IGUud2hpY2g7XHJcbiAgICAgICAgICAgIGlmICh0ZWNsYSA9PSA4KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IHBhdHJvblJlZyA9IG5ldyBSZWdFeHAocGF0cm9uKVxyXG4gICAgICAgICAgICBsZXQgdGVjbGFfZmluYWwgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRlY2xhKTtcclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0cm9uUmVnLnRlc3QodGVjbGFfZmluYWwpICYmIGNvbmRpdGlvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcGF0cm9uUmVnLnRlc3QodGVjbGFfZmluYWwpXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcImlucHV0VmFsaWRhdGlvbkJ5RXhwcmVzc2lvbnMgcHJvZHVqbyB1biBlcnJvciAtPiBcIiwgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG5lZWRsZXMgKGFndWphcykgb2JqZWN0IGNvbiBjbGF2ZXMgdmFsb3IgYSBmaWx0cmFyXHJcbiAgICAgKiBAcGFyYW0gaGF5c3RhY2sgKHBhamFyKSBvYmplY3RvIGVuIGVsIHF1ZSBidXNjYXJcclxuICAgICAqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgYnVzY2EgZW4gZWwgaGF5c3RhY2sgKHBhamFyKSB0b2RvcyBsb3Mgb2JqZXRvcyBxdWUgY29udGVudGFuXHJcbiAgICAgKiB0b2RhcyBsYXMgY2xhdmVzIGRlIGxvcyBuZWVkbGVzKGFndWphcykgcXVlIGNvbnRlbmdhbiBlbCBtaXNtbyB2YWxvclxyXG4gICAgICovXHJcbiAgICBjb250YWluc0FsbChuZWVkbGVzOiBvYmplY3QsIGhheXN0YWNrOiBvYmplY3QpOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgcmVzdWx0OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKCEhbmVlZGxlcyAmJiAhIWhheXN0YWNrKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG5lZWRsZXMpLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCEoaGF5c3RhY2suaGFzT3duUHJvcGVydHkodmFsdWVbMF0pICYmIGhheXN0YWNrW3ZhbHVlWzBdXSA9PSB2YWx1ZVsxXSkpIHJlc3VsdCA9IGZhbHNlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcm9waWVkYWQgcXVlIHNlIHV0aWxpemEgcGFyYSB0b21hciBjb21vIGNvbmZpZ3VyYWNpw7NuIHBhcmEgZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHV0aWxpemEgZW4gZWwgc2l0aW8uXHJcbiAgICAgKiBFc3RvcyB2YWxvcmVzIHNvbiB1dGlsaXphZG9zIHBhcmEgZWwgcGlwZSBjdXJyZW5jeVByaWNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjdXJyZW5jeTogQ3VycmVuY3lDb25maWcgPSB7XHJcbiAgICAgICAgY29kZTogJ0FSRycsXHJcbiAgICAgICAgc3ltYm9sOiAnJCcsXHJcbiAgICAgICAgcG9zaXRpb246ICdMZWZ0JyxcclxuICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29kZTogJ0VVUicsXHJcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICfigqwnLFxyXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdSaWdodCcsXHJcbiAgICAgICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvZGU6ICdBUkcnLFxyXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAnJCcsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvZGU6ICdBUlMnLFxyXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAnJCcsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvZGU6ICdVU0QnLFxyXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAnJCcsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvZGU6ICdQWUcnLFxyXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAnR3MuJyxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXHJcbiAgICAgICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgY29kZTogJ1BFTicsXHJcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICdTLycsXHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxyXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGNvZGU6ICdTRUsnLFxyXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAnU0VLJyxcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnUmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IHRydWVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdXHJcblxyXG4gICAgICAgIHB1YmxpYyBzZXRDdXJyZW5jeVR5cGVDb25maWcgPSAoY3VycmVuY3lUeXBlQ29uZmlnOiBDdXJyZW5jeUNvbmZpZ1tdKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVlbXBsYXphIGxvcyB2YWxvcmVzIGRlIHVuYSBtb25lZGEuXHJcbiAgICAgKiBAcGFyYW0gY3VycmVuY3lUeXBlRmluZCBUaXBvIGRlIGN1cnJlbmN5IHF1ZSBzZSBkZXNlYSBtb2RpZmljYXJcclxuICAgICAqIEBwYXJhbSBjdXN0b21UeXBlIExvcyBudWV2b3MgdmFsb3Jlcy4gVG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlc1xyXG4gICAgICogQGV4YW1wbGUgY3VzdG9tVHlwZSA9IHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0xlZnQnICwgd2l0aG91dERlY2ltYWw6IGZhbHNlIH1cclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlcGxhY2VDdXJyZW5jeVR5cGVDb25maWcgPSAoY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlOiBDdXJyZW5jeUNvbmZpZykgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW5jeVR5cGUgPSB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZy5maW5kKHR5cGUgPT4gdHlwZS5jb2RlID09IGN1cnJlbmN5VHlwZUZpbmQgKVxyXG4gICAgICAgIGlmKGN1cnJlbmN5VHlwZSl7XHJcbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS5zeW1ib2wgPSBjdXN0b21UeXBlPy5zeW1ib2wgfHwgIGN1cnJlbmN5VHlwZS5zeW1ib2xcclxuICAgICAgICAgICAgY3VycmVuY3lUeXBlLmNvZGUgPSBjdXN0b21UeXBlPy5jb2RlIHx8IGN1cnJlbmN5VHlwZS5jb2RlXHJcbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS5wb3NpdGlvbiA9IGN1c3RvbVR5cGU/LnBvc2l0aW9uIHx8ICBjdXJyZW5jeVR5cGUucG9zaXRpb25cclxuICAgICAgICAgICAgY3VycmVuY3lUeXBlLndpdGhvdXREZWNpbWFsID0gY3VzdG9tVHlwZT8ud2l0aG91dERlY2ltYWwgfHwgY3VycmVuY3lUeXBlLndpdGhvdXREZWNpbWFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vUmV2ZWVyIGVuIGVsIGZ1dHVybyBzaSBzZSBlbXBpZXphbiBhIGFncmVnYXIgb3RybyB0aXBvcyBkZSBtb25lZGFzXHJcbiAgICAgICAgLyogZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW5jeVR5cGVDb25maWcucHVzaCh7Li4uY3VzdG9tVHlwZSB9KVxyXG4gICAgICAgIH0gKi9cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY3VycmVuY3lUeXBlRmluZCBEZWZpbmlyIGVsIGNvZGUgZGVsIHRpcG8gZGUgbW9uZWRhIHF1ZSBzZSBxdWllcmEgdXRpbGl6YXIuXHJcbiAgICAgKiBTaSBlbCB0aXBvIGVzIENVU1RPTSBzZSB0b21hbiBsb3MgdmFsb3JlcyBkZWwgc2VndW5kbyBwYXJhbWV0cm8gZG9uZGUgc2UgcHVlZGUgZGVmaW5pciBsYSBzaW1ib2xvZ8OtYSB5IHBvc2VzacOzbiBxdWUgc2UgcXVpZXJhLlxyXG4gICAgICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcclxuICAgICAqIHRvZGFzIGxhcyBrZXkgc29uIG9wY2lvbmFsZXMgeSBwb3IgZGVmZWN0byBzZSB0b21hbiBsb3MgdmFsb3JlcyBkZWwgZWplbXBsby5cclxuICAgICAqIEByZXR1cm5zIHNlIHJldG9ybmEgbGEgY29uZmlndXJhY2nDs24gcXVlIHNlIHNldGVvIGEgbGEgcHJvcGllZGFkIGN1cnJlbmN5IGRlbCBzZXJ2aWNpby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNldEN1cnJlbmN5ID0gKGN1cnJlbmN5VHlwZUZpbmQ6IGN1cnJlbmN5VHlwZSwgY3VzdG9tVHlwZT86IEN1cnJlbmN5Q29uZmlnKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoY3QgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcclxuICAgICAgICBjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVuY3k7XHJcbiAgICB9O1xyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIGRldnVlbHZlIHRydWUgc2kgZXhpc3RlIGVsIGVsZW1lbnRvIFwic2VhcmNoXCIgZW4gZWwgYXJyYXkgZGUgcGFyYW1ldHJvcyBcInBhcmFtc1wiXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHBhcmFtcyBBcnJheSBkZSBwYXJhbWV0cm9zIGVudHJlIGxvcyBxdWUgYnVzY2FyXHJcbiAgICAgKiBAcGFyYW0gc2VhcmNoZWQgRWxlbWVudG8gcXVlIGJ1c2NhclxyXG4gICAgICogQHBhcmFtIHByZWZpeCBwcmVmaWpvIGRlbCBzdHJpbmcgYSBidXNjYXIgKGVqZW1wbG86IFwibGlua19cIilcclxuICAgICAqIEBwYXJhbSBzdWZmaXggc3VmaWpvIGRlbCBzdHJpbmcgYSBidXNjYXIgKGVqZW1wbG86IFwibGlua19cIilcclxuICAgICAqIEBwYXJhbSBjYXNlc2Vuc2l0aXZlIGRldGVybWluYSBzaSBzZSBldmFsdWEgY29uIHNlbnNpYmlsaWRhZCBlbnRyZSBtYXl1c2N1bGEgeSBtaW51c2N1bGFcclxuICAgICAqIEByZXR1cm5zIHJldG9ybmEgdHJ1ZSBvIGZhbHNlIHNpIHNlIGVuY29udHJvIG8gbm8gZWwgcGFyYW1ldHJvIGVuIGVsIGFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBoYXNQYXJhbXMoXHJcbiAgICAgICAgcGFyYW1zLFxyXG4gICAgICAgIHNlYXJjaGVkLFxyXG4gICAgICAgIHByZWZpeCA9ICcnLFxyXG4gICAgICAgIHN1ZmZpeCA9ICcnLFxyXG4gICAgICAgIGNhc2VzZW5zaXRpdmUgPSBmYWxzZSk6IGJvb2xlYW4ge1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuIGNhc2VzZW5zaXRpdmUgPyBwYXJhbXMuZmluZChwYXJhbSA9PiAocGFyYW0uY29kZSkudG9Mb3dlckNhc2UoKSA9PSAocHJlZml4ICsgc2VhcmNoZWQgKyBzdWZmaXgpLnRvTG93ZXJDYXNlKCkgfHwgKHBhcmFtLmNvZGUpLnRvTG93ZXJDYXNlKCkgPT0gKHNlYXJjaGVkKS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgICAgICAgICA6IHBhcmFtcy5maW5kKHBhcmFtID0+IHBhcmFtLmNvZGUgPT0gKHByZWZpeCArIHNlYXJjaGVkICsgc3VmZml4KSB8fCBwYXJhbS5jb2RlID09IHNlYXJjaGVkKVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgcHVibGljIG1vZGlmeUNoYW5uZWxDb25maWcgPSBjaGFubmVsQ29uZmlnID0+IHtcclxuICAgICAgICBpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcclxuICAgICAgICAgICAgdGhpcy5zZXRDaGFubmVsKGNoYW5uZWxDb25maWcuY2hhbm5lbCB8fCBjaGFubmVsQ29uZmlnLmNvZGUpXHJcblxyXG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcclxuICAgICAgICAgICAgdGhpcy5zZXRMb2NhbGUoY2hhbm5lbENvbmZpZy5sb2NhbGUgfHwgY2hhbm5lbENvbmZpZy5sb2NhbGVzLmNvZGUpXHJcblxyXG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxyXG4gICAgICAgICAgICB0aGlzLnNldEN1cnJlbmN5KGNoYW5uZWxDb25maWcuY3VycmVuY3kgfHwgY2hhbm5lbENvbmZpZy5iYXNlQ3VycmVuY3kpXHJcblxyXG4gICAgICAgIHJldHVybiBjaGFubmVsQ29uZmlnO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgbG9zIGZpbHRyb3MgcG9yIGRlZmVjdG8gcXVlIHNlIGFwbGljYXJhbiBlbiBsYSBzZWNjaW9uICdDb2xsZWN0aW9uJ1xyXG4gICAgICogY3VhbmRvIHNlIGluZ3Jlc2EgYSBsYSBtaXNtYS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0RmlsdGVyczogRGVmYXVsdEZpbHRlcltdID0gW11cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXR0ZWEgZWwgdmFsb3IgZGUgbGEgdmFyaWFibGUgZGVmYXVsRmlsdGVycy5cclxuICAgICAqIEBwYXJhbSBmaWx0ZXJzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXREZWZhdWx0RmlsdGVycyA9IChmaWx0ZXJzOkRlZmF1bHRGaWx0ZXJbXSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdEZpbHRlcnMgPSBmaWx0ZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXREZWZhdWx0RmlsdGVycyA9ICgpOkRlZmF1bHRGaWx0ZXJbXSA9PiB0aGlzLmRlZmF1bHRGaWx0ZXJzXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gU2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgdGFudG8gbG9zIGZpbHRyb3MgcG9yIGRlZmVjdG9zIHF1ZSB5YSBzZXJhbiBhcGxpY2Fkb3MsIGNvbW8gdGFtYmllblxyXG4gICAgICogbG9zIGZpbHRyb3MgcXVlIHNlIG1vc3RyYXJhbiBlbiBsYSBzZWNjaW9uIGNvbGxlY3Rpb24sIHN1IG9yZGVuLCBldGMuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZmlsdGVyQ29uZmlnOiBGaWx0ZXJDb25maWcgPSB7XHJcbiAgICAgICAgZGVmYXVsdEZpbHRlcnM6IFtdLFxyXG4gICAgICAgIGZpbHRlcnM6IFsnY2F0ZWdvcnknLCdhdHRyaWJ1dGVzJywnZHluYW1pY3MnLCAncHJpY2VfcmFuZ2UnXVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXRGaWx0ZXJDb25maWcgPSAoIGZpbHRlckNvbmZpZzpGaWx0ZXJDb25maWcgKSA9PiB7XHJcbiAgICAgICAgZmlsdGVyQ29uZmlnLmRlZmF1bHRGaWx0ZXJzID8gdGhpcy5maWx0ZXJDb25maWcuZGVmYXVsdEZpbHRlcnMgPSBmaWx0ZXJDb25maWcuZGVmYXVsdEZpbHRlcnMgOiBudWxsXHJcbiAgICAgICAgZmlsdGVyQ29uZmlnLmZpbHRlcnMgPyB0aGlzLmZpbHRlckNvbmZpZy5maWx0ZXJzID0gZmlsdGVyQ29uZmlnLmZpbHRlcnMgOiBudWxsXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldEZpbHRlckNvbmZpZyA9ICgpID0+IHRoaXMuZmlsdGVyQ29uZmlnLmZpbHRlcnNcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBkZXNjcmlwdGlvbiBjb250aWVuZSB1biBhcnJlZ2xvIGRlIHN0cmluZyBjdXlvIGNvbnRlbmlkbyBzb24gbG9zIGNvZGlnb3MgZGUgbG9zIHBhaXNlcy5cclxuICAgICAqIEBleGFtcGxlIFsnQVInLCdFUycsJ0dCJ11cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb3VudHJpZXM6IHN0cmluZ1tdID0gW11cclxuXHJcbiAgICAvKipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIGRlYmUgY29udGVuZXIgbG9zIGNvZGlnb3MgZGUgbG9zIHBhaXNlcyBxdWUgc2UgcXVpZXJlIG1vc3RyYXJcclxuICAgICAqIEBleGFtcGxlIFsnQVInLCdFUycsJ0dCJ11cclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRDb3VudHJpZXMgPSAoY291bnRyaWVzOnN0cmluZ1tdKSA9PiB0aGlzLmNvdW50cmllcyA9IGNvdW50cmllcztcclxuXHJcbiAgICBwdWJsaWMgZ2V0Q291bnRyaWVzID0gKCkgPT4gdGhpcy5jb3VudHJpZXM7XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGRlc2NyaXB0aW9uIGVzdGEgdmFyaWFibGUgc2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgbG9zIHBhcmFtZXRyb3MgY3VhbmRvIHNlIGRlc2VhIG1vc3RyYXJcclxuICAgICAqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfXR5cGUgdGlwbyBkZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ31jb2RlIGNvZGlnbyBkZSBvcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1jaGVja0lmU3RvY2sgYHRydWVgIHNlIHJlYWxpemEgdW4gY2hlcXVlbyBkZSBzaSBsYSB2YXJpYW50ZSB0aWVuZSBzdG9jayBwYXJhIG1vc3RyYXJsYVxyXG4gICAgICogQGV4YW1wbGUgIGBgYGphdmFzY3JpcHRcclxuICAgICAqIHtcclxuICAgICAgICB0eXBlOiAnY29sb3InLFxyXG4gICAgICAgIGNvZGU6ICdjb2xvcicsXHJcbiAgICAgICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXHJcbiAgICAgICAgY2hlY2tJZlN0b2NrOnRydWVcclxuICAgICAgICB9IGBgYFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQ6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XHJcbiAgICAgICAgdHlwZTogJ2NvbG9yJyxcclxuICAgICAgICBjb2RlOiAnY29sb3InLFxyXG4gICAgICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogZmFsc2UgLFxyXG4gICAgICAgIGNoZWNrSWZTdG9jazp0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9ICh2YWx1ZTpQYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXHJcbiAgICAgICAgICAgIC4uLnZhbHVlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gc2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgcXVlIGZpbHRyb3MgZGVsIHRpcG8gYFNvcnRGaWx0ZXJgIHNlIHF1aWVyZSBtb3N0cmFyIGVuIGxhIHZpc3RhLlxyXG4gICAgICogU2UgdXNhbiBsb3MgY29kaWdvIGRlIGxvcyBmaWx0cm9zIHBhcmEgaW5kaWNhciBjdWFsZXMgc2UgZGViZW4gbW9zdHJhci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzb3J0RmlsdGVyczpzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxyXG5cclxuICAgIC8qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmaWx0ZXJzQ29kZSBhcnJlZ2xvIGRlIHN0cmluZ3MgY29uIGxvcyBjb2RpZ29zIGRlIGxvcyBmaWx0cm9zLlxyXG4gICAgICogU2kgc2UgbGUgcGFzYSBlbCBwYXJhbWV0cm8gKiphbGwqKiBlc3RlIG1vc3RyYXJhIHRvZG9zLlxyXG4gICAgICogQGV4YW1wbGUgcHJpY2UgfCBvcmRlci1hbHBoIHwgcmVjZW50IHwgdXBkYXRlIHwgYWxsXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBzZXRTb3J0RmlsdGVycyA9IChmaWx0ZXJzQ29kZTpzdHJpbmdbXT1bJ2FsbCddKSA9PiB0aGlzLnNvcnRGaWx0ZXJzID0gZmlsdGVyc0NvZGU7XHJcblxyXG4gICAgZ2V0U29ydEZpbHRlcnMgPSAoKSA9PiB0aGlzLnNvcnRGaWx0ZXJzO1xyXG5cclxufVxyXG5cclxuIl19
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
13
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
16
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
17
+ };
18
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
19
+ return function (target, key) { decorator(target, key, paramIndex); }
20
+ };
21
+ import { Injectable, Inject } from '@angular/core';
22
+ import { Router } from '@angular/router';
23
+ import { TranslateService } from '@ngx-translate/core';
24
+ import { ReplaySubject } from 'rxjs';
25
+ import * as i0 from "@angular/core";
26
+ import * as i1 from "../public-api";
27
+ import * as i2 from "@ngx-translate/core";
28
+ import * as i3 from "@angular/router";
29
+ var Constants = /** @class */ (function () {
30
+ function Constants(translate, router, env) {
31
+ var _this = this;
32
+ this.translate = translate;
33
+ this.router = router;
34
+ this.env = env;
35
+ this.LOCALE = 'LOCALE';
36
+ this.CHANNEL = 'CHANNEL';
37
+ this.searchValue = '';
38
+ this.channelConfigSubject = new ReplaySubject();
39
+ this.channelConfig$ = this.channelConfigSubject.asObservable();
40
+ this.channelConfigAPI = function (channel) { return '/shop-api/' + channel + 'channel'; };
41
+ this.browserWindow = window || {};
42
+ this.browserWindowEnv = this.browserWindow['__env'] || {};
43
+ // private urlBase: string = 'http://testing.backend.easycommercetech.com/';
44
+ this.urlBase = this.browserWindowEnv['apiUrl'] ? this.browserWindowEnv['apiUrl'] : (this.env.apiUrl || 'http://backend.easycommerce.devp/');
45
+ this.urlAssets = this.browserWindowEnv['urlAssets'] ? this.browserWindowEnv['urlAssets'] : (this.env.urlAssets || this.urlBase);
46
+ this.urlFrontend = this.browserWindowEnv['urlFrontend'] ? this.browserWindowEnv['urlFrontend'] : (this.env.urlFrontend || 'https://elden.easycommercetech.com/');
47
+ this.locale = localStorage.getItem(this.LOCALE) ? localStorage.getItem(this.LOCALE) : this.browserWindowEnv['locale'] ? this.browserWindowEnv['locale'] : (this.env.locale || 'es_AR');
48
+ this.channel = localStorage.getItem(this.CHANNEL) ? localStorage.getItem(this.CHANNEL) : this.browserWindowEnv['channel'] ? this.browserWindowEnv['channel'] : (this.env.channel || 'minorista');
49
+ this.blocksCacheTime = this.browserWindowEnv['blocksCacheTime'] ? this.browserWindowEnv['blocksCacheTime'] : (this.env.blocksCacheTime || null);
50
+ this.modalConfig = { title: 'Example', class: 'modal-xl modal-dialog-centered', keyboard: false };
51
+ this.setModalConfig = function (config) { return _this.modalConfig = config; };
52
+ this.getModalConfig = function () { return _this.modalConfig; };
53
+ this.version = 'v1';
54
+ this.routes = [/^home$/g, /^(\/?)collection(\/?)([\w\.\/\?]*)$/g, /^contact$/g];
55
+ /* Get rid of this ASAP! */
56
+ this.masterChannel = null;
57
+ this.getMasterChannel = function () {
58
+ if (!_this.masterChannel)
59
+ _this.masterChannel = localStorage.getItem('MASTER_CHANNEL');
60
+ return _this.masterChannel;
61
+ };
62
+ this.setMasterChannel = function (channel) {
63
+ _this.masterChannel = channel;
64
+ localStorage.setItem('MASTER_CHANNEL', channel);
65
+ };
66
+ this.isProduction = function () { return _this.browserWindowEnv['production'] ? _this.browserWindowEnv['production'] : (_this.env.production || false); };
67
+ this.setUrlBase = function (url) { return _this.urlBase = url; };
68
+ this.setUrlAssets = function (url) { return _this.urlAssets = url; };
69
+ /**
70
+ * @param next Function to execute
71
+ * @param params That function needs
72
+ *
73
+ * Execute the function passed as params, if the frontend is in production mode
74
+ */
75
+ this.onlyIfProduction = function (next, params) { return _this.isProduction() && next(params); };
76
+ /**
77
+ * @description Devuelve la url base donde se alojan los archivos multimedia
78
+ * @param postMedia carpeta donde se guardan los archivos
79
+ * @returns
80
+ */
81
+ this.mediaUrl = function (postMedia) { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + (postMedia ? postMedia : "image/"); };
82
+ this.mediaBannerUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "banner-image/"; };
83
+ this.mediaStoreUrl = function () { return _this.urlAssets + (_this.urlAssets == _this.urlBase ? 'media/' : '') + "store-image/"; };
84
+ this.getProductsListRoute = function () { return 'collection/'; };
85
+ this.getSectionsRoute = function () { return 'section/'; };
86
+ this.getUrlBase = function () { return _this.urlBase; };
87
+ this.getUrlFrontend = function () { return _this.urlFrontend; };
88
+ this.getBlocksCacheTime = function () { return _this.blocksCacheTime && parseInt(_this.blocksCacheTime); };
89
+ // getLocale = () => this.locale;
90
+ // setLocale = (locale) => this.locale = locale;
91
+ this.getLocale = function () {
92
+ if (localStorage.getItem(_this.LOCALE)) {
93
+ _this.locale = localStorage.getItem(_this.LOCALE);
94
+ }
95
+ return _this.locale;
96
+ };
97
+ this.getLocaleTranslate = function () {
98
+ return _this.getLocale().split('_')[0];
99
+ };
100
+ this.setLocale = function (locale) {
101
+ localStorage.setItem(_this.LOCALE, locale);
102
+ _this.translate.use(locale.split('_')[0]);
103
+ _this.locale = locale;
104
+ };
105
+ this.getChannel = function () {
106
+ if (localStorage.getItem(_this.CHANNEL)) {
107
+ _this.channel = localStorage.getItem(_this.CHANNEL);
108
+ }
109
+ return _this.channel;
110
+ };
111
+ this.setChannel = function (channel) {
112
+ localStorage.setItem(_this.CHANNEL, channel);
113
+ _this.channel = channel;
114
+ };
115
+ this.getVersion = function () { return _this.version; };
116
+ this.loginExtraData = function () {
117
+ return {
118
+ client_id: 'demo_client',
119
+ client_secret: 'secret_demo_client',
120
+ grant_type: 'password'
121
+ };
122
+ };
123
+ this.isCollection = function (path) { return (/^(\/?)collection(\/?)([\w\.\/\?]*)$/g).test(path); };
124
+ /**
125
+ * Utilities
126
+ */
127
+ this.mobile = function () { return window.innerWidth < 750; };
128
+ this.strictTypeChannel = function () { return _this.env.strictTypeChannel || 'b2b2c'; };
129
+ this.toDecimal = function (total) { return (total - Math.floor(total) == 0) ? total / 100 : total; };
130
+ /**
131
+ * Elementos para manejo de lista de rutas reutilizables
132
+ */
133
+ this.addRouteToReuse = function (route) { return route && _this.routes.push(route); };
134
+ this.removeRouteToReuse = function (route) {
135
+ var index = _this.routes.indexOf(route);
136
+ if (index > -1) {
137
+ _this.routes.splice(index, 1);
138
+ }
139
+ };
140
+ this.getRoutesToReuse = function () { return _this.routes; };
141
+ /**
142
+ * @public ejemplo de uso <img *ngFor="let item of consts.getRatingStar(product.rating,'assets/images/star.png','assets/images/notStar.png')" [src]="item">
143
+ * @description funcion que dado un valor entre 1 .. 5, y star: notStar:
144
+ * (deben ser el path del archivo local a la implementacion).
145
+ * retorna un arreglo con con la valoracion correspondiente.
146
+ */
147
+ this.getRatingStar = function (rating, star, notStar) {
148
+ try {
149
+ var urlStar = [];
150
+ var cantStar = Number(rating) || 0;
151
+ for (var index = 0; index < 5; index++) {
152
+ urlStar.push(cantStar > 0
153
+ ? star
154
+ : notStar);
155
+ cantStar--;
156
+ }
157
+ return urlStar;
158
+ }
159
+ catch (error) {
160
+ console.error("getRatingStar produjo un error -> ", error);
161
+ }
162
+ };
163
+ /**
164
+ * @public ejemplo de uso (keypress)="inputValidationByExpressions($event,'[0-9]{1,9}')" en el DOM.
165
+ * @description funcion que dado un manejandor de evento, y una expresion regular esta es
166
+ * evaluada sobre los valores que el manejador de eventos nos envia.
167
+ * En el caso en el que se envie el parametro 'condition' este puede ser para
168
+ * anular el evento como condicion adicional a la evaluacion de la entrada.
169
+ */
170
+ this.inputValidationByExpressions = function (e, patron, condition) {
171
+ if (condition === void 0) { condition = null; }
172
+ try {
173
+ var tecla = (document) ? e.keyCode : e.which;
174
+ if (tecla == 8)
175
+ return true;
176
+ var patronReg = new RegExp(patron);
177
+ var tecla_final = String.fromCharCode(tecla);
178
+ if (condition != null) {
179
+ return patronReg.test(tecla_final) && condition;
180
+ }
181
+ return patronReg.test(tecla_final);
182
+ }
183
+ catch (error) {
184
+ console.error("inputValidationByExpressions produjo un error -> ", error);
185
+ }
186
+ };
187
+ /**
188
+ * Propiedad que se utiliza para tomar como configuración para el tipo de moneda que se utiliza en el sitio.
189
+ * Estos valores son utilizados para el pipe currencyPrice
190
+ */
191
+ this.currency = {
192
+ code: 'ARG',
193
+ symbol: '$',
194
+ position: 'Left',
195
+ withoutDecimal: false
196
+ };
197
+ /**
198
+ * Arreglo de valores usados para el pipe currencyPrice
199
+ */
200
+ this.currencyTypeConfig = [
201
+ {
202
+ code: 'EUR',
203
+ symbol: '€',
204
+ position: 'Right',
205
+ withoutDecimal: false
206
+ },
207
+ {
208
+ code: 'ARG',
209
+ symbol: '$',
210
+ position: 'Left',
211
+ withoutDecimal: false
212
+ },
213
+ {
214
+ code: 'ARS',
215
+ symbol: '$',
216
+ position: 'Left',
217
+ withoutDecimal: false
218
+ },
219
+ {
220
+ code: 'USD',
221
+ symbol: '$',
222
+ position: 'Left',
223
+ withoutDecimal: false
224
+ },
225
+ {
226
+ code: 'PYG',
227
+ symbol: 'Gs.',
228
+ position: 'Left',
229
+ withoutDecimal: false
230
+ },
231
+ {
232
+ code: 'PEN',
233
+ symbol: 'S/',
234
+ position: 'Left',
235
+ withoutDecimal: false
236
+ },
237
+ {
238
+ code: 'SEK',
239
+ symbol: 'SEK',
240
+ position: 'Right',
241
+ withoutDecimal: true
242
+ },
243
+ ];
244
+ this.setCurrencyTypeConfig = function (currencyTypeConfig) {
245
+ _this.currencyTypeConfig = currencyTypeConfig;
246
+ };
247
+ /**
248
+ * @description Reemplaza los valores de una moneda.
249
+ * @param currencyTypeFind Tipo de currency que se desea modificar
250
+ * @param customType Los nuevos valores. Todas las key son opcionales
251
+ * @example customType = { code: 'ARG', symbol: '$', position: 'Left' , withoutDecimal: false }
252
+ */
253
+ this.replaceCurrencyTypeConfig = function (currencyTypeFind, customType) {
254
+ var _a, _b, _c, _d;
255
+ var currencyType = _this.currencyTypeConfig.find(function (type) { return type.code == currencyTypeFind; });
256
+ if (currencyType) {
257
+ currencyType.symbol = ((_a = customType) === null || _a === void 0 ? void 0 : _a.symbol) || currencyType.symbol;
258
+ currencyType.code = ((_b = customType) === null || _b === void 0 ? void 0 : _b.code) || currencyType.code;
259
+ currencyType.position = ((_c = customType) === null || _c === void 0 ? void 0 : _c.position) || currencyType.position;
260
+ currencyType.withoutDecimal = ((_d = customType) === null || _d === void 0 ? void 0 : _d.withoutDecimal) || currencyType.withoutDecimal;
261
+ }
262
+ //Reveer en el futuro si se empiezan a agregar otro tipos de monedas
263
+ /* else{
264
+ this.currencyTypeConfig.push({...customType })
265
+ } */
266
+ };
267
+ /**
268
+ *
269
+ * @param currencyTypeFind Definir el code del tipo de moneda que se quiera utilizar.
270
+ * Si el tipo es CUSTOM se toman los valores del segundo parametro donde se puede definir la simbología y posesión que se quiera.
271
+ * @param customType Formato del parámetro ejemplo { code: 'ARG', symbol: '$', position: 'L' , withoutDecimals: false } ,
272
+ * todas las key son opcionales y por defecto se toman los valores del ejemplo.
273
+ * @returns se retorna la configuración que se seteo a la propiedad currency del servicio.
274
+ */
275
+ this.setCurrency = function (currencyTypeFind, customType) {
276
+ _this.currency = _this.currencyTypeConfig.find(function (ct) { return ct.code == currencyTypeFind.toUpperCase(); }) || _this.currency;
277
+ customType && (_this.currency = __assign(__assign({}, _this.currency), customType));
278
+ return _this.currency;
279
+ };
280
+ this.modifyChannelConfig = function (channelConfig) {
281
+ if (channelConfig.channel || channelConfig.code)
282
+ _this.setChannel(channelConfig.channel || channelConfig.code);
283
+ if (channelConfig.locale || channelConfig.locales.code)
284
+ _this.setLocale(channelConfig.locale || channelConfig.locales.code);
285
+ if (channelConfig.currency || channelConfig.baseCurrency)
286
+ _this.setCurrency(channelConfig.currency || channelConfig.baseCurrency);
287
+ return channelConfig;
288
+ };
289
+ /**
290
+ * @description Se utiliza para configurar los filtros por defecto que se aplicaran en la seccion 'Collection'
291
+ * cuando se ingresa a la misma.
292
+ */
293
+ this.defaultFilters = [];
294
+ /**
295
+ * @description Settea el valor de la variable defaulFilters.
296
+ * @param filters
297
+ */
298
+ this.setDefaultFilters = function (filters) {
299
+ _this.defaultFilters = filters;
300
+ };
301
+ this.getDefaultFilters = function () { return _this.defaultFilters; };
302
+ /**
303
+ * @description Se utiliza para configurar tanto los filtros por defectos que ya seran aplicados, como tambien
304
+ * los filtros que se mostraran en la seccion collection, su orden, etc.
305
+ */
306
+ this.filterConfig = {
307
+ defaultFilters: [],
308
+ filters: ['category', 'attributes', 'dynamics', 'price_range']
309
+ };
310
+ this.setFilterConfig = function (filterConfig) {
311
+ filterConfig.defaultFilters ? _this.filterConfig.defaultFilters = filterConfig.defaultFilters : null;
312
+ filterConfig.filters ? _this.filterConfig.filters = filterConfig.filters : null;
313
+ };
314
+ this.getFilterConfig = function () { return _this.filterConfig.filters; };
315
+ /**
316
+ * @description contiene un arreglo de string cuyo contenido son los codigos de los paises.
317
+ * @example ['AR','ES','GB']
318
+ */
319
+ this.countries = [];
320
+ /**
321
+ *
322
+ * @param countries debe contener los codigos de los paises que se quiere mostrar
323
+ * @example ['AR','ES','GB']
324
+ * @returns
325
+ */
326
+ this.setCountries = function (countries) { return _this.countries = countries; };
327
+ this.getCountries = function () { return _this.countries; };
328
+ /**
329
+ * @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
330
+ * variantes el listado de productos.
331
+ * @param {string}type tipo de options
332
+ * @param {string}code codigo de options
333
+ * @param {boolean}defaultFirstOption `true` toma el primer option del producto en general
334
+ * @param {boolean}checkIfStock `true` se realiza un chequeo de si la variante tiene stock para mostrarla
335
+ * @example ```javascript
336
+ * {
337
+ type: 'color',
338
+ code: 'color',
339
+ defaultFirstOption: false ,
340
+ checkIfStock:true
341
+ } ```
342
+ */
343
+ this.paramsProductsWithUniqueVariant = {
344
+ type: 'color',
345
+ code: 'color',
346
+ defaultFirstOption: false,
347
+ checkIfStock: true
348
+ };
349
+ this.setParamsProductsWithUniqueVariant = function (value) {
350
+ _this.paramsProductsWithUniqueVariant = __assign(__assign({}, _this.paramsProductsWithUniqueVariant), value);
351
+ };
352
+ this.getParamsProductsWithUniqueVariant = function () { return _this.paramsProductsWithUniqueVariant; };
353
+ /**
354
+ * @description se utiliza para configurar que filtros del tipo `SortFilter` se quiere mostrar en la vista.
355
+ * Se usan los codigo de los filtros para indicar cuales se deben mostrar.
356
+ */
357
+ this.sortFilters = ['price', 'order-alph', 'recent'];
358
+ /**
359
+ *
360
+ * @param filtersCode arreglo de strings con los codigos de los filtros.
361
+ * Si se le pasa el parametro **all** este mostrara todos.
362
+ * @example price | order-alph | recent | update | all
363
+ * @returns
364
+ */
365
+ this.setSortFilters = function (filtersCode) {
366
+ if (filtersCode === void 0) { filtersCode = ['all']; }
367
+ return _this.sortFilters = filtersCode;
368
+ };
369
+ this.getSortFilters = function () { return _this.sortFilters; };
370
+ }
371
+ /**
372
+ *
373
+ * @param needles (agujas) object con claves valor a filtrar
374
+ * @param haystack (pajar) objecto en el que buscar
375
+ *
376
+ * @description funcion que busca en el haystack (pajar) todos los objetos que contentan
377
+ * todas las claves de los needles(agujas) que contengan el mismo valor
378
+ */
379
+ Constants.prototype.containsAll = function (needles, haystack) {
380
+ var result = true;
381
+ if (!!needles && !!haystack) {
382
+ Object.entries(needles).forEach(function (value) {
383
+ if (!(haystack.hasOwnProperty(value[0]) && haystack[value[0]] == value[1]))
384
+ result = false;
385
+ });
386
+ }
387
+ return result;
388
+ };
389
+ /**
390
+ * devuelve true si existe el elemento "search" en el array de parametros "params"
391
+ *
392
+ * @param params Array de parametros entre los que buscar
393
+ * @param searched Elemento que buscar
394
+ * @param prefix prefijo del string a buscar (ejemplo: "link_")
395
+ * @param suffix sufijo del string a buscar (ejemplo: "link_")
396
+ * @param casesensitive determina si se evalua con sensibilidad entre mayuscula y minuscula
397
+ * @returns retorna true o false si se encontro o no el parametro en el array
398
+ */
399
+ Constants.prototype.hasParams = function (params, searched, prefix, suffix, casesensitive) {
400
+ if (prefix === void 0) { prefix = ''; }
401
+ if (suffix === void 0) { suffix = ''; }
402
+ if (casesensitive === void 0) { casesensitive = false; }
403
+ return casesensitive ? params.find(function (param) { return (param.code).toLowerCase() == (prefix + searched + suffix).toLowerCase() || (param.code).toLowerCase() == (searched).toLowerCase(); })
404
+ : params.find(function (param) { return param.code == (prefix + searched + suffix) || param.code == searched; });
405
+ };
406
+ ;
407
+ Constants.ctorParameters = function () { return [
408
+ { type: TranslateService },
409
+ { type: Router },
410
+ { type: undefined, decorators: [{ type: Inject, args: ['env',] }] }
411
+ ]; };
412
+ Constants.ɵprov = i0.ɵɵdefineInjectable({ factory: function Constants_Factory() { return new i1.Constants(i0.ɵɵinject(i2.TranslateService), i0.ɵɵinject(i3.Router), i0.ɵɵinject("env")); }, token: i1.Constants, providedIn: "root" });
413
+ Constants = __decorate([
414
+ Injectable({
415
+ providedIn: 'root'
416
+ }),
417
+ __param(2, Inject('env'))
418
+ ], Constants);
419
+ return Constants;
420
+ }());
421
+ export { Constants };
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdHMuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1lYXN5Y29tbWVyY2UvIiwic291cmNlcyI6WyJsaWIvY29yZS5jb25zdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFtQixhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBWXREO0lBRUksbUJBQW1CLFNBQTJCLEVBQVUsTUFBYyxFQUF5QixHQUFHO1FBQWxHLGlCQUF1RztRQUFwRixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBeUIsUUFBRyxHQUFILEdBQUcsQ0FBQTtRQUVqRixXQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ2xCLFlBQU8sR0FBRyxTQUFTLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFeEIseUJBQW9CLEdBQUcsSUFBSSxhQUFhLEVBQU8sQ0FBQztRQUNqRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUV6RCxxQkFBZ0IsR0FBRyxVQUFDLE9BQU8sSUFBSyxPQUFBLFlBQVksR0FBRyxPQUFPLEdBQUcsU0FBUyxFQUFsQyxDQUFrQyxDQUFDO1FBRW5FLGtCQUFhLEdBQVcsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUNyQyxxQkFBZ0IsR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVyRSxnRkFBZ0Y7UUFDeEUsWUFBTyxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFB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ckIsQ0FBQztRQUcyRSxXQUFBLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtPQUY3RSxTQUFTLENBK2JyQjtvQkEvY0Q7Q0ErY0MsQUEvYkQsSUErYkM7U0EvYlksU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU2VydmljZSB9IGZyb20gJy4vYXBpL2Nvbm5lY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDdXJyZW5jeUNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9jdXJyZW5jeUNvbmZpZyc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsdGVyLCBGaWx0ZXJDb25maWcgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyJztcbmltcG9ydCB7IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgfSBmcm9tICcuL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcbnR5cGUgY3VycmVuY3lUeXBlID0gJ0VVUicgfCAnQVJHJyB8ICdVU0QnIHwgJ1BZRycgfCAnUEVOJyB8ICdTRUsnIHwgJ0NVU1RPTSc7XG50eXBlIHBvc2l0aW9uVHlwZSA9ICdMJyB8ICdSJztcbnR5cGUgY2hhbm5lbFR5cGVzID0gJ2IyYicgfCAnYjJiMmMnIHwgJ2IyYyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29uc3RhbnRzIHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIEBJbmplY3QoJ2VudicpIHByaXZhdGUgZW52KSB7IH1cblxuICAgIHByaXZhdGUgcmVhZG9ubHkgTE9DQUxFID0gJ0xPQ0FMRSc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBDSEFOTkVMID0gJ0NIQU5ORUwnO1xuICAgIHB1YmxpYyBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cbiAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTdWJqZWN0ID0gbmV3IFJlcGxheVN1YmplY3Q8YW55PigpO1xuICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnJCA9IHRoaXMuY2hhbm5lbENvbmZpZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwcml2YXRlIGNoYW5uZWxDb25maWdBUEkgPSAoY2hhbm5lbCkgPT4gJy9zaG9wLWFwaS8nICsgY2hhbm5lbCArICdjaGFubmVsJztcblxuICAgIHByaXZhdGUgYnJvd3NlcldpbmRvdzogb2JqZWN0ID0gd2luZG93IHx8IHt9O1xuICAgIHByaXZhdGUgYnJvd3NlcldpbmRvd0Vudjogb2JqZWN0ID0gdGhpcy5icm93c2VyV2luZG93WydfX2VudiddIHx8IHt9O1xuXG4gICAgLy8gICAgIHByaXZhdGUgdXJsQmFzZTogc3RyaW5nID0gJ2h0dHA6Ly90ZXN0aW5nLmJhY2tlbmQuZWFzeWNvbW1lcmNldGVjaC5jb20vJztcbiAgICBwcml2YXRlIHVybEJhc2U6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYXBpVXJsJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2FwaVVybCddIDogKHRoaXMuZW52LmFwaVVybCB8fCAnaHR0cDovL2JhY2tlbmQuZWFzeWNvbW1lcmNlLmRldnAvJyk7XG4gICAgcHJpdmF0ZSB1cmxBc3NldHM6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsQXNzZXRzJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ3VybEFzc2V0cyddIDogKHRoaXMuZW52LnVybEFzc2V0cyB8fCB0aGlzLnVybEJhc2UpO1xuICAgIHByaXZhdGUgdXJsRnJvbnRlbmQ6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsRnJvbnRlbmQnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsndXJsRnJvbnRlbmQnXSA6ICh0aGlzLmVudi51cmxGcm9udGVuZCB8fCAnaHR0cHM6Ly9lbGRlbi5lYXN5Y29tbWVyY2V0ZWNoLmNvbS8nKTtcbiAgICBwcml2YXRlIGxvY2FsZTogc3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5MT0NBTEUpIDogdGhpcy5icm93c2VyV2luZG93RW52Wydsb2NhbGUnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnbG9jYWxlJ10gOiAodGhpcy5lbnYubG9jYWxlIHx8ICdlc19BUicpO1xuICAgIHByaXZhdGUgY2hhbm5lbDogc3RyaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5DSEFOTkVMKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuQ0hBTk5FTCkgOiB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2NoYW5uZWwnXSA/IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnY2hhbm5lbCddIDogKHRoaXMuZW52LmNoYW5uZWwgfHwgJ21pbm9yaXN0YScpXG4gICAgcHJpdmF0ZSBibG9ja3NDYWNoZVRpbWU6IHN0cmluZyA9IHRoaXMuYnJvd3NlcldpbmRvd0VudlsnYmxvY2tzQ2FjaGVUaW1lJ10gPyB0aGlzLmJyb3dzZXJXaW5kb3dFbnZbJ2Jsb2Nrc0NhY2hlVGltZSddIDogKHRoaXMuZW52LmJsb2Nrc0NhY2hlVGltZSB8fCBudWxsKTtcblxuICAgIHByaXZhdGUgbW9kYWxDb25maWcgPSB7IHRpdGxlOiAnRXhhbXBsZScsIGNsYXNzOiAnbW9kYWwteGwgbW9kYWwtZGlhbG9nLWNlbnRlcmVkJywga2V5Ym9hcmQ6IGZhbHNlIH07XG4gICAgc2V0TW9kYWxDb25maWcgPSAoY29uZmlnOiBhbnkpID0+IHRoaXMubW9kYWxDb25maWcgPSBjb25maWc7XG4gICAgZ2V0TW9kYWxDb25maWcgPSAoKSA9PiB0aGlzLm1vZGFsQ29uZmlnO1xuXG4gICAgcHJpdmF0ZSB2ZXJzaW9uOiBzdHJpbmcgPSAndjEnO1xuXG4gICAgcHJpdmF0ZSByb3V0ZXMgPSBbL15ob21lJC9nLCAvXihcXC8/KWNvbGxlY3Rpb24oXFwvPykoW1xcd1xcLlxcL1xcP10qKSQvZywgL15jb250YWN0JC9nXTtcblxuICAgIC8qIEdldCByaWQgb2YgdGhpcyBBU0FQISAqL1xuICAgIHByaXZhdGUgbWFzdGVyQ2hhbm5lbCA9IG51bGxcblxuICAgIHB1YmxpYyBnZXRNYXN0ZXJDaGFubmVsID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubWFzdGVyQ2hhbm5lbCkgdGhpcy5tYXN0ZXJDaGFubmVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ01BU1RFUl9DSEFOTkVMJylcbiAgICAgICAgcmV0dXJuIHRoaXMubWFzdGVyQ2hhbm5lbFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRNYXN0ZXJDaGFubmVsID0gY2hhbm5lbCA9PiB7XG4gICAgICAgIHRoaXMubWFzdGVyQ2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ01BU1RFUl9DSEFOTkVMJywgY2hhbm5lbClcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJvZHVjdGlvbiA9ICgpID0+IHRoaXMuYnJvd3NlcldpbmRvd0VudlsncHJvZHVjdGlvbiddID8gdGhpcy5icm93c2VyV2luZG93RW52Wydwcm9kdWN0aW9uJ10gOiAodGhpcy5lbnYucHJvZHVjdGlvbiB8fCBmYWxzZSk7XG5cbiAgICBzZXRVcmxCYXNlID0gKHVybCkgPT4gdGhpcy51cmxCYXNlID0gdXJsO1xuICAgIHNldFVybEFzc2V0cyA9ICh1cmwpID0+IHRoaXMudXJsQXNzZXRzID0gdXJsO1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIG5leHQgRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgICAqIEBwYXJhbSBwYXJhbXMgVGhhdCBmdW5jdGlvbiBuZWVkc1xuICAgICAqXG4gICAgICogRXhlY3V0ZSB0aGUgZnVuY3Rpb24gcGFzc2VkIGFzIHBhcmFtcywgaWYgdGhlIGZyb250ZW5kIGlzIGluIHByb2R1Y3Rpb24gbW9kZVxuICAgICAqL1xuICAgIG9ubHlJZlByb2R1Y3Rpb24gPSAobmV4dCwgcGFyYW1zKSA9PiB0aGlzLmlzUHJvZHVjdGlvbigpICYmIG5leHQocGFyYW1zKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBEZXZ1ZWx2ZSBsYSB1cmwgYmFzZSBkb25kZSBzZSBhbG9qYW4gbG9zIGFyY2hpdm9zIG11bHRpbWVkaWFcbiAgICAgKiBAcGFyYW0gcG9zdE1lZGlhIGNhcnBldGEgZG9uZGUgc2UgZ3VhcmRhbiBsb3MgYXJjaGl2b3NcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIG1lZGlhVXJsID0gKHBvc3RNZWRpYT86c3RyaW5nKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArICggcG9zdE1lZGlhID8gcG9zdE1lZGlhIDogXCJpbWFnZS9cIik7XG4gICAgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xuICAgIG1lZGlhU3RvcmVVcmwgPSAoKSA9PiB0aGlzLnVybEFzc2V0cyArICh0aGlzLnVybEFzc2V0cyA9PSB0aGlzLnVybEJhc2UgPyAnbWVkaWEvJyA6ICcnKSArIFwic3RvcmUtaW1hZ2UvXCI7XG5cbiAgICBnZXRQcm9kdWN0c0xpc3RSb3V0ZSA9ICgpID0+ICdjb2xsZWN0aW9uLyc7XG5cbiAgICBnZXRTZWN0aW9uc1JvdXRlID0gKCkgPT4gJ3NlY3Rpb24vJztcblxuICAgIGdldFVybEJhc2UgPSAoKSA9PiB0aGlzLnVybEJhc2U7XG4gICAgZ2V0VXJsRnJvbnRlbmQgPSAoKSA9PiB0aGlzLnVybEZyb250ZW5kO1xuXG4gICAgZ2V0QmxvY2tzQ2FjaGVUaW1lID0gKCk6IG51bWJlciA9PiB0aGlzLmJsb2Nrc0NhY2hlVGltZSAmJiBwYXJzZUludCh0aGlzLmJsb2Nrc0NhY2hlVGltZSk7XG5cbiAgICAvLyBnZXRMb2NhbGUgPSAoKSA9PiB0aGlzLmxvY2FsZTtcbiAgICAvLyBzZXRMb2NhbGUgPSAobG9jYWxlKSA9PiB0aGlzLmxvY2FsZSA9IGxvY2FsZTtcblxuICAgIGdldExvY2FsZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuTE9DQUxFKSkge1xuICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkxPQ0FMRSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVcbiAgICB9XG5cbiAgICBnZXRMb2NhbGVUcmFuc2xhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0TG9jYWxlID0gbG9jYWxlID0+IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5MT0NBTEUsIGxvY2FsZSlcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGxvY2FsZS5zcGxpdCgnXycpWzBdKVxuICAgICAgICB0aGlzLmxvY2FsZSA9IGxvY2FsZVxuICAgIH1cblxuICAgIGdldENoYW5uZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5uZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLkNIQU5ORUwpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbm5lbFxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRDaGFubmVsID0gY2hhbm5lbCA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuQ0hBTk5FTCwgY2hhbm5lbClcbiAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIH1cblxuICAgIGdldFZlcnNpb24gPSAoKSA9PiB0aGlzLnZlcnNpb247XG5cbiAgICBsb2dpbkV4dHJhRGF0YSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNsaWVudF9pZDogJ2RlbW9fY2xpZW50JyxcbiAgICAgICAgICAgIGNsaWVudF9zZWNyZXQ6ICdzZWNyZXRfZGVtb19jbGllbnQnLFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3Bhc3N3b3JkJ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNDb2xsZWN0aW9uID0gKHBhdGgpID0+ICgvXihcXC8/KWNvbGxlY3Rpb24oXFwvPykoW1xcd1xcLlxcL1xcP10qKSQvZykudGVzdChwYXRoKTtcblxuICAgIC8qKlxuICAgICAqIFV0aWxpdGllc1xuICAgICAqL1xuXG4gICAgbW9iaWxlID0gKCkgPT4gd2luZG93LmlubmVyV2lkdGggPCA3NTA7XG5cbiAgICBzdHJpY3RUeXBlQ2hhbm5lbCA9ICgpID0+IHRoaXMuZW52LnN0cmljdFR5cGVDaGFubmVsIHx8ICdiMmIyYyc7XG5cbiAgICB0b0RlY2ltYWwgPSAodG90YWwpID0+ICh0b3RhbCAtIE1hdGguZmxvb3IodG90YWwpID09IDApID8gdG90YWwgLyAxMDAgOiB0b3RhbDtcblxuICAgIC8qKlxuICAgICAqIEVsZW1lbnRvcyBwYXJhIG1hbmVqbyBkZSBsaXN0YSBkZSBydXRhcyByZXV0aWxpemFibGVzXG4gICAgICovXG5cbiAgICBhZGRSb3V0ZVRvUmV1c2UgPSAocm91dGU6IFJlZ0V4cCkgPT4gcm91dGUgJiYgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSk7XG5cbiAgICByZW1vdmVSb3V0ZVRvUmV1c2UgPSAocm91dGU6IFJlZ0V4cCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucm91dGVzLmluZGV4T2Yocm91dGUpO1xuICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvdXRlc1RvUmV1c2UgPSAoKTogUmVnRXhwW10gPT4gdGhpcy5yb3V0ZXM7XG5cblxuXG4gICAgLyoqXG4gICAgICogIEBwdWJsaWMgZWplbXBsbyBkZSB1c28gPGltZyAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb25zdHMuZ2V0UmF0aW5nU3Rhcihwcm9kdWN0LnJhdGluZywnYXNzZXRzL2ltYWdlcy9zdGFyLnBuZycsJ2Fzc2V0cy9pbWFnZXMvbm90U3Rhci5wbmcnKVwiIFtzcmNdPVwiaXRlbVwiPlxuICAgICAqICBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgZGFkbyB1biB2YWxvciBlbnRyZSAxIC4uIDUsIHkgc3Rhcjogbm90U3RhcjpcbiAgICAgKiAgICAgIChkZWJlbiBzZXIgZWwgcGF0aCBkZWwgYXJjaGl2byBsb2NhbCBhIGxhIGltcGxlbWVudGFjaW9uKS5cbiAgICAgKiAgICAgIHJldG9ybmEgdW4gYXJyZWdsbyBjb24gY29uIGxhIHZhbG9yYWNpb24gY29ycmVzcG9uZGllbnRlLlxuICAgICAqL1xuICAgIGdldFJhdGluZ1N0YXIgPSAocmF0aW5nOiBhbnksIHN0YXI6IFN0cmluZywgbm90U3RhcjogU3RyaW5nKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdXJsU3RhciA9IFtdO1xuICAgICAgICAgICAgbGV0IGNhbnRTdGFyID0gTnVtYmVyKHJhdGluZykgfHwgMDtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA1OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdXJsU3Rhci5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBjYW50U3RhciA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhclxuICAgICAgICAgICAgICAgICAgICAgICAgOiBub3RTdGFyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjYW50U3Rhci0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVybFN0YXI7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZ2V0UmF0aW5nU3RhciBwcm9kdWpvIHVuIGVycm9yIC0+IFwiLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiAgQHB1YmxpYyBlamVtcGxvIGRlIHVzbyAoa2V5cHJlc3MpPVwiaW5wdXRWYWxpZGF0aW9uQnlFeHByZXNzaW9ucygkZXZlbnQsJ1swLTldezEsOX0nKVwiIGVuIGVsIERPTS5cbiAgICAgKiAgQGRlc2NyaXB0aW9uIGZ1bmNpb24gcXVlIGRhZG8gdW4gbWFuZWphbmRvciBkZSBldmVudG8sIHkgdW5hIGV4cHJlc2lvbiByZWd1bGFyIGVzdGEgZXNcbiAgICAgKiAgICAgICAgICBldmFsdWFkYSBzb2JyZSBsb3MgdmFsb3JlcyBxdWUgZWwgbWFuZWphZG9yIGRlIGV2ZW50b3Mgbm9zIGVudmlhLlxuICAgICAqICAgICAgICAgIEVuIGVsIGNhc28gZW4gZWwgcXVlIHNlIGVudmllIGVsIHBhcmFtZXRybyAnY29uZGl0aW9uJyBlc3RlIHB1ZWRlIHNlciBwYXJhXG4gICAgICogICAgICAgICAgYW51bGFyIGVsIGV2ZW50byBjb21vIGNvbmRpY2lvbiBhZGljaW9uYWwgYSBsYSBldmFsdWFjaW9uIGRlIGxhIGVudHJhZGEuXG4gICAgICovXG4gICAgaW5wdXRWYWxpZGF0aW9uQnlFeHByZXNzaW9ucyA9IChlLCBwYXRyb24sIGNvbmRpdGlvbiA9IG51bGwgKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgdGVjbGEgPSAoZG9jdW1lbnQpID8gZS5rZXlDb2RlIDogZS53aGljaDtcbiAgICAgICAgICAgIGlmICh0ZWNsYSA9PSA4KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwYXRyb25SZWcgPSBuZXcgUmVnRXhwKHBhdHJvbilcbiAgICAgICAgICAgIGxldCB0ZWNsYV9maW5hbCA9IFN0cmluZy5mcm9tQ2hhckNvZGUodGVjbGEpO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhdHJvblJlZy50ZXN0KHRlY2xhX2ZpbmFsKSAmJiBjb25kaXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcGF0cm9uUmVnLnRlc3QodGVjbGFfZmluYWwpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiaW5wdXRWYWxpZGF0aW9uQnlFeHByZXNzaW9ucyBwcm9kdWpvIHVuIGVycm9yIC0+IFwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIG5lZWRsZXMgKGFndWphcykgb2JqZWN0IGNvbiBjbGF2ZXMgdmFsb3IgYSBmaWx0cmFyXG4gICAgICogQHBhcmFtIGhheXN0YWNrIChwYWphcikgb2JqZWN0byBlbiBlbCBxdWUgYnVzY2FyXG4gICAgICpcbiAgICAgKiBAZGVzY3JpcHRpb24gZnVuY2lvbiBxdWUgYnVzY2EgZW4gZWwgaGF5c3RhY2sgKHBhamFyKSB0b2RvcyBsb3Mgb2JqZXRvcyBxdWUgY29udGVudGFuXG4gICAgICogdG9kYXMgbGFzIGNsYXZlcyBkZSBsb3MgbmVlZGxlcyhhZ3VqYXMpIHF1ZSBjb250ZW5nYW4gZWwgbWlzbW8gdmFsb3JcbiAgICAgKi9cbiAgICBjb250YWluc0FsbChuZWVkbGVzOiBvYmplY3QsIGhheXN0YWNrOiBvYmplY3QpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAgICAgaWYgKCEhbmVlZGxlcyAmJiAhIWhheXN0YWNrKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhuZWVkbGVzKS5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIShoYXlzdGFjay5oYXNPd25Qcm9wZXJ0eSh2YWx1ZVswXSkgJiYgaGF5c3RhY2tbdmFsdWVbMF1dID09IHZhbHVlWzFdKSkgcmVzdWx0ID0gZmFsc2VcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9waWVkYWQgcXVlIHNlIHV0aWxpemEgcGFyYSB0b21hciBjb21vIGNvbmZpZ3VyYWNpw7NuIHBhcmEgZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHV0aWxpemEgZW4gZWwgc2l0aW8uXG4gICAgICogRXN0b3MgdmFsb3JlcyBzb24gdXRpbGl6YWRvcyBwYXJhIGVsIHBpcGUgY3VycmVuY3lQcmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW5jeTogQ3VycmVuY3lDb25maWcgPSB7XG4gICAgICAgIGNvZGU6ICdBUkcnLFxuICAgICAgICBzeW1ib2w6ICckJyxcbiAgICAgICAgcG9zaXRpb246ICdMZWZ0JyxcbiAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXJyZWdsbyBkZSB2YWxvcmVzIHVzYWRvcyBwYXJhIGVsIHBpcGUgY3VycmVuY3lQcmljZVxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29kZTogJ0VVUicsXG4gICAgICAgICAgICAgICAgc3ltYm9sOiAn4oKsJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ1JpZ2h0JyxcbiAgICAgICAgICAgICAgICB3aXRob3V0RGVjaW1hbDogZmFsc2VcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnQVJHJyxcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICckJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnQVJTJyxcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICckJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnVVNEJyxcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICckJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnUFlHJyxcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICdHcy4nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnTGVmdCcsXG4gICAgICAgICAgICAgICAgd2l0aG91dERlY2ltYWw6IGZhbHNlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvZGU6ICdQRU4nLFxuICAgICAgICAgICAgICAgIHN5bWJvbDogJ1MvJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ0xlZnQnLFxuICAgICAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0VLJyxcbiAgICAgICAgICAgICAgICBzeW1ib2w6ICdTRUsnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnUmlnaHQnLFxuICAgICAgICAgICAgICAgIHdpdGhvdXREZWNpbWFsOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICBdXG5cbiAgICAgICAgcHVibGljIHNldEN1cnJlbmN5VHlwZUNvbmZpZyA9IChjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10pID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xuICAgICAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBSZWVtcGxhemEgbG9zIHZhbG9yZXMgZGUgdW5hIG1vbmVkYS5cbiAgICAgKiBAcGFyYW0gY3VycmVuY3lUeXBlRmluZCBUaXBvIGRlIGN1cnJlbmN5IHF1ZSBzZSBkZXNlYSBtb2RpZmljYXJcbiAgICAgKiBAcGFyYW0gY3VzdG9tVHlwZSBMb3MgbnVldm9zIHZhbG9yZXMuIFRvZGFzIGxhcyBrZXkgc29uIG9wY2lvbmFsZXNcbiAgICAgKiBAZXhhbXBsZSBjdXN0b21UeXBlID0geyBjb2RlOiAnQVJHJywgc3ltYm9sOiAnJCcsIHBvc2l0aW9uOiAnTGVmdCcgLCB3aXRob3V0RGVjaW1hbDogZmFsc2UgfVxuICAgICAqL1xuICAgIHB1YmxpYyByZXBsYWNlQ3VycmVuY3lUeXBlQ29uZmlnID0gKGN1cnJlbmN5VHlwZUZpbmQ6IGN1cnJlbmN5VHlwZSwgY3VzdG9tVHlwZTogQ3VycmVuY3lDb25maWcpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbmN5VHlwZSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQodHlwZSA9PiB0eXBlLmNvZGUgPT0gY3VycmVuY3lUeXBlRmluZCApXG4gICAgICAgIGlmKGN1cnJlbmN5VHlwZSl7XG4gICAgICAgICAgICBjdXJyZW5jeVR5cGUuc3ltYm9sID0gY3VzdG9tVHlwZT8uc3ltYm9sIHx8ICBjdXJyZW5jeVR5cGUuc3ltYm9sXG4gICAgICAgICAgICBjdXJyZW5jeVR5cGUuY29kZSA9IGN1c3RvbVR5cGU/LmNvZGUgfHwgY3VycmVuY3lUeXBlLmNvZGVcbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS5wb3NpdGlvbiA9IGN1c3RvbVR5cGU/LnBvc2l0aW9uIHx8ICBjdXJyZW5jeVR5cGUucG9zaXRpb25cbiAgICAgICAgICAgIGN1cnJlbmN5VHlwZS53aXRob3V0RGVjaW1hbCA9IGN1c3RvbVR5cGU/LndpdGhvdXREZWNpbWFsIHx8IGN1cnJlbmN5VHlwZS53aXRob3V0RGVjaW1hbFxuICAgICAgICB9XG4gICAgICAgIC8vUmV2ZWVyIGVuIGVsIGZ1dHVybyBzaSBzZSBlbXBpZXphbiBhIGFncmVnYXIgb3RybyB0aXBvcyBkZSBtb25lZGFzXG4gICAgICAgIC8qIGVsc2V7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5VHlwZUNvbmZpZy5wdXNoKHsuLi5jdXN0b21UeXBlIH0pXG4gICAgICAgIH0gKi9cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cbiAgICAgKiBTaSBlbCB0aXBvIGVzIENVU1RPTSBzZSB0b21hbiBsb3MgdmFsb3JlcyBkZWwgc2VndW5kbyBwYXJhbWV0cm8gZG9uZGUgc2UgcHVlZGUgZGVmaW5pciBsYSBzaW1ib2xvZ8OtYSB5IHBvc2VzacOzbiBxdWUgc2UgcXVpZXJhLlxuICAgICAqIEBwYXJhbSBjdXN0b21UeXBlIEZvcm1hdG8gZGVsIHBhcsOhbWV0cm8gZWplbXBsbyB7IGNvZGU6ICdBUkcnLCBzeW1ib2w6ICckJywgcG9zaXRpb246ICdMJyAsIHdpdGhvdXREZWNpbWFsczogZmFsc2UgfSAsXG4gICAgICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxuICAgICAqIEByZXR1cm5zIHNlIHJldG9ybmEgbGEgY29uZmlndXJhY2nDs24gcXVlIHNlIHNldGVvIGEgbGEgcHJvcGllZGFkIGN1cnJlbmN5IGRlbCBzZXJ2aWNpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q3VycmVuY3kgPSAoY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoY3QgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcbiAgICAgICAgY3VzdG9tVHlwZSAmJiAodGhpcy5jdXJyZW5jeSA9IHsgLi4udGhpcy5jdXJyZW5jeSwgLi4uY3VzdG9tVHlwZSB9KVxuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW5jeTtcbiAgICB9O1xuXG5cbiAgICAvKipcbiAgICAgKiBkZXZ1ZWx2ZSB0cnVlIHNpIGV4aXN0ZSBlbCBlbGVtZW50byBcInNlYXJjaFwiIGVuIGVsIGFycmF5IGRlIHBhcmFtZXRyb3MgXCJwYXJhbXNcIlxuICAgICAqXG4gICAgICogQHBhcmFtIHBhcmFtcyBBcnJheSBkZSBwYXJhbWV0cm9zIGVudHJlIGxvcyBxdWUgYnVzY2FyXG4gICAgICogQHBhcmFtIHNlYXJjaGVkIEVsZW1lbnRvIHF1ZSBidXNjYXJcbiAgICAgKiBAcGFyYW0gcHJlZml4IHByZWZpam8gZGVsIHN0cmluZyBhIGJ1c2NhciAoZWplbXBsbzogXCJsaW5rX1wiKVxuICAgICAqIEBwYXJhbSBzdWZmaXggc3VmaWpvIGRlbCBzdHJpbmcgYSBidXNjYXIgKGVqZW1wbG86IFwibGlua19cIilcbiAgICAgKiBAcGFyYW0gY2FzZXNlbnNpdGl2ZSBkZXRlcm1pbmEgc2kgc2UgZXZhbHVhIGNvbiBzZW5zaWJpbGlkYWQgZW50cmUgbWF5dXNjdWxhIHkgbWludXNjdWxhXG4gICAgICogQHJldHVybnMgcmV0b3JuYSB0cnVlIG8gZmFsc2Ugc2kgc2UgZW5jb250cm8gbyBubyBlbCBwYXJhbWV0cm8gZW4gZWwgYXJyYXlcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUGFyYW1zKFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHNlYXJjaGVkLFxuICAgICAgICBwcmVmaXggPSAnJyxcbiAgICAgICAgc3VmZml4ID0gJycsXG4gICAgICAgIGNhc2VzZW5zaXRpdmUgPSBmYWxzZSk6IGJvb2xlYW4ge1xuXG5cbiAgICAgICAgcmV0dXJuIGNhc2VzZW5zaXRpdmUgPyBwYXJhbXMuZmluZChwYXJhbSA9PiAocGFyYW0uY29kZSkudG9Mb3dlckNhc2UoKSA9PSAocHJlZml4ICsgc2VhcmNoZWQgKyBzdWZmaXgpLnRvTG93ZXJDYXNlKCkgfHwgKHBhcmFtLmNvZGUpLnRvTG93ZXJDYXNlKCkgPT0gKHNlYXJjaGVkKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgOiBwYXJhbXMuZmluZChwYXJhbSA9PiBwYXJhbS5jb2RlID09IChwcmVmaXggKyBzZWFyY2hlZCArIHN1ZmZpeCkgfHwgcGFyYW0uY29kZSA9PSBzZWFyY2hlZClcblxuICAgIH07XG5cbiAgICBwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyA9IGNoYW5uZWxDb25maWcgPT4ge1xuICAgICAgICBpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0Q2hhbm5lbChjaGFubmVsQ29uZmlnLmNoYW5uZWwgfHwgY2hhbm5lbENvbmZpZy5jb2RlKVxuXG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcbiAgICAgICAgICAgIHRoaXMuc2V0TG9jYWxlKGNoYW5uZWxDb25maWcubG9jYWxlIHx8IGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKVxuXG4gICAgICAgIGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW5jeShjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXG4gICAgICAgIHJldHVybiBjaGFubmVsQ29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgbG9zIGZpbHRyb3MgcG9yIGRlZmVjdG8gcXVlIHNlIGFwbGljYXJhbiBlbiBsYSBzZWNjaW9uICdDb2xsZWN0aW9uJ1xuICAgICAqIGN1YW5kbyBzZSBpbmdyZXNhIGEgbGEgbWlzbWEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZWZhdWx0RmlsdGVyczogRGVmYXVsdEZpbHRlcltdID0gW11cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXR0ZWEgZWwgdmFsb3IgZGUgbGEgdmFyaWFibGUgZGVmYXVsRmlsdGVycy5cbiAgICAgKiBAcGFyYW0gZmlsdGVyc1xuICAgICAqL1xuICAgIHB1YmxpYyBzZXREZWZhdWx0RmlsdGVycyA9IChmaWx0ZXJzOkRlZmF1bHRGaWx0ZXJbXSkgPT4ge1xuICAgICAgICB0aGlzLmRlZmF1bHRGaWx0ZXJzID0gZmlsdGVycztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVmYXVsdEZpbHRlcnMgPSAoKTpEZWZhdWx0RmlsdGVyW10gPT4gdGhpcy5kZWZhdWx0RmlsdGVyc1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHRhbnRvIGxvcyBmaWx0cm9zIHBvciBkZWZlY3RvcyBxdWUgeWEgc2VyYW4gYXBsaWNhZG9zLCBjb21vIHRhbWJpZW5cbiAgICAgKiBsb3MgZmlsdHJvcyBxdWUgc2UgbW9zdHJhcmFuIGVuIGxhIHNlY2Npb24gY29sbGVjdGlvbiwgc3Ugb3JkZW4sIGV0Yy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlckNvbmZpZzogRmlsdGVyQ29uZmlnID0ge1xuICAgICAgICBkZWZhdWx0RmlsdGVyczogW10sXG4gICAgICAgIGZpbHRlcnM6IFsnY2F0ZWdvcnknLCdhdHRyaWJ1dGVzJywnZHluYW1pY3MnLCAncHJpY2VfcmFuZ2UnXVxuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGaWx0ZXJDb25maWcgPSAoIGZpbHRlckNvbmZpZzpGaWx0ZXJDb25maWcgKSA9PiB7XG4gICAgICAgIGZpbHRlckNvbmZpZy5kZWZhdWx0RmlsdGVycyA/IHRoaXMuZmlsdGVyQ29uZmlnLmRlZmF1bHRGaWx0ZXJzID0gZmlsdGVyQ29uZmlnLmRlZmF1bHRGaWx0ZXJzIDogbnVsbFxuICAgICAgICBmaWx0ZXJDb25maWcuZmlsdGVycyA/IHRoaXMuZmlsdGVyQ29uZmlnLmZpbHRlcnMgPSBmaWx0ZXJDb25maWcuZmlsdGVycyA6IG51bGxcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmlsdGVyQ29uZmlnID0gKCkgPT4gdGhpcy5maWx0ZXJDb25maWcuZmlsdGVyc1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGNvbnRpZW5lIHVuIGFycmVnbG8gZGUgc3RyaW5nIGN1eW8gY29udGVuaWRvIHNvbiBsb3MgY29kaWdvcyBkZSBsb3MgcGFpc2VzLlxuICAgICAqIEBleGFtcGxlIFsnQVInLCdFUycsJ0dCJ11cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvdW50cmllczogc3RyaW5nW10gPSBbXVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIGRlYmUgY29udGVuZXIgbG9zIGNvZGlnb3MgZGUgbG9zIHBhaXNlcyBxdWUgc2UgcXVpZXJlIG1vc3RyYXJcbiAgICAgKiBAZXhhbXBsZSBbJ0FSJywnRVMnLCdHQiddXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q291bnRyaWVzID0gKGNvdW50cmllczpzdHJpbmdbXSkgPT4gdGhpcy5jb3VudHJpZXMgPSBjb3VudHJpZXM7XG5cbiAgICBwdWJsaWMgZ2V0Q291bnRyaWVzID0gKCkgPT4gdGhpcy5jb3VudHJpZXM7XG5cblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBlc3RhIHZhcmlhYmxlIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIGxvcyBwYXJhbWV0cm9zIGN1YW5kbyBzZSBkZXNlYSBtb3N0cmFyXG4gICAgICogdmFyaWFudGVzIGVsIGxpc3RhZG8gZGUgcHJvZHVjdG9zLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfXR5cGUgdGlwbyBkZSBvcHRpb25zXG4gICAgICogQHBhcmFtIHtzdHJpbmd9Y29kZSBjb2RpZ28gZGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1kZWZhdWx0Rmlyc3RPcHRpb24gYHRydWVgIHRvbWEgZWwgcHJpbWVyIG9wdGlvbiBkZWwgcHJvZHVjdG8gZW4gZ2VuZXJhbFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn1jaGVja0lmU3RvY2sgYHRydWVgIHNlIHJlYWxpemEgdW4gY2hlcXVlbyBkZSBzaSBsYSB2YXJpYW50ZSB0aWVuZSBzdG9jayBwYXJhIG1vc3RyYXJsYVxuICAgICAqIEBleGFtcGxlICBgYGBqYXZhc2NyaXB0XG4gICAgICoge1xuICAgICAgICB0eXBlOiAnY29sb3InLFxuICAgICAgICBjb2RlOiAnY29sb3InLFxuICAgICAgICBkZWZhdWx0Rmlyc3RPcHRpb246IGZhbHNlICxcbiAgICAgICAgY2hlY2tJZlN0b2NrOnRydWVcbiAgICAgICAgfSBgYGBcbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQ6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG4gICAgICAgIHR5cGU6ICdjb2xvcicsXG4gICAgICAgIGNvZGU6ICdjb2xvcicsXG4gICAgICAgIGRlZmF1bHRGaXJzdE9wdGlvbjogZmFsc2UgLFxuICAgICAgICBjaGVja0lmU3RvY2s6dHJ1ZVxuICAgIH1cblxuICAgIHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xuICAgICAgICB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG4gICAgICAgICAgICAuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXG4gICAgICAgICAgICAuLi52YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9ICgpID0+IHRoaXMucGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudFxuXG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gc2UgdXRpbGl6YSBwYXJhIGNvbmZpZ3VyYXIgcXVlIGZpbHRyb3MgZGVsIHRpcG8gYFNvcnRGaWx0ZXJgIHNlIHF1aWVyZSBtb3N0cmFyIGVuIGxhIHZpc3RhLlxuICAgICAqIFNlIHVzYW4gbG9zIGNvZGlnbyBkZSBsb3MgZmlsdHJvcyBwYXJhIGluZGljYXIgY3VhbGVzIHNlIGRlYmVuIG1vc3RyYXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzb3J0RmlsdGVyczpzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVyc0NvZGUgYXJyZWdsbyBkZSBzdHJpbmdzIGNvbiBsb3MgY29kaWdvcyBkZSBsb3MgZmlsdHJvcy5cbiAgICAgKiBTaSBzZSBsZSBwYXNhIGVsIHBhcmFtZXRybyAqKmFsbCoqIGVzdGUgbW9zdHJhcmEgdG9kb3MuXG4gICAgICogQGV4YW1wbGUgcHJpY2UgfCBvcmRlci1hbHBoIHwgcmVjZW50IHwgdXBkYXRlIHwgYWxsXG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBzZXRTb3J0RmlsdGVycyA9IChmaWx0ZXJzQ29kZTpzdHJpbmdbXT1bJ2FsbCddKSA9PiB0aGlzLnNvcnRGaWx0ZXJzID0gZmlsdGVyc0NvZGU7XG5cbiAgICBnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XG5cbn1cblxuIl19