@snabcentr/client-core 2.66.19 → 2.66.21

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.
@@ -1,6 +1,7 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { HttpClient } from '@angular/common/http';
3
- import { inject, Injectable } from '@angular/core';
3
+ import { DestroyRef, inject, Injectable } from '@angular/core';
4
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
5
  import { tuiPure } from '@taiga-ui/cdk';
5
6
  import { catchError, distinctUntilChanged, map, of, skip, startWith, switchMap } from 'rxjs';
6
7
  import { ScCartService } from '../../cart';
@@ -44,11 +45,41 @@ export class ScRecommendationService {
44
45
  * Сервис для работы с корзиной.
45
46
  */
46
47
  this.cartService = inject(ScCartService);
48
+ /**
49
+ * Ссылка на жизненный цикл сервиса.
50
+ */
51
+ this.destroyRef = inject(DestroyRef);
47
52
  inject(SC_USER_INFO)
48
- .pipe(skip(1))
53
+ .pipe(skip(1), takeUntilDestroyed(this.destroyRef))
49
54
  .subscribe(() => {
50
- this.productsByCategoryMap.clear();
51
- this.productsByProductMap.clear();
55
+ this.clearCache();
56
+ });
57
+ }
58
+ /**
59
+ * Очищает кэшированные рекомендации.
60
+ */
61
+ clearCache() {
62
+ this.productsByCategoryMap.clear();
63
+ this.productsByProductMap.clear();
64
+ }
65
+ /**
66
+ * Удаляет просроченные записи кэша, чтобы карты не росли бесконечно при смене ключей.
67
+ */
68
+ deleteExpiredCategoryCacheItems() {
69
+ this.productsByCategoryMap.forEach((cachedItem, key) => {
70
+ if (!cachedItem.cachedDataIsActual()) {
71
+ this.productsByCategoryMap.delete(key);
72
+ }
73
+ });
74
+ }
75
+ /**
76
+ * Удаляет просроченные записи кэша товаров, чтобы карты не росли бесконечно при смене ключей.
77
+ */
78
+ deleteExpiredProductCacheItems() {
79
+ this.productsByProductMap.forEach((cachedItem, key) => {
80
+ if (!cachedItem.cachedDataIsActual()) {
81
+ this.productsByProductMap.delete(key);
82
+ }
52
83
  });
53
84
  }
54
85
  /**
@@ -57,6 +88,7 @@ export class ScRecommendationService {
57
88
  * @param categoryIdOrSlug Идентификатор или slug категории товаров.
58
89
  */
59
90
  getProductsByCategory$(categoryIdOrSlug) {
91
+ this.deleteExpiredCategoryCacheItems();
60
92
  let cachedItem = this.productsByCategoryMap.get(categoryIdOrSlug.toString());
61
93
  if (!cachedItem) {
62
94
  // Устанавливаем время жизни cachedItem равное, потому что нам не важно время жизни. Нам нужен функционал update().
@@ -68,6 +100,9 @@ export class ScRecommendationService {
68
100
  .pipe(startWith(null)), null);
69
101
  this.productsByCategoryMap.set(categoryIdOrSlug.toString(), cachedItem);
70
102
  }
103
+ if (!cachedItem.cachedDataIsActual()) {
104
+ cachedItem.update();
105
+ }
71
106
  return cachedItem.item$;
72
107
  }
73
108
  /**
@@ -76,6 +111,7 @@ export class ScRecommendationService {
76
111
  * @param productIdOrSlug Идентификатор или slug товара/услуги.
77
112
  */
78
113
  getProductsByProduct$(productIdOrSlug) {
114
+ this.deleteExpiredProductCacheItems();
79
115
  let cachedItem = this.productsByProductMap.get(productIdOrSlug.toString());
80
116
  if (!cachedItem) {
81
117
  // Устанавливаем время жизни cachedItem равное, потому что нам не важно время жизни. Нам нужен функционал update().
@@ -87,6 +123,9 @@ export class ScRecommendationService {
87
123
  .pipe(startWith(null)), null);
88
124
  this.productsByProductMap.set(productIdOrSlug.toString(), cachedItem);
89
125
  }
126
+ if (!cachedItem.cachedDataIsActual()) {
127
+ cachedItem.update();
128
+ }
90
129
  return cachedItem.item$;
91
130
  }
