@wizishop/img-manager-webelement 1.0.3 → 14.0.5

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 (40) hide show
  1. package/README.md +13 -113
  2. package/esm2020/lib/environments/environment.mjs +99 -0
  3. package/esm2020/lib/img-manager-web-element.component.mjs +177 -0
  4. package/esm2020/lib/img-manager-web-element.module.mjs +47 -0
  5. package/esm2020/lib/services/auth-credentials.service.mjs +43 -0
  6. package/esm2020/lib/services/event.service.mjs +37 -0
  7. package/esm2020/lib/services/fiche_products.service.mjs +237 -0
  8. package/esm2020/lib/services/storage.service.mjs +53 -0
  9. package/esm2020/public-api.mjs +6 -0
  10. package/esm2020/wizishop-img-manager-webelement.mjs +5 -0
  11. package/fesm2015/wizishop-img-manager-webelement.mjs +671 -0
  12. package/fesm2015/wizishop-img-manager-webelement.mjs.map +1 -0
  13. package/fesm2020/wizishop-img-manager-webelement.mjs +673 -0
  14. package/fesm2020/wizishop-img-manager-webelement.mjs.map +1 -0
  15. package/index.d.ts +5 -0
  16. package/lib/environments/environment.d.ts +19 -0
  17. package/lib/img-manager-web-element.component.d.ts +50 -0
  18. package/lib/img-manager-web-element.module.d.ts +11 -0
  19. package/lib/services/auth-credentials.service.d.ts +19 -0
  20. package/lib/services/event.service.d.ts +11 -0
  21. package/lib/services/fiche_products.service.d.ts +51 -0
  22. package/lib/services/storage.service.d.ts +14 -0
  23. package/package.json +25 -10
  24. package/public-api.d.ts +2 -0
  25. package/3rdpartylicenses.txt +0 -665
  26. package/4.js +0 -1
  27. package/assets/img-manager/canva/icon_canva.svg +0 -4
  28. package/assets/img-manager/i18n/en.json +0 -1
  29. package/assets/img-manager/i18n/es.json +0 -1
  30. package/assets/img-manager/i18n/fr.json +0 -1
  31. package/assets/img-manager/i18n/it.json +0 -1
  32. package/assets/img-manager/img/fake.png +0 -0
  33. package/assets/img-manager/img/icon_picture.svg +0 -11
  34. package/favicon.ico +0 -0
  35. package/img-manager-webelement.1.0.3.js +0 -1
  36. package/index.html +0 -25
  37. package/main.js +0 -1
  38. package/polyfills.js +0 -1
  39. package/runtime.js +0 -1
  40. package/styles.1.0.3.css +0 -1
