ng-easycommerce 0.0.691 → 0.1.0

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 (63) hide show
  1. package/README.md +17 -0
  2. package/assets/ec-i18n/ct.json +3 -0
  3. package/assets/ec-i18n/en.json +3 -0
  4. package/assets/ec-i18n/es.json +3 -0
  5. package/assets/ec-i18n/fr.json +3 -0
  6. package/assets/ec-i18n/gl.json +3 -0
  7. package/assets/ec-i18n/pr.json +3 -0
  8. package/bundles/ng-easycommerce.umd.js +1219 -653
  9. package/bundles/ng-easycommerce.umd.js.map +1 -1
  10. package/bundles/ng-easycommerce.umd.min.js +1 -1
  11. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  12. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +103 -5
  13. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +22 -8
  14. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +34 -11
  15. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  16. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  17. package/esm2015/lib/interfaces/cart-item.js +1 -1
  18. package/esm2015/lib/interfaces/cart-totals.js +1 -0
  19. package/esm2015/lib/interfaces/channel.js +1 -0
  20. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  21. package/esm2015/lib/interfaces/product.js +1 -1
  22. package/esm2015/lib/services/account/orders.service.js +18 -3
  23. package/esm2015/lib/services/cart.service.js +138 -23
  24. package/esm2015/lib/services/checkout/checkout.service.js +34 -4
  25. package/esm2015/lib/utils/order-util.service.js +99 -7
  26. package/esm2015/lib/utils/price-presentation.service.js +127 -0
  27. package/esm2015/public-api.js +2 -1
  28. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +111 -5
  29. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +35 -8
  30. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +36 -13
  31. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +18 -7
  32. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +12 -3
  33. package/esm5/lib/interfaces/cart-item.js +1 -1
  34. package/esm5/lib/interfaces/cart-totals.js +1 -0
  35. package/esm5/lib/interfaces/channel.js +1 -0
  36. package/esm5/lib/interfaces/checkout-data.js +1 -1
  37. package/esm5/lib/interfaces/product.js +1 -1
  38. package/esm5/lib/services/account/orders.service.js +18 -3
  39. package/esm5/lib/services/cart.service.js +154 -23
  40. package/esm5/lib/services/checkout/checkout.service.js +30 -4
  41. package/esm5/lib/utils/order-util.service.js +99 -7
  42. package/esm5/lib/utils/price-presentation.service.js +130 -0
  43. package/esm5/public-api.js +2 -1
  44. package/fesm2015/ng-easycommerce.js +1181 -652
  45. package/fesm2015/ng-easycommerce.js.map +1 -1
  46. package/fesm5/ng-easycommerce.js +1219 -654
  47. package/fesm5/ng-easycommerce.js.map +1 -1
  48. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +15 -0
  49. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +8 -1
  50. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +1 -1
  51. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +2 -2
  52. package/lib/interfaces/cart-item.d.ts +27 -2
  53. package/lib/interfaces/cart-totals.d.ts +19 -0
  54. package/lib/interfaces/channel.d.ts +15 -0
  55. package/lib/interfaces/checkout-data.d.ts +2 -1
  56. package/lib/interfaces/product.d.ts +48 -1
  57. package/lib/services/account/orders.service.d.ts +5 -0
  58. package/lib/services/cart.service.d.ts +26 -5
  59. package/lib/utils/order-util.service.d.ts +22 -0
  60. package/lib/utils/price-presentation.service.d.ts +56 -0
  61. package/ng-easycommerce.metadata.json +1 -1
  62. package/package.json +1 -1
  63. package/public-api.d.ts +3 -0