92
131
  /**
@@ -123,4 +162,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
123
162
  providedIn: 'root',
124
163
  }]
125
164
  }], ctorParameters: () => [], propDecorators: { getProductsByCart$: [] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcmVjb21tZW5kYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY2F0YWxvZy9zZXJ2aWNlcy9zYy1yZWNvbW1lbmRhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFekcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUzQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUc5Qzs7R0FFRztBQUlILE1BQU0sT0FBTyx1QkFBdUI7SUErQmhDOztPQUVHO0lBQ0g7UUFqQ0E7O1dBRUc7UUFDYywwQkFBcUIsR0FBb0QsSUFBSSxHQUFHLEVBQXFDLENBQUM7UUFFdkk7O1dBRUc7UUFDYyx5QkFBb0IsR0FBb0QsSUFB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dEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ2pKLEVBQ0QsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQzdGLENBQUM7SUFDTixDQUFDOytHQXJJUSx1QkFBdUI7bUhBQXZCLHVCQUF1QixjQUZwQixNQUFNOztBQTRIWDtJQUROLE9BQU87aUVBWVA7NEZBcklRLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7d0RBMkhVLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHR1aVB1cmUgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIE9ic2VydmFibGUsIG9mLCBza2lwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY0NhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2FydCc7XG5pbXBvcnQgeyBTY0lVcmxzIH0gZnJvbSAnLi4vLi4vY29uZmlnL3NjLWktdXJscyc7XG5pbXBvcnQgeyBTY0NvbnZlcnRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29udmVydGVycyc7XG5pbXBvcnQgeyBsb2FkaW5nUGxhY2Vob2xkZXIgfSBmcm9tICcuLi8uLi9vcmRlci90b2tlbnMvc2Mtb3JkZXItbG9hZGVyLnRva2VuJztcbmltcG9ydCB7IFNDX0lTX0hJRERFTl9FUlJPUl9BTEVSVF9IVFRQX0NPTlRFWFQgfSBmcm9tICcuLi8uLi90b2tlbnMvc2MtaXMtaGlkZGVuLWVycm9yLWFsZXJ0JztcbmltcG9ydCB7IFNDX1VSTFMgfSBmcm9tICcuLi8uLi90b2tlbnMvc2MtdXJscyc7XG5pbXBvcnQgeyBTQ19VU0VSX0lORk8gfSBmcm9tICcuLi8uLi91c2VyL3Rva2Vucy9zYy11c2VyLXByb3ZpZGVycyc7XG5pbXBvcnQgeyBTY0NhY2hlZEl0ZW0gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFNjUHJvZHVjdCB9IGZyb20gJy4uL2R0by9zYy1wcm9kdWN0JztcbmltcG9ydCB7IFNjSVByb2R1Y3QgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3NjLWktcHJvZHVjdCc7XG5cbi8qKlxuICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0YDQtdC60L7QvNC10L3QtNGD0LXQvNGL0LzQuCDRgtC+0LLQsNGA0LDQvNC4LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY1JlY29tbWVuZGF0aW9uU2VydmljZSB7XG4gICAgLyoqXG4gICAgICoge0BsaW5rIE1hcH0g0LrQvtC70LvQtdC60YbQuNGPINC/0LDRgCDQutC70Y7Rhy3Qt9C90LDRh9C10L3QuNC1INC00LvRjyDQutGN0YjQuNGA0L7QstCw0L3QvdGL0YUg0YDQtdC60L7QvNC10L3QtNGD0LXQvNGL0YUg0YLQvtCy0LDRgNC+0LIg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdHNCeUNhdGVnb3J5TWFwOiBNYXA8bnVtYmVyIHwgc3RyaW5nLCBTY0NhY2hlZEl0ZW08U2NQcm9kdWN0W10+PiA9IG5ldyBNYXA8bnVtYmVyLCBTY0NhY2hlZEl0ZW08U2NQcm9kdWN0W10+PigpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE1hcH0g0LrQvtC70LvQtdC60YbQuNGPINC/0LDRgCDQutC70Y7Rhy3Qt9C90LDRh9C10L3QuNC1INC00LvRjyDQutGN0YjQuNGA0L7QstCw0L3QvdGL0YUg0YDQtdC60L7QvNC10L3QtNGD0LXQvNGL0YUg0YLQvtCy0LDRgNC+0LIg0YLQvtCy0LDRgNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZHVjdHNCeVByb2R1Y3RNYXA6IE1hcDxudW1iZXIgfCBzdHJpbmcsIFNjQ2FjaGVkSXRlbTxTY1Byb2R1Y3RbXT4+ID0gbmV3IE1hcDxudW1iZXIsIFNjQ2FjaGVkSXRlbTxTY1Byb2R1Y3RbXT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiBIVFRQLdC60LvQuNC10L3Rgi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC/0LjRgdC+0Log0YHRgdGL0LvQvtC6INC/0YDQuNC70L7QttC10L3QuNGPLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXJsczogU2NJVXJscyA9IGluamVjdChTQ19VUkxTKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQutC+0L3QstC10YDRgtCw0YbQuNC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnZlcnRlcnNTZXJ2aWNlOiBTY0NvbnZlcnRlcnNTZXJ2aWNlID0gaW5qZWN0KFNjQ29udmVydGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQvtGA0LfQuNC90L7QuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBTY0NhcnRTZXJ2aWNlID0gaW5qZWN0KFNjQ2FydFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY1JlY29tbWVuZGF0aW9uU2VydmljZX0uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBpbmplY3QoU0NfVVNFUl9JTkZPKVxuICAgICAgICAgICAgLnBpcGUoc2tpcCgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdHNCeUNhdGVnb3J5TWFwLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0J5UHJvZHVjdE1hcC5jbGVhcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0LfQsNC/0YDQvtGBINC90LAg0L/QvtC70YPRh9C10L3QuNC1INGB0L/QuNGB0LrQsCDRgNC10LrQvtC80LXQvdC00L7QstCw0L3QvdGL0YUg0YLQvtCy0LDRgNC+0LIg0LTQu9GPINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeUlkT3JTbHVnINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCBzbHVnINC60LDRgtC10LPQvtGA0LjQuCDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvZHVjdHNCeUNhdGVnb3J5JChjYXRlZ29yeUlkT3JTbHVnOiBudW1iZXIgfCBzdHJpbmcpOiBPYnNlcnZhYmxlPFNjUHJvZHVjdFtdIHwgbnVsbD4ge1xuICAgICAgICBsZXQgY2FjaGVkSXRlbSA9IHRoaXMucHJvZHVjdHNCeUNhdGVnb3J5TWFwLmdldChjYXRlZ29yeUlkT3JTbHVnLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIGlmICghY2FjaGVkSXRlbSkge1xuICAgICAgICAgICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0LLRgNC10LzRjyDQttC40LfQvdC4IGNhY2hlZEl0ZW0g0YDQsNCy0L3QvtC1LCDQv9C+0YLQvtC80YMg0YfRgtC+INC90LDQvCDQvdC1INCy0LDQttC90L4g0LLRgNC10LzRjyDQttC40LfQvdC4LiDQndCw0Lwg0L3Rg9C20LXQvSDRhNGD0L3QutGG0LjQvtC90LDQuyB1cGRhdGUoKS5cbiAgICAgICAgICAgIGNhY2hlZEl0ZW0gPSBuZXcgU2NDYWNoZWRJdGVtPFNjUHJvZHVjdFtdLCBudWxsPihcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgICAgICAuZ2V0PFNjSVByb2R1Y3RbXT4oYCR7dGhpcy51cmxzLmFwaVVybH0vY2F0YWxvZy9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnlJZE9yU2x1Z30vcmVjb21tZW5kYXRpb25zYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogU0NfSVNfSElEREVOX0VSUk9SX0FMRVJUX0hUVFBfQ09OVEVYVCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHByb2R1Y3RzRFRPKSA9PiBwcm9kdWN0c0RUTy5tYXAoKHByb2R1Y3QpID0+IG5ldyBTY1Byb2R1Y3QocHJvZHVjdCkpKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aDxTY1Byb2R1Y3RbXSB8IG51bGw+KG51bGwpKSxcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0J5Q2F0ZWdvcnlNYXAuc2V0KGNhdGVnb3J5SWRPclNsdWcudG9TdHJpbmcoKSwgY2FjaGVkSXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGVkSXRlbS5pdGVtJDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiDQt9Cw0L/RgNC+0YEg0L3QsCDQv9C+0LvRg9GH0LXQvdC40LUg0YHQv9C40YHQutCwINGA0LXQutC+0LzQtdC90LTQvtCy0LDQvdC90YvRhSDRgtC+0LLQsNGA0L7QsiDQtNC70Y8g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0SWRPclNsdWcg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LjQu9C4IHNsdWcg0YLQvtCy0LDRgNCwL9GD0YHQu9GD0LPQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvZHVjdHNCeVByb2R1Y3QkKHByb2R1Y3RJZE9yU2x1ZzogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxTY1Byb2R1Y3RbXSB8IG51bGw+IHtcbiAgICAgICAgbGV0IGNhY2hlZEl0ZW0gPSB0aGlzLnByb2R1Y3RzQnlQcm9kdWN0TWFwLmdldChwcm9kdWN0SWRPclNsdWcudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgaWYgKCFjYWNoZWRJdGVtKSB7XG4gICAgICAgICAgICAvLyDQo9GB0YLQsNC90LDQstC70LjQstCw0LXQvCDQstGA0LXQvNGPINC20LjQt9C90LggY2FjaGVkSXRlbSDRgNCw0LLQvdC+0LUsINC/0L7RgtC+0LzRgyDRh9GC0L4g0L3QsNC8INC90LUg0LLQsNC20L3QviDQstGA0LXQvNGPINC20LjQt9C90LguINCd0LDQvCDQvdGD0LbQtdC9INGE0YPQvdC60YbQuNC+0L3QsNC7IHVwZGF0ZSgpLlxuICAgICAgICAgICAgY2FjaGVkSXRlbSA9IG5ldyBTY0NhY2hlZEl0ZW08U2NQcm9kdWN0W10+KFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAgICAgICAgIC5nZXQ8U2NJUHJvZHVjdFtdPihgJHt0aGlzLnVybHMuYXBpVXJsfS9jYXRhbG9nL3Byb2R1Y3RzLyR7cHJvZHVjdElkT3JTbHVnfS9yZWNvbW1lbmRhdGlvbnNgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBTQ19JU19ISURERU5fRVJST1JfQUxFUlRfSFRUUF9DT05URVhULFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgocHJvZHVjdHNEVE8pID0+IHByb2R1Y3RzRFRPLm1hcCgocHJvZHVjdCkgPT4gbmV3IFNjUHJvZHVjdChwcm9kdWN0KSkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoPFNjUHJvZHVjdFtdIHwgbnVsbD4obnVsbCkpLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnByb2R1Y3RzQnlQcm9kdWN0TWFwLnNldChwcm9kdWN0SWRPclNsdWcudG9TdHJpbmcoKSwgY2FjaGVkSXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGVkSXRlbS5pdGVtJDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiDQt9Cw0L/RgNC+0YEg0L3QsCDQv9C+0LvRg9GH0LXQvdC40LUg0YHQv9C40YHQutCwINGA0LXQutC+0LzQtdC90LTQvtCy0LDQvdC90YvRhSDRgtC+0LLQsNGA0L7QsiDQtNC70Y8g0YHQv9C40YHQutCwINC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0L7QsiDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0SWRzINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0Ysg0L/RgNC+0LTRg9C60YLQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRQcm9kdWN0c0J5UHJvZHVjdElkcyQocHJvZHVjdElkczogbnVtYmVyW10pOiBPYnNlcnZhYmxlPFNjUHJvZHVjdFtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5nZXQ8U2NJUHJvZHVjdFtdPihgJHt0aGlzLnVybHMuYXBpVXJsfS9jYXRhbG9nL3Byb2R1Y3RzL3JlY29tbWVuZGF0aW9uc2AsIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHRoaXMuY29udmVydGVyc1NlcnZpY2UudG9IdHRwUGFyYW1zKHsgcHJvZHVjdHM6IHByb2R1Y3RJZHMgfSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBTQ19JU19ISURERU5fRVJST1JfQUxFUlRfSFRUUF9DT05URVhULFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSxcbiAgICAgICAgICAgICAgICBtYXAoKHByb2R1Y3RzRFRPKSA9PiBwcm9kdWN0c0RUTy5tYXAoKHByb2R1Y3QpID0+IG5ldyBTY1Byb2R1Y3QocHJvZHVjdCkpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiDQt9Cw0L/RgNC+0YEg0L3QsCDQv9C+0LvRg9GH0LXQvdC40LUg0YHQv9C40YHQutCwINGA0LXQutC+0LzQtdC90LTQvtCy0LDQvdC90YvRhSDRgtC+0LLQsNGA0L7QsiDQtNC70Y8g0LrQvtGA0LfQuNC90Ysg0LrQu9C40LXQvdGC0LAuXG4gICAgICovXG4gICAgQHR1aVB1cmVcbiAgICBwdWJsaWMgZ2V0UHJvZHVjdHNCeUNhcnQkKCk6IE9ic2VydmFibGU8U2NQcm9kdWN0W10gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcnRTZXJ2aWNlLmdldCQoKS5waXBlKFxuICAgICAgICAgICAgbWFwKChjYXJ0KTogbnVtYmVyW10gPT4gKGNhcnQgIT09IGxvYWRpbmdQbGFjZWhvbGRlciAmJiAnaXRlbXMnIGluIGNhcnQgPyBjYXJ0Lml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5wcm9kdWN0LmlkKSA6IFtdKSksXG4gICAgICAgICAgICAvLyDQntGC0YTQuNC70YzRgtGA0L7QstGL0LLQsNC10Lwg0L/QvtCy0YLQvtGA0LXQvdC40Y8uINCe0L3QuCDQstC+0LfQvdC40LrQvdGD0YIg0LXRgdC70Lgg0LHRi9C70L4g0LjQt9C80LXQvdC10L3QviDQutC+0LvQuNGH0LXRgdGC0LLQviDRgtC+0LLQsNGA0LAg0LHQtdC3INGD0LTQsNC70LXQvdC40Y9cXNC00L7QsdCw0LLQu9C10L3QuNGPINC90L7QstGL0YUg0YLQvtCy0LDRgNC+0LIuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9uby1taXNsZWFkaW5nLWFycmF5LXJldmVyc2VcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKFxuICAgICAgICAgICAgICAgIChwcmV2aW91czogbnVtYmVyW10sIGN1cnJlbnQ6IG51bWJlcltdKSA9PlxuICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShbLi4ucHJldmlvdXNdLnNvcnQoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC0gYikpID09PSBKU09OLnN0cmluZ2lmeShbLi4uY3VycmVudF0uc29ydCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgLSBiKSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKHByb2R1Y3RJZHMpID0+IHRoaXMuZ2V0UHJvZHVjdHNCeVByb2R1Y3RJZHMkKHByb2R1Y3RJZHMpLnBpcGUoc3RhcnRXaXRoKG51bGwpKSlcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcmVjb21tZW5kYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvY2F0YWxvZy9zZXJ2aWNlcy9zYy1yZWNvbW1lbmRhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXpHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7QUFHOUM7O0dBRUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBb0NoQzs7T0FFRztJQUNIO1FBdENBOztXQUVHO1FBQ2MsMEJBQXFCLEdBQW9E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T0FBaUIsRUFBRSxFQUFFLENBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNqSixFQUNELFNBQVMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUM3RixDQUFDO0lBQ04sQ0FBQzsrR0FuTFEsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTs7QUEwS1g7SUFETixPQUFPO2lFQVlQOzRGQW5MUSx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCO3dEQXlLVSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyB0dWlQdXJlIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2tpcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NhcnQnO1xuaW1wb3J0IHsgU2NJVXJscyB9IGZyb20gJy4uLy4uL2NvbmZpZy9zYy1pLXVybHMnO1xuaW1wb3J0IHsgU2NDb252ZXJ0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbnZlcnRlcnMnO1xuaW1wb3J0IHsgbG9hZGluZ1BsYWNlaG9sZGVyIH0gZnJvbSAnLi4vLi4vb3JkZXIvdG9rZW5zL3NjLW9yZGVyLWxvYWRlci50b2tlbic7XG5pbXBvcnQgeyBTQ19JU19ISURERU5fRVJST1JfQUxFUlRfSFRUUF9DT05URVhUIH0gZnJvbSAnLi4vLi4vdG9rZW5zL3NjLWlzLWhpZGRlbi1lcnJvci1hbGVydCc7XG5pbXBvcnQgeyBTQ19VUkxTIH0gZnJvbSAnLi4vLi4vdG9rZW5zL3NjLXVybHMnO1xuaW1wb3J0IHsgU0NfVVNFUl9JTkZPIH0gZnJvbSAnLi4vLi4vdXNlci90b2tlbnMvc2MtdXNlci1wcm92aWRlcnMnO1xuaW1wb3J0IHsgU2NDYWNoZWRJdGVtIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBTY1Byb2R1Y3QgfSBmcm9tICcuLi9kdG8vc2MtcHJvZHVjdCc7XG5pbXBvcnQgeyBTY0lQcm9kdWN0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zYy1pLXByb2R1Y3QnO1xuXG4vKipcbiAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINGA0LXQutC+0LzQtdC90LTRg9C10LzRi9C80Lgg0YLQvtCy0LDRgNCw0LzQuC5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2NSZWNvbW1lbmRhdGlvblNlcnZpY2Uge1xuICAgIC8qKlxuICAgICAqIHtAbGluayBNYXB9INC60L7Qu9C70LXQutGG0LjRjyDQv9Cw0YAg0LrQu9GO0Yct0LfQvdCw0YfQtdC90LjQtSDQtNC70Y8g0LrRjdGI0LjRgNC+0LLQsNC90L3Ri9GFINGA0LXQutC+0LzQtdC90LTRg9C10LzRi9GFINGC0L7QstCw0YDQvtCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQnlDYXRlZ29yeU1hcDogTWFwPG51bWJlciB8IHN0cmluZywgU2NDYWNoZWRJdGVtPFNjUHJvZHVjdFtdPj4gPSBuZXcgTWFwPG51bWJlciwgU2NDYWNoZWRJdGVtPFNjUHJvZHVjdFtdPj4oKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBNYXB9INC60L7Qu9C70LXQutGG0LjRjyDQv9Cw0YAg0LrQu9GO0Yct0LfQvdCw0YfQtdC90LjQtSDQtNC70Y8g0LrRjdGI0LjRgNC+0LLQsNC90L3Ri9GFINGA0LXQutC+0LzQtdC90LTRg9C10LzRi9GFINGC0L7QstCw0YDQvtCyINGC0L7QstCw0YDQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y3RzQnlQcm9kdWN0TWFwOiBNYXA8bnVtYmVyIHwgc3RyaW5nLCBTY0NhY2hlZEl0ZW08U2NQcm9kdWN0W10+PiA9IG5ldyBNYXA8bnVtYmVyLCBTY0NhY2hlZEl0ZW08U2NQcm9kdWN0W10+PigpO1xuXG4gICAgLyoqXG4gICAgICogSFRUUC3QutC70LjQtdC90YIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50ID0gaW5qZWN0KEh0dHBDbGllbnQpO1xuXG4gICAgLyoqXG4gICAgICog0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVybHM6IFNjSVVybHMgPSBpbmplY3QoU0NfVVJMUyk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LrQvtC90LLQtdGA0YLQsNGG0LjQuCDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb252ZXJ0ZXJzU2VydmljZTogU2NDb252ZXJ0ZXJzU2VydmljZSA9IGluamVjdChTY0NvbnZlcnRlcnNTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC60L7RgNC30LjQvdC+0LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogU2NDYXJ0U2VydmljZSA9IGluamVjdChTY0NhcnRTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0YHRi9C70LrQsCDQvdCwINC20LjQt9C90LXQvdC90YvQuSDRhtC40LrQuyDRgdC10YDQstC40YHQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjUmVjb21tZW5kYXRpb25TZXJ2aWNlfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChTQ19VU0VSX0lORk8pXG4gICAgICAgICAgICAucGlwZShza2lwKDEpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7Rh9C40YnQsNC10YIg0LrRjdGI0LjRgNC+0LLQsNC90L3Ri9C1INGA0LXQutC+0LzQtdC90LTQsNGG0LjQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvZHVjdHNCeUNhdGVnb3J5TWFwLmNsZWFyKCk7XG4gICAgICAgIHRoaXMucHJvZHVjdHNCeVByb2R1Y3RNYXAuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDQv9GA0L7RgdGA0L7Rh9C10L3QvdGL0LUg0LfQsNC/0LjRgdC4INC60Y3RiNCwLCDRh9GC0L7QsdGLINC60LDRgNGC0Ysg0L3QtSDRgNC+0YHQu9C4INCx0LXRgdC60L7QvdC10YfQvdC+INC/0YDQuCDRgdC80LXQvdC1INC60LvRjtGH0LXQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGRlbGV0ZUV4cGlyZWRDYXRlZ29yeUNhY2hlSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvZHVjdHNCeUNhdGVnb3J5TWFwLmZvckVhY2goKGNhY2hlZEl0ZW0sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYWNoZWRJdGVtLmNhY2hlZERhdGFJc0FjdHVhbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0J5Q2F0ZWdvcnlNYXAuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINC/0YDQvtGB0YDQvtGH0LXQvdC90YvQtSDQt9Cw0L/QuNGB0Lgg0LrRjdGI0LAg0YLQvtCy0LDRgNC+0LIsINGH0YLQvtCx0Ysg0LrQsNGA0YLRiyDQvdC1INGA0L7RgdC70Lgg0LHQtdGB0LrQvtC90LXRh9C90L4g0L/RgNC4INGB0LzQtdC90LUg0LrQu9GO0YfQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgZGVsZXRlRXhwaXJlZFByb2R1Y3RDYWNoZUl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnByb2R1Y3RzQnlQcm9kdWN0TWFwLmZvckVhY2goKGNhY2hlZEl0ZW0sIGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYWNoZWRJdGVtLmNhY2hlZERhdGFJc0FjdHVhbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0J5UHJvZHVjdE1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0LfQsNC/0YDQvtGBINC90LAg0L/QvtC70YPRh9C10L3QuNC1INGB0L/QuNGB0LrQsCDRgNC10LrQvtC80LXQvdC00L7QstCw0L3QvdGL0YUg0YLQvtCy0LDRgNC+0LIg0LTQu9GPINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYXRlZ29yeUlkT3JTbHVnINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCBzbHVnINC60LDRgtC10LPQvtGA0LjQuCDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvZHVjdHNCeUNhdGVnb3J5JChjYXRlZ29yeUlkT3JTbHVnOiBudW1iZXIgfCBzdHJpbmcpOiBPYnNlcnZhYmxlPFNjUHJvZHVjdFtdIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmRlbGV0ZUV4cGlyZWRDYXRlZ29yeUNhY2hlSXRlbXMoKTtcblxuICAgICAgICBsZXQgY2FjaGVkSXRlbSA9IHRoaXMucHJvZHVjdHNCeUNhdGVnb3J5TWFwLmdldChjYXRlZ29yeUlkT3JTbHVnLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIGlmICghY2FjaGVkSXRlbSkge1xuICAgICAgICAgICAgLy8g0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10Lwg0LLRgNC10LzRjyDQttC40LfQvdC4IGNhY2hlZEl0ZW0g0YDQsNCy0L3QvtC1LCDQv9C+0YLQvtC80YMg0YfRgtC+INC90LDQvCDQvdC1INCy0LDQttC90L4g0LLRgNC10LzRjyDQttC40LfQvdC4LiDQndCw0Lwg0L3Rg9C20LXQvSDRhNGD0L3QutGG0LjQvtC90LDQuyB1cGRhdGUoKS5cbiAgICAgICAgICAgIGNhY2hlZEl0ZW0gPSBuZXcgU2NDYWNoZWRJdGVtPFNjUHJvZHVjdFtdLCBudWxsPihcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgICAgICAuZ2V0PFNjSVByb2R1Y3RbXT4oYCR7dGhpcy51cmxzLmFwaVVybH0vY2F0YWxvZy9jYXRlZ29yaWVzLyR7Y2F0ZWdvcnlJZE9yU2x1Z30vcmVjb21tZW5kYXRpb25zYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogU0NfSVNfSElEREVOX0VSUk9SX0FMRVJUX0hUVFBfQ09OVEVYVCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKFtdKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHByb2R1Y3RzRFRPKSA9PiBwcm9kdWN0c0RUTy5tYXAoKHByb2R1Y3QpID0+IG5ldyBTY1Byb2R1Y3QocHJvZHVjdCkpKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKHN0YXJ0V2l0aDxTY1Byb2R1Y3RbXSB8IG51bGw+KG51bGwpKSxcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0c0J5Q2F0ZWdvcnlNYXAuc2V0KGNhdGVnb3J5SWRPclNsdWcudG9TdHJpbmcoKSwgY2FjaGVkSXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNhY2hlZEl0ZW0uY2FjaGVkRGF0YUlzQWN0dWFsKCkpIHtcbiAgICAgICAgICAgIGNhY2hlZEl0ZW0udXBkYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2FjaGVkSXRlbS5pdGVtJDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiDQt9Cw0L/RgNC+0YEg0L3QsCDQv9C+0LvRg9GH0LXQvdC40LUg0YHQv9C40YHQutCwINGA0LXQutC+0LzQtdC90LTQvtCy0LDQvdC90YvRhSDRgtC+0LLQsNGA0L7QsiDQtNC70Y8g0L/RgNC+0LTRg9C60YLQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0SWRPclNsdWcg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LjQu9C4IHNsdWcg0YLQvtCy0LDRgNCwL9GD0YHQu9GD0LPQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0UHJvZHVjdHNCeVByb2R1Y3QkKHByb2R1Y3RJZE9yU2x1ZzogbnVtYmVyIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxTY1Byb2R1Y3RbXSB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5kZWxldGVFeHBpcmVkUHJvZHVjdENhY2hlSXRlbXMoKTtcblxuICAgICAgICBsZXQgY2FjaGVkSXRlbSA9IHRoaXMucHJvZHVjdHNCeVByb2R1Y3RNYXAuZ2V0KHByb2R1Y3RJZE9yU2x1Zy50b1N0cmluZygpKTtcblxuICAgICAgICBpZiAoIWNhY2hlZEl0ZW0pIHtcbiAgICAgICAgICAgIC8vINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdC8INCy0YDQtdC80Y8g0LbQuNC30L3QuCBjYWNoZWRJdGVtINGA0LDQstC90L7QtSwg0L/QvtGC0L7QvNGDINGH0YLQviDQvdCw0Lwg0L3QtSDQstCw0LbQvdC+INCy0YDQtdC80Y8g0LbQuNC30L3QuC4g0J3QsNC8INC90YPQttC10L0g0YTRg9C90LrRhtC40L7QvdCw0LsgdXBkYXRlKCkuXG4gICAgICAgICAgICBjYWNoZWRJdGVtID0gbmV3IFNjQ2FjaGVkSXRlbTxTY1Byb2R1Y3RbXT4oXG4gICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAgICAgICAgICAgLmdldDxTY0lQcm9kdWN0W10+KGAke3RoaXMudXJscy5hcGlVcmx9L2NhdGFsb2cvcHJvZHVjdHMvJHtwcm9kdWN0SWRPclNsdWd9L3JlY29tbWVuZGF0aW9uc2AsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFNDX0lTX0hJRERFTl9FUlJPUl9BTEVSVF9IVFRQX0NPTlRFWFQsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChwcm9kdWN0c0RUTykgPT4gcHJvZHVjdHNEVE8ubWFwKChwcm9kdWN0KSA9PiBuZXcgU2NQcm9kdWN0KHByb2R1Y3QpKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAucGlwZShzdGFydFdpdGg8U2NQcm9kdWN0W10gfCBudWxsPihudWxsKSksXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdHNCeVByb2R1Y3RNYXAuc2V0KHByb2R1Y3RJZE9yU2x1Zy50b1N0cmluZygpLCBjYWNoZWRJdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY2FjaGVkSXRlbS5jYWNoZWREYXRhSXNBY3R1YWwoKSkge1xuICAgICAgICAgICAgY2FjaGVkSXRlbS51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWNoZWRJdGVtLml0ZW0kO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCINC30LDQv9GA0L7RgSDQvdCwINC/0L7Qu9GD0YfQtdC90LjQtSDRgdC/0LjRgdC60LAg0YDQtdC60L7QvNC10L3QtNC+0LLQsNC90L3Ri9GFINGC0L7QstCw0YDQvtCyINC00LvRjyDRgdC/0LjRgdC60LAg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDQvtCyINGC0L7QstCw0YDQvtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3RJZHMg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDRiyDQv9GA0L7QtNGD0LrRgtC+0LIuXG4gICAgICovXG4gICAgcHVibGljIGdldFByb2R1Y3RzQnlQcm9kdWN0SWRzJChwcm9kdWN0SWRzOiBudW1iZXJbXSk6IE9ic2VydmFibGU8U2NQcm9kdWN0W10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLmdldDxTY0lQcm9kdWN0W10+KGAke3RoaXMudXJscy5hcGlVcmx9L2NhdGFsb2cvcHJvZHVjdHMvcmVjb21tZW5kYXRpb25zYCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczogdGhpcy5jb252ZXJ0ZXJzU2VydmljZS50b0h0dHBQYXJhbXMoeyBwcm9kdWN0czogcHJvZHVjdElkcyB9LCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IFNDX0lTX0hJRERFTl9FUlJPUl9BTEVSVF9IVFRQX0NPTlRFWFQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSkpLFxuICAgICAgICAgICAgICAgIG1hcCgocHJvZHVjdHNEVE8pID0+IHByb2R1Y3RzRFRPLm1hcCgocHJvZHVjdCkgPT4gbmV3IFNjUHJvZHVjdChwcm9kdWN0KSkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCINC30LDQv9GA0L7RgSDQvdCwINC/0L7Qu9GD0YfQtdC90LjQtSDRgdC/0LjRgdC60LAg0YDQtdC60L7QvNC10L3QtNC+0LLQsNC90L3Ri9GFINGC0L7QstCw0YDQvtCyINC00LvRjyDQutC+0YDQt9C40L3RiyDQutC70LjQtdC90YLQsC5cbiAgICAgKi9cbiAgICBAdHVpUHVyZVxuICAgIHB1YmxpYyBnZXRQcm9kdWN0c0J5Q2FydCQoKTogT2JzZXJ2YWJsZTxTY1Byb2R1Y3RbXSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydFNlcnZpY2UuZ2V0JCgpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKGNhcnQpOiBudW1iZXJbXSA9PiAoY2FydCAhPT0gbG9hZGluZ1BsYWNlaG9sZGVyICYmICdpdGVtcycgaW4gY2FydCA/IGNhcnQuaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLnByb2R1Y3QuaWQpIDogW10pKSxcbiAgICAgICAgICAgIC8vINCe0YLRhNC40LvRjNGC0YDQvtCy0YvQstCw0LXQvCDQv9C+0LLRgtC+0YDQtdC90LjRjy4g0J7QvdC4INCy0L7Qt9C90LjQutC90YPRgiDQtdGB0LvQuCDQsdGL0LvQviDQuNC30LzQtdC90LXQvdC+INC60L7Qu9C40YfQtdGB0YLQstC+INGC0L7QstCw0YDQsCDQsdC10Lcg0YPQtNCw0LvQtdC90LjRj1xc0LTQvtCx0LDQstC70LXQvdC40Y8g0L3QvtCy0YvRhSDRgtC+0LLQsNGA0L7Qsi5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL25vLW1pc2xlYWRpbmctYXJyYXktcmV2ZXJzZVxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAgICAgICAgICAgKHByZXZpb3VzOiBudW1iZXJbXSwgY3VycmVudDogbnVtYmVyW10pID0+XG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFsuLi5wcmV2aW91c10uc29ydCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgLSBiKSkgPT09IEpTT04uc3RyaW5naWZ5KFsuLi5jdXJyZW50XS5zb3J0KChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gYSAtIGIpKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcCgocHJvZHVjdElkcykgPT4gdGhpcy5nZXRQcm9kdWN0c0J5UHJvZHVjdElkcyQocHJvZHVjdElkcykucGlwZShzdGFydFdpdGgobnVsbCkpKVxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,52 +1,33 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { SC_LINEAR_VALUES_TOKEN } from '../tokens';
3
- import * as i0 from "@angular/core";
4
1
  /**
5
- * Клас-помощник для работы со значениями единиц измерения товара.
2
+ * Класс-помощник для работы со значениями единиц измерения товара.
6
3
  */
7
4
  export class ScUnitsHelper {
8
5
  /**
9
- * Инициирует экземпляр класса {@link ScUnitsHelper}.
6
+ * Возвращает признак, что указанный товар имеет линейную единицу измерения.
10
7
  *
11
- * @param linearValues Единицы измерения линейной величины.
8
+ * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.
12
9
  */
13
- constructor(linearValues) {
14
- this.linearValues = linearValues;
10
+ static productIsMeasurable(product) {
11
+ return product.unit.isLinear || product.unit.isSquare;
15
12
  }
16
13
  /**
17
- * Возвращает признак возможности продажи товара на метраж.
14
+ * Возвращает кратность количества для указанного товара.
18
15
  *
19
- * @param product Товар для которого нужно проверить возможность продажи на метраж.
16
+ * @param product Данные о товаре для которого необходимо вернуть кратность количества.
20
17
  */
21
- productIsMeasurable(product) {
22
- return this.linearValues.includes(product.unit.name);
18
+ static getProductMultiplicity(product) {
19
+ return !product.properties?.ignoreMinCountCheck && product.minCount && !ScUnitsHelper.productIsMeasurable(product) ? product.minCount : 1;
23
20
  }
24
21
  /**
25
- * Возвращает кратность количества для товара.
22
+ * Возвращает кратность длины для указанного товара.
26
23
  *
27
- * @param product Товар для которого нужно вернуть кратность количества.
24
+ * @param product Данные о товаре для которого необходимо вернуть кратность длины.
28
25
  */
29
- productMultiplicity(product) {
30
- return product.minCount && !this.linearValues.includes(product.unit.name) ? product.minCount : 1;
26
+ static getProductLengthMultiplicity(product) {
27
+ if (product.properties?.lengthStep) {
28
+ return product.properties.lengthStep;
29
+ }
30
+ return !product.properties?.ignoreMinCountCheck && product.minCount ? product.minCount : 0.01;
31
31
  }
32
- /**
33
- * Возвращает значение кратности, для проверки кратности количества товара.
34
- *
35
- * @param product Товар для которого нужно вернуть значение кратность.
36
- */
37
- productStepForValidator(product) {
38
- return product.ignoreMinCountCheck ? 1 : this.productMultiplicity(product);
39
- }
40
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, deps: [{ token: SC_LINEAR_VALUES_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
41
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, providedIn: 'root' }); }
42
32
  }
43
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, decorators: [{
44
- type: Injectable,
45
- args: [{
46
- providedIn: 'root',
47
- }]
48
- }], ctorParameters: () => [{ type: undefined, decorators: [{
49
- type: Inject,
50
- args: [SC_LINEAR_VALUES_TOKEN]
51
- }] }] });
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtdW5pdHMtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9oZWxwZXJzL3NjLXVuaXRzLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUduRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBRW5EOztHQUVHO0FBSUgsTUFBTSxPQUFPLGFBQWE7SUFDdEI7Ozs7T0FJRztJQUNILFlBQW1FLFlBQXNCO1FBQXRCLGlCQUFZLEdBQVosWUFBWSxDQUFVO0lBQUcsQ0FBQztJQUU3Rjs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsT0FBa0I7UUFDekMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsT0FBa0I7UUFDekMsT0FBTyxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksdUJBQXVCLENBQUMsT0FBa0I7UUFDN0MsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9FLENBQUM7K0dBakNRLGFBQWEsa0JBTUssc0JBQXNCO21IQU54QyxhQUFhLGNBRlYsTUFBTTs7NEZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQU91QixNQUFNOzJCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTY1Byb2R1Y3QgfSBmcm9tICcuLi9jYXRhbG9nL2R0by9zYy1wcm9kdWN0JztcbmltcG9ydCB7IFNDX0xJTkVBUl9WQUxVRVNfVE9LRU4gfSBmcm9tICcuLi90b2tlbnMnO1xuXG4vKipcbiAqINCa0LvQsNGBLdC/0L7QvNC+0YnQvdC40Log0LTQu9GPINGA0LDQsdC+0YLRiyDRgdC+INC30L3QsNGH0LXQvdC40Y/QvNC4INC10LTQuNC90LjRhiDQuNC30LzQtdGA0LXQvdC40Y8g0YLQvtCy0LDRgNCwLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY1VuaXRzSGVscGVyIHtcbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY1VuaXRzSGVscGVyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsaW5lYXJWYWx1ZXMg0JXQtNC40L3QuNGG0Ysg0LjQt9C80LXRgNC10L3QuNGPINC70LjQvdC10LnQvdC+0Lkg0LLQtdC70LjRh9C40L3Riy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoQEluamVjdChTQ19MSU5FQVJfVkFMVUVTX1RPS0VOKSBwdWJsaWMgcmVhZG9ubHkgbGluZWFyVmFsdWVzOiBzdHJpbmdbXSkge31cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC/0YDQuNC30L3QsNC6INCy0L7Qt9C80L7QttC90L7RgdGC0Lgg0L/RgNC+0LTQsNC20Lgg0YLQvtCy0LDRgNCwINC90LAg0LzQtdGC0YDQsNC2LlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0KLQvtCy0LDRgCDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQvdGD0LbQvdC+INC/0YDQvtCy0LXRgNC40YLRjCDQstC+0LfQvNC+0LbQvdC+0YHRgtGMINC/0YDQvtC00LDQttC4INC90LAg0LzQtdGC0YDQsNC2LlxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9kdWN0SXNNZWFzdXJhYmxlKHByb2R1Y3Q6IFNjUHJvZHVjdCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lYXJWYWx1ZXMuaW5jbHVkZXMocHJvZHVjdC51bml0Lm5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC60YDQsNGC0L3QvtGB0YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQsCDQtNC70Y8g0YLQvtCy0LDRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0KLQvtCy0LDRgCDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQvdGD0LbQvdC+INCy0LXRgNC90YPRgtGMINC60YDQsNGC0L3QvtGB0YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvZHVjdE11bHRpcGxpY2l0eShwcm9kdWN0OiBTY1Byb2R1Y3QpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gcHJvZHVjdC5taW5Db3VudCAmJiAhdGhpcy5saW5lYXJWYWx1ZXMuaW5jbHVkZXMocHJvZHVjdC51bml0Lm5hbWUpID8gcHJvZHVjdC5taW5Db3VudCA6IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0LfQvdCw0YfQtdC90LjQtSDQutGA0LDRgtC90L7RgdGC0LgsINC00LvRjyDQv9GA0L7QstC10YDQutC4INC60YDQsNGC0L3QvtGB0YLQuCDQutC+0LvQuNGH0LXRgdGC0LLQsCDRgtC+0LLQsNGA0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQotC+0LLQsNGAINC00LvRjyDQutC+0YLQvtGA0L7Qs9C+INC90YPQttC90L4g0LLQtdGA0L3Rg9GC0Ywg0LfQvdCw0YfQtdC90LjQtSDQutGA0LDRgtC90L7RgdGC0YwuXG4gICAgICovXG4gICAgcHVibGljIHByb2R1Y3RTdGVwRm9yVmFsaWRhdG9yKHByb2R1Y3Q6IFNjUHJvZHVjdCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBwcm9kdWN0Lmlnbm9yZU1pbkNvdW50Q2hlY2sgPyAxIDogdGhpcy5wcm9kdWN0TXVsdGlwbGljaXR5KHByb2R1Y3QpO1xuICAgIH1cbn1cbiJdfQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtdW5pdHMtaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9oZWxwZXJzL3NjLXVuaXRzLWhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ3RCOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBa0I7UUFDaEQsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxPQUFrQjtRQUNuRCxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsSUFBSSxPQUFPLENBQUMsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUksQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsNEJBQTRCLENBQUMsT0FBa0I7UUFDekQsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNsRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY1Byb2R1Y3QgfSBmcm9tICcuLi9jYXRhbG9nL2R0by9zYy1wcm9kdWN0JztcblxuLyoqXG4gKiDQmtC70LDRgdGBLdC/0L7QvNC+0YnQvdC40Log0LTQu9GPINGA0LDQsdC+0YLRiyDRgdC+INC30L3QsNGH0LXQvdC40Y/QvNC4INC10LTQuNC90LjRhiDQuNC30LzQtdGA0LXQvdC40Y8g0YLQvtCy0LDRgNCwLlxuICovXG5leHBvcnQgY2xhc3MgU2NVbml0c0hlbHBlciB7XG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0L/RgNC40LfQvdCw0LosINGH0YLQviDRg9C60LDQt9Cw0L3QvdGL0Lkg0YLQvtCy0LDRgCDQuNC80LXQtdGCINC70LjQvdC10LnQvdGD0Y4g0LXQtNC40L3QuNGG0YMg0LjQt9C80LXRgNC10L3QuNGPLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0JTQsNC90L3Ri9C1INC+INGC0L7QstCw0YDQtSDQtNC70Y8g0LrQvtGC0L7RgNC+0LPQviDQvdGD0LbQvdC+INC/0YDQvtCy0LXRgNC40YLRjCDQu9C40L3QtdC50L3QvtGB0YLRjCDQtdCz0L4g0LXQtNC40L3QuNGG0Ysg0LjQt9C80LXRgNC10L3QuNGPLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcHJvZHVjdElzTWVhc3VyYWJsZShwcm9kdWN0OiBTY1Byb2R1Y3QpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QudW5pdC5pc0xpbmVhciB8fCBwcm9kdWN0LnVuaXQuaXNTcXVhcmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0LrRgNCw0YLQvdC+0YHRgtGMINC60L7Qu9C40YfQtdGB0YLQstCwINC00LvRjyDRg9C60LDQt9Cw0L3QvdC+0LPQviDRgtC+0LLQsNGA0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvZHVjdCDQlNCw0L3QvdGL0LUg0L4g0YLQvtCy0LDRgNC1INC00LvRjyDQutC+0YLQvtGA0L7Qs9C+INC90LXQvtCx0YXQvtC00LjQvNC+INCy0LXRgNC90YPRgtGMINC60YDQsNGC0L3QvtGB0YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFByb2R1Y3RNdWx0aXBsaWNpdHkocHJvZHVjdDogU2NQcm9kdWN0KTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICFwcm9kdWN0LnByb3BlcnRpZXM/Lmlnbm9yZU1pbkNvdW50Q2hlY2sgJiYgcHJvZHVjdC5taW5Db3VudCAmJiAhU2NVbml0c0hlbHBlci5wcm9kdWN0SXNNZWFzdXJhYmxlKHByb2R1Y3QpID8gcHJvZHVjdC5taW5Db3VudCA6IDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0LrRgNCw0YLQvdC+0YHRgtGMINC00LvQuNC90Ysg0LTQu9GPINGD0LrQsNC30LDQvdC90L7Qs9C+INGC0L7QstCw0YDQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0INCU0LDQvdC90YvQtSDQviDRgtC+0LLQsNGA0LUg0LTQu9GPINC60L7RgtC+0YDQvtCz0L4g0L3QtdC+0LHRhdC+0LTQuNC80L4g0LLQtdGA0L3Rg9GC0Ywg0LrRgNCw0YLQvdC+0YHRgtGMINC00LvQuNC90YsuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQcm9kdWN0TGVuZ3RoTXVsdGlwbGljaXR5KHByb2R1Y3Q6IFNjUHJvZHVjdCk6IG51bWJlciB7XG4gICAgICAgIGlmIChwcm9kdWN0LnByb3BlcnRpZXM/Lmxlbmd0aFN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiBwcm9kdWN0LnByb3BlcnRpZXMubGVuZ3RoU3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhcHJvZHVjdC5wcm9wZXJ0aWVzPy5pZ25vcmVNaW5Db3VudENoZWNrICYmIHByb2R1Y3QubWluQ291bnQgPyBwcm9kdWN0Lm1pbkNvdW50IDogMC4wMTtcbiAgICB9XG59XG4iXX0=
@@ -3140,6 +3140,16 @@ class ScCatalogFilterService {
3140
3140
  */
3141
3141
  this.filterMap = new Map();
3142
3142
  }
3143
+ /**
3144
+ * Удаляет просроченные записи кэша, чтобы карта не удерживала фильтры неиспользуемых категорий.
3145
+ */
3146
+ deleteExpiredCacheItems() {
3147
+ this.filterMap.forEach((cachedItem, key) => {
3148
+ if (!cachedItem.cachedDataIsActual()) {
3149
+ this.filterMap.delete(key);
3150
+ }
3151
+ });
3152
+ }
3143
3153
  /**
3144
3154
  * Возвращает список доступных фильтров продуктов в категории.
3145
3155
  *
@@ -3148,6 +3158,7 @@ class ScCatalogFilterService {
3148
3158
  */
3149
3159
  getFilters$(categoryIdOrSlug, recursively) {
3150
3160
  const key = `${categoryIdOrSlug}:${recursively ?? ''}`;
3161
+ this.deleteExpiredCacheItems();
3151
3162
  let cachedItem = this.filterMap.get(key);
3152
3163
  if (!cachedItem) {
3153
3164
  let params = new HttpParams();
@@ -3281,10 +3292,14 @@ class ScCatalogService {
3281
3292
  * Сервис информации о пользователе.
3282
3293
  */
3283
3294
  this.userService = inject(ScUserService);
3295
+ /**
3296
+ * Ссылка на жизненный цикл сервиса.
3297
+ */
3298
+ this.destroyRef = inject(DestroyRef);
3284
3299
  /**
3285
3300
  * {@link Observable} изменения списка товаров со скидкой.
3286
3301
  */
3287
- this.firstDiscounted$ = inject(SC_USER_INFO).pipe(switchMap((user) => user.isGuest ? of(null) : this.getProducts$({ filters: { onlyDiscounted: true }, paginate: true, page: 1, perPage: this.countFirstDiscountedProducts })), shareReplay(1));
3302
+ this.firstDiscounted$ = inject(SC_USER_INFO).pipe(switchMap((user) => user.isGuest ? of(null) : this.getProducts$({ filters: { onlyDiscounted: true }, paginate: true, page: 1, perPage: this.countFirstDiscountedProducts })), shareReplay({ refCount: true, bufferSize: 1 }));
3288
3303
  /**
3289
3304
  * {@link Observable} изменения списка из первых товаров со скидкой.
3290
3305
  */
@@ -3295,16 +3310,24 @@ class ScCatalogService {
3295
3310
  this.countDiscountedProducts$ = this.firstDiscounted$.pipe(map$1((data) => data?.meta.total ?? 0));
3296
3311
  this.userService
3297
3312
  .getUserChange$()
3298
- .pipe(skip(1))
3313
+ .pipe(skip(1), takeUntilDestroyed(this.destroyRef))
3299
3314
  .subscribe(() => {
3300
- this.idCategoryMap.clear();
3301
- this.categoryMap.clear();
3302
- this.productHistoryMap.clear();
3303
- this.productMap.clear();
3304
- this.categoryProductsMap.clear();
3305
- this.virtualCategoryMap.clear();
3315
+ this.clearCache();
3306
3316
  });
3307
3317
  }
3318
+ /**
3319
+ * Очищает данные каталога, привязанные к текущему пользователю.
3320
+ */
3321
+ clearCache() {
3322
+ this.idCategoryMap.clear();
3323
+ this.categoryMap.clear();
3324
+ this.productHistoryMap.clear();
3325
+ this.productMap.clear();
3326
+ this.categoryProductsMap.clear();
3327
+ this.virtualCategoryMap.clear();
3328
+ this.categoryIdOrSlugMap.clear();
3329
+ this.productIdOrSlugMap.clear();
3330
+ }
3308
3331
  /**
3309
3332
  * Возвращает категорию из коллекции каталога, если её срок жизни не истёк.
3310
3333
  *
@@ -3415,6 +3438,9 @@ class ScCatalogService {
3415
3438
  .pipe(catchError$1(() => of({}))), null);
3416
3439
  this.productHistoryMap.set(product.id.toString(), cachedItem);
3417
3440
  }
3441
+ if (!cachedItem.cachedDataIsActual()) {
3442
+ cachedItem.update();
3443
+ }
3418
3444
  return cachedItem.item$;
3419
3445
  }
3420
3446
  // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents
@@ -3558,7 +3584,7 @@ class ScFavoriteService {
3558
3584
  /**
3559
3585
  * {@link Observable} списка избранных категорий.
3560
3586
  */
3561
- this.categories$ = this.categoriesUpdateSubject.pipe(switchMap(() => this.user$), switchMap((user) => (user.isGuest ? of([]) : this.getFavoriteCategories$())), shareReplay(1) // Подогреваем запрос во избежание повторения запросов получения списка избранных категорий для новых подписчиков.
3587
+ this.categories$ = this.categoriesUpdateSubject.pipe(switchMap(() => this.user$), switchMap((user) => (user.isGuest ? of([]) : this.getFavoriteCategories$())), shareReplay({ refCount: true, bufferSize: 1 }) // Подогреваем запрос во избежание повторения запросов получения списка избранных категорий для новых подписчиков.
3562
3588
  );
3563
3589
  }
3564
3590
  /**
@@ -3649,11 +3675,41 @@ class ScRecommendationService {
3649
3675
  * Сервис для работы с корзиной.
3650
3676
  */
3651
3677
  this.cartService = inject(ScCartService);
3678
+ /**
3679
+ * Ссылка на жизненный цикл сервиса.
3680
+ */
3681
+ this.destroyRef = inject(DestroyRef);
3652
3682
  inject(SC_USER_INFO)
3653
- .pipe(skip(1))
3683
+ .pipe(skip(1), takeUntilDestroyed(this.destroyRef))
3654
3684
  .subscribe(() => {
3655
- this.productsByCategoryMap.clear();
3656
- this.productsByProductMap.clear();
3685
+ this.clearCache();
3686
+ });
3687
+ }
3688
+ /**
3689
+ * Очищает кэшированные рекомендации.
3690
+ */
3691
+ clearCache() {
3692
+ this.productsByCategoryMap.clear();
3693
+ this.productsByProductMap.clear();
3694
+ }
3695
+ /**
3696
+ * Удаляет просроченные записи кэша, чтобы карты не росли бесконечно при смене ключей.
3697
+ */
3698
+ deleteExpiredCategoryCacheItems() {
3699
+ this.productsByCategoryMap.forEach((cachedItem, key) => {
3700
+ if (!cachedItem.cachedDataIsActual()) {
3701
+ this.productsByCategoryMap.delete(key);
3702
+ }
3703
+ });
3704
+ }
3705
+ /**
3706
+ * Удаляет просроченные записи кэша товаров, чтобы карты не росли бесконечно при смене ключей.
3707
+ */
3708
+ deleteExpiredProductCacheItems() {
3709
+ this.productsByProductMap.forEach((cachedItem, key) => {
3710
+ if (!cachedItem.cachedDataIsActual()) {
3711
+ this.productsByProductMap.delete(key);
3712
+ }
3657
3713
  });
3658
3714
  }
3659
3715
  /**
@@ -3662,6 +3718,7 @@ class ScRecommendationService {
3662
3718
  * @param categoryIdOrSlug Идентификатор или slug категории товаров.
3663
3719
  */
3664
3720
  getProductsByCategory$(categoryIdOrSlug) {
3721
+ this.deleteExpiredCategoryCacheItems();
3665
3722
  let cachedItem = this.productsByCategoryMap.get(categoryIdOrSlug.toString());
3666
3723
  if (!cachedItem) {
3667
3724
  // Устанавливаем время жизни cachedItem равное, потому что нам не важно время жизни. Нам нужен функционал update().
@@ -3673,6 +3730,9 @@ class ScRecommendationService {
3673
3730
  .pipe(startWith$1(null)), null);
3674
3731
  this.productsByCategoryMap.set(categoryIdOrSlug.toString(), cachedItem);
3675
3732
  }
3733
+ if (!cachedItem.cachedDataIsActual()) {
3734
+ cachedItem.update();
3735
+ }
3676
3736
  return cachedItem.item$;
3677
3737
  }
3678
3738
  /**
@@ -3681,6 +3741,7 @@ class ScRecommendationService {
3681
3741
  * @param productIdOrSlug Идентификатор или slug товара/услуги.
3682
3742
  */
3683
3743
  getProductsByProduct$(productIdOrSlug) {
3744
+ this.deleteExpiredProductCacheItems();
3684
3745
  let cachedItem = this.productsByProductMap.get(productIdOrSlug.toString());
3685
3746
  if (!cachedItem) {
3686
3747
  // Устанавливаем время жизни cachedItem равное, потому что нам не важно время жизни. Нам нужен функционал update().
@@ -3692,6 +3753,9 @@ class ScRecommendationService {
3692
3753
  .pipe(startWith$1(null)), null);
3693
3754
  this.productsByProductMap.set(productIdOrSlug.toString(), cachedItem);
3694
3755
  }
3756
+ if (!cachedItem.cachedDataIsActual()) {
3757
+ cachedItem.update();
3758
+ }
3695
3759
  return cachedItem.item$;
3696
3760
  }
3697
3761
  /**
@@ -4294,53 +4358,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
4294
4358
  }] });
4295
4359
 
4296
4360
  /**
4297
- * Клас-помощник для работы со значениями единиц измерения товара.
4361
+ * Класс-помощник для работы со значениями единиц измерения товара.
4298
4362
  */
4299
4363
  class ScUnitsHelper {
4300
4364
  /**
4301
- * Инициирует экземпляр класса {@link ScUnitsHelper}.
4365
+ * Возвращает признак, что указанный товар имеет линейную единицу измерения.
4302
4366
  *
4303
- * @param linearValues Единицы измерения линейной величины.
4367
+ * @param product Данные о товаре для которого нужно проверить линейность его единицы измерения.
4304
4368
  */
4305
- constructor(linearValues) {
4306
- this.linearValues = linearValues;
4369
+ static productIsMeasurable(product) {
4370
+ return product.unit.isLinear || product.unit.isSquare;
4307
4371
  }
4308
4372
  /**
4309
- * Возвращает признак возможности продажи товара на метраж.
4373
+ * Возвращает кратность количества для указанного товара.
4310
4374
  *
4311
- * @param product Товар для которого нужно проверить возможность продажи на метраж.
4375
+ * @param product Данные о товаре для которого необходимо вернуть кратность количества.
4312
4376
  */
4313
- productIsMeasurable(product) {
4314
- return this.linearValues.includes(product.unit.name);
4377
+ static getProductMultiplicity(product) {
4378
+ return !product.properties?.ignoreMinCountCheck && product.minCount && !ScUnitsHelper.productIsMeasurable(product) ? product.minCount : 1;
4315
4379
  }
4316
4380
  /**
4317
- * Возвращает кратность количества для товара.
4381
+ * Возвращает кратность длины для указанного товара.
4318
4382
  *
4319
- * @param product Товар для которого нужно вернуть кратность количества.
4383
+ * @param product Данные о товаре для которого необходимо вернуть кратность длины.
4320
4384
  */
4321
- productMultiplicity(product) {
4322
- return product.minCount && !this.linearValues.includes(product.unit.name) ? product.minCount : 1;
4323
- }
4324
- /**
4325
- * Возвращает значение кратности, для проверки кратности количества товара.
4326
- *
4327
- * @param product Товар для которого нужно вернуть значение кратность.
4328
- */
4329
- productStepForValidator(product) {
4330
- return product.ignoreMinCountCheck ? 1 : this.productMultiplicity(product);
4385
+ static getProductLengthMultiplicity(product) {
4386
+ if (product.properties?.lengthStep) {
4387
+ return product.properties.lengthStep;
4388
+ }
4389
+ return !product.properties?.ignoreMinCountCheck && product.minCount ? product.minCount : 0.01;
4331
4390
  }
4332
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, deps: [{ token: SC_LINEAR_VALUES_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable }); }
4333
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, providedIn: 'root' }); }
4334
4391
  }
4335
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScUnitsHelper, decorators: [{
4336
- type: Injectable,
4337
- args: [{
4338
- providedIn: 'root',
4339
- }]
4340
- }], ctorParameters: () => [{ type: undefined, decorators: [{
4341
- type: Inject,
4342
- args: [SC_LINEAR_VALUES_TOKEN]
4343
- }] }] });
4344
4392
 
4345
4393
  /**
4346
4394
  * Возвращает текущий маршрут.