@@ -0,0 +1,237 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpHeaders } from '@angular/common/http';
3
+ import { forkJoin, fromEvent, Observable } from "rxjs";
4
+ import { take } from 'rxjs/operators';
5
+ import { environment } from '../environments/environment';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common/http";
8
+ import * as i2 from "@wizishop/img-manager";
9
+ import * as i3 from "./event.service";
10
+ export class FicheProductService {
11
+ constructor(http, imgSelectionService, eventService, canvaService) {
12
+ this.http = http;
13
+ this.imgSelectionService = imgSelectionService;
14
+ this.eventService = eventService;
15
+ this.canvaService = canvaService;
16
+ this.image_manager_api = environment.wizi_api + "/image-manager/shops/";
17
+ this.isPhotosTab = false; // State of the Photos tabs in fiche product page
18
+ this.isPreviousTabPhotos = false;
19
+ this.isVariantsTab = false;
20
+ this.loadProductImgSelection = false;
21
+ this.expectedMediaDto = {
22
+ id: '',
23
+ image_url: '',
24
+ image_width: '900',
25
+ image_height: '900',
26
+ };
27
+ this.subscriptions = [];
28
+ }
29
+ setApiConfig(shop_id, shop_token) {
30
+ this.shopToken = shop_token;
31
+ this.shopId = shop_id;
32
+ const matches = window.location.pathname.match(/\/(\w+)\/products\/(\d+)\/edit/);
33
+ const lang = matches && matches[1] ? matches[1] : 'fr';
34
+ this.productSheetApiRoute = environment.wizi_admin_api + lang + environment.product_sheet_endpoint;
35
+ this.productId = matches && matches[2] ? matches[2] : "0";
36
+ this.isProductCreation = /\/products\/create/.test(window.location.pathname);
37
+ }
38
+ /**
39
+ * There is only one instance of this img manager.
40
+ * But it is called with different config, by Photos tab and Variation tab, on fiche product page.
41
+ * The method handle the switch config between Photos and Variation tab.
42
+ * Return an observable : true => Photos tab / false => Variation tab.
43
+ * */
44
+ handleTabs() {
45
+ return new Observable(observer => {
46
+ const switchTabsSub = this.switchTabs().subscribe(data => {
47
+ if (!data || !data["detail"] || !data["detail"]["currentTab"]) {
48
+ return;
49
+ }
50
+ // Retrieve current tab
51
+ const currentTab = data["detail"]["currentTab"];
52
+ this.isPreviousTabPhotos = this.isPhotosTab;
53
+ this.isPhotosTab = currentTab === 'photos';
54
+ this.isVariantsTab = currentTab === 'variation';
55
+ // The user switch to Photos tab
56
+ if (this.isPhotosTab) {
57
+ this.loadProductImgSelection = true;
58
+ if (!this.currentProductImgSelection || !this.currentProductImgSelection.length) {
59
+ this.initProductImgSelection();
60
+ }
61
+ else {
62
+ this.applyCurrentImgSelection();
63
+ this.loadProductImgSelection = false;
64
+ }
65
+ }
66
+ else if (this.isPreviousTabPhotos) { // The user switch to another tab
67
+ // Save current img selection, in order to not lose the img selection
68
+ this.saveCurrentImgSelection();
69
+ }
70
+ observer.next(this.isPhotosTab);
71
+ });
72
+ this.subscriptions.push(switchTabsSub);
73
+ });
74
+ }
75
+ getShopImg(idFile) {
76
+ return this.http.get(`${this.image_manager_api}${this.shopId}/images/${idFile}`, this.getOptionsHeadersWithBearer());
77
+ }
78
+ initProductImgSelection() {
79
+ // Display the loader in img list selection
80
+ this.imgSelectionService.emitImgListLoading(true);
81
+ // retrieve img selection
82
+ const retrieveImgSelectionSub = this.retrieveImgSelection().subscribe(data => {
83
+ // No imgage selected
84
+ if (!data || !data["photos"] || !data["photos"]["infos"] || !data["photos"]["infos"]["files"] || !data["photos"]["infos"]["files"].length) {
85
+ this.loadProductImgSelection = false;
86
+ this.imgSelectionService.emitImgListLoading(false);
87
+ return;
88
+ }
89
+ const idImgSelectionList = data["photos"]["infos"]["files"];
90
+ const obsImg = [];
91
+ idImgSelectionList.forEach(idFile => obsImg.push(this.getShopImg(idFile.toString()).pipe(take(1))));
92
+ const allImgSub = forkJoin(obsImg).subscribe((photos) => {
93
+ // The img selection must be saved, otherwise it is lost when the user switch on variation tab
94
+ this.saveCurrentImgSelection(photos);
95
+ this.applyCurrentImgSelection();
96
+ this.loadProductImgSelection = false;
97
+ }, error => {
98
+ // Hide the loader in img list selection
99
+ this.loadProductImgSelection = false;
100
+ this.imgSelectionService.emitImgListLoading(false);
101
+ });
102
+ this.subscriptions.push(allImgSub);
103
+ });
104
+ this.subscriptions.push(retrieveImgSelectionSub);
105
+ this.canvaService.expectedImgSizesChange(this.expectedMediaDto);
106
+ }
107
+ retrieveInfoSelection() {
108
+ const formData = new FormData();
109
+ formData.append('rub', "main");
110
+ formData.append('action', "getInfos");
111
+ formData.append('prodId', this.productId);
112
+ formData.append('_token', '');
113
+ formData.append('_shid', this.shopId.toString());
114
+ return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
115
+ }
116
+ retrieveImgSelection() {
117
+ const formData = new FormData();
118
+ formData.append('rub', "main");
119
+ formData.append('action', "getAllInfos");
120
+ formData.append('prodId', this.productId);
121
+ formData.append('_token', '');
122
+ formData.append('_shid', this.shopId.toString());
123
+ return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
124
+ }
125
+ updateImgSelectionOnChange() {
126
+ // listen to the img manager change
127
+ const imgSelectionSub = this.imgSelectionService.getImgSelectionChange().subscribe(imgSelectionList => {
128
+ if (!imgSelectionList) {
129
+ return;
130
+ }
131
+ // Send the img selection
132
+ if (this.isPhotosTab && !this.loadProductImgSelection) {
133
+ // Retrieve only the img id
134
+ const idImgSelectedList = [];
135
+ imgSelectionList.forEach(img => {
136
+ idImgSelectedList.push(parseInt(img.id_file));
137
+ });
138
+ this.updateProductImgSelection(idImgSelectedList);
139
+ // On variation tab, send event with img selected
140
+ }
141
+ else if (!this.isPhotosTab && imgSelectionList.length) {
142
+ this.eventService.sendImgSelectedToPage(imgSelectionList[0]);
143
+ }
144
+ });
145
+ this.subscriptions.push(imgSelectionSub);
146
+ }
147
+ updateProductImgSelection(idsImgList) {
148
+ if ((!this.productId || this.productId === "0") && Wizi._produit.global.PROD_ID) {
149
+ this.productId = Wizi._produit.global.PROD_ID.toString();
150
+ }
151
+ Wizi._produit._dataTmp['photos'].infos = {};
152
+ Wizi._produit._dataTmp['photos'].infos.files = idsImgList;
153
+ this.emitImgSelectionChange(idsImgList);
154
+ if (this.productId && this.productId !== "0") {
155
+ const submitProd1 = this.submitProductImg(idsImgList).subscribe();
156
+ this.subscriptions.push(submitProd1);
157
+ return;
158
+ }
159
+ const createProductSub = this.createProduct().subscribe((productId) => {
160
+ if (!productId) {
161
+ throw "No product id created. Can not link image(s) to the new product.";
162
+ }
163
+ Wizi._produit.global.PROD_ID = productId;
164
+ this.productId = productId.toString();
165
+ this.submitProductImg(idsImgList).subscribe();
166
+ });
167
+ this.subscriptions.push(createProductSub);
168
+ }
169
+ submitProductImg(idsImgList) {
170
+ const data = {
171
+ files: idsImgList,
172
+ couls: []
173
+ };
174
+ const formData = new FormData();
175
+ formData.append('rub', "photos");
176
+ formData.append('action', "save");
177
+ formData.append('newProd', this.isProductCreation ? "1" : "0");
178
+ formData.append('prodId', this.productId);
179
+ formData.append('_token', this.shopToken);
180
+ formData.append('_shid', this.shopId.toString());
181
+ formData.append('data', JSON.stringify(data));
182
+ return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
183
+ }
184
+ createProduct() {
185
+ const formData = new FormData();
186
+ formData.append('rub', "main");
187
+ formData.append('action', "createProd");
188
+ formData.append('_token', '');
189
+ formData.append('_shid', this.shopId.toString());
190
+ return this.http.post(this.productSheetApiRoute, formData, this.getOptionsHeaders());
191
+ }
192
+ /* Use to know where the img manager is displayed, and to close it when switching tab */
193
+ switchTabs() {
194
+ return fromEvent(document.getElementById('imgManagerModule'), "switchTab");
195
+ }
196
+ emitImgSelectionChange(idsImgList) {
197
+ const value = {
198
+ detail: {
199
+ idsImgList
200
+ }
201
+ };
202
+ const event = new CustomEvent('onImgSelectionChange', value);
203
+ const imgManagerModule = document.getElementById('imgManagerModule');
204
+ imgManagerModule?.dispatchEvent(event);
205
+ }
206
+ saveCurrentImgSelection(imgSelection) {
207
+ this.currentProductImgSelection = imgSelection ? imgSelection : JSON.parse(JSON.stringify(this.imgSelectionService.getImgSelection()));
208
+ }
209
+ applyCurrentImgSelection() {
210
+ this.imgSelectionService.setImgSelection(this.currentProductImgSelection);
211
+ // Hide the loader in img list selection
212
+ this.imgSelectionService.emitImgListLoading(false);
213
+ }
214
+ getOptionsHeaders() {
215
+ const header = { headers: new HttpHeaders({
216
+ 'Access-Control-Allow-Origin': '*'
217
+ })
218
+ };
219
+ return header;
220
+ }
221
+ getOptionsHeadersWithBearer() {
222
+ const header = { headers: new HttpHeaders({
223
+ Authorization: 'Bearer ' + this.shopToken
224
+ })
225
+ };
226
+ return header;
227
+ }
228
+ ngOnDestroy() {
229
+ this.subscriptions.forEach(subscription => subscription.unsubscribe());
230
+ }
231
+ }
232
+ FicheProductService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService, deps: [{ token: i1.HttpClient }, { token: i2.ImgSelectionService }, { token: i3.EventService }, { token: i2.CanvaService }], target: i0.ɵɵFactoryTarget.Injectable });
233
+ FicheProductService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService });
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: FicheProductService, decorators: [{
235
+ type: Injectable
236
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ImgSelectionService }, { type: i3.EventService }, { type: i2.CanvaService }]; } });
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmljaGVfcHJvZHVjdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy9saWIvc2VydmljZXMvZmljaGVfcHJvZHVjdHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7Ozs7O0FBSzFELE1BQU0sT0FBTyxtQkFBbUI7SUFzQjlCLFlBQ1UsSUFBZ0IsRUFDaEIsbUJBQXdDLEVBQ3hDLFlBQTBCLEVBQzFCLFlBQTBCO1FBSDFCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQXZCcEMsc0JBQWlCLEdBQVcsV0FBVyxDQUFDLFFBQVEsR0FBRyx1QkFBdUIsQ0FBQztRQUkzRSxnQkFBVyxHQUFZLEtBQUssQ0FBQyxDQUFDLGlEQUFpRDtRQUMvRSx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFDckMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsNEJBQXVCLEdBQVcsS0FBSyxDQUFDO1FBR3hDLHFCQUFnQixHQUFxQjtZQUNuQyxFQUFFLEVBQUUsRUFBRTtZQUNOLFNBQVMsRUFBRSxFQUFFO1lBQ2IsV0FBVyxFQUFFLEtBQUs7WUFDbEIsWUFBWSxFQUFFLEtBQUs7U0FDcEIs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Q29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FudmFTZXJ2aWNlLCBJbWdQaWN0dXJlRFRPLCBJbWdTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnQHdpemlzaG9wL2ltZy1tYW5hZ2VyJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4vZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBXaXppQmxvY2tNZWRpYUR0byB9IGZyb20gJ0B3aXppc2hvcC9pbWctbWFuYWdlci9saWIvZHRvL3dpemktYmxvY2stbWVkaWEuZHRvJztcbmltcG9ydCB7IGVudmlyb25tZW50IH0gZnJvbSAnLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50JztcblxuZGVjbGFyZSBjb25zdCBXaXppOiBhbnk7XG5cbkBJbmplY3RhYmxlKCkgLy8gdG9kb1xuZXhwb3J0IGNsYXNzIEZpY2hlUHJvZHVjdFNlcnZpY2Uge1xuXG4gIHByb2R1Y3RTaGVldEFwaVJvdXRlOiBzdHJpbmc7XG4gIGltYWdlX21hbmFnZXJfYXBpOiBzdHJpbmcgPSBlbnZpcm9ubWVudC53aXppX2FwaSArIFwiL2ltYWdlLW1hbmFnZXIvc2hvcHMvXCI7XG4gIHNob3BUb2tlbjogc3RyaW5nO1xuICBzaG9wSWQ6IG51bWJlcjtcbiAgcHJvZHVjdElkOiBzdHJpbmc7XG4gIGlzUGhvdG9zVGFiOiBib29sZWFuID0gZmFsc2U7IC8vIFN0YXRlIG9mIHRoZSBQaG90b3MgdGFicyBpbiBmaWNoZSBwcm9kdWN0IHBhZ2VcbiAgaXNQcmV2aW91c1RhYlBob3RvczogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1ZhcmlhbnRzVGFiOiBib29sZWFuID0gZmFsc2U7XG4gIGxvYWRQcm9kdWN0SW1nU2VsZWN0aW9uOmJvb2xlYW4gPSBmYWxzZTtcbiAgY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb246IEltZ1BpY3R1cmVEVE9bXTtcbiAgaXNQcm9kdWN0Q3JlYXRpb246IGJvb2xlYW47XG4gIGV4cGVjdGVkTWVkaWFEdG86V2l6aUJsb2NrTWVkaWFEdG8gPSB7XG4gICAgaWQ6ICcnLFxuICAgIGltYWdlX3VybDogJycsXG4gICAgaW1hZ2Vfd2lkdGg6ICc5MDAnLFxuICAgIGltYWdlX2hlaWdodDogJzkwMCcsXG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIHByaXZhdGUgaW1nU2VsZWN0aW9uU2VydmljZTogSW1nU2VsZWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FudmFTZXJ2aWNlOiBDYW52YVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICBzZXRBcGlDb25maWcoc2hvcF9pZDogbnVtYmVyLCBzaG9wX3Rva2VuOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNob3BUb2tlbiA9IHNob3BfdG9rZW47XG4gICAgdGhpcy5zaG9wSWQgPSBzaG9wX2lkO1xuXG4gICAgY29uc3QgbWF0Y2hlcyA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZS5tYXRjaCggL1xcLyhcXHcrKVxcL3Byb2R1Y3RzXFwvKFxcZCspXFwvZWRpdC8pO1xuICAgIGNvbnN0IGxhbmcgPSBtYXRjaGVzICYmIG1hdGNoZXNbMV0gPyBtYXRjaGVzWzFdIDogJ2ZyJztcbiAgICB0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlID0gZW52aXJvbm1lbnQud2l6aV9hZG1pbl9hcGkgKyBsYW5nICsgZW52aXJvbm1lbnQucHJvZHVjdF9zaGVldF9lbmRwb2ludDtcbiAgICB0aGlzLnByb2R1Y3RJZCA9IG1hdGNoZXMgJiYgbWF0Y2hlc1syXSA/IG1hdGNoZXNbMl0gOiBcIjBcIjtcbiAgICB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID0gL1xcL3Byb2R1Y3RzXFwvY3JlYXRlLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBpbWcgbWFuYWdlci5cbiAgICogQnV0IGl0IGlzIGNhbGxlZCB3aXRoIGRpZmZlcmVudCBjb25maWcsIGJ5IFBob3RvcyB0YWIgYW5kIFZhcmlhdGlvbiB0YWIsIG9uIGZpY2hlIHByb2R1Y3QgcGFnZS5cbiAgICogVGhlIG1ldGhvZCBoYW5kbGUgdGhlIHN3aXRjaCBjb25maWcgYmV0d2VlbiBQaG90b3MgYW5kIFZhcmlhdGlvbiB0YWIuXG4gICAqIFJldHVybiBhbiBvYnNlcnZhYmxlIDogdHJ1ZSA9PiBQaG90b3MgdGFiIC8gZmFsc2UgPT4gVmFyaWF0aW9uIHRhYi5cbiAgICogICovXG4gIGhhbmRsZVRhYnMoKTpPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuXG4gICAgICBjb25zdCBzd2l0Y2hUYWJzU3ViID1cbiAgICAgICAgdGhpcy5zd2l0Y2hUYWJzKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuXG4gICAgICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGFbXCJkZXRhaWxcIl0gfHwgIWRhdGFbXCJkZXRhaWxcIl1bXCJjdXJyZW50VGFiXCJdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFJldHJpZXZlIGN1cnJlbnQgdGFiXG4gICAgICAgICAgY29uc3QgY3VycmVudFRhYiA9IGRhdGFbXCJkZXRhaWxcIl1bXCJjdXJyZW50VGFiXCJdO1xuICAgICAgICAgIHRoaXMuaXNQcmV2aW91c1RhYlBob3RvcyA9IHRoaXMuaXNQaG90b3NUYWI7XG4gICAgICAgICAgdGhpcy5pc1Bob3Rvc1RhYiA9IGN1cnJlbnRUYWIgPT09ICdwaG90b3MnO1xuICAgICAgICAgIHRoaXMuaXNWYXJpYW50c1RhYiA9IGN1cnJlbnRUYWIgPT09ICd2YXJpYXRpb24nO1xuXG4gICAgICAgICAgLy8gVGhlIHVzZXIgc3dpdGNoIHRvIFBob3RvcyB0YWJcbiAgICAgICAgICBpZiAodGhpcy5pc1Bob3Rvc1RhYikge1xuICAgICAgICAgICAgdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb24gfHwgIXRoaXMuY3VycmVudFByb2R1Y3RJbWdTZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5pdFByb2R1Y3RJbWdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuYXBwbHlDdXJyZW50SW1nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1ByZXZpb3VzVGFiUGhvdG9zKSB7IC8vIFRoZSB1c2VyIHN3aXRjaCB0byBhbm90aGVyIHRhYlxuICAgICAgICAgICAgLy8gU2F2ZSBjdXJyZW50IGltZyBzZWxlY3Rpb24sIGluIG9yZGVyIHRvIG5vdCBsb3NlIHRoZSBpbWcgc2VsZWN0aW9uXG4gICAgICAgICAgICB0aGlzLnNhdmVDdXJyZW50SW1nU2VsZWN0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQodGhpcy5pc1Bob3Rvc1RhYik7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChzd2l0Y2hUYWJzU3ViKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFNob3BJbWcoaWRGaWxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke3RoaXMuaW1hZ2VfbWFuYWdlcl9hcGl9JHt0aGlzLnNob3BJZH0vaW1hZ2VzLyR7aWRGaWxlfWAsIHRoaXMuZ2V0T3B0aW9uc0hlYWRlcnNXaXRoQmVhcmVyKCkpO1xuICB9XG5cbiAgaW5pdFByb2R1Y3RJbWdTZWxlY3Rpb24oKSB7XG5cbiAgICAvLyBEaXNwbGF5IHRoZSBsb2FkZXIgaW4gaW1nIGxpc3Qgc2VsZWN0aW9uXG4gICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmVtaXRJbWdMaXN0TG9hZGluZyh0cnVlKTtcblxuICAgIC8vIHJldHJpZXZlIGltZyBzZWxlY3Rpb25cbiAgICBjb25zdCByZXRyaWV2ZUltZ1NlbGVjdGlvblN1YiA9XG4gICAgICB0aGlzLnJldHJpZXZlSW1nU2VsZWN0aW9uKCkuc3Vic2NyaWJlKGRhdGEgPT4ge1xuXG4gICAgICAgIC8vIE5vIGltZ2FnZSBzZWxlY3RlZFxuICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGFbXCJwaG90b3NcIl0gfHwgIWRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXSB8fCAhZGF0YVtcInBob3Rvc1wiXVtcImluZm9zXCJdW1wiZmlsZXNcIl0gfHwgIWRhdGFbXCJwaG90b3NcIl1bXCJpbmZvc1wiXVtcImZpbGVzXCJdLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcblxuICAgICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkSW1nU2VsZWN0aW9uTGlzdDogbnVtYmVyW10gPSBkYXRhW1wicGhvdG9zXCJdW1wiaW5mb3NcIl1bXCJmaWxlc1wiXTtcbiAgICAgICAgY29uc3Qgb2JzSW1nOiBPYnNlcnZhYmxlPGFueT5bXSA9IFtdO1xuXG4gICAgICAgIGlkSW1nU2VsZWN0aW9uTGlzdC5mb3JFYWNoKGlkRmlsZSA9PlxuICAgICAgICAgIG9ic0ltZy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5nZXRTaG9wSW1nKGlkRmlsZS50b1N0cmluZygpKS5waXBlKHRha2UoMSkpXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdCBhbGxJbWdTdWIgPVxuICAgICAgICAgIGZvcmtKb2luKG9ic0ltZykuc3Vic2NyaWJlKChwaG90b3M6IEltZ1BpY3R1cmVEVE9bXSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhlIGltZyBzZWxlY3Rpb24gbXVzdCBiZSBzYXZlZCwgb3RoZXJ3aXNlIGl0IGlzIGxvc3Qgd2hlbiB0aGUgdXNlciBzd2l0Y2ggb24gdmFyaWF0aW9uIHRhYlxuICAgICAgICAgICAgdGhpcy5zYXZlQ3VycmVudEltZ1NlbGVjdGlvbihwaG90b3MpO1xuICAgICAgICAgICAgdGhpcy5hcHBseUN1cnJlbnRJbWdTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yID0+IHtcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGxvYWRlciBpbiBpbWcgbGlzdCBzZWxlY3Rpb25cbiAgICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3RJbWdTZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChhbGxJbWdTdWIpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChyZXRyaWV2ZUltZ1NlbGVjdGlvblN1Yik7XG4gICAgdGhpcy5jYW52YVNlcnZpY2UuZXhwZWN0ZWRJbWdTaXplc0NoYW5nZSh0aGlzLmV4cGVjdGVkTWVkaWFEdG8pO1xuICB9XG5cbiAgcmV0cmlldmVJbmZvU2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcIm1haW5cIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhY3Rpb24nLCBcImdldEluZm9zXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZElkJywgdGhpcy5wcm9kdWN0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3Rva2VuJywgJycpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3NoaWQnLCB0aGlzLnNob3BJZC50b1N0cmluZygpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIHJldHJpZXZlSW1nU2VsZWN0aW9uKCkge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcIm1haW5cIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdhY3Rpb24nLCBcImdldEFsbEluZm9zXCIpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgncHJvZElkJywgdGhpcy5wcm9kdWN0SWQpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3Rva2VuJywgJycpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnX3NoaWQnLCB0aGlzLnNob3BJZC50b1N0cmluZygpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHRoaXMucHJvZHVjdFNoZWV0QXBpUm91dGUsIGZvcm1EYXRhLCB0aGlzLmdldE9wdGlvbnNIZWFkZXJzKCkpO1xuICB9XG5cbiAgdXBkYXRlSW1nU2VsZWN0aW9uT25DaGFuZ2UoKSB7XG4gICAgLy8gbGlzdGVuIHRvIHRoZSBpbWcgbWFuYWdlciBjaGFuZ2VcbiAgICBjb25zdCBpbWdTZWxlY3Rpb25TdWIgPVxuICAgICAgdGhpcy5pbWdTZWxlY3Rpb25TZXJ2aWNlLmdldEltZ1NlbGVjdGlvbkNoYW5nZSgpLnN1YnNjcmliZShpbWdTZWxlY3Rpb25MaXN0ID0+IHtcbiAgICAgICAgaWYgKCFpbWdTZWxlY3Rpb25MaXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgaW1nIHNlbGVjdGlvblxuICAgICAgICBpZiAodGhpcy5pc1Bob3Rvc1RhYiAmJiAhdGhpcy5sb2FkUHJvZHVjdEltZ1NlbGVjdGlvbikge1xuICAgICAgICAgIC8vIFJldHJpZXZlIG9ubHkgdGhlIGltZyBpZFxuICAgICAgICAgIGNvbnN0IGlkSW1nU2VsZWN0ZWRMaXN0OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGltZ1NlbGVjdGlvbkxpc3QuZm9yRWFjaChpbWcgPT4ge1xuICAgICAgICAgICAgaWRJbWdTZWxlY3RlZExpc3QucHVzaChwYXJzZUludChpbWcuaWRfZmlsZSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhpcy51cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkSW1nU2VsZWN0ZWRMaXN0KTtcblxuICAgICAgICAvLyBPbiB2YXJpYXRpb24gdGFiLCBzZW5kIGV2ZW50IHdpdGggaW1nIHNlbGVjdGVkXG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNQaG90b3NUYWIgJiYgaW1nU2VsZWN0aW9uTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zZW5kSW1nU2VsZWN0ZWRUb1BhZ2UoaW1nU2VsZWN0aW9uTGlzdFswXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGltZ1NlbGVjdGlvblN1Yik7XG4gIH1cblxuICB1cGRhdGVQcm9kdWN0SW1nU2VsZWN0aW9uKGlkc0ltZ0xpc3Q6IG51bWJlcltdKSB7XG4gICAgaWYgKCghdGhpcy5wcm9kdWN0SWQgfHwgdGhpcy5wcm9kdWN0SWQgPT09IFwiMFwiKSAmJiBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEKSB7XG4gICAgICB0aGlzLnByb2R1Y3RJZCA9IFdpemkuX3Byb2R1aXQuZ2xvYmFsLlBST0RfSUQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBXaXppLl9wcm9kdWl0Ll9kYXRhVG1wWydwaG90b3MnXS5pbmZvcyA9IHt9O1xuICAgIFdpemkuX3Byb2R1aXQuX2RhdGFUbXBbJ3Bob3RvcyddLmluZm9zLmZpbGVzID0gaWRzSW1nTGlzdDtcbiAgICB0aGlzLmVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdCk7XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0SWQgJiYgdGhpcy5wcm9kdWN0SWQgIT09IFwiMFwiKSB7XG4gICAgICBjb25zdCBzdWJtaXRQcm9kMSA9XG4gICAgICAgIHRoaXMuc3VibWl0UHJvZHVjdEltZyhpZHNJbWdMaXN0KS5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHN1Ym1pdFByb2QxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3JlYXRlUHJvZHVjdFN1YiA9XG4gICAgICB0aGlzLmNyZWF0ZVByb2R1Y3QoKS5zdWJzY3JpYmUoXG4gICAgICAgIChwcm9kdWN0SWQ6bnVtYmVyKSA9PiB7XG4gICAgICAgICAgaWYgKCFwcm9kdWN0SWQpIHtcbiAgICAgICAgICAgIHRocm93IFwiTm8gcHJvZHVjdCBpZCBjcmVhdGVkLiBDYW4gbm90IGxpbmsgaW1hZ2UocykgdG8gdGhlIG5ldyBwcm9kdWN0LlwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBXaXppLl9wcm9kdWl0Lmdsb2JhbC5QUk9EX0lEID0gcHJvZHVjdElkO1xuXG4gICAgICAgICAgdGhpcy5wcm9kdWN0SWQgPSBwcm9kdWN0SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICB0aGlzLnN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdCkuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goY3JlYXRlUHJvZHVjdFN1Yik7XG5cbiAgfVxuXG4gIHN1Ym1pdFByb2R1Y3RJbWcoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgZmlsZXMgOiBpZHNJbWdMaXN0LFxuICAgICAgY291bHM6IFtdXG4gICAgfTtcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdydWInLCBcInBob3Rvc1wiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwic2F2ZVwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ25ld1Byb2QnLCB0aGlzLmlzUHJvZHVjdENyZWF0aW9uID8gXCIxXCIgOiBcIjBcIik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdwcm9kSWQnLCB0aGlzLnByb2R1Y3RJZCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfdG9rZW4nLCB0aGlzLnNob3BUb2tlbik7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdfc2hpZCcsIHRoaXMuc2hvcElkLnRvU3RyaW5nKCkpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZGF0YScsIEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcbiAgfVxuXG4gIGNyZWF0ZVByb2R1Y3QoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ3J1YicsIFwibWFpblwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2FjdGlvbicsIFwiY3JlYXRlUHJvZFwiKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ190b2tlbicsICcnKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ19zaGlkJywgdGhpcy5zaG9wSWQudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8bnVtYmVyPih0aGlzLnByb2R1Y3RTaGVldEFwaVJvdXRlLCBmb3JtRGF0YSwgdGhpcy5nZXRPcHRpb25zSGVhZGVycygpKTtcblxuICB9XG5cbiAgLyogVXNlIHRvIGtub3cgd2hlcmUgdGhlIGltZyBtYW5hZ2VyIGlzIGRpc3BsYXllZCwgYW5kIHRvIGNsb3NlIGl0IHdoZW4gc3dpdGNoaW5nIHRhYiAqL1xuICBzd2l0Y2hUYWJzKCkge1xuICAgIHJldHVybiBmcm9tRXZlbnQ8YW55Pihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpIGFzIGFueSwgXCJzd2l0Y2hUYWJcIik7XG4gIH1cblxuICBwcml2YXRlIGVtaXRJbWdTZWxlY3Rpb25DaGFuZ2UoaWRzSW1nTGlzdDogbnVtYmVyW10pIHtcbiAgICBjb25zdCB2YWx1ZSA9IHtcbiAgICAgIGRldGFpbDoge1xuICAgICAgICBpZHNJbWdMaXN0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdvbkltZ1NlbGVjdGlvbkNoYW5nZScsIHZhbHVlKTtcbiAgICBjb25zdCBpbWdNYW5hZ2VyTW9kdWxlPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaW1nTWFuYWdlck1vZHVsZScpO1xuICAgIGltZ01hbmFnZXJNb2R1bGU/LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlQ3VycmVudEltZ1NlbGVjdGlvbihpbWdTZWxlY3Rpb24/OiBJbWdQaWN0dXJlRFRPW10pIHtcbiAgICB0aGlzLmN1cnJlbnRQcm9kdWN0SW1nU2VsZWN0aW9uID0gaW1nU2VsZWN0aW9uID8gaW1nU2VsZWN0aW9uIDogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmltZ1NlbGVjdGlvblNlcnZpY2UuZ2V0SW1nU2VsZWN0aW9uKCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDdXJyZW50SW1nU2VsZWN0aW9uKCkge1xuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5zZXRJbWdTZWxlY3Rpb24odGhpcy5jdXJyZW50UHJvZHVjdEltZ1NlbGVjdGlvbik7XG4gICAgLy8gSGlkZSB0aGUgbG9hZGVyIGluIGltZyBsaXN0IHNlbGVjdGlvblxuICAgIHRoaXMuaW1nU2VsZWN0aW9uU2VydmljZS5lbWl0SW1nTGlzdExvYWRpbmcoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25zSGVhZGVycygpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzonKidcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcHRpb25zSGVhZGVyc1dpdGhCZWFyZXIoKSB7XG4gICAgY29uc3QgaGVhZGVyID0geyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgQXV0aG9yaXphdGlvbjogJ0JlYXJlciAnICsgdGhpcy5zaG9wVG9rZW5cbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4gaGVhZGVyO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,53 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class StorageService {
5
+ constructor() {
6
+ this.subscriptions = new Map();
7
+ window.addEventListener('storage', e => {
8
+ if (this.subscriptions.has(e.key || '')) {
9
+ this.subscriptions.get(e.key || '')?.next(this.unserialize(e.newValue));
10
+ }
11
+ });
12
+ }
13
+ unserialize(data) {
14
+ let d = null;
15
+ if (data) {
16
+ try {
17
+ d = JSON.parse(data).data;
18
+ }
19
+ catch (e) { }
20
+ }
21
+ return d;
22
+ }
23
+ serialize(data) {
24
+ const d = {
25
+ data: data
26
+ };
27
+ return JSON.stringify(d);
28
+ }
29
+ subscribe(key) {
30
+ if (!this.subscriptions.has(key)) {
31
+ this.subscriptions.set(key, new Subject());
32
+ }
33
+ return this.subscriptions.get(key);
34
+ }
35
+ get(key) {
36
+ const d = localStorage.getItem(key);
37
+ return Promise.resolve(this.unserialize(d));
38
+ }
39
+ set(key, data) {
40
+ localStorage.setItem(key, this.serialize(data));
41
+ return Promise.resolve(true);
42
+ }
43
+ remove(key) {
44
+ localStorage.removeItem(key);
45
+ return Promise.resolve(true);
46
+ }
47
+ }
48
+ StorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
49
+ StorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService });
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.3", ngImport: i0, type: StorageService, decorators: [{
51
+ type: Injectable
52
+ }], ctorParameters: function () { return []; } });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1nLW1hbmFnZXItd2ViLWVsZW1lbnQvc3JjL2xpYi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUcvQixNQUFNLE9BQU8sY0FBYztJQUd6QjtRQUZRLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFHdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7YUFDekU7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxXQUFXLENBQUMsSUFBb0I7UUFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRWIsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJO2dCQUNGLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMzQjtZQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUU7U0FDZjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLFNBQVMsQ0FBQyxJQUFZO1FBQzVCLE1BQU0sQ0FBQyxHQUFHO1lBQ1IsSUFBSSxFQUFFLElBQUk7U0FDWCxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxTQUFTLENBQUksR0FBVztRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksT0FBTyxFQUFLLENBQUMsQ0FBQztTQUMvQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELEdBQUcsQ0FBSSxHQUFXO1FBQ2hCLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFTO1FBQ3hCLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFXO1FBQ2hCLFlBQVksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7OzJHQXREVSxjQUFjOytHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFEMUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoKSAvLyB0b2RvXG5leHBvcnQgY2xhc3MgU3RvcmFnZVNlcnZpY2Uge1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzdG9yYWdlJywgZSA9PiB7XG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25zLmhhcyhlLmtleSB8fCAnJykpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmdldChlLmtleSB8fCAnJyk/Lm5leHQodGhpcy51bnNlcmlhbGl6ZShlLm5ld1ZhbHVlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVuc2VyaWFsaXplKGRhdGE/OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgbGV0IGQgPSBudWxsO1xuXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGQgPSBKU09OLnBhcnNlKGRhdGEpLmRhdGE7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgICByZXR1cm4gZDtcbiAgfVxuXG4gIHByaXZhdGUgc2VyaWFsaXplKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IGQgPSB7XG4gICAgICBkYXRhOiBkYXRhXG4gICAgfTtcblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShkKTtcbiAgfVxuXG4gIHN1YnNjcmliZTxUPihrZXk6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zLmhhcyhrZXkpKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KGtleSwgbmV3IFN1YmplY3Q8VD4oKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9ucy5nZXQoa2V5KTtcbiAgfVxuXG4gIGdldDxUPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IGFueT4ge1xuICAgIGNvbnN0IGQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLnVuc2VyaWFsaXplKGQpKTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB0aGlzLnNlcmlhbGl6ZShkYXRhKSk7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Public API Surface of img-manager-web-element
3
+ */
4
+ export * from './lib/img-manager-web-element.component';
5
+ export * from './lib/img-manager-web-element.module';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBpbWctbWFuYWdlci13ZWItZWxlbWVudFxuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbWctbWFuYWdlci13ZWItZWxlbWVudC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW1nLW1hbmFnZXItd2ViLWVsZW1lbnQubW9kdWxlJztcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6aXNob3AtaW1nLW1hbmFnZXItd2ViZWxlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2ltZy1tYW5hZ2VyLXdlYi1lbGVtZW50L3NyYy93aXppc2hvcC1pbWctbWFuYWdlci13ZWJlbGVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=