@@ -42,7 +42,104 @@ let OrderEcComponent = class OrderEcComponent extends ComponentHelper {
42
42
  this.hideDiscounts = false;
43
43
  this.hideTaxes = false;
44
44
  this.enableFieldNotesInArticleFile = false;
45
+ this.showPriceWithTaxesWhileBrowsing = false;
45
46
  this.toDate = (date, format) => moment(date).format(!format && 'DD/MM/YYYY, h:mm:ss a' || format);
47
+ this.getLinePricing = (item) => {
48
+ var _a, _b;
49
+ const pricing = ((_a = item) === null || _a === void 0 ? void 0 : _a.linePricing) || ((_b = item) === null || _b === void 0 ? void 0 : _b.line_pricing);
50
+ if (!pricing || !pricing.unit || !pricing.discount || !pricing.subtotal)
51
+ return null;
52
+ const sections = ['unit', 'discount', 'subtotal'];
53
+ const valid = sections.every(section => ['net', 'tax', 'gross'].every(key => Number.isFinite(Number(pricing[section][key]))));
54
+ return valid ? pricing : null;
55
+ };
56
+ this.getHistoricalPricingKey = () => this.showPriceWithTaxesWhileBrowsing ? 'gross' : 'net';
57
+ this.getOrderLineValue = (item, section) => {
58
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
59
+ const linePricing = this.getLinePricing(item);
60
+ if (linePricing) {
61
+ return Number(linePricing[section][this.getHistoricalPricingKey()]);
62
+ }
63
+ if (section === 'unit') {
64
+ const unitPrice = (_b = (_a = item) === null || _a === void 0 ? void 0 : _a.unitPrice, (_b !== null && _b !== void 0 ? _b : (_c = item) === null || _c === void 0 ? void 0 : _c.unit_price));
65
+ if (unitPrice !== null && unitPrice !== undefined && unitPrice !== '')
66
+ return Number(unitPrice);
67
+ const historicalSubtotal = (_e = (_d = item) === null || _d === void 0 ? void 0 : _d.subtotal, (_e !== null && _e !== void 0 ? _e : (_f = item) === null || _f === void 0 ? void 0 : _f.total));
68
+ const quantity = Number(((_g = item) === null || _g === void 0 ? void 0 : _g.quantity) || 0);
69
+ if (historicalSubtotal !== null && historicalSubtotal !== undefined && quantity > 0) {
70
+ return Number(historicalSubtotal) / quantity;
71
+ }
72
+ // Compatibilidad extrema con respuestas antiguas que no contienen
73
+ // ningún importe del OrderItem. Nunca tiene prioridad sobre datos
74
+ // históricos persistidos.
75
+ const variant = (_k = (_j = (_h = item) === null || _h === void 0 ? void 0 : _h.product) === null || _j === void 0 ? void 0 : _j.variants) === null || _k === void 0 ? void 0 : _k[0];
76
+ const catalogPrice = (_m = (_l = variant) === null || _l === void 0 ? void 0 : _l.saleprice, (_m !== null && _m !== void 0 ? _m : (_o = variant) === null || _o === void 0 ? void 0 : _o.price));
77
+ return catalogPrice === null || catalogPrice === undefined || catalogPrice === ''
78
+ ? null
79
+ : Number(catalogPrice);
80
+ }
81
+ if (section === 'discount') {
82
+ const discount = (_p = item) === null || _p === void 0 ? void 0 : _p.discount;
83
+ return discount === null || discount === undefined || discount === '' ? 0 : Number(discount);
84
+ }
85
+ const subtotal = (_r = (_q = item) === null || _q === void 0 ? void 0 : _q.subtotal, (_r !== null && _r !== void 0 ? _r : (_s = item) === null || _s === void 0 ? void 0 : _s.total));
86
+ if (subtotal !== null && subtotal !== undefined && subtotal !== '')
87
+ return Number(subtotal);
88
+ return null;
89
+ };
90
+ this.hasOrderLineValue = (item, section) => this.getOrderLineValue(item, section) !== null;
91
+ this.getTotalsPricing = (totals, camelKey, snakeKey) => {
92
+ var _a, _b;
93
+ const pricing = ((_a = totals) === null || _a === void 0 ? void 0 : _a[camelKey]) || ((_b = totals) === null || _b === void 0 ? void 0 : _b[snakeKey]);
94
+ if (!pricing || !['net', 'tax', 'gross'].every(key => Number.isFinite(Number(pricing[key]))))
95
+ return null;
96
+ return pricing;
97
+ };
98
+ this.getSelectedTotalsPricing = (totals, camelKey, snakeKey) => {
99
+ const pricing = this.getTotalsPricing(totals, camelKey, snakeKey);
100
+ return pricing ? Number(pricing[this.getHistoricalPricingKey()]) : null;
101
+ };
102
+ this.hasHistoricalLinePricing = () => {
103
+ var _a;
104
+ return Array.isArray((_a = this.order) === null || _a === void 0 ? void 0 : _a.items)
105
+ && this.order.items.length > 0
106
+ && this.order.items.every(item => this.getLinePricing(item));
107
+ };
108
+ this.getHistoricalProductsSubtotal = () => {
109
+ var _a, _b, _c, _d, _e, _f, _g, _h;
110
+ if (this.hasHistoricalLinePricing()) {
111
+ return this.order.items.reduce((total, item) => total + Number(this.getLinePricing(item).subtotal[this.getHistoricalPricingKey()]), 0);
112
+ }
113
+ const subtotal = (_f = (_c = (_b = (_a = this.order) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.cartSubtotal, (_c !== null && _c !== void 0 ? _c : (_e = (_d = this.order) === null || _d === void 0 ? void 0 : _d.totals) === null || _e === void 0 ? void 0 : _e.cart_subtotal)), (_f !== null && _f !== void 0 ? _f : (_h = (_g = this.order) === null || _g === void 0 ? void 0 : _g.totals) === null || _h === void 0 ? void 0 : _h.subtotal));
114
+ return subtotal === null || subtotal === undefined ? null : Number(subtotal);
115
+ };
116
+ this.getHistoricalOrderDiscount = () => {
117
+ var _a, _b;
118
+ const explicit = this.getSelectedTotalsPricing((_a = this.order) === null || _a === void 0 ? void 0 : _a.totals, 'orderDiscountPricing', 'order_discount_pricing');
119
+ if (explicit !== null)
120
+ return explicit;
121
+ const totals = ((_b = this.order) === null || _b === void 0 ? void 0 : _b.totals) || {};
122
+ return totals.promotion === null || totals.promotion === undefined ? null : Number(totals.promotion);
123
+ };
124
+ this.getHistoricalCouponDiscount = () => { var _a; return this.getSelectedTotalsPricing((_a = this.order) === null || _a === void 0 ? void 0 : _a.totals, 'couponDiscountPricing', 'coupon_discount_pricing'); };
125
+ this.getHistoricalShipping = () => {
126
+ var _a, _b, _c;
127
+ const explicit = this.getSelectedTotalsPricing((_a = this.order) === null || _a === void 0 ? void 0 : _a.totals, 'shippingPricing', 'shipping_pricing');
128
+ if (explicit !== null)
129
+ return explicit;
130
+ const shipping = (_c = (_b = this.order) === null || _b === void 0 ? void 0 : _b.totals) === null || _c === void 0 ? void 0 : _c.shipping;
131
+ return shipping === null || shipping === undefined ? null : Number(shipping);
132
+ };
133
+ this.getHistoricalTaxes = () => {
134
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
135
+ return Number((_j = (_f = (_c = (_b = (_a = this.order) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.taxes, (_c !== null && _c !== void 0 ? _c : (_e = (_d = this.order) === null || _d === void 0 ? void 0 : _d.totals) === null || _e === void 0 ? void 0 : _e.cartTaxes)), (_f !== null && _f !== void 0 ? _f : (_h = (_g = this.order) === null || _g === void 0 ? void 0 : _g.totals) === null || _h === void 0 ? void 0 : _h.cart_taxes)), (_j !== null && _j !== void 0 ? _j : 0)));
136
+ };
137
+ this.hasHistoricalTaxes = () => this.getHistoricalTaxes() !== 0;
138
+ this.getHistoricalTotal = () => {
139
+ var _a, _b;
140
+ const total = (_b = (_a = this.order) === null || _a === void 0 ? void 0 : _a.totals) === null || _b === void 0 ? void 0 : _b.total;
141
+ return total === null || total === undefined ? null : Number(total);
142
+ };
46
143
  this.callError = () => {
47
144
  this.error = '?';
48
145
  this.router.navigateByUrl('account/orders');
@@ -72,7 +169,7 @@ let OrderEcComponent = class OrderEcComponent extends ComponentHelper {
72
169
  this.callError();
73
170
  };
74
171
  this.channelConfigService.channelConfig$.subscribe((config) => {
75
- var _a, _b, _c, _d, _e, _f, _g, _h;
172
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
76
173
  if (config && config.allowRepeatOrders !== undefined) {
77
174
  this.allowRepeatOrders = config.allowRepeatOrders;
78
175
  }
@@ -82,7 +179,8 @@ let OrderEcComponent = class OrderEcComponent extends ComponentHelper {
82
179
  this.hidePrices = (_b = (_a = config) === null || _a === void 0 ? void 0 : _a.hidePrices, (_b !== null && _b !== void 0 ? _b : false));
83
180
  this.hideDiscounts = (_d = (_c = config) === null || _c === void 0 ? void 0 : _c.hideDiscounts, (_d !== null && _d !== void 0 ? _d : false));
84
181
  this.hideTaxes = (_f = (_e = config) === null || _e === void 0 ? void 0 : _e.hideTaxes, (_f !== null && _f !== void 0 ? _f : false));
85
- this.enableFieldNotesInArticleFile = (_h = (_g = config) === null || _g === void 0 ? void 0 : _g.enableFieldNotesInArticleFile, (_h !== null && _h !== void 0 ? _h : false));
182
+ this.showPriceWithTaxesWhileBrowsing = ((_g = config) === null || _g === void 0 ? void 0 : _g.showPriceWithTaxesWhileBrowsing) === true;
183
+ this.enableFieldNotesInArticleFile = (_j = (_h = config) === null || _h === void 0 ? void 0 : _h.enableFieldNotesInArticleFile, (_j !== null && _j !== void 0 ? _j : false));
86
184
  });
87
185
  this.cartService.showPrice$.subscribe((showPrice) => {
88
186
  this.creditAccountShowPrices = showPrice;
@@ -109,9 +207,9 @@ __decorate([
109
207
  OrderEcComponent = __decorate([
110
208
  Component({
111
209
  selector: 'app-order-ec',
112
- template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n <div class=\"wrap\" *ngIf=\"!loading; else loadingView\">\n <div *ngIf=\"order; else noOrder\">\n\n <div class=\"row justify-content-between \">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n <ng-container *ngIf=\"order?.invoice\">\n <div class=\"col-sm col-12 font-brandon\" *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <a target=\"_blank\" [href]=\"consts.getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n </ng-container>\n <a (click)=\"volver()\" class=\"col-auto text-end\">\n <button class=\"btn btvolver bg-gray text-white\">{{ 'back-to-orders' | translate }}</button>\n </a>\n </div>\n\n <section id=\"orders\">\n <div class=\"row pt-2\">\n <div class=\"col-md-2 col-12\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"\">\n {{ order.shipments[0].method.name }}\n </p>\n <!-- ACA DEBERIA IR EL LINK DE SEGUIMIENTO -->\n <a *ngIf=\"order.tracking\" [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver\n seguimiento</a>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol:'alwaysShowDecimals'}}\n\n </h5>\n </div>\n </div>\n </section>\n\n <div class=\"text-end mt-3\" *ngIf=\"!hidePrices && allowRepeatOrders\">\n <button class=\"btn btn-primary mb-2\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n\n <div class=\"container py-3 border-top border-bottom\">\n <div *ngIf=\"order.items.length; else noProducts\" class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-4 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n <div id=\"colLots\" *ngIf=\"ordersService.channelConfig.applyOrderLot\"\n class=\"col-1 font-sm font-brandon d-none d-md-block\">\n <!-- {{ 'description' | translate | uppercase }} -->\n {{ 'lots' | translate | uppercase }}\n </div>\n <div class=\"col-2 text-center font-sm font-brandon d-none d-md-block\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n {{ 'total' | translate | uppercase }}\n </div>\n </div>\n <ng-container *ngFor=\"let item of order.items; let i = index\">\n <div class=\"row cart-items\">\n <div class=\"col-5 col-md-2 py-2\">\n <ng-container *ngIf=\"item.product.variants[0]?.images?.length ; else defaultpicture\">\n <img class=\"smc maxwidth img-fluid rounded-custom \"\n [src]=\"consts.mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n </ng-container>\n <ng-template #defaultpicture>\n <img *ngIf=\"item.product.picturesdefault\"\n class=\"smc maxwidth img-fluid rounded-custom\"\n [src]=\"consts.mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n </ng-template>\n </div> \n <div\n class=\"col-md-4 col-7 d-flex flex-column justify-content-center\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n <p *ngIf=\"enableFieldNotesInArticleFile && item.comments\" class=\"comment-truncated fst-italic small text-muted mt-1\">\n \"{{ item.comments }}\"\n </p>\n </div>\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-flex align-items-center\"\n *ngIf=\"ordersService.channelConfig.applyOrderLot\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center\" type=\"button\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n <div class=\"container d-md-none\">\n <div class=\"row\">\n <div class=\"col-4\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n <div class=\"col-4 font-xl\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-center w-100 m-0\"> {{ (item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) |\n ecCurrencySymbol:'alwaysShowDecimals'}}</p>\n </div>\n <div class=\"col-4 font-xl\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-center w-100 m-0\"> {{ ((item.product.variants[0].saleprice ?\n item.product.variants[0].saleprice : item.product.variants[0].price) *\n item.quantity) | ecCurrencySymbol:'alwaysShowDecimals'}}</p>\n </div>\n </div>\n </div>\n\n <div class=\"col-2 d-none d-md-flex align-items-center\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-center w-100 m-0\">\n {{ (item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) | ecCurrencySymbol:'alwaysShowDecimals'}}\n </p>\n </div>\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n <div class=\"col-2 d-none d-md-flex align-items-center\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-end w-100 m-0\">\n {{ ((item.product.variants[0].saleprice ? item.product.variants[0].saleprice :\n item.product.variants[0].price) * item.quantity) | ecCurrencySymbol:'alwaysShowDecimals'}}</p>\n </div>\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let lot of item.orderItemLot\">\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n <td *ngIf=\"lot.date_deliver; else sinFechaEstimada\">{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n <ng-template #sinFechaEstimada>\n <td>Pendiente</td>\n </ng-template>\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol:'alwaysShowDecimals'}}</td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n <div class=\"col-12 col-md-6\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <div class=\"row py-4\">\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'total-products' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.subtotal) | ecCurrencySymbol:'alwaysShowDecimals' }}\n </div>\n\n <div class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'shipment' |\n translate }}</div>\n <div class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.shipping || '0') | ecCurrencySymbol:'alwaysShowDecimals' }}\n\n </div>\n\n <div *ngIf=\"!hideDiscounts && order.totals.promotion && order.totals.promotion != 0\"\n class=\"col-6 font-brandon font-md text-gray border-bottom \">{{ 'discount' |\n translate }}</div>\n <div *ngIf=\"!hideDiscounts && order.totals.promotion && order.totals.promotion != 0\"\n class=\"col-6 font-brandon font-md text-gray border-bottom text-end text-end\">\n {{ (order.totals.promotion) | ecCurrencySymbol:'alwaysShowDecimals' }}</div>\n\n <div *ngIf=\"!hideTaxes && order.totals.taxes && order.totals.taxes != 0 \"\n class=\"col-6 font-brandon font-md text-gray border-bottom \">\n {{ 'taxes' | translate }}</div>\n <div *ngIf=\"!hideTaxes && order.totals.taxes && order.totals.taxes != 0\"\n class=\"col-6 font-brandon font-md text-gray border-bottom text-end\">\n {{ (order.totals.taxes) | ecCurrencySymbol:'alwaysShowDecimals' }}</div>\n\n <div class=\"col-6 font-brandon font-md\">{{ 'total' | translate | uppercase }}</div>\n <div class=\"col-6 font-brandon font-md text-end\">\n {{ (order.totals.total) | ecCurrencySymbol:'alwaysShowDecimals' }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n</main>\n\n<ng-template #noOrder>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingView>\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n</ng-template>",
113
- styles: [".maxwidth{max-width:100px}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}"]
210
+ template: "<main class=\"py-5\" id=\"orderEcComponent\">\n <div class=\"container\">\n <div class=\"wrap\" *ngIf=\"!loading; else loadingView\">\n <div *ngIf=\"order; else noOrder\">\n\n <div class=\"row justify-content-between \">\n <div class=\"col-sm-auto col-12 font-brandon\">\n <h4 class=\"tit1 fw-bold\">{{ ('order' | translate) + ': ' + order.number }}</h4>\n </div>\n <ng-container *ngIf=\"order?.invoice\">\n <div class=\"col-sm col-12 font-brandon\" *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <a target=\"_blank\" [href]=\"consts.getUrlBase().slice(0, -1) + order.invoice\"\n class=\"btn btn-link btn-invoice\">\n <i class=\"fas fa-file-download me-1\"></i>\n {{ 'download' | translate }} {{ 'invoices' | translate | titlecase }}\n </a>\n </div>\n </ng-container>\n <a (click)=\"volver()\" class=\"col-auto text-end\">\n <button class=\"btn btvolver bg-gray text-white\">{{ 'back-to-orders' | translate }}</button>\n </a>\n </div>\n\n <section id=\"orders\">\n <div class=\"row pt-2\">\n <div class=\"col-md-2 col-12\">\n <p class=\"st\">{{ 'payment-state' | translate }}:</p>\n <p class=\"\">\n {{ order.payments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'shipment-state' | translate }}:</p>\n <p class=\"\">\n {{ order.shipments[0].state | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'payment-method' | translate }}:</p>\n <p class=\"\">\n {{ order.payments[0]?.method?.name | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'shipment-method' | translate }}:</p>\n <p class=\"\">\n {{ order.shipments[0].method.name }}\n </p>\n <!-- ACA DEBERIA IR EL LINK DE SEGUIMIENTO -->\n <a *ngIf=\"order.tracking\" [href]=\"order.tracking\"\n class=\"btn btn-outline-dark btnLogout px-3 py-1 font-size-10 w-auto btn-sm\">Ver\n seguimiento</a>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\">\n <p class=\"st\">{{ 'date' | translate }}:</p>\n <p class=\"\">\n {{ toDate(order.checkoutCompletedAt, 'DD/MM/YYYY') | translate }}<br>\n {{ toDate(order.checkoutCompletedAt, 'h:mm:ss a') | translate }}\n </p>\n </div>\n <div class=\"col-md-2 col-12 font-brandon\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"st\">{{ 'total' | translate }}:</p>\n <h5 class=\"fw-bold\">\n {{ (order.totals.total) | ecCurrencySymbol:'alwaysShowDecimals'}}\n\n </h5>\n </div>\n </div>\n </section>\n\n <div class=\"text-end mt-3\" *ngIf=\"!hidePrices && allowRepeatOrders\">\n <button class=\"btn btn-primary mb-2\" (click)=\"repeatOrder()\">\n {{ 'repeat-order' | translate }}\n </button>\n </div>\n\n <div class=\"container py-3 border-top border-bottom\">\n <div *ngIf=\"order.items.length; else noProducts\" class=\"row\">\n <div class=\"col-2 font-sm font-brandon d-none d-md-block\">\n {{ 'product' | translate | uppercase }}\n </div>\n <div class=\"col-3 font-sm font-brandon d-none d-md-block\">\n {{ 'description' | translate | uppercase }}\n </div>\n <div id=\"colLots\" *ngIf=\"ordersService.channelConfig.applyOrderLot\"\n class=\"col-1 font-sm font-brandon d-none d-md-block\">\n <!-- {{ 'description' | translate | uppercase }} -->\n {{ 'lots' | translate | uppercase }}\n </div>\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n {{ 'unit-price' | translate | uppercase }}\n </div>\n <div class=\"col-1 text-center font-sm font-brandon d-none d-md-block\">\n {{ 'quantity' | translate | uppercase }}\n </div>\n <div class=\"col-1 text-end font-sm font-brandon d-none d-md-block\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n {{ 'discount' | translate | uppercase }}\n </div>\n <div class=\"col-2 text-end font-sm font-brandon d-none d-md-block\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n {{ 'subtotal' | translate | uppercase }}\n </div>\n </div>\n <ng-container *ngFor=\"let item of order.items; let i = index\">\n <div class=\"row cart-items\">\n <div class=\"col-5 col-md-2 py-2\">\n <ng-container *ngIf=\"item.product.variants[0]?.images?.length ; else defaultpicture\">\n <img class=\"smc maxwidth img-fluid rounded-custom \"\n [src]=\"consts.mediaUrl() + item.product.variants[0].images[0]\" alt=\"\">\n </ng-container>\n <ng-template #defaultpicture>\n <img *ngIf=\"item.product.picturesdefault\"\n class=\"smc maxwidth img-fluid rounded-custom\"\n [src]=\"consts.mediaUrl() + item.product.picturesdefault[0]\" alt=\"\">\n </ng-template>\n </div> \n <div\n class=\"col-md-3 col-7 d-flex flex-column justify-content-center\">\n <p class=\"font-brandon d-flex w-100 mb-0\">\n {{ item.product.name }} (Cod:{{ item.product.variants[0].code }})\n </p>\n <p *ngIf=\"enableFieldNotesInArticleFile && item.comments\" class=\"comment-truncated fst-italic small text-muted mt-1\">\n \"{{ item.comments }}\"\n </p>\n </div>\n <div class=\"col-md-1 col-1 flex-column flex-md-row justify-content-start d-flex align-items-center\"\n *ngIf=\"ordersService.channelConfig.applyOrderLot\">\n <input type=\"button\" class=\"btn btn-primary btnSeguir m-0 text-center\" type=\"button\"\n [attr.data-bs-toggle]=\"'collapse'\" [attr.data-bs-target]=\"'#collapseExample'+i\"\n aria-expanded=\"false\" [attr.aria-controls]=\"'collapseExample'+i\"\n value=\"{{ 'see' | translate | uppercase }}\">\n </div>\n <div class=\"container d-md-none\">\n <div class=\"row\">\n <div class=\"col-3\">\n <small class=\"order-line-label\">{{ 'unit-price' | translate }}</small>\n <p class=\"text-center w-100 m-0\" *ngIf=\"hasOrderLineValue(item, 'unit'); else noMobileUnit\">\n {{ getOrderLineValue(item, 'unit') | ecCurrencySymbol:'alwaysShowDecimals' }}\n </p>\n <ng-template #noMobileUnit>-</ng-template>\n </div>\n <div class=\"col-3\">\n <small class=\"order-line-label\">{{ 'quantity' | translate }}</small>\n <p class=\"text-center w-100 m-0\">{{ item.quantity }}</p>\n </div>\n <div class=\"col-3\">\n <small class=\"order-line-label\">{{ 'discount' | translate }}</small>\n <p class=\"text-center w-100 m-0\" *ngIf=\"getOrderLineValue(item, 'discount') !== 0; else noMobileDiscount\">\n {{ getOrderLineValue(item, 'discount') | ecCurrencySymbol:'alwaysShowDecimals' }}\n </p>\n <ng-template #noMobileDiscount>-</ng-template>\n </div>\n <div class=\"col-3\">\n <small class=\"order-line-label\">{{ 'subtotal' | translate }}</small>\n <p class=\"text-center w-100 m-0\" *ngIf=\"hasOrderLineValue(item, 'subtotal'); else noMobileSubtotal\">\n {{ getOrderLineValue(item, 'subtotal') | ecCurrencySymbol:'alwaysShowDecimals' }}\n </p>\n <ng-template #noMobileSubtotal>-</ng-template>\n </div>\n </div>\n </div>\n\n <div class=\"col-2 d-none d-md-flex align-items-center\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-end w-100 m-0\">\n {{ hasOrderLineValue(item, 'unit') ? (getOrderLineValue(item, 'unit') | ecCurrencySymbol:'alwaysShowDecimals') : '-' }}\n </p>\n </div>\n <div class=\"col-1 d-none d-md-flex align-items-center\">\n <p class=\"text-center w-100 m-0\"> {{ item.quantity }}</p>\n </div>\n <div class=\"col-1 d-none d-md-flex align-items-center\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-end w-100 m-0\" [class.text-muted]=\"getOrderLineValue(item, 'discount') === 0\">\n {{ getOrderLineValue(item, 'discount') !== 0 ? (getOrderLineValue(item, 'discount') | ecCurrencySymbol:'alwaysShowDecimals') : '-' }}\n </p>\n </div>\n <div class=\"col-2 d-none d-md-flex align-items-center\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <p class=\"text-end w-100 m-0\">\n {{ hasOrderLineValue(item, 'subtotal') ? (getOrderLineValue(item, 'subtotal') | ecCurrencySymbol:'alwaysShowDecimals') : '-' }}\n </p>\n </div>\n <div class=\"collapse\" [attr.id]=\"'collapseExample'+i\">\n <div class=\"card card-body\">\n <table class=\"table table-striped\">\n <thead>\n <tr>\n <th scope=\"col\">#</th>\n <th scope=\"col\">Estado</th>\n <th scope=\"col\">Cantidad</th>\n <th scope=\"col\">Fecha Solicitada</th>\n <th scope=\"col\">Fecha Estimada</th>\n <th scope=\"col\">Sede</th>\n <th scope=\"col\">Nota</th>\n <th scope=\"col\">Total Lote</th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let lot of item.orderItemLot\">\n <tr>\n <th scope=\"row\">{{lot.id}}</th>\n <td>{{lot.lot_status}}</td>\n <td>{{lot.quantity}}</td>\n <td>{{ toDate(lot.date_request, 'DD/MM/YYYY') | translate }}</td>\n <td *ngIf=\"lot.date_deliver; else sinFechaEstimada\">{{\n toDate(lot.date_deliver, 'DD/MM/YYYY') | translate }}</td>\n <ng-template #sinFechaEstimada>\n <td>Pendiente</td>\n </ng-template>\n <td>{{lot.shipping_address_name}}</td>\n <td>{{lot.notes}}</td>\n <td>{{lot.total_lot | ecCurrencySymbol:'alwaysShowDecimals'}}</td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n\n </ng-container>\n </div>\n\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 col-md-6\"></div>\n <div class=\"col-12 col-md-6\"\n *ngIf=\"(creditAccountShowPrices !== null ? creditAccountShowPrices : true)\">\n <div class=\"order-summary py-4\">\n <div class=\"order-summary-row\">\n <span>{{ 'subtotal' | translate }}</span>\n <strong>\n {{ getHistoricalProductsSubtotal() !== null\n ? (getHistoricalProductsSubtotal() | ecCurrencySymbol:'alwaysShowDecimals')\n : '-' }}\n </strong>\n </div>\n\n <div class=\"order-summary-row order-summary-row--discount\"\n *ngIf=\"!hideDiscounts && getHistoricalOrderDiscount() !== null && getHistoricalOrderDiscount() !== 0\">\n <span>{{ 'discount' | translate }}</span>\n <strong>{{ getHistoricalOrderDiscount() | ecCurrencySymbol:'alwaysShowDecimals' }}</strong>\n </div>\n\n <div class=\"order-summary-row order-summary-row--discount\"\n *ngIf=\"!hideDiscounts && getHistoricalCouponDiscount() !== null && getHistoricalCouponDiscount() !== 0\">\n <span>{{ 'coupon' | translate }}</span>\n <strong>{{ getHistoricalCouponDiscount() | ecCurrencySymbol:'alwaysShowDecimals' }}</strong>\n </div>\n\n <div class=\"order-summary-row order-summary-row--tax\"\n *ngIf=\"!showPriceWithTaxesWhileBrowsing && !hideTaxes && hasHistoricalTaxes()\">\n <span>{{ 'taxes' | translate }}</span>\n <strong>{{ getHistoricalTaxes() | ecCurrencySymbol:'alwaysShowDecimals' }}</strong>\n </div>\n\n <div class=\"order-summary-row\"\n *ngIf=\"getHistoricalShipping() !== null\">\n <span>{{ 'shipment' | translate }}</span>\n <strong>{{ getHistoricalShipping() | ecCurrencySymbol:'alwaysShowDecimals' }}</strong>\n </div>\n\n <div class=\"order-summary-row order-summary-row--total\">\n <span>{{ 'total' | translate | uppercase }}</span>\n <strong>\n {{ getHistoricalTotal() !== null\n ? (getHistoricalTotal() | ecCurrencySymbol:'alwaysShowDecimals')\n : '-' }}\n </strong>\n </div>\n\n <div class=\"order-summary-tax-info\"\n *ngIf=\"showPriceWithTaxesWhileBrowsing && !hideTaxes && hasHistoricalTaxes()\">\n <span>{{ 'taxes-included-in-total' | translate }}</span>\n <strong>{{ getHistoricalTaxes() | ecCurrencySymbol:'alwaysShowDecimals' }}</strong>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n</main>\n\n<ng-template #noOrder>\n <div class=\"w-100 h-50\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <h5>{{ 'no-orders' | translate }}</h5>\n </div>\n </div>\n</ng-template>\n\n<ng-template #loadingView>\n <div class=\"w-100 h-50 py-5\">\n <div class=\"d-flex flex-row justify-content-center align-items-center text-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n</ng-template>\n",
211
+ styles: [".maxwidth{max-width:100px}.comment-truncated{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;text-overflow:ellipsis;white-space:normal;max-height:3em}.order-line-label{display:block;color:#6b7280;font-size:.72rem;line-height:1.2;text-transform:uppercase}.order-summary{display:flex;flex-direction:column;gap:.65rem;color:#4b5563}.order-summary-row{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;min-width:0;font-size:.95rem}.order-summary-row span{min-width:0}.order-summary-row strong{flex:0 0 auto;white-space:nowrap;color:#111827;font-weight:600;text-align:right}.order-summary-row--discount strong{color:#15803d}.order-summary-row--tax{color:#4b5563}.order-summary-row--total{margin-top:.35rem;padding-top:.8rem;border-top:1px solid #d1d5db;color:#111827;font-size:1.15rem;font-weight:700}.order-summary-row--total strong{font-size:1.2rem;font-weight:700}.order-summary-tax-info{display:flex;align-items:baseline;justify-content:space-between;gap:1rem;margin-top:-.15rem;color:#6b7280;font-size:.82rem;font-weight:400}.order-summary-tax-info strong{flex:0 0 auto;white-space:nowrap;font-weight:400}@media (max-width:767.98px){.order-summary{padding-top:1rem;padding-bottom:1rem}.order-summary-row,.order-summary-tax-info{gap:.75rem}.order-summary-row--total{font-size:1.05rem}.order-summary-row--total strong{font-size:1.1rem}}"]
114
212
  })
115
213
  ], OrderEcComponent);
116
214
  export { OrderEcComponent };
117
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9hY2NvdW50LWVjL29yZGVyLWVjL29yZGVyLWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBT2hGLElBQWEsZ0JBQWdCLEdBQTdCLE1BQWEsZ0JBQWlCLFNBQVEsZUFBZTtJQWdCakQsWUFDVyxhQUE0QixFQUN6QixZQUE0QixFQUMvQixNQUFjLEVBQ2QsTUFBaUIsRUFDaEIsV0FBd0IsRUFDeEIsb0JBQTBDO1FBRWxELEtBQUssRUFBRSxDQUFDO1FBUEQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFw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O1lBQzlDLElBQUksQ0FBQyxhQUFhLGVBQUcsTUFBTSwwQ0FBRSxhQUFhLHVDQUFJLEtBQUssRUFBQSxDQUFDO1lBQ3BELElBQUksQ0FBQyxTQUFTLGVBQUcsTUFBTSwwQ0FBRSxTQUFTLHVDQUFJLEtBQUssRUFBQSxDQUFDO1lBQzVDLElBQUksQ0FBQyw2QkFBNkIsZUFBRyxNQUFNLDBDQUFFLDZCQUE2Qix1Q0FBSSxLQUFLLEVBQUEsQ0FBQztRQUN4RixDQUFDLENBQ0osQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQVdELFdBQVc7UUFDUCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzRDtJQUNMLENBQUM7Q0FFSixDQUFBOztZQWxFNkIsYUFBYTtZQUNYLGNBQWM7WUFDdkIsTUFBTTtZQUNOLFNBQVM7WUFDSCxXQUFXO1lBQ0Ysb0JBQW9COztBQWQ3QztJQUFSLEtBQUssRUFBRTtxREFBbUI7QUFSbEIsZ0JBQWdCO0lBTDVCLFNBQVMsQ0FBQztRQUNQLFFBQVEsRUFBRSxjQUFjO1FBQ3hCLGt5aUJBQXNDOztLQUV6QyxDQUFDO0dBQ1csZ0JBQWdCLENBbUY1QjtTQW5GWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IE9yZGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hY2NvdW50L29yZGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1vcmRlci1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdvcmRlci1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ29yZGVyLWVjLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgT3JkZXJFY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBwcm90ZWN0ZWQgb3JkZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHt9KTtcblxuICAgIHB1YmxpYyBvcmRlciQgPSB0aGlzLm9yZGVyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgb3JkZXIgPSBudWxsXG4gICAgcHVibGljIGxvYWRpbmcgPSB0cnVlO1xuICAgIHB1YmxpYyBlcnJvcjtcbiAgICBASW5wdXQoKSBudW1iZXJPcmRlciA9IG51bGxcbiAgICBwdWJsaWMgYWxsb3dSZXBlYXRPcmRlcnMgPSBmYWxzZTtcbiAgICBwdWJsaWMgY3JlZGl0QWNjb3VudFNob3dQcmljZXM6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgaGlkZVByaWNlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlRGlzY291bnRzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGhpZGVUYXhlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBlbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBvcmRlcnNTZXJ2aWNlOiBPcmRlcnNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYWN0aXZlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHByaXZhdGUgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLm9yZGVyc1NlcnZpY2Uuc2VsZWN0ZWRPcmRlciQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyT3JkZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlck9yZGVyID0gdGhpcy5hY3RpdmVkUm91dGUuc25hcHNob3QucGFyYW1zLm51bWJlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzKSBvcmRlciA9IHJlcztcbiAgICAgICAgICAgICAgICBlbHNlIG9yZGVyID0gYXdhaXQgdGhpcy5vcmRlcnNTZXJ2aWNlLmZpbmRPcmRlcih0aGlzLm51bWJlck9yZGVyKTtcbiAgICAgICAgICAgICAgICBvcmRlciAmJiB0aGlzLm9yZGVyU3ViamVjdC5uZXh0KG9yZGVyKTtcbiAgICAgICAgICAgICAgICAhb3JkZXIgJiYgdGhpcy5jYWxsRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyc1NlcnZpY2UuZXJyb3IkLnRvUHJvbWlzZSgpLnRoZW4ocmVzID0+IHRoaXMuZXJyb3IgPSByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFubmVsQ29uZmlnU2VydmljZS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYWxsb3dSZXBlYXRPcmRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVwZWF0T3JkZXJzID0gY29uZmlnLmFsbG93UmVwZWF0T3JkZXJzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlUHJpY2VzID0gY29uZmlnPy5oaWRlUHJpY2VzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZURpc2NvdW50cyA9IGNvbmZpZz8uaGlkZURpc2NvdW50cyA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IGNvbmZpZz8uaGlkZVRheGVzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGUgPSBjb25maWc/LmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID8/IGZhbHNlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5zaG93UHJpY2UkLnN1YnNjcmliZSgoc2hvd1ByaWNlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNyZWRpdEFjY291bnRTaG93UHJpY2VzID0gc2hvd1ByaWNlO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuXG4gICAgdG9EYXRlID0gKGRhdGUsIGZvcm1hdCkgPT4gbW9tZW50KGRhdGUpLmZvcm1hdCghZm9ybWF0ICYmICdERC9NTS9ZWVlZLCBoOm1tOnNzIGEnIHx8IGZvcm1hdClcblxuICAgIGNhbGxFcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvciA9ICc/JztcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnYWNjb3VudC9vcmRlcnMnKTtcbiAgICB9XG5cbiAgICB2b2x2ZXIgPSAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCdhY2NvdW50L29yZGVycycpO1xuXG4gICAgcmVwZWF0T3JkZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93UmVwZWF0T3JkZXJzICYmIHRoaXMub3JkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkUmVwZWF0T3JkZXJUb0NhcnQodGhpcy5vcmRlci5pdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0iXX0=
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXItZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9hY2NvdW50LWVjL29yZGVyLWVjL29yZGVyLWVjLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBT2hGLElBQWEsZ0JBQWdCLEdBQTdCLE1BQWEsZ0JBQWlCLFNBQVEsZUFBZTtJQWlCakQsWUFDVyxhQUE0QixFQUN6QixZQUE0QixFQUMvQixNQUFjLEVBQ2QsTUFBaUIsRUFDaEIsV0FBd0IsRUFDeEIsb0JBQTBDO1FBRWxELEtBQUssRUFBRSxDQUFDO1FBUEQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDekIsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQy9CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFy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LFNBQVMsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQTZIRCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN0QyxJQUFJLENBQUMsV0FBVyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDM0Q7SUFDTCxDQUFDO0NBRUosQ0FBQTs7WUFyTDZCLGFBQWE7WUFDWCxjQUFjO1lBQ3ZCLE1BQU07WUFDTixTQUFTO1lBQ0gsV0FBVztZQUNGLG9CQUFvQjs7QUFmN0M7SUFBUixLQUFLLEVBQUU7cURBQW1CO0FBUmxCLGdCQUFnQjtJQUw1QixTQUFTLENBQUM7UUFDUCxRQUFRLEVBQUUsY0FBYztRQUN4Qiw2dG5CQUFzQzs7S0FFekMsQ0FBQztHQUNXLGdCQUFnQixDQXVNNUI7U0F2TVksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBPcmRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYWNjb3VudC9vcmRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGFubmVsLWNvbmZpZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtb3JkZXItZWMnLFxuICAgIHRlbXBsYXRlVXJsOiAnb3JkZXItZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydvcmRlci1lYy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE9yZGVyRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHJvdGVjdGVkIG9yZGVyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XG5cbiAgICBwdWJsaWMgb3JkZXIkID0gdGhpcy5vcmRlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIG9yZGVyID0gbnVsbFxuICAgIHB1YmxpYyBsb2FkaW5nID0gdHJ1ZTtcbiAgICBwdWJsaWMgZXJyb3I7XG4gICAgQElucHV0KCkgbnVtYmVyT3JkZXIgPSBudWxsXG4gICAgcHVibGljIGFsbG93UmVwZWF0T3JkZXJzID0gZmFsc2U7XG4gICAgcHVibGljIGNyZWRpdEFjY291bnRTaG93UHJpY2VzOiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGhpZGVQcmljZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgaGlkZURpc2NvdW50czogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBoaWRlVGF4ZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZW5hYmxlRmllbGROb3Rlc0luQXJ0aWNsZUZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgc2hvd1ByaWNlV2l0aFRheGVzV2hpbGVCcm93c2luZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBvcmRlcnNTZXJ2aWNlOiBPcmRlcnNTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgYWN0aXZlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHVibGljIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHByaXZhdGUgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNoYW5uZWxDb25maWdTZXJ2aWNlOiBDaGFubmVsQ29uZmlnU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLm9yZGVyc1NlcnZpY2Uuc2VsZWN0ZWRPcmRlciQuc3Vic2NyaWJlKFxuICAgICAgICAgICAgYXN5bmMgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgb3JkZXI7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubnVtYmVyT3JkZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm51bWJlck9yZGVyID0gdGhpcy5hY3RpdmVkUm91dGUuc25hcHNob3QucGFyYW1zLm51bWJlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzKSBvcmRlciA9IHJlcztcbiAgICAgICAgICAgICAgICBlbHNlIG9yZGVyID0gYXdhaXQgdGhpcy5vcmRlcnNTZXJ2aWNlLmZpbmRPcmRlcih0aGlzLm51bWJlck9yZGVyKTtcbiAgICAgICAgICAgICAgICBvcmRlciAmJiB0aGlzLm9yZGVyU3ViamVjdC5uZXh0KG9yZGVyKTtcbiAgICAgICAgICAgICAgICAhb3JkZXIgJiYgdGhpcy5jYWxsRXJyb3IoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9yZGVyc1NlcnZpY2UuZXJyb3IkLnRvUHJvbWlzZSgpLnRoZW4ocmVzID0+IHRoaXMuZXJyb3IgPSByZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbEVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGFubmVsQ29uZmlnU2VydmljZS5jaGFubmVsQ29uZmlnJC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAoY29uZmlnKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuYWxsb3dSZXBlYXRPcmRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG93UmVwZWF0T3JkZXJzID0gY29uZmlnLmFsbG93UmVwZWF0T3JkZXJzO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxsb3dSZXBlYXRPcmRlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlUHJpY2VzID0gY29uZmlnPy5oaWRlUHJpY2VzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZURpc2NvdW50cyA9IGNvbmZpZz8uaGlkZURpc2NvdW50cyA/PyBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUYXhlcyA9IGNvbmZpZz8uaGlkZVRheGVzID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByaWNlV2l0aFRheGVzV2hpbGVCcm93c2luZyA9IGNvbmZpZz8uc2hvd1ByaWNlV2l0aFRheGVzV2hpbGVCcm93c2luZyA9PT0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUZpZWxkTm90ZXNJbkFydGljbGVGaWxlID0gY29uZmlnPy5lbmFibGVGaWVsZE5vdGVzSW5BcnRpY2xlRmlsZSA/PyBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2Uuc2hvd1ByaWNlJC5zdWJzY3JpYmUoKHNob3dQcmljZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVkaXRBY2NvdW50U2hvd1ByaWNlcyA9IHNob3dQcmljZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZWNPbkluaXQoKVxuICAgIH1cblxuICAgIHRvRGF0ZSA9IChkYXRlLCBmb3JtYXQpID0+IG1vbWVudChkYXRlKS5mb3JtYXQoIWZvcm1hdCAmJiAnREQvTU0vWVlZWSwgaDptbTpzcyBhJyB8fCBmb3JtYXQpXG5cbiAgICBwcml2YXRlIGdldExpbmVQcmljaW5nID0gKGl0ZW06IGFueSk6IGFueSB8IG51bGwgPT4ge1xuICAgICAgICBjb25zdCBwcmljaW5nID0gaXRlbT8ubGluZVByaWNpbmcgfHwgaXRlbT8ubGluZV9wcmljaW5nO1xuICAgICAgICBpZiAoIXByaWNpbmcgfHwgIXByaWNpbmcudW5pdCB8fCAhcHJpY2luZy5kaXNjb3VudCB8fCAhcHJpY2luZy5zdWJ0b3RhbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbJ3VuaXQnLCAnZGlzY291bnQnLCAnc3VidG90YWwnXTtcbiAgICAgICAgY29uc3QgdmFsaWQgPSBzZWN0aW9ucy5ldmVyeShzZWN0aW9uID0+XG4gICAgICAgICAgICBbJ25ldCcsICd0YXgnLCAnZ3Jvc3MnXS5ldmVyeShrZXkgPT4gTnVtYmVyLmlzRmluaXRlKE51bWJlcihwcmljaW5nW3NlY3Rpb25dW2tleV0pKSlcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gdmFsaWQgPyBwcmljaW5nIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEhpc3RvcmljYWxQcmljaW5nS2V5ID0gKCk6ICduZXQnIHwgJ2dyb3NzJyA9PlxuICAgICAgICB0aGlzLnNob3dQcmljZVdpdGhUYXhlc1doaWxlQnJvd3NpbmcgPyAnZ3Jvc3MnIDogJ25ldCc7XG5cbiAgICBnZXRPcmRlckxpbmVWYWx1ZSA9IChpdGVtOiBhbnksIHNlY3Rpb246ICd1bml0JyB8ICdkaXNjb3VudCcgfCAnc3VidG90YWwnKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmVQcmljaW5nID0gdGhpcy5nZXRMaW5lUHJpY2luZyhpdGVtKTtcbiAgICAgICAgaWYgKGxpbmVQcmljaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyKGxpbmVQcmljaW5nW3NlY3Rpb25dW3RoaXMuZ2V0SGlzdG9yaWNhbFByaWNpbmdLZXkoKV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlY3Rpb24gPT09ICd1bml0Jykge1xuICAgICAgICAgICAgY29uc3QgdW5pdFByaWNlID0gaXRlbT8udW5pdFByaWNlID8/IGl0ZW0/LnVuaXRfcHJpY2U7XG4gICAgICAgICAgICBpZiAodW5pdFByaWNlICE9PSBudWxsICYmIHVuaXRQcmljZSAhPT0gdW5kZWZpbmVkICYmIHVuaXRQcmljZSAhPT0gJycpIHJldHVybiBOdW1iZXIodW5pdFByaWNlKTtcblxuICAgICAgICAgICAgY29uc3QgaGlzdG9yaWNhbFN1YnRvdGFsID0gaXRlbT8uc3VidG90YWwgPz8gaXRlbT8udG90YWw7XG4gICAgICAgICAgICBjb25zdCBxdWFudGl0eSA9IE51bWJlcihpdGVtPy5xdWFudGl0eSB8fCAwKTtcbiAgICAgICAgICAgIGlmIChoaXN0b3JpY2FsU3VidG90YWwgIT09IG51bGwgJiYgaGlzdG9yaWNhbFN1YnRvdGFsICE9PSB1bmRlZmluZWQgJiYgcXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcihoaXN0b3JpY2FsU3VidG90YWwpIC8gcXVhbnRpdHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbXBhdGliaWxpZGFkIGV4dHJlbWEgY29uIHJlc3B1ZXN0YXMgYW50aWd1YXMgcXVlIG5vIGNvbnRpZW5lblxuICAgICAgICAgICAgLy8gbmluZ8O6biBpbXBvcnRlIGRlbCBPcmRlckl0ZW0uIE51bmNhIHRpZW5lIHByaW9yaWRhZCBzb2JyZSBkYXRvc1xuICAgICAgICAgICAgLy8gaGlzdMOzcmljb3MgcGVyc2lzdGlkb3MuXG4gICAgICAgICAgICBjb25zdCB2YXJpYW50ID0gaXRlbT8ucHJvZHVjdD8udmFyaWFudHM/LlswXTtcbiAgICAgICAgICAgIGNvbnN0IGNhdGFsb2dQcmljZSA9IHZhcmlhbnQ/LnNhbGVwcmljZSA/PyB2YXJpYW50Py5wcmljZTtcbiAgICAgICAgICAgIHJldHVybiBjYXRhbG9nUHJpY2UgPT09IG51bGwgfHwgY2F0YWxvZ1ByaWNlID09PSB1bmRlZmluZWQgfHwgY2F0YWxvZ1ByaWNlID09PSAnJ1xuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogTnVtYmVyKGNhdGFsb2dQcmljZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VjdGlvbiA9PT0gJ2Rpc2NvdW50Jykge1xuICAgICAgICAgICAgY29uc3QgZGlzY291bnQgPSBpdGVtPy5kaXNjb3VudDtcbiAgICAgICAgICAgIHJldHVybiBkaXNjb3VudCA9PT0gbnVsbCB8fCBkaXNjb3VudCA9PT0gdW5kZWZpbmVkIHx8IGRpc2NvdW50ID09PSAnJyA/IDAgOiBOdW1iZXIoZGlzY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3VidG90YWwgPSBpdGVtPy5zdWJ0b3RhbCA/PyBpdGVtPy50b3RhbDtcbiAgICAgICAgaWYgKHN1YnRvdGFsICE9PSBudWxsICYmIHN1YnRvdGFsICE9PSB1bmRlZmluZWQgJiYgc3VidG90YWwgIT09ICcnKSByZXR1cm4gTnVtYmVyKHN1YnRvdGFsKTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBoYXNPcmRlckxpbmVWYWx1ZSA9IChpdGVtOiBhbnksIHNlY3Rpb246ICd1bml0JyB8ICdkaXNjb3VudCcgfCAnc3VidG90YWwnKTogYm9vbGVhbiA9PlxuICAgICAgICB0aGlzLmdldE9yZGVyTGluZVZhbHVlKGl0ZW0sIHNlY3Rpb24pICE9PSBudWxsO1xuXG4gICAgcHJpdmF0ZSBnZXRUb3RhbHNQcmljaW5nID0gKHRvdGFsczogYW55LCBjYW1lbEtleTogc3RyaW5nLCBzbmFrZUtleTogc3RyaW5nKTogYW55IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IHByaWNpbmcgPSB0b3RhbHM/LltjYW1lbEtleV0gfHwgdG90YWxzPy5bc25ha2VLZXldO1xuICAgICAgICBpZiAoIXByaWNpbmcgfHwgIVsnbmV0JywgJ3RheCcsICdncm9zcyddLmV2ZXJ5KGtleSA9PiBOdW1iZXIuaXNGaW5pdGUoTnVtYmVyKHByaWNpbmdba2V5XSkpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcmljaW5nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2VsZWN0ZWRUb3RhbHNQcmljaW5nID0gKHRvdGFsczogYW55LCBjYW1lbEtleTogc3RyaW5nLCBzbmFrZUtleTogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IHByaWNpbmcgPSB0aGlzLmdldFRvdGFsc1ByaWNpbmcodG90YWxzLCBjYW1lbEtleSwgc25ha2VLZXkpO1xuICAgICAgICByZXR1cm4gcHJpY2luZyA/IE51bWJlcihwcmljaW5nW3RoaXMuZ2V0SGlzdG9yaWNhbFByaWNpbmdLZXkoKV0pIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0hpc3RvcmljYWxMaW5lUHJpY2luZyA9ICgpOiBib29sZWFuID0+XG4gICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5vcmRlcj8uaXRlbXMpXG4gICAgICAgICYmIHRoaXMub3JkZXIuaXRlbXMubGVuZ3RoID4gMFxuICAgICAgICAmJiB0aGlzLm9yZGVyLml0ZW1zLmV2ZXJ5KGl0ZW0gPT4gdGhpcy5nZXRMaW5lUHJpY2luZyhpdGVtKSk7XG5cbiAgICBnZXRIaXN0b3JpY2FsUHJvZHVjdHNTdWJ0b3RhbCA9ICgpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzSGlzdG9yaWNhbExpbmVQcmljaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9yZGVyLml0ZW1zLnJlZHVjZSgodG90YWwsIGl0ZW0pID0+XG4gICAgICAgICAgICAgICAgdG90YWwgKyBOdW1iZXIodGhpcy5nZXRMaW5lUHJpY2luZyhpdGVtKS5zdWJ0b3RhbFt0aGlzLmdldEhpc3RvcmljYWxQcmljaW5nS2V5KCldKSwgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJ0b3RhbCA9IHRoaXMub3JkZXI/LnRvdGFscz8uY2FydFN1YnRvdGFsXG4gICAgICAgICAgICA/PyB0aGlzLm9yZGVyPy50b3RhbHM/LmNhcnRfc3VidG90YWxcbiAgICAgICAgICAgID8/IHRoaXMub3JkZXI/LnRvdGFscz8uc3VidG90YWw7XG4gICAgICAgIHJldHVybiBzdWJ0b3RhbCA9PT0gbnVsbCB8fCBzdWJ0b3RhbCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IE51bWJlcihzdWJ0b3RhbCk7XG4gICAgfVxuXG4gICAgZ2V0SGlzdG9yaWNhbE9yZGVyRGlzY291bnQgPSAoKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0ID0gdGhpcy5nZXRTZWxlY3RlZFRvdGFsc1ByaWNpbmcodGhpcy5vcmRlcj8udG90YWxzLCAnb3JkZXJEaXNjb3VudFByaWNpbmcnLCAnb3JkZXJfZGlzY291bnRfcHJpY2luZycpO1xuICAgICAgICBpZiAoZXhwbGljaXQgIT09IG51bGwpIHJldHVybiBleHBsaWNpdDtcblxuICAgICAgICBjb25zdCB0b3RhbHMgPSB0aGlzLm9yZGVyPy50b3RhbHMgfHwge307XG4gICAgICAgIHJldHVybiB0b3RhbHMucHJvbW90aW9uID09PSBudWxsIHx8IHRvdGFscy5wcm9tb3Rpb24gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIodG90YWxzLnByb21vdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0SGlzdG9yaWNhbENvdXBvbkRpc2NvdW50ID0gKCk6IG51bWJlciB8IG51bGwgPT5cbiAgICAgICAgdGhpcy5nZXRTZWxlY3RlZFRvdGFsc1ByaWNpbmcodGhpcy5vcmRlcj8udG90YWxzLCAnY291cG9uRGlzY291bnRQcmljaW5nJywgJ2NvdXBvbl9kaXNjb3VudF9wcmljaW5nJyk7XG5cbiAgICBnZXRIaXN0b3JpY2FsU2hpcHBpbmcgPSAoKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0ID0gdGhpcy5nZXRTZWxlY3RlZFRvdGFsc1ByaWNpbmcodGhpcy5vcmRlcj8udG90YWxzLCAnc2hpcHBpbmdQcmljaW5nJywgJ3NoaXBwaW5nX3ByaWNpbmcnKTtcbiAgICAgICAgaWYgKGV4cGxpY2l0ICE9PSBudWxsKSByZXR1cm4gZXhwbGljaXQ7XG5cbiAgICAgICAgY29uc3Qgc2hpcHBpbmcgPSB0aGlzLm9yZGVyPy50b3RhbHM/LnNoaXBwaW5nO1xuICAgICAgICByZXR1cm4gc2hpcHBpbmcgPT09IG51bGwgfHwgc2hpcHBpbmcgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIoc2hpcHBpbmcpO1xuICAgIH1cblxuICAgIGdldEhpc3RvcmljYWxUYXhlcyA9ICgpOiBudW1iZXIgPT4gTnVtYmVyKHRoaXMub3JkZXI/LnRvdGFscz8udGF4ZXNcbiAgICAgICAgPz8gdGhpcy5vcmRlcj8udG90YWxzPy5jYXJ0VGF4ZXNcbiAgICAgICAgPz8gdGhpcy5vcmRlcj8udG90YWxzPy5jYXJ0X3RheGVzXG4gICAgICAgID8/IDApO1xuXG4gICAgaGFzSGlzdG9yaWNhbFRheGVzID0gKCk6IGJvb2xlYW4gPT4gdGhpcy5nZXRIaXN0b3JpY2FsVGF4ZXMoKSAhPT0gMDtcblxuICAgIGdldEhpc3RvcmljYWxUb3RhbCA9ICgpOiBudW1iZXIgfCBudWxsID0+IHtcbiAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLm9yZGVyPy50b3RhbHM/LnRvdGFsO1xuICAgICAgICByZXR1cm4gdG90YWwgPT09IG51bGwgfHwgdG90YWwgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIodG90YWwpO1xuICAgIH1cblxuICAgIGNhbGxFcnJvciA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5lcnJvciA9ICc/JztcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnYWNjb3VudC9vcmRlcnMnKTtcbiAgICB9XG5cbiAgICB2b2x2ZXIgPSAoKSA9PiB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCdhY2NvdW50L29yZGVycycpO1xuXG4gICAgcmVwZWF0T3JkZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFsbG93UmVwZWF0T3JkZXJzICYmIHRoaXMub3JkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkUmVwZWF0T3JkZXJUb0NhcnQodGhpcy5vcmRlci5pdGVtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiJdfQ==