@sumit_yewale/angular2 1.0.6 → 1.0.7-fix.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { Component, Input, SecurityContext } from '@angular/core';
2
2
  import { insertCSS } from './utils/insertCSS';
3
- import { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
3
+ import { buildImportUrl, generateUuid, buildInitPayload, createMessageGate, createImportTracker, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/platform-browser";
6
6
  // How long we wait for the importer to confirm a file it was sent before giving up on it.
@@ -75,6 +75,8 @@ export class CSVBoxButtonComponent {
75
75
  this.disabled = true;
76
76
  // True while a different importer on the page is open: the button stays disabled.
77
77
  this.blockedByOther = false;
78
+ this.messageGate = createMessageGate();
79
+ this.importTracker = createImportTracker();
78
80
  this.registryEntry = { getHolder: () => this.holder };
79
81
  this.fileSender = createFileSender({
80
82
  getIframe: () => this.iframe,
@@ -104,6 +106,11 @@ export class CSVBoxButtonComponent {
104
106
  if (!this.iframe || event.source !== this.iframe.contentWindow) {
105
107
  return;
106
108
  }
109
+ // A newer importer sends the typed message as well; act on that one only.
110
+ if (!this.messageGate.allowLegacy()) {
111
+ return;
112
+ }
113
+ const ended = this.importTracker.observe(legacy);
107
114
  if (legacy.type === "mainModalHidden") {
108
115
  this.handleModalClosed();
109
116
  }
@@ -123,6 +130,7 @@ export class CSVBoxButtonComponent {
123
130
  if (this.imported)
124
131
  this.imported(false);
125
132
  }
133
+ this.finishImport(ended);
126
134
  return;
127
135
  }
128
136
  // Set-file handshake messages. The shared core does not classify these, so they are
@@ -165,18 +173,17 @@ export class CSVBoxButtonComponent {
165
173
  if (!message) {
166
174
  return;
167
175
  }
176
+ this.messageGate.markTyped();
177
+ const ended = this.importTracker.observe(message);
168
178
  if (message.type === "data-on-submit") {
169
179
  if (this.onSubmit)
170
180
  this.onSubmit(message.metadata);
171
181
  if (this.isSubmitted)
172
182
  this.isSubmitted(message.metadata);
173
183
  if (this.submitted)
174
- this.submitted();
184
+ this.submitted(message.metadata);
175
185
  }
176
186
  else if (message.type === "data-push-status") {
177
- if (!message.success) {
178
- delete message.metadata["unique_token"];
179
- }
180
187
  if (this.onImport)
181
188
  this.onImport(message.success, message.metadata);
182
189
  if (this.isImported)
@@ -203,6 +210,7 @@ export class CSVBoxButtonComponent {
203
210
  if (this.imported)
204
211
  this.imported(false);
205
212
  }
213
+ this.finishImport(ended);
206
214
  };
207
215
  }
208
216
  ngOnInit() {
@@ -256,40 +264,70 @@ export class CSVBoxButtonComponent {
256
264
  }
257
265
  }
258
266
  ngOnDestroy() {
259
- this.clearProbeTimer();
260
267
  window.removeEventListener("message", this.messageListener);
261
- unregisterOpenImporter(this.registryEntry);
268
+ // Takes the holder out of document.body: left there, it would keep covering the page with
269
+ // an invisible full-screen layer that nothing is left to hide.
270
+ this.destroyImporter();
262
271
  if (this.unsubscribeOpenImporters) {
263
272
  this.unsubscribeOpenImporters();
264
273
  this.unsubscribeOpenImporters = null;
265
274
  }
266
275
  }
267
276
  handleModalClosed() {
277
+ if (this.importTracker.isInFlight()) {
278
+ // Closed after submitting and before the result arrived: keep the iframe and its listener
279
+ // so the late result still reaches onImport. It is removed once that result has been
280
+ // delivered (see finishImport), so the next open is a fresh load.
281
+ if (this.holder) {
282
+ this.holder.style.display = 'none';
283
+ this.holder.style.pointerEvents = 'auto';
284
+ }
285
+ this.isModalShown = false;
286
+ this.openModalOnIframeLoad = false;
287
+ this.clearFileAckTimer();
288
+ unregisterOpenImporter(this.registryEntry);
289
+ }
290
+ else {
291
+ this.destroyImporter();
292
+ }
293
+ if (this.onClose)
294
+ this.onClose();
295
+ if (this.isClosed)
296
+ this.isClosed();
297
+ if (this.closed)
298
+ this.closed();
299
+ }
300
+ // Called after the result of an import has been delivered. If the modal was closed in the
301
+ // meantime the iframe was only hidden, so remove it now.
302
+ finishImport(ended) {
303
+ if (ended && !this.isModalShown && this.iframe) {
304
+ this.destroyImporter();
305
+ }
306
+ }
307
+ // Puts the importer away: the next open builds a new iframe with a new token.
308
+ destroyImporter() {
268
309
  if (this.holder) {
269
310
  this.holder.style.display = 'none';
270
311
  this.holder.style.pointerEvents = 'auto';
312
+ this.holder.remove();
271
313
  }
314
+ this.holder = null;
315
+ this.iframe = null;
272
316
  this.isModalShown = false;
273
317
  this.isIframeLoaded = false;
274
318
  this.openModalOnIframeLoad = false;
275
- if (this.holder)
276
- this.holder.remove();
277
- this.holder = null;
278
- this.iframe = null;
319
+ this.messageGate.reset();
320
+ this.importTracker.reset();
279
321
  // A new iframe is built on the next open, so the origin is learned again.
280
322
  this.clearProbeTimer();
281
323
  unregisterOpenImporter(this.registryEntry);
282
- if (this.onClose)
283
- this.onClose();
284
- if (this.isClosed)
285
- this.isClosed();
286
- if (this.closed)
287
- this.closed();
288
324
  }
289
325
  initImporter() {
290
326
  if (this.loadStarted)
291
327
  this.loadStarted();
292
328
  this.uuid = generateUuid();
329
+ this.messageGate.reset();
330
+ this.importTracker.reset();
293
331
  insertCSS();
294
332
  const iframe = document.createElement("iframe");
295
333
  this.iframe = iframe;
@@ -297,17 +335,19 @@ export class CSVBoxButtonComponent {
297
335
  iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
298
336
  iframe.frameBorder = "0";
299
337
  iframe.onload = () => {
338
+ this.disabled = false;
339
+ this.isIframeLoaded = true;
340
+ // The handshake goes first: a consumer that calls openModalWithFile() from the ready
341
+ // callback needs the importer to already have its customer, columns, options and token.
342
+ if (this.iframe && this.iframe.contentWindow) {
343
+ this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
344
+ }
300
345
  if (this.onReady)
301
346
  this.onReady();
302
347
  if (this.isReady)
303
348
  this.isReady();
304
349
  if (this.importerReady)
305
350
  this.importerReady();
306
- this.disabled = false;
307
- this.isIframeLoaded = true;
308
- if (this.iframe && this.iframe.contentWindow) {
309
- this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
310
- }
311
351
  if (this.openModalOnIframeLoad) {
312
352
  this.openModal();
313
353
  }
@@ -502,4 +542,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
502
542
  }], disabled: [{
503
543
  type: Input
504
544
  }] } });
505
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUtoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRWhLLDBGQUEwRjtBQUMxRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQVNqQyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBQ25ELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUUvQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hGLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTTtZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxH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QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4vdXRpbHMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+IEhUTUxFbGVtZW50IHwgbnVsbDsgfVxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlcnMgeyBvcGVuOiBPcGVuSW1wb3J0ZXJFbnRyeVtdOyBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+OyB9XG5jb25zdCBPUEVOX0lNUE9SVEVSU19LRVkgPSAnX19jc3Zib3hPcGVuSW1wb3J0ZXJzJztcbmNvbnN0IFRPUF9aX0lOREVYID0gMjE0NzQ4MzY0NztcblxuZnVuY3Rpb24gb3BlbkltcG9ydGVycygpOiBPcGVuSW1wb3J0ZXJzIHtcbiAgY29uc3QgdyA9IHdpbmRvdyBhcyBhbnk7XG4gIGlmICghd1tPUEVOX0lNUE9SVEVSU19LRVldKSB3W09QRU5fSU1QT1JURVJTX0tFWV0gPSB7IG9wZW46IFtdLCBsaXN0ZW5lcnM6IFtdIH07XG4gIHJldHVybiB3W09QRU5fSU1QT1JURVJTX0tFWV07XG59XG5cbmZ1bmN0aW9uIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZzogT3BlbkltcG9ydGVycyk6IHZvaWQge1xuICByZWcub3Blbi5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGNvbnN0IGhvbGRlciA9IGVudHJ5LmdldEhvbGRlcigpO1xuICAgIGlmIChob2xkZXIpIGhvbGRlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoVE9QX1pfSU5ERVggLSAocmVnLm9wZW4ubGVuZ3RoIC0gMSAtIGkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGlmIChyZWcub3Blbi5pbmRleE9mKGVudHJ5KSA+PSAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnB1c2goZW50cnkpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBjb25zdCBpID0gcmVnLm9wZW4uaW5kZXhPZihlbnRyeSk7XG4gIGlmIChpIDwgMCkgcmV0dXJuO1xuICByZWcub3Blbi5zcGxpY2UoaSwgMSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiBpc0Jsb2NrZWRCeU9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZXR1cm4gcmVnLm9wZW4ubGVuZ3RoID4gMCAmJiByZWcub3Blbi5pbmRleE9mKGVudHJ5KSA8IDA7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZWcubGlzdGVuZXJzLnB1c2goZm4pO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGkgPSByZWcubGlzdGVuZXJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID49IDApIHJlZy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9O1xufVxuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4xNic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBibG9ja2VkQnlPdGhlclwiIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBvbkltcG9ydD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25SZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQ2xvc2U/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzUmVhZHk/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGNsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgdXNlcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkeW5hbWljQ29sdW1uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvcGVuTW9kYWxPbklmcmFtZUxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2FmZVVybDogU2FmZVVybCB8IG51bGwgPSBudWxsO1xuXG4gIGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7fVxuXG4gIC8vIFRydWUgd2hpbGUgYSBkaWZmZXJlbnQgaW1wb3J0ZXIgb24gdGhlIHBhZ2UgaXMgb3BlbjogdGhlIGJ1dHRvbiBzdGF5cyBkaXNhYmxlZC5cbiAgYmxvY2tlZEJ5T3RoZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0ZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcblxuICB0YXJnZXRPcmlnaW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBEYXRhLWxvY2F0aW9uIHNoZWV0cyByZWRpcmVjdCB0byBhbm90aGVyIGhvc3QsIHNvIHRoZSBpZnJhbWUgb3JpZ2luIGNhbiBkaWZmZXIgZnJvbVxuICAvLyB0YXJnZXRPcmlnaW4uIGJhc2VEb21haW4gaXMgdXNlZCB0byBjaGVjayB0aGUgcmVhbCBvcmlnaW4gYmVmb3JlIHRydXN0aW5nIGl0LlxuICBiYXNlRG9tYWluOiBzdHJpbmcgPSBcImFwcC5jc3Zib3guaW9cIjtcblxuICBwcml2YXRlIGZpbGVBY2tUaW1lcjogYW55ID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBjb25zdCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgLy8gT2xkZXIgaW1wb3J0ZXJzIHNlbmQgdGhlc2UgYXMgYmFyZSBzdHJpbmdzLCB3aXRob3V0IGEgdG9rZW4uXG4gICAgY29uc3QgbGVnYWN5ID0gY2xhc3NpZnlMZWdhY3lNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChsZWdhY3kpIHtcbiAgICAgIC8vIExlZ2FjeSBtZXNzYWdlcyBjYXJyeSBubyB0b2tlbiwgc28gdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2ggaW1wb3J0ZXIgc2VudCBvbmUgaXMgaXRzXG4gICAgICAvLyB3aW5kb3cuIElnbm9yZSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBhbm90aGVyIGluc3RhbmNlJ3MgaWZyYW1lIChvciBhbnl3aGVyZSBlbHNlKS5cbiAgICAgIGlmICghdGhpcy5pZnJhbWUgfHwgZXZlbnQuc291cmNlICE9PSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWdhY3kudHlwZSA9PT0gXCJtYWluTW9kYWxIaWRkZW5cIikge1xuICAgICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZFN1Y2Nlc3NmdWxcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkRmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0LWZpbGUgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGUgc2hhcmVkIGNvcmUgZG9lcyBub3QgY2xhc3NpZnkgdGhlc2UsIHNvIHRoZXkgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBiZWhpbmQgdGhlIHNhbWUgdW5pcXVlX3Rva2VuIGNoZWNrIHRoZSBjb3JlIGFwcGxpZXMuXG4gICAgY29uc3QgcmF3ID0gZXZlbnQuZGF0YTtcbiAgICBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIgJiYgcmF3LmRhdGEgJiYgcmF3LmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xuICAgICAgdGhpcy5maWxlU2VuZGVyLmxlYXJuT3JpZ2luKGV2ZW50KTtcblxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiICYmIHJhdy5kYXRhLnJlYXNvbiA9PT0gXCJub3QtYS1maWxlXCIpIHtcbiAgICAgICAgLy8gUmVwbHkgdG8gb3VyIHByb2JlIChpdCBoYXMgbm8gZmlsZSkuIEl0IG9ubHkgdGVsbHMgdXMgdGhlIG9yaWdpbiwgc28gZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1tb2RhbC1zaG93blwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgLy8gV2hhdCB0aGUgZmlsZSBwYXRoIGluIG9wZW5Nb2RhbCgpIGlzIHdhaXRpbmcgZm9yLiBkaXNwbGF5IGFzIHdlbGwgYXNcbiAgICAgICAgLy8gcG9pbnRlci1ldmVudHM6IGEgc2Vjb25kIGZpbGUgZGVjbGluZWQgd2hpbGUgdGhlIGZpcnN0IHdhcyBzdGlsbCBvcGVuaW5nIHRoZVxuICAgICAgICAvLyBtb2RhbCBoYXMgcHV0IHRoZSBob2xkZXIgYXdheSBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgaGFzIHRoZSBmaWxlIGFuZCB3aWxsIG5vdCB0YWtlIGl0LiBQdXQgdGhlIGhvbGRlciBhd2F5IG9ubHkgaWYgdGhlXG4gICAgICAgIC8vIG1vZGFsIHdhcyBuZXZlciBjb25maXJtZWQgdXA6IGEgZmlsZSBkZWNsaW5lZCB3aGlsZSBpdCBpcyBvcGVuIGxlYXZlcyB0aGF0IG1vZGFsXG4gICAgICAgIC8vIHdoZXJlIGl0IGlzLCBhbmQgaXRzIG93biAnY3N2Ym94LW1vZGFsLWhpZGRlbicgd2lsbCBwdXQgdGhlIGhvbGRlciBhd2F5LlxuICAgICAgICBpZiAoIXRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSBpbXBvcnRlciBkZWNsaW5lZCB0aGUgc3VwcGxpZWQgZmlsZTogXCIgKyByYXcuZGF0YS5yZWFzb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkKTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNTdWJtaXR0ZWQpIHRoaXMuaXNTdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICBkZWxldGUgbWVzc2FnZS5tZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm1lc3NhZ2VMaXN0ZW5lciwgZmFsc2UpO1xuICAgIHRoaXMuc3luY0Jsb2NrZWQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKCkgPT4gdGhpcy5zeW5jQmxvY2tlZCgpKTtcblxuICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0Jsb2NrZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tlZCA9IGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKGJsb2NrZWQgIT09IHRoaXMuYmxvY2tlZEJ5T3RoZXIpIHtcbiAgICAgIC8vIFRoZSByZWdpc3RyeSBjYW4gY2FsbCBiYWNrIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSAoYW5vdGhlciBpbnN0YW5jZSwgYW5vdGhlciBhcHApLlxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYmxvY2tlZEJ5T3RoZXIgPSBibG9ja2VkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycygpO1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIC8vIEEgbmV3IGlmcmFtZSBpcyBidWlsdCBvbiB0aGUgbmV4dCBvcGVuLCBzbyB0aGUgb3JpZ2luIGlzIGxlYXJuZWQgYWdhaW4uXG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XG4gIH1cblxuICBpbml0SW1wb3J0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcblxuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuXG4gICAgaW5zZXJ0Q1NTKCk7XG5cbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBpZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub25SZWFkeSkgdGhpcy5vblJlYWR5KCk7XG4gICAgICBpZiAodGhpcy5pc1JlYWR5KSB0aGlzLmlzUmVhZHkoKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVyUmVhZHkpIHRoaXMuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZCh0aGlzLnVzZXIsIHRoaXMuZHluYW1pY0NvbHVtbnMsIHRoaXMub3B0aW9ucywgdGhpcy51dWlkKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG59XG4iXX0=
545
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUtoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRXhNLDBGQUEwRjtBQUMxRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQVNqQyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBQ25ELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUUvQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hGLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTTtZQUFFLE1B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bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7OztHQU1UO2lCQUNGO3dKQU1VLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2VjdXJpdHlDb250ZXh0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi91dGlscy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY3JlYXRlTWVzc2FnZUdhdGUsIGNyZWF0ZUltcG9ydFRyYWNrZXIsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+IEhUTUxFbGVtZW50IHwgbnVsbDsgfVxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlcnMgeyBvcGVuOiBPcGVuSW1wb3J0ZXJFbnRyeVtdOyBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+OyB9XG5jb25zdCBPUEVOX0lNUE9SVEVSU19LRVkgPSAnX19jc3Zib3hPcGVuSW1wb3J0ZXJzJztcbmNvbnN0IFRPUF9aX0lOREVYID0gMjE0NzQ4MzY0NztcblxuZnVuY3Rpb24gb3BlbkltcG9ydGVycygpOiBPcGVuSW1wb3J0ZXJzIHtcbiAgY29uc3QgdyA9IHdpbmRvdyBhcyBhbnk7XG4gIGlmICghd1tPUEVOX0lNUE9SVEVSU19LRVldKSB3W09QRU5fSU1QT1JURVJTX0tFWV0gPSB7IG9wZW46IFtdLCBsaXN0ZW5lcnM6IFtdIH07XG4gIHJldHVybiB3W09QRU5fSU1QT1JURVJTX0tFWV07XG59XG5cbmZ1bmN0aW9uIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZzogT3BlbkltcG9ydGVycyk6IHZvaWQge1xuICByZWcub3Blbi5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGNvbnN0IGhvbGRlciA9IGVudHJ5LmdldEhvbGRlcigpO1xuICAgIGlmIChob2xkZXIpIGhvbGRlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoVE9QX1pfSU5ERVggLSAocmVnLm9wZW4ubGVuZ3RoIC0gMSAtIGkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGlmIChyZWcub3Blbi5pbmRleE9mKGVudHJ5KSA+PSAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnB1c2goZW50cnkpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBjb25zdCBpID0gcmVnLm9wZW4uaW5kZXhPZihlbnRyeSk7XG4gIGlmIChpIDwgMCkgcmV0dXJuO1xuICByZWcub3Blbi5zcGxpY2UoaSwgMSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiBpc0Jsb2NrZWRCeU9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZXR1cm4gcmVnLm9wZW4ubGVuZ3RoID4gMCAmJiByZWcub3Blbi5pbmRleE9mKGVudHJ5KSA8IDA7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZWcubGlzdGVuZXJzLnB1c2goZm4pO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGkgPSByZWcubGlzdGVuZXJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID49IDApIHJlZy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9O1xufVxuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4xNic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBibG9ja2VkQnlPdGhlclwiIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBvbkltcG9ydD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25SZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQ2xvc2U/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzUmVhZHk/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGNsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgbG9hZFN0YXJ0ZWQ/OiAoKSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIHVzZXI6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZHluYW1pY0NvbHVtbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGljZW5zZUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSB0aGVtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgaXNJZnJhbWVMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgb3Blbk1vZGFsT25JZnJhbWVMb2FkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbGF6eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHNhZmVVcmw6IFNhZmVVcmwgfCBudWxsID0gbnVsbDtcblxuICBpZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzYW5pdGl6ZXI6IERvbVNhbml0aXplciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICAvLyBUcnVlIHdoaWxlIGEgZGlmZmVyZW50IGltcG9ydGVyIG9uIHRoZSBwYWdlIGlzIG9wZW46IHRoZSBidXR0b24gc3RheXMgZGlzYWJsZWQuXG4gIGJsb2NrZWRCeU90aGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlR2F0ZSA9IGNyZWF0ZU1lc3NhZ2VHYXRlKCk7XG4gIHByaXZhdGUgaW1wb3J0VHJhY2tlciA9IGNyZWF0ZUltcG9ydFRyYWNrZXIoKTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0ZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcblxuICB0YXJnZXRPcmlnaW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBEYXRhLWxvY2F0aW9uIHNoZWV0cyByZWRpcmVjdCB0byBhbm90aGVyIGhvc3QsIHNvIHRoZSBpZnJhbWUgb3JpZ2luIGNhbiBkaWZmZXIgZnJvbVxuICAvLyB0YXJnZXRPcmlnaW4uIGJhc2VEb21haW4gaXMgdXNlZCB0byBjaGVjayB0aGUgcmVhbCBvcmlnaW4gYmVmb3JlIHRydXN0aW5nIGl0LlxuICBiYXNlRG9tYWluOiBzdHJpbmcgPSBcImFwcC5jc3Zib3guaW9cIjtcblxuICBwcml2YXRlIGZpbGVBY2tUaW1lcjogYW55ID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBjb25zdCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgLy8gT2xkZXIgaW1wb3J0ZXJzIHNlbmQgdGhlc2UgYXMgYmFyZSBzdHJpbmdzLCB3aXRob3V0IGEgdG9rZW4uXG4gICAgY29uc3QgbGVnYWN5ID0gY2xhc3NpZnlMZWdhY3lNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChsZWdhY3kpIHtcbiAgICAgIC8vIExlZ2FjeSBtZXNzYWdlcyBjYXJyeSBubyB0b2tlbiwgc28gdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2ggaW1wb3J0ZXIgc2VudCBvbmUgaXMgaXRzXG4gICAgICAvLyB3aW5kb3cuIElnbm9yZSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBhbm90aGVyIGluc3RhbmNlJ3MgaWZyYW1lIChvciBhbnl3aGVyZSBlbHNlKS5cbiAgICAgIGlmICghdGhpcy5pZnJhbWUgfHwgZXZlbnQuc291cmNlICE9PSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgbmV3ZXIgaW1wb3J0ZXIgc2VuZHMgdGhlIHR5cGVkIG1lc3NhZ2UgYXMgd2VsbDsgYWN0IG9uIHRoYXQgb25lIG9ubHkuXG4gICAgICBpZiAoIXRoaXMubWVzc2FnZUdhdGUuYWxsb3dMZWdhY3koKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbmRlZCA9IHRoaXMuaW1wb3J0VHJhY2tlci5vYnNlcnZlKGxlZ2FjeSk7XG4gICAgICBpZiAobGVnYWN5LnR5cGUgPT09IFwibWFpbk1vZGFsSGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChsZWdhY3kudHlwZSA9PT0gXCJ1cGxvYWRTdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZEZhaWxlZFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5maW5pc2hJbXBvcnQoZW5kZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNldC1maWxlIGhhbmRzaGFrZSBtZXNzYWdlcy4gVGhlIHNoYXJlZCBjb3JlIGRvZXMgbm90IGNsYXNzaWZ5IHRoZXNlLCBzbyB0aGV5IGFyZVxuICAgIC8vIHJlYWQgaGVyZSwgYmVoaW5kIHRoZSBzYW1lIHVuaXF1ZV90b2tlbiBjaGVjayB0aGUgY29yZSBhcHBsaWVzLlxuICAgIGNvbnN0IHJhdyA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKHJhdyAmJiB0eXBlb2YgcmF3ID09PSBcIm9iamVjdFwiICYmIHJhdy5kYXRhICYmIHJhdy5kYXRhLnVuaXF1ZV90b2tlbiA9PSB0aGlzLnV1aWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5sZWFybk9yaWdpbihldmVudCk7XG5cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtc2V0LWZpbGUtcmVqZWN0ZWRcIiAmJiByYXcuZGF0YS5yZWFzb24gPT09IFwibm90LWEtZmlsZVwiKSB7XG4gICAgICAgIC8vIFJlcGx5IHRvIG91ciBwcm9iZSAoaXQgaGFzIG5vIGZpbGUpLiBJdCBvbmx5IHRlbGxzIHVzIHRoZSBvcmlnaW4sIHNvIGRvIG5vdGhpbmcuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtc2hvd25cIikge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICAgIHJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIC8vIFdoYXQgdGhlIGZpbGUgcGF0aCBpbiBvcGVuTW9kYWwoKSBpcyB3YWl0aW5nIGZvci4gZGlzcGxheSBhcyB3ZWxsIGFzXG4gICAgICAgIC8vIHBvaW50ZXItZXZlbnRzOiBhIHNlY29uZCBmaWxlIGRlY2xpbmVkIHdoaWxlIHRoZSBmaXJzdCB3YXMgc3RpbGwgb3BlbmluZyB0aGVcbiAgICAgICAgLy8gbW9kYWwgaGFzIHB1dCB0aGUgaG9sZGVyIGF3YXkgaW4gdGhlIG1lYW50aW1lLlxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgLy8gVGhlIGltcG9ydGVyIGhhcyB0aGUgZmlsZSBhbmQgd2lsbCBub3QgdGFrZSBpdC4gUHV0IHRoZSBob2xkZXIgYXdheSBvbmx5IGlmIHRoZVxuICAgICAgICAvLyBtb2RhbCB3YXMgbmV2ZXIgY29uZmlybWVkIHVwOiBhIGZpbGUgZGVjbGluZWQgd2hpbGUgaXQgaXMgb3BlbiBsZWF2ZXMgdGhhdCBtb2RhbFxuICAgICAgICAvLyB3aGVyZSBpdCBpcywgYW5kIGl0cyBvd24gJ2NzdmJveC1tb2RhbC1oaWRkZW4nIHdpbGwgcHV0IHRoZSBob2xkZXIgYXdheS5cbiAgICAgICAgaWYgKCF0aGlzLmlzTW9kYWxTaG93biAmJiB0aGlzLmhvbGRlcikge1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKFwiW2NzdmJveF0gaW1wb3J0ZXIgZGVjbGluZWQgdGhlIHN1cHBsaWVkIGZpbGU6IFwiICsgcmF3LmRhdGEucmVhc29uKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZUdhdGUubWFya1R5cGVkKCk7XG4gICAgY29uc3QgZW5kZWQgPSB0aGlzLmltcG9ydFRyYWNrZXIub2JzZXJ2ZShtZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xuICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xuICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZmluaXNoSW1wb3J0KGVuZGVkKTtcbiAgfTtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyLCBmYWxzZSk7XG4gICAgdGhpcy5zeW5jQmxvY2tlZCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gc3Vic2NyaWJlT3BlbkltcG9ydGVycygoKSA9PiB0aGlzLnN5bmNCbG9ja2VkKCkpO1xuXG4gICAgaWYgKHRoaXMubGF6eSkge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQmxvY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBibG9ja2VkID0gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAoYmxvY2tlZCAhPT0gdGhpcy5ibG9ja2VkQnlPdGhlcikge1xuICAgICAgLy8gVGhlIHJlZ2lzdHJ5IGNhbiBjYWxsIGJhY2sgZnJvbSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIChhbm90aGVyIGluc3RhbmNlLCBhbm90aGVyIGFwcCkuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ibG9ja2VkQnlPdGhlciA9IGJsb2NrZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICAvLyBUYWtlcyB0aGUgaG9sZGVyIG91dCBvZiBkb2N1bWVudC5ib2R5OiBsZWZ0IHRoZXJlLCBpdCB3b3VsZCBrZWVwIGNvdmVyaW5nIHRoZSBwYWdlIHdpdGhcbiAgICAvLyBhbiBpbnZpc2libGUgZnVsbC1zY3JlZW4gbGF5ZXIgdGhhdCBub3RoaW5nIGlzIGxlZnQgdG8gaGlkZS5cbiAgICB0aGlzLmRlc3Ryb3lJbXBvcnRlcigpO1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycykge1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNb2RhbENsb3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbXBvcnRUcmFja2VyLmlzSW5GbGlnaHQoKSkge1xuICAgICAgLy8gQ2xvc2VkIGFmdGVyIHN1Ym1pdHRpbmcgYW5kIGJlZm9yZSB0aGUgcmVzdWx0IGFycml2ZWQ6IGtlZXAgdGhlIGlmcmFtZSBhbmQgaXRzIGxpc3RlbmVyXG4gICAgICAvLyBzbyB0aGUgbGF0ZSByZXN1bHQgc3RpbGwgcmVhY2hlcyBvbkltcG9ydC4gSXQgaXMgcmVtb3ZlZCBvbmNlIHRoYXQgcmVzdWx0IGhhcyBiZWVuXG4gICAgICAvLyBkZWxpdmVyZWQgKHNlZSBmaW5pc2hJbXBvcnQpLCBzbyB0aGUgbmV4dCBvcGVuIGlzIGEgZnJlc2ggbG9hZC5cbiAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICB9XG5cbiAgLy8gQ2FsbGVkIGFmdGVyIHRoZSByZXN1bHQgb2YgYW4gaW1wb3J0IGhhcyBiZWVuIGRlbGl2ZXJlZC4gSWYgdGhlIG1vZGFsIHdhcyBjbG9zZWQgaW4gdGhlXG4gIC8vIG1lYW50aW1lIHRoZSBpZnJhbWUgd2FzIG9ubHkgaGlkZGVuLCBzbyByZW1vdmUgaXQgbm93LlxuICBwcml2YXRlIGZpbmlzaEltcG9ydChlbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChlbmRlZCAmJiAhdGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5pZnJhbWUpIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0cyB0aGUgaW1wb3J0ZXIgYXdheTogdGhlIG5leHQgb3BlbiBidWlsZHMgYSBuZXcgaWZyYW1lIHdpdGggYSBuZXcgdG9rZW4uXG4gIHByaXZhdGUgZGVzdHJveUltcG9ydGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZUdhdGUucmVzZXQoKTtcbiAgICB0aGlzLmltcG9ydFRyYWNrZXIucmVzZXQoKTtcbiAgICAvLyBBIG5ldyBpZnJhbWUgaXMgYnVpbHQgb24gdGhlIG5leHQgb3Blbiwgc28gdGhlIG9yaWdpbiBpcyBsZWFybmVkIGFnYWluLlxuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICB9XG5cbiAgaW5pdEltcG9ydGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRTdGFydGVkKSB0aGlzLmxvYWRTdGFydGVkKCk7XG5cbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICB0aGlzLm1lc3NhZ2VHYXRlLnJlc2V0KCk7XG4gICAgdGhpcy5pbXBvcnRUcmFja2VyLnJlc2V0KCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmw/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJhbGxvd1wiLCBcImNsaXBib2FyZC1yZWFkOyBjbGlwYm9hcmQtd3JpdGUgKlwiKTtcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcblxuICAgIGlmcmFtZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIC8vIFRoZSBoYW5kc2hha2UgZ29lcyBmaXJzdDogYSBjb25zdW1lciB0aGF0IGNhbGxzIG9wZW5Nb2RhbFdpdGhGaWxlKCkgZnJvbSB0aGUgcmVhZHlcbiAgICAgIC8vIGNhbGxiYWNrIG5lZWRzIHRoZSBpbXBvcnRlciB0byBhbHJlYWR5IGhhdmUgaXRzIGN1c3RvbWVyLCBjb2x1bW5zLCBvcHRpb25zIGFuZCB0b2tlbi5cbiAgICAgIGlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZCh0aGlzLnVzZXIsIHRoaXMuZHluYW1pY0NvbHVtbnMsIHRoaXMub3B0aW9ucywgdGhpcy51dWlkKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub25SZWFkeSkgdGhpcy5vblJlYWR5KCk7XG4gICAgICBpZiAodGhpcy5pc1JlYWR5KSB0aGlzLmlzUmVhZHkoKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVyUmVhZHkpIHRoaXMuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBpZiAodGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhvbGRlci5jbGFzc0xpc3QuYWRkKCdjc3Zib3gtaG9sZGVyJyk7XG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXG4gICAgKTtcbiAgICAvLyBUaGUgaG9sZGVyIGRpZCBub3QgZXhpc3QgeWV0IGlmIG9wZW5Nb2RhbCgpIGFza2VkIGZvciB0aGUgaW1wb3J0ZXIgYmVmb3JlIGl0IHdhcyBidWlsdC5cbiAgICByZXN0YWNrT3BlbkltcG9ydGVycyhvcGVuSW1wb3J0ZXJzKCkpO1xuICB9XG5cbiAgb3Blbk1vZGFsKCk6IHZvaWQge1xuICAgIC8vIENvdW50cyBhcyBvcGVuIGZyb20gdGhlIG1vbWVudCBpdCBpcyByZXF1ZXN0ZWQsIHNvIHRoZSBvdGhlciBidXR0b25zIGFyZSBkaXNhYmxlZCB3aGlsZVxuICAgIC8vIHRoaXMgaW1wb3J0ZXIgaXMgc3RpbGwgbG9hZGluZywgYW5kIHNvIGl0IGlzIHN0YWNrZWQgYWJvdmUgYW55IGltcG9ydGVyIG9wZW5lZCBlYXJsaWVyLlxuICAgIHJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYoIXRoaXMuaWZyYW1lKSB7XG4gICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZighdGhpcy5pc01vZGFsU2hvd24pIHtcbiAgICAgIGlmKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgICAgaWYodGhpcy5wZW5kaW5nRmlsZSkge1xuICAgICAgICAgIC8vIFRoZSBpbXBvcnRlciBvcGVucyBpdHMgb3duIG1vZGFsIG9uY2UgaXQgaGFzIHRoZSBmaWxlLCBzbyB0aGF0IGl0IGNhbiBpbmplY3Qgb25cbiAgICAgICAgICAvLyAnc2hvd24uYnMubW9kYWwnLiBTZW5kaW5nICdvcGVuTW9kYWwnIGFzIHdlbGwgd291bGQgcmFjZSB0aGF0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSXQgY2FuIGFsc28gZGVjbGluZTogd3Jvbmcgc3RlcCwgYW4gaW1wb3J0IGZpbGUgVVJMIGNvbmZpZ3VyZWQgb24gdGhlIHNoZWV0LCBvclxuICAgICAgICAgIC8vIGFuIGltcG9ydGVyIHRvbyBvbGQgdG8ga25vdyB0aGUgbWVzc2FnZSBhdCBhbGwuIFNvIHRoZSBob2xkZXIgZ29lcyB1cFxuICAgICAgICAgIC8vIGNsaWNrLXRocm91Z2ggYW5kIHN0YXlzIHRoYXQgd2F5IHVudGlsICdjc3Zib3gtbW9kYWwtc2hvd24nIGNvbmZpcm1zIHRoZSBtb2RhbFxuICAgICAgICAgIC8vIGlzIHJlYWxseSB1cC4gSXQgY292ZXJzIHRoZSB2aWV3cG9ydCBhdCB6LWluZGV4IDIxNDc0ODM2NDcgYW5kIHRoZSBpbXBvcnRlclxuICAgICAgICAgIC8vIHJlbmRlcnMgdHJhbnNwYXJlbnQgd2l0aCBpdHMgbW9kYWwgY2xvc2VkLCBzbyBhcm1pbmcgaXQgb24gYW4gdW5hbnN3ZXJlZCBtZXNzYWdlXG4gICAgICAgICAgLy8gbGVhdmVzIGFuIGludmlzaWJsZSBzaGVldCBvdmVyIHRoZSBob3N0IHBhZ2UgZWF0aW5nIGV2ZXJ5IGNsaWNrLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gZGlzcGxheTpibG9jayByZWdhcmRsZXNzLCBzbyB0aGUgaWZyYW1lIGxheXMgb3V0IGFuZCBhbmltYXRlcyBub3JtYWxseTsgb25seVxuICAgICAgICAgIC8vIHBvaW50ZXItZXZlbnRzIGlzIGhlbGQgYmFjay4gaXNNb2RhbFNob3duIGxpa2V3aXNlIHdhaXRzIGZvciB0aGUgY29uZmlybWF0aW9uLFxuICAgICAgICAgIC8vIG9yIGEgZGVjbGluZWQgZmlsZSB3b3VsZCBsYXRjaCB0aGUgaW1wb3J0ZXIgc2h1dCBmb3IgZ29vZC5cbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZpbGVTZW5kZXIuc2VuZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikge1xuICAgICAgICAgICAgLy8gRXhwbGljaXQ6IGEgcHJldmlvdXNseSBkZWNsaW5lZCBmaWxlIGxlYXZlcyB0aGUgaG9sZGVyIGNsaWNrLXRocm91Z2guXG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ29wZW5Nb2RhbCcsICcqJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgaW1wb3J0ZXIgb24gYSBGaWxlIHRoZSBob3N0IHBhZ2UgYWxyZWFkeSBoYXMsIGluc3RlYWQgb2YgdGhlIGZpbGUgcGlja2VyLlxuICAgKlxuICAgKiBSZWFjaGFibGUgdGhyb3VnaCBhIHRlbXBsYXRlIHJlZmVyZW5jZSAoYCNpbXBvcnRlcmAgdGhlbiBgaW1wb3J0ZXIub3Blbk1vZGFsV2l0aEZpbGUoZmlsZSlgKVxuICAgKiBvciBgQFZpZXdDaGlsZChDU1ZCb3hCdXR0b25Db21wb25lbnQpYC5cbiAgICpcbiAgICogVGhlIEZpbGUgY3Jvc3NlcyB0byB0aGUgaWZyYW1lIGJ5IHN0cnVjdHVyZWQgY2xvbmUsIHNvIHRoZSBpbXBvcnRlciByZWNlaXZlcyB0aGUgcmVhbFxuICAgKiBvYmplY3QgYW5kIGFwcGxpZXMgaXRzIG93biBleHRlbnNpb24sIHdvcmtzaGVldCBhbmQgc2l6ZSBydWxlcyB0byBpdCAtLSB0aGlzIGRvZXMgbm90XG4gICAqIGJ5cGFzcyBhbnkgb2YgdGhlbS4gUGFzcyBhIEZpbGU7IGEgQmxvYiBoYXMgbm8gbmFtZSBmb3IgdGhlIGltcG9ydGVyIHRvIHJlYWQgYW5cbiAgICogZXh0ZW5zaW9uIGZyb20uXG4gICAqL1xuICBvcGVuTW9kYWxXaXRoRmlsZShmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgaWYodHlwZW9mIEZpbGUgPT09ICd1bmRlZmluZWQnIHx8ICEoZmlsZSBpbnN0YW5jZW9mIEZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nRmlsZSA9IGZpbGU7XG5cbiAgICAvLyBBbHJlYWR5IG9wZW46IGhhbmQgaXQgb3ZlciBub3cgcmF0aGVyIHRoYW4gaG9sZGluZyBpdCBmb3IgdGhlIG5leHQgb3Blbi4gVGhlIGltcG9ydGVyXG4gICAgLy8gdGFrZXMgaXQgb25seSB3aGlsZSBpdCBpcyBzdGlsbCBvbiB0aGUgdXBsb2FkIHN0ZXAsIGFuZCBpZ25vcmVzIGl0IG9uY2UgdGhlIHVzZXIgaGFzIGFcbiAgICAvLyBkYXRhc2V0IGFuZCBhIG1hcHBpbmcgaW4gcHJvZ3Jlc3MuXG4gICAgaWYodGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5pZnJhbWUgJiYgdGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5Nb2RhbCgpO1xuICB9XG5cbiAgY2xlYXJQcm9iZVRpbWVyKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICB0aGlzLmZpbGVTZW5kZXIucmVzZXQoKTtcbiAgfVxuXG4gIHN0YXJ0RmlsZUFja1RpbWVyKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICB0aGlzLmZpbGVBY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5maWxlQWNrVGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5naXZlVXBPbkZpbGUoKTtcbiAgICB9LCBGSUxFX0FDS19USU1FT1VUX01TKTtcbiAgfVxuXG4gIGNsZWFyRmlsZUFja1RpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbGVBY2tUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuZmlsZUFja1RpbWVyKTtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgaW1wb3J0ZXIgbmV2ZXIgY29uZmlybWVkIHRoZSBmaWxlIGl0IHdhcyBzZW50IChhbiBvcmlnaW4gd2UgZG8gbm90IHRydXN0LCBvciBhbiBpbXBvcnRlciB0b29cbiAgLy8gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UpLiBXaXRob3V0IHRoaXMgdGhlIGhvbGRlciB3b3VsZCBzdGF5IHVwLCBpbnZpc2libGUgYW5kIGNsaWNrLXRocm91Z2gsXG4gIC8vIGFuZCB0aGUgb3RoZXIgaW5zdGFuY2VzJyBidXR0b25zIHdvdWxkIHN0YXkgZGlzYWJsZWQgZm9yIGdvb2QuXG4gIGdpdmVVcE9uRmlsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vZGFsU2hvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaG9sZGVyID0gdGhpcy5ob2xkZXI7XG4gICAgaWYgKGhvbGRlcikge1xuICAgICAgaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICB9XG4gICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGNvbnNvbGUud2FybihcIltjc3Zib3hdIHRoZSBpbXBvcnRlciBkaWQgbm90IHJlc3BvbmQgdG8gdGhlIHN1cHBsaWVkIGZpbGVcIik7XG4gIH1cbn1cbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { SecurityContext, Component, Input } from '@angular/core';
3
- import { createFileSender, classifyLegacyMessage, classifyStructuredMessage, generateUuid, buildImportUrl, buildInitPayload } from '@sumit_yewale/adapter-core';
3
+ import { createMessageGate, createImportTracker, createFileSender, classifyLegacyMessage, classifyStructuredMessage, generateUuid, buildImportUrl, buildInitPayload } from '@sumit_yewale/adapter-core';
4
4
  import * as i1 from '@angular/platform-browser';
5
5
 
6
6
  let styleElement;
@@ -107,6 +107,8 @@ class CSVBoxButtonComponent {
107
107
  this.disabled = true;
108
108
  // True while a different importer on the page is open: the button stays disabled.
109
109
  this.blockedByOther = false;
110
+ this.messageGate = createMessageGate();
111
+ this.importTracker = createImportTracker();
110
112
  this.registryEntry = { getHolder: () => this.holder };
111
113
  this.fileSender = createFileSender({
112
114
  getIframe: () => this.iframe,
@@ -136,6 +138,11 @@ class CSVBoxButtonComponent {
136
138
  if (!this.iframe || event.source !== this.iframe.contentWindow) {
137
139
  return;
138
140
  }
141
+ // A newer importer sends the typed message as well; act on that one only.
142
+ if (!this.messageGate.allowLegacy()) {
143
+ return;
144
+ }
145
+ const ended = this.importTracker.observe(legacy);
139
146
  if (legacy.type === "mainModalHidden") {
140
147
  this.handleModalClosed();
141
148
  }
@@ -155,6 +162,7 @@ class CSVBoxButtonComponent {
155
162
  if (this.imported)
156
163
  this.imported(false);
157
164
  }
165
+ this.finishImport(ended);
158
166
  return;
159
167
  }
160
168
  // Set-file handshake messages. The shared core does not classify these, so they are
@@ -197,18 +205,17 @@ class CSVBoxButtonComponent {
197
205
  if (!message) {
198
206
  return;
199
207
  }
208
+ this.messageGate.markTyped();
209
+ const ended = this.importTracker.observe(message);
200
210
  if (message.type === "data-on-submit") {
201
211
  if (this.onSubmit)
202
212
  this.onSubmit(message.metadata);
203
213
  if (this.isSubmitted)
204
214
  this.isSubmitted(message.metadata);
205
215
  if (this.submitted)
206
- this.submitted();
216
+ this.submitted(message.metadata);
207
217
  }
208
218
  else if (message.type === "data-push-status") {
209
- if (!message.success) {
210
- delete message.metadata["unique_token"];
211
- }
212
219
  if (this.onImport)
213
220
  this.onImport(message.success, message.metadata);
214
221
  if (this.isImported)
@@ -235,6 +242,7 @@ class CSVBoxButtonComponent {
235
242
  if (this.imported)
236
243
  this.imported(false);
237
244
  }
245
+ this.finishImport(ended);
238
246
  };
239
247
  }
240
248
  ngOnInit() {
@@ -288,41 +296,71 @@ class CSVBoxButtonComponent {
288
296
  }
289
297
  }
290
298
  ngOnDestroy() {
291
- this.clearProbeTimer();
292
299
  window.removeEventListener("message", this.messageListener);
293
- unregisterOpenImporter(this.registryEntry);
300
+ // Takes the holder out of document.body: left there, it would keep covering the page with
301
+ // an invisible full-screen layer that nothing is left to hide.
302
+ this.destroyImporter();
294
303
  if (this.unsubscribeOpenImporters) {
295
304
  this.unsubscribeOpenImporters();
296
305
  this.unsubscribeOpenImporters = null;
297
306
  }
298
307
  }
299
308
  handleModalClosed() {
309
+ if (this.importTracker.isInFlight()) {
310
+ // Closed after submitting and before the result arrived: keep the iframe and its listener
311
+ // so the late result still reaches onImport. It is removed once that result has been
312
+ // delivered (see finishImport), so the next open is a fresh load.
313
+ if (this.holder) {
314
+ this.holder.style.display = 'none';
315
+ this.holder.style.pointerEvents = 'auto';
316
+ }
317
+ this.isModalShown = false;
318
+ this.openModalOnIframeLoad = false;
319
+ this.clearFileAckTimer();
320
+ unregisterOpenImporter(this.registryEntry);
321
+ }
322
+ else {
323
+ this.destroyImporter();
324
+ }
325
+ if (this.onClose)
326
+ this.onClose();
327
+ if (this.isClosed)
328
+ this.isClosed();
329
+ if (this.closed)
330
+ this.closed();
331
+ }
332
+ // Called after the result of an import has been delivered. If the modal was closed in the
333
+ // meantime the iframe was only hidden, so remove it now.
334
+ finishImport(ended) {
335
+ if (ended && !this.isModalShown && this.iframe) {
336
+ this.destroyImporter();
337
+ }
338
+ }
339
+ // Puts the importer away: the next open builds a new iframe with a new token.
340
+ destroyImporter() {
300
341
  if (this.holder) {
301
342
  this.holder.style.display = 'none';
302
343
  this.holder.style.pointerEvents = 'auto';
344
+ this.holder.remove();
303
345
  }
346
+ this.holder = null;
347
+ this.iframe = null;
304
348
  this.isModalShown = false;
305
349
  this.isIframeLoaded = false;
306
350
  this.openModalOnIframeLoad = false;
307
- if (this.holder)
308
- this.holder.remove();
309
- this.holder = null;
310
- this.iframe = null;
351
+ this.messageGate.reset();
352
+ this.importTracker.reset();
311
353
  // A new iframe is built on the next open, so the origin is learned again.
312
354
  this.clearProbeTimer();
313
355
  unregisterOpenImporter(this.registryEntry);
314
- if (this.onClose)
315
- this.onClose();
316
- if (this.isClosed)
317
- this.isClosed();
318
- if (this.closed)
319
- this.closed();
320
356
  }
321
357
  initImporter() {
322
358
  var _a;
323
359
  if (this.loadStarted)
324
360
  this.loadStarted();
325
361
  this.uuid = generateUuid();
362
+ this.messageGate.reset();
363
+ this.importTracker.reset();
326
364
  insertCSS();
327
365
  const iframe = document.createElement("iframe");
328
366
  this.iframe = iframe;
@@ -330,17 +368,19 @@ class CSVBoxButtonComponent {
330
368
  iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
331
369
  iframe.frameBorder = "0";
332
370
  iframe.onload = () => {
371
+ this.disabled = false;
372
+ this.isIframeLoaded = true;
373
+ // The handshake goes first: a consumer that calls openModalWithFile() from the ready
374
+ // callback needs the importer to already have its customer, columns, options and token.
375
+ if (this.iframe && this.iframe.contentWindow) {
376
+ this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
377
+ }
333
378
  if (this.onReady)
334
379
  this.onReady();
335
380
  if (this.isReady)
336
381
  this.isReady();
337
382
  if (this.importerReady)
338
383
  this.importerReady();
339
- this.disabled = false;
340
- this.isIframeLoaded = true;
341
- if (this.iframe && this.iframe.contentWindow) {
342
- this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
343
- }
344
384
  if (this.openModalOnIframeLoad) {
345
385
  this.openModal();
346
386
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sumit_yewale-angular2.mjs","sources":["../../../projects/angular-adapter/src/lib/utils/insertCSS.ts","../../../projects/angular-adapter/src/lib/angular-adapter.component.ts","../../../projects/angular-adapter/src/public-api.ts","../../../projects/angular-adapter/src/sumit_yewale-angular2.ts"],"sourcesContent":["let styleElement: HTMLStyleElement\n\nconst GLOBAL_CSS = `\n.csvbox-holder {\n z-index: 2147483647;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: none;\n}\n.csvbox-holder iframe {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n}\n`\n\nexport const insertCSS = (): void => {\n if (styleElement) {\n return\n }\n\n styleElement = document.createElement('style')\n styleElement.setAttribute('type', 'text/css')\n const head = document.querySelector('head');\n if (head) {\n head.appendChild(styleElement);\n }\n\n styleElement.textContent = GLOBAL_CSS\n}\n","import {\n Component,\n OnInit,\n Input,\n OnChanges,\n SimpleChanges,\n SecurityContext,\n AfterContentInit,\n OnDestroy,\n ChangeDetectorRef,\n NgZone\n} from '@angular/core';\n\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { insertCSS } from './utils/insertCSS';\nimport { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';\n\n// How long we wait for the importer to confirm a file it was sent before giving up on it.\nconst FILE_ACK_TIMEOUT_MS = 8000;\n\n// Page-wide record of the importers that are open or opening, shared by every CSVBox adapter\n// on the page (it lives on window so separate copies of an adapter see the same list). It does\n// two things: the newest importer is stacked on top (every holder is fixed, full screen and\n// z-index 2147483647, so equal z-indexes would leave the one that comes first in the DOM on\n// top), and the other instances learn that an importer is open so they can disable their button.\ninterface OpenImporterEntry { getHolder: () => HTMLElement | null; }\ninterface OpenImporters { open: OpenImporterEntry[]; listeners: Array<() => void>; }\nconst OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';\nconst TOP_Z_INDEX = 2147483647;\n\nfunction openImporters(): OpenImporters {\n const w = window as any;\n if (!w[OPEN_IMPORTERS_KEY]) w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };\n return w[OPEN_IMPORTERS_KEY];\n}\n\nfunction restackOpenImporters(reg: OpenImporters): void {\n reg.open.forEach((entry, i) => {\n const holder = entry.getHolder();\n if (holder) holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));\n });\n}\n\nfunction registerOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n if (reg.open.indexOf(entry) >= 0) return;\n reg.open.push(entry);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction unregisterOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n const i = reg.open.indexOf(entry);\n if (i < 0) return;\n reg.open.splice(i, 1);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction isBlockedByOpenImporter(entry: OpenImporterEntry): boolean {\n const reg = openImporters();\n return reg.open.length > 0 && reg.open.indexOf(entry) < 0;\n}\n\nfunction subscribeOpenImporters(fn: () => void): () => void {\n const reg = openImporters();\n reg.listeners.push(fn);\n return () => {\n const i = reg.listeners.indexOf(fn);\n if (i >= 0) reg.listeners.splice(i, 1);\n };\n}\n\nconst appVersion = '1.1.16';\n\n@Component({\n selector: 'csvbox-button',\n standalone: true,\n template: `\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n `\n})\n\nexport class CSVBoxButtonComponent implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n\n isModalShown = false;\n\n @Input() onImport?: (success: boolean, metadata?: any) => void;\n @Input() onReady?: () => void;\n @Input() onClose?: () => void;\n @Input() onSubmit?: (metadata: any) => void;\n\n @Input() isImported?: (success: boolean, metadata?: any) => void;\n @Input() isReady?: () => void;\n @Input() isClosed?: () => void;\n @Input() isSubmitted?: (metadata: any) => void;\n\n @Input() importerReady?: () => void;\n @Input() closed?: () => void;\n @Input() submitted?: () => void;\n @Input() imported?: (success: boolean, metadata?: any) => void;\n @Input() loadStarted?: () => void;\n\n @Input() user: { [key: string]: any } | null = null;\n @Input() dynamicColumns: { [key: string]: any } | null = null;\n @Input() licenseKey: string | null = null;\n @Input() options: { [key: string]: any } | null = null;\n @Input() uuid: string = '';\n @Input() customDomain: string | null = null;\n @Input() dataLocation: string | null = null;\n @Input() language: string | null = null;\n @Input() environment: { [key: string]: any } | null = null;\n\n @Input() theme: string | null = null;\n\n @Input() isIframeLoaded: boolean = false;\n @Input() openModalOnIframeLoad: boolean = false;\n\n @Input() lazy: boolean = false;\n\n safeUrl: SafeUrl | null = null;\n\n iframe: HTMLIFrameElement | null = null;\n\n @Input() disabled: boolean = true;\n\n constructor(public sanitizer: DomSanitizer, private cdr: ChangeDetectorRef, private zone: NgZone) {}\n\n // True while a different importer on the page is open: the button stays disabled.\n blockedByOther: boolean = false;\n\n private registryEntry: OpenImporterEntry = { getHolder: () => this.holder };\n\n private fileSender = createFileSender({\n getIframe: () => this.iframe,\n getToken: () => this.uuid as string,\n getTargetOrigin: () => this.targetOrigin as string,\n getBaseDomain: () => this.baseDomain,\n takeFile: () => {\n const file = this.pendingFile;\n this.pendingFile = null;\n return file;\n },\n onSent: () => this.startFileAckTimer()\n });\n\n private unsubscribeOpenImporters: (() => void) | null = null;\n\n holder: HTMLDivElement | null = null;\n\n pendingFile: File | null = null;\n\n targetOrigin: string | undefined;\n\n // Data-location sheets redirect to another host, so the iframe origin can differ from\n // targetOrigin. baseDomain is used to check the real origin before trusting it.\n baseDomain: string = \"app.csvbox.io\";\n\n private fileAckTimer: any = null;\n\n ngOnInit(): void {\n this.uuid = generateUuid();\n const iframeUrl = buildImportUrl(\n {\n licenseKey: this.licenseKey,\n customDomain: this.customDomain,\n dataLocation: this.dataLocation,\n language: this.language,\n theme: this.theme,\n environment: this.environment\n },\n \"angular\",\n appVersion\n );\n // Default place to send the file. A file is only ever sent to a named origin, never \"*\".\n this.targetOrigin = new URL(iframeUrl).origin;\n this.baseDomain = this.customDomain || \"app.csvbox.io\";\n this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {\n this.updateUserVariable(changes['user'].currentValue);\n }\n }\n\n updateUserVariable(data: { [key: string]: any }): void {\n this.user = data;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage({\n \"customer\": data\n }, \"*\");\n }\n }\n\n private messageListener = (event: MessageEvent) => {\n // Older importers send these as bare strings, without a token.\n const legacy = classifyLegacyMessage(event.data);\n if (legacy) {\n // Legacy messages carry no token, so the only way to tell which importer sent one is its\n // window. Ignore those that came from another instance's iframe (or anywhere else).\n if (!this.iframe || event.source !== this.iframe.contentWindow) {\n return;\n }\n if (legacy.type === \"mainModalHidden\") {\n this.handleModalClosed();\n } else if (legacy.type === \"uploadSuccessful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (legacy.type === \"uploadFailed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n return;\n }\n\n // Set-file handshake messages. The shared core does not classify these, so they are\n // read here, behind the same unique_token check the core applies.\n const raw = event.data;\n if (raw && typeof raw === \"object\" && raw.data && raw.data.unique_token == this.uuid) {\n this.fileSender.learnOrigin(event);\n\n if (raw.type === \"csvbox-set-file-rejected\" && raw.data.reason === \"not-a-file\") {\n // Reply to our probe (it has no file). It only tells us the origin, so do nothing.\n return;\n }\n if (raw.type === \"csvbox-modal-shown\") {\n this.clearFileAckTimer();\n registerOpenImporter(this.registryEntry);\n // What the file path in openModal() is waiting for. display as well as\n // pointer-events: a second file declined while the first was still opening the\n // modal has put the holder away in the meantime.\n this.isModalShown = true;\n if (this.holder) {\n this.holder.style.display = 'block';\n this.holder.style.pointerEvents = 'auto';\n }\n return;\n }\n if (raw.type === \"csvbox-set-file-rejected\") {\n this.clearFileAckTimer();\n // The importer has the file and will not take it. Put the holder away only if the\n // modal was never confirmed up: a file declined while it is open leaves that modal\n // where it is, and its own 'csvbox-modal-hidden' will put the holder away.\n if (!this.isModalShown && this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n unregisterOpenImporter(this.registryEntry);\n }\n console.warn(\"[csvbox] importer declined the supplied file: \" + raw.data.reason);\n return;\n }\n }\n\n const message = classifyStructuredMessage(event.data, this.uuid);\n if (!message) {\n return;\n }\n\n if (message.type === \"data-on-submit\") {\n if (this.onSubmit) this.onSubmit(message.metadata);\n if (this.isSubmitted) this.isSubmitted(message.metadata);\n if (this.submitted) this.submitted();\n } else if (message.type === \"data-push-status\") {\n if (!message.success) {\n delete message.metadata[\"unique_token\"];\n }\n if (this.onImport) this.onImport(message.success, message.metadata);\n if (this.isImported) this.isImported(message.success, message.metadata);\n if (this.imported) this.imported(message.success, message.metadata);\n } else if (message.type === \"csvbox-modal-hidden\") {\n this.handleModalClosed();\n } else if (message.type === \"csvbox-upload-successful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (message.type === \"csvbox-upload-failed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n };\n\n ngAfterContentInit(): void {\n window.addEventListener(\"message\", this.messageListener, false);\n this.syncBlocked();\n this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());\n\n if (this.lazy) {\n this.disabled = false;\n } else {\n this.disabled = true;\n this.initImporter();\n }\n }\n\n private syncBlocked(): void {\n const blocked = isBlockedByOpenImporter(this.registryEntry);\n if (blocked !== this.blockedByOther) {\n // The registry can call back from outside Angular's zone (another instance, another app).\n this.zone.run(() => {\n this.blockedByOther = blocked;\n this.cdr.markForCheck();\n });\n }\n }\n\n ngOnDestroy(): void {\n this.clearProbeTimer();\n window.removeEventListener(\"message\", this.messageListener);\n unregisterOpenImporter(this.registryEntry);\n if (this.unsubscribeOpenImporters) {\n this.unsubscribeOpenImporters();\n this.unsubscribeOpenImporters = null;\n }\n }\n\n handleModalClosed(): void {\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n }\n this.isModalShown = false;\n this.isIframeLoaded = false;\n this.openModalOnIframeLoad = false;\n if (this.holder) this.holder.remove();\n this.holder = null;\n this.iframe = null;\n // A new iframe is built on the next open, so the origin is learned again.\n this.clearProbeTimer();\n unregisterOpenImporter(this.registryEntry);\n if (this.onClose) this.onClose();\n if (this.isClosed) this.isClosed();\n if (this.closed) this.closed();\n }\n\n initImporter(): void {\n if (this.loadStarted) this.loadStarted();\n\n this.uuid = generateUuid();\n\n insertCSS();\n\n const iframe = document.createElement(\"iframe\");\n this.iframe = iframe;\n iframe.setAttribute(\"src\", this.safeUrl?.toString() || '');\n iframe.setAttribute(\"allow\", \"clipboard-read; clipboard-write *\");\n iframe.frameBorder = \"0\";\n\n iframe.onload = () => {\n if (this.onReady) this.onReady();\n if (this.isReady) this.isReady();\n if (this.importerReady) this.importerReady();\n\n this.disabled = false;\n this.isIframeLoaded = true;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), \"*\");\n }\n if (this.openModalOnIframeLoad) {\n this.openModal();\n }\n };\n\n this.holder = document.createElement('div');\n this.holder.classList.add('csvbox-holder');\n this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);\n this.holder.appendChild(iframe);\n\n document.body.insertAdjacentElement(\n 'beforeend', this.holder\n );\n // The holder did not exist yet if openModal() asked for the importer before it was built.\n restackOpenImporters(openImporters());\n }\n\n openModal(): void {\n // Counts as open from the moment it is requested, so the other buttons are disabled while\n // this importer is still loading, and so it is stacked above any importer opened earlier.\n registerOpenImporter(this.registryEntry);\n if(!this.iframe) {\n this.openModalOnIframeLoad = true;\n this.initImporter();\n return;\n }\n if(!this.isModalShown) {\n if(this.isIframeLoaded) {\n if(this.pendingFile) {\n // The importer opens its own modal once it has the file, so that it can inject on\n // 'shown.bs.modal'. Sending 'openModal' as well would race that.\n //\n // It can also decline: wrong step, an import file URL configured on the sheet, or\n // an importer too old to know the message at all. So the holder goes up\n // click-through and stays that way until 'csvbox-modal-shown' confirms the modal\n // is really up. It covers the viewport at z-index 2147483647 and the importer\n // renders transparent with its modal closed, so arming it on an unanswered message\n // leaves an invisible sheet over the host page eating every click.\n //\n // display:block regardless, so the iframe lays out and animates normally; only\n // pointer-events is held back. isModalShown likewise waits for the confirmation,\n // or a declined file would latch the importer shut for good.\n if(this.holder) {\n this.holder.style.pointerEvents = 'none';\n this.holder.style.display = 'block';\n }\n this.fileSender.send();\n } else {\n this.isModalShown = true;\n if(this.holder) {\n // Explicit: a previously declined file leaves the holder click-through.\n this.holder.style.pointerEvents = 'auto';\n this.holder.style.display = 'block';\n }\n if(this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage('openModal', '*');\n }\n }\n } else {\n this.openModalOnIframeLoad = true;\n }\n }\n }\n\n /**\n * Open the importer on a File the host page already has, instead of the file picker.\n *\n * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)\n * or `@ViewChild(CSVBoxButtonComponent)`.\n *\n * The File crosses to the iframe by structured clone, so the importer receives the real\n * object and applies its own extension, worksheet and size rules to it -- this does not\n * bypass any of them. Pass a File; a Blob has no name for the importer to read an\n * extension from.\n */\n openModalWithFile(file: File): void {\n if(typeof File === 'undefined' || !(file instanceof File)) {\n return;\n }\n\n this.pendingFile = file;\n\n // Already open: hand it over now rather than holding it for the next open. The importer\n // takes it only while it is still on the upload step, and ignores it once the user has a\n // dataset and a mapping in progress.\n if(this.isModalShown && this.iframe && this.isIframeLoaded) {\n this.fileSender.send();\n return;\n }\n\n this.openModal();\n }\n\n clearProbeTimer(): void {\n this.clearFileAckTimer();\n this.fileSender.reset();\n }\n\n startFileAckTimer(): void {\n this.clearFileAckTimer();\n this.fileAckTimer = setTimeout(() => {\n this.fileAckTimer = null;\n this.giveUpOnFile();\n }, FILE_ACK_TIMEOUT_MS);\n }\n\n clearFileAckTimer(): void {\n if (this.fileAckTimer) {\n clearTimeout(this.fileAckTimer);\n this.fileAckTimer = null;\n }\n }\n\n // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too\n // old to know the message). Without this the holder would stay up, invisible and click-through,\n // and the other instances' buttons would stay disabled for good.\n giveUpOnFile(): void {\n if (this.isModalShown) {\n return;\n }\n const holder = this.holder;\n if (holder) {\n holder.style.display = 'none';\n holder.style.pointerEvents = 'auto';\n }\n unregisterOpenImporter(this.registryEntry);\n console.warn(\"[csvbox] the importer did not respond to the supplied file\");\n }\n}\n","/*\n * Public API Surface of angular-adapter\n */\n\n\nexport * from './lib/angular-adapter.component';\nexport * from './lib/interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sumit_yewale-angular2.mjs","sources":["../../../projects/angular-adapter/src/lib/utils/insertCSS.ts","../../../projects/angular-adapter/src/lib/angular-adapter.component.ts","../../../projects/angular-adapter/src/public-api.ts","../../../projects/angular-adapter/src/sumit_yewale-angular2.ts"],"sourcesContent":["let styleElement: HTMLStyleElement\n\nconst GLOBAL_CSS = `\n.csvbox-holder {\n z-index: 2147483647;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: none;\n}\n.csvbox-holder iframe {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n}\n`\n\nexport const insertCSS = (): void => {\n if (styleElement) {\n return\n }\n\n styleElement = document.createElement('style')\n styleElement.setAttribute('type', 'text/css')\n const head = document.querySelector('head');\n if (head) {\n head.appendChild(styleElement);\n }\n\n styleElement.textContent = GLOBAL_CSS\n}\n","import {\n Component,\n OnInit,\n Input,\n OnChanges,\n SimpleChanges,\n SecurityContext,\n AfterContentInit,\n OnDestroy,\n ChangeDetectorRef,\n NgZone\n} from '@angular/core';\n\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { insertCSS } from './utils/insertCSS';\nimport { buildImportUrl, generateUuid, buildInitPayload, createMessageGate, createImportTracker, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';\n\n// How long we wait for the importer to confirm a file it was sent before giving up on it.\nconst FILE_ACK_TIMEOUT_MS = 8000;\n\n// Page-wide record of the importers that are open or opening, shared by every CSVBox adapter\n// on the page (it lives on window so separate copies of an adapter see the same list). It does\n// two things: the newest importer is stacked on top (every holder is fixed, full screen and\n// z-index 2147483647, so equal z-indexes would leave the one that comes first in the DOM on\n// top), and the other instances learn that an importer is open so they can disable their button.\ninterface OpenImporterEntry { getHolder: () => HTMLElement | null; }\ninterface OpenImporters { open: OpenImporterEntry[]; listeners: Array<() => void>; }\nconst OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';\nconst TOP_Z_INDEX = 2147483647;\n\nfunction openImporters(): OpenImporters {\n const w = window as any;\n if (!w[OPEN_IMPORTERS_KEY]) w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };\n return w[OPEN_IMPORTERS_KEY];\n}\n\nfunction restackOpenImporters(reg: OpenImporters): void {\n reg.open.forEach((entry, i) => {\n const holder = entry.getHolder();\n if (holder) holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));\n });\n}\n\nfunction registerOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n if (reg.open.indexOf(entry) >= 0) return;\n reg.open.push(entry);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction unregisterOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n const i = reg.open.indexOf(entry);\n if (i < 0) return;\n reg.open.splice(i, 1);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction isBlockedByOpenImporter(entry: OpenImporterEntry): boolean {\n const reg = openImporters();\n return reg.open.length > 0 && reg.open.indexOf(entry) < 0;\n}\n\nfunction subscribeOpenImporters(fn: () => void): () => void {\n const reg = openImporters();\n reg.listeners.push(fn);\n return () => {\n const i = reg.listeners.indexOf(fn);\n if (i >= 0) reg.listeners.splice(i, 1);\n };\n}\n\nconst appVersion = '1.1.16';\n\n@Component({\n selector: 'csvbox-button',\n standalone: true,\n template: `\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n `\n})\n\nexport class CSVBoxButtonComponent implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n\n isModalShown = false;\n\n @Input() onImport?: (success: boolean, metadata?: any) => void;\n @Input() onReady?: () => void;\n @Input() onClose?: () => void;\n @Input() onSubmit?: (metadata: any) => void;\n\n @Input() isImported?: (success: boolean, metadata?: any) => void;\n @Input() isReady?: () => void;\n @Input() isClosed?: () => void;\n @Input() isSubmitted?: (metadata: any) => void;\n\n @Input() importerReady?: () => void;\n @Input() closed?: () => void;\n @Input() submitted?: (metadata: any) => void;\n @Input() imported?: (success: boolean, metadata?: any) => void;\n @Input() loadStarted?: () => void;\n\n @Input() user: { [key: string]: any } | null = null;\n @Input() dynamicColumns: { [key: string]: any } | null = null;\n @Input() licenseKey: string | null = null;\n @Input() options: { [key: string]: any } | null = null;\n @Input() uuid: string = '';\n @Input() customDomain: string | null = null;\n @Input() dataLocation: string | null = null;\n @Input() language: string | null = null;\n @Input() environment: { [key: string]: any } | null = null;\n\n @Input() theme: string | null = null;\n\n @Input() isIframeLoaded: boolean = false;\n @Input() openModalOnIframeLoad: boolean = false;\n\n @Input() lazy: boolean = false;\n\n safeUrl: SafeUrl | null = null;\n\n iframe: HTMLIFrameElement | null = null;\n\n @Input() disabled: boolean = true;\n\n constructor(public sanitizer: DomSanitizer, private cdr: ChangeDetectorRef, private zone: NgZone) {}\n\n // True while a different importer on the page is open: the button stays disabled.\n blockedByOther: boolean = false;\n\n private messageGate = createMessageGate();\n private importTracker = createImportTracker();\n\n private registryEntry: OpenImporterEntry = { getHolder: () => this.holder };\n\n private fileSender = createFileSender({\n getIframe: () => this.iframe,\n getToken: () => this.uuid as string,\n getTargetOrigin: () => this.targetOrigin as string,\n getBaseDomain: () => this.baseDomain,\n takeFile: () => {\n const file = this.pendingFile;\n this.pendingFile = null;\n return file;\n },\n onSent: () => this.startFileAckTimer()\n });\n\n private unsubscribeOpenImporters: (() => void) | null = null;\n\n holder: HTMLDivElement | null = null;\n\n pendingFile: File | null = null;\n\n targetOrigin: string | undefined;\n\n // Data-location sheets redirect to another host, so the iframe origin can differ from\n // targetOrigin. baseDomain is used to check the real origin before trusting it.\n baseDomain: string = \"app.csvbox.io\";\n\n private fileAckTimer: any = null;\n\n ngOnInit(): void {\n this.uuid = generateUuid();\n const iframeUrl = buildImportUrl(\n {\n licenseKey: this.licenseKey,\n customDomain: this.customDomain,\n dataLocation: this.dataLocation,\n language: this.language,\n theme: this.theme,\n environment: this.environment\n },\n \"angular\",\n appVersion\n );\n // Default place to send the file. A file is only ever sent to a named origin, never \"*\".\n this.targetOrigin = new URL(iframeUrl).origin;\n this.baseDomain = this.customDomain || \"app.csvbox.io\";\n this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {\n this.updateUserVariable(changes['user'].currentValue);\n }\n }\n\n updateUserVariable(data: { [key: string]: any }): void {\n this.user = data;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage({\n \"customer\": data\n }, \"*\");\n }\n }\n\n private messageListener = (event: MessageEvent) => {\n // Older importers send these as bare strings, without a token.\n const legacy = classifyLegacyMessage(event.data);\n if (legacy) {\n // Legacy messages carry no token, so the only way to tell which importer sent one is its\n // window. Ignore those that came from another instance's iframe (or anywhere else).\n if (!this.iframe || event.source !== this.iframe.contentWindow) {\n return;\n }\n // A newer importer sends the typed message as well; act on that one only.\n if (!this.messageGate.allowLegacy()) {\n return;\n }\n const ended = this.importTracker.observe(legacy);\n if (legacy.type === \"mainModalHidden\") {\n this.handleModalClosed();\n } else if (legacy.type === \"uploadSuccessful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (legacy.type === \"uploadFailed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n this.finishImport(ended);\n return;\n }\n\n // Set-file handshake messages. The shared core does not classify these, so they are\n // read here, behind the same unique_token check the core applies.\n const raw = event.data;\n if (raw && typeof raw === \"object\" && raw.data && raw.data.unique_token == this.uuid) {\n this.fileSender.learnOrigin(event);\n\n if (raw.type === \"csvbox-set-file-rejected\" && raw.data.reason === \"not-a-file\") {\n // Reply to our probe (it has no file). It only tells us the origin, so do nothing.\n return;\n }\n if (raw.type === \"csvbox-modal-shown\") {\n this.clearFileAckTimer();\n registerOpenImporter(this.registryEntry);\n // What the file path in openModal() is waiting for. display as well as\n // pointer-events: a second file declined while the first was still opening the\n // modal has put the holder away in the meantime.\n this.isModalShown = true;\n if (this.holder) {\n this.holder.style.display = 'block';\n this.holder.style.pointerEvents = 'auto';\n }\n return;\n }\n if (raw.type === \"csvbox-set-file-rejected\") {\n this.clearFileAckTimer();\n // The importer has the file and will not take it. Put the holder away only if the\n // modal was never confirmed up: a file declined while it is open leaves that modal\n // where it is, and its own 'csvbox-modal-hidden' will put the holder away.\n if (!this.isModalShown && this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n unregisterOpenImporter(this.registryEntry);\n }\n console.warn(\"[csvbox] importer declined the supplied file: \" + raw.data.reason);\n return;\n }\n }\n\n const message = classifyStructuredMessage(event.data, this.uuid);\n if (!message) {\n return;\n }\n this.messageGate.markTyped();\n const ended = this.importTracker.observe(message);\n\n if (message.type === \"data-on-submit\") {\n if (this.onSubmit) this.onSubmit(message.metadata);\n if (this.isSubmitted) this.isSubmitted(message.metadata);\n if (this.submitted) this.submitted(message.metadata);\n } else if (message.type === \"data-push-status\") {\n if (this.onImport) this.onImport(message.success, message.metadata);\n if (this.isImported) this.isImported(message.success, message.metadata);\n if (this.imported) this.imported(message.success, message.metadata);\n } else if (message.type === \"csvbox-modal-hidden\") {\n this.handleModalClosed();\n } else if (message.type === \"csvbox-upload-successful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (message.type === \"csvbox-upload-failed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n this.finishImport(ended);\n };\n\n ngAfterContentInit(): void {\n window.addEventListener(\"message\", this.messageListener, false);\n this.syncBlocked();\n this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());\n\n if (this.lazy) {\n this.disabled = false;\n } else {\n this.disabled = true;\n this.initImporter();\n }\n }\n\n private syncBlocked(): void {\n const blocked = isBlockedByOpenImporter(this.registryEntry);\n if (blocked !== this.blockedByOther) {\n // The registry can call back from outside Angular's zone (another instance, another app).\n this.zone.run(() => {\n this.blockedByOther = blocked;\n this.cdr.markForCheck();\n });\n }\n }\n\n ngOnDestroy(): void {\n window.removeEventListener(\"message\", this.messageListener);\n // Takes the holder out of document.body: left there, it would keep covering the page with\n // an invisible full-screen layer that nothing is left to hide.\n this.destroyImporter();\n if (this.unsubscribeOpenImporters) {\n this.unsubscribeOpenImporters();\n this.unsubscribeOpenImporters = null;\n }\n }\n\n handleModalClosed(): void {\n if (this.importTracker.isInFlight()) {\n // Closed after submitting and before the result arrived: keep the iframe and its listener\n // so the late result still reaches onImport. It is removed once that result has been\n // delivered (see finishImport), so the next open is a fresh load.\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n }\n this.isModalShown = false;\n this.openModalOnIframeLoad = false;\n this.clearFileAckTimer();\n unregisterOpenImporter(this.registryEntry);\n } else {\n this.destroyImporter();\n }\n if (this.onClose) this.onClose();\n if (this.isClosed) this.isClosed();\n if (this.closed) this.closed();\n }\n\n // Called after the result of an import has been delivered. If the modal was closed in the\n // meantime the iframe was only hidden, so remove it now.\n private finishImport(ended: boolean): void {\n if (ended && !this.isModalShown && this.iframe) {\n this.destroyImporter();\n }\n }\n\n // Puts the importer away: the next open builds a new iframe with a new token.\n private destroyImporter(): void {\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n this.holder.remove();\n }\n this.holder = null;\n this.iframe = null;\n this.isModalShown = false;\n this.isIframeLoaded = false;\n this.openModalOnIframeLoad = false;\n this.messageGate.reset();\n this.importTracker.reset();\n // A new iframe is built on the next open, so the origin is learned again.\n this.clearProbeTimer();\n unregisterOpenImporter(this.registryEntry);\n }\n\n initImporter(): void {\n if (this.loadStarted) this.loadStarted();\n\n this.uuid = generateUuid();\n this.messageGate.reset();\n this.importTracker.reset();\n\n insertCSS();\n\n const iframe = document.createElement(\"iframe\");\n this.iframe = iframe;\n iframe.setAttribute(\"src\", this.safeUrl?.toString() || '');\n iframe.setAttribute(\"allow\", \"clipboard-read; clipboard-write *\");\n iframe.frameBorder = \"0\";\n\n iframe.onload = () => {\n this.disabled = false;\n this.isIframeLoaded = true;\n // The handshake goes first: a consumer that calls openModalWithFile() from the ready\n // callback needs the importer to already have its customer, columns, options and token.\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), \"*\");\n }\n if (this.onReady) this.onReady();\n if (this.isReady) this.isReady();\n if (this.importerReady) this.importerReady();\n\n if (this.openModalOnIframeLoad) {\n this.openModal();\n }\n };\n\n this.holder = document.createElement('div');\n this.holder.classList.add('csvbox-holder');\n this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);\n this.holder.appendChild(iframe);\n\n document.body.insertAdjacentElement(\n 'beforeend', this.holder\n );\n // The holder did not exist yet if openModal() asked for the importer before it was built.\n restackOpenImporters(openImporters());\n }\n\n openModal(): void {\n // Counts as open from the moment it is requested, so the other buttons are disabled while\n // this importer is still loading, and so it is stacked above any importer opened earlier.\n registerOpenImporter(this.registryEntry);\n if(!this.iframe) {\n this.openModalOnIframeLoad = true;\n this.initImporter();\n return;\n }\n if(!this.isModalShown) {\n if(this.isIframeLoaded) {\n if(this.pendingFile) {\n // The importer opens its own modal once it has the file, so that it can inject on\n // 'shown.bs.modal'. Sending 'openModal' as well would race that.\n //\n // It can also decline: wrong step, an import file URL configured on the sheet, or\n // an importer too old to know the message at all. So the holder goes up\n // click-through and stays that way until 'csvbox-modal-shown' confirms the modal\n // is really up. It covers the viewport at z-index 2147483647 and the importer\n // renders transparent with its modal closed, so arming it on an unanswered message\n // leaves an invisible sheet over the host page eating every click.\n //\n // display:block regardless, so the iframe lays out and animates normally; only\n // pointer-events is held back. isModalShown likewise waits for the confirmation,\n // or a declined file would latch the importer shut for good.\n if(this.holder) {\n this.holder.style.pointerEvents = 'none';\n this.holder.style.display = 'block';\n }\n this.fileSender.send();\n } else {\n this.isModalShown = true;\n if(this.holder) {\n // Explicit: a previously declined file leaves the holder click-through.\n this.holder.style.pointerEvents = 'auto';\n this.holder.style.display = 'block';\n }\n if(this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage('openModal', '*');\n }\n }\n } else {\n this.openModalOnIframeLoad = true;\n }\n }\n }\n\n /**\n * Open the importer on a File the host page already has, instead of the file picker.\n *\n * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)\n * or `@ViewChild(CSVBoxButtonComponent)`.\n *\n * The File crosses to the iframe by structured clone, so the importer receives the real\n * object and applies its own extension, worksheet and size rules to it -- this does not\n * bypass any of them. Pass a File; a Blob has no name for the importer to read an\n * extension from.\n */\n openModalWithFile(file: File): void {\n if(typeof File === 'undefined' || !(file instanceof File)) {\n return;\n }\n\n this.pendingFile = file;\n\n // Already open: hand it over now rather than holding it for the next open. The importer\n // takes it only while it is still on the upload step, and ignores it once the user has a\n // dataset and a mapping in progress.\n if(this.isModalShown && this.iframe && this.isIframeLoaded) {\n this.fileSender.send();\n return;\n }\n\n this.openModal();\n }\n\n clearProbeTimer(): void {\n this.clearFileAckTimer();\n this.fileSender.reset();\n }\n\n startFileAckTimer(): void {\n this.clearFileAckTimer();\n this.fileAckTimer = setTimeout(() => {\n this.fileAckTimer = null;\n this.giveUpOnFile();\n }, FILE_ACK_TIMEOUT_MS);\n }\n\n clearFileAckTimer(): void {\n if (this.fileAckTimer) {\n clearTimeout(this.fileAckTimer);\n this.fileAckTimer = null;\n }\n }\n\n // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too\n // old to know the message). Without this the holder would stay up, invisible and click-through,\n // and the other instances' buttons would stay disabled for good.\n giveUpOnFile(): void {\n if (this.isModalShown) {\n return;\n }\n const holder = this.holder;\n if (holder) {\n holder.style.display = 'none';\n holder.style.pointerEvents = 'auto';\n }\n unregisterOpenImporter(this.registryEntry);\n console.warn(\"[csvbox] the importer did not respond to the supplied file\");\n }\n}\n","/*\n * Public API Surface of angular-adapter\n */\n\n\nexport * from './lib/angular-adapter.component';\nexport * from './lib/interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { SecurityContext, Component, Input } from '@angular/core';
3
- import { createFileSender, classifyLegacyMessage, classifyStructuredMessage, generateUuid, buildImportUrl, buildInitPayload } from '@sumit_yewale/adapter-core';
3
+ import { createMessageGate, createImportTracker, createFileSender, classifyLegacyMessage, classifyStructuredMessage, generateUuid, buildImportUrl, buildInitPayload } from '@sumit_yewale/adapter-core';
4
4
  import * as i1 from '@angular/platform-browser';
5
5
 
6
6
  let styleElement;
@@ -107,6 +107,8 @@ class CSVBoxButtonComponent {
107
107
  this.disabled = true;
108
108
  // True while a different importer on the page is open: the button stays disabled.
109
109
  this.blockedByOther = false;
110
+ this.messageGate = createMessageGate();
111
+ this.importTracker = createImportTracker();
110
112
  this.registryEntry = { getHolder: () => this.holder };
111
113
  this.fileSender = createFileSender({
112
114
  getIframe: () => this.iframe,
@@ -136,6 +138,11 @@ class CSVBoxButtonComponent {
136
138
  if (!this.iframe || event.source !== this.iframe.contentWindow) {
137
139
  return;
138
140
  }
141
+ // A newer importer sends the typed message as well; act on that one only.
142
+ if (!this.messageGate.allowLegacy()) {
143
+ return;
144
+ }
145
+ const ended = this.importTracker.observe(legacy);
139
146
  if (legacy.type === "mainModalHidden") {
140
147
  this.handleModalClosed();
141
148
  }
@@ -155,6 +162,7 @@ class CSVBoxButtonComponent {
155
162
  if (this.imported)
156
163
  this.imported(false);
157
164
  }
165
+ this.finishImport(ended);
158
166
  return;
159
167
  }
160
168
  // Set-file handshake messages. The shared core does not classify these, so they are
@@ -197,18 +205,17 @@ class CSVBoxButtonComponent {
197
205
  if (!message) {
198
206
  return;
199
207
  }
208
+ this.messageGate.markTyped();
209
+ const ended = this.importTracker.observe(message);
200
210
  if (message.type === "data-on-submit") {
201
211
  if (this.onSubmit)
202
212
  this.onSubmit(message.metadata);
203
213
  if (this.isSubmitted)
204
214
  this.isSubmitted(message.metadata);
205
215
  if (this.submitted)
206
- this.submitted();
216
+ this.submitted(message.metadata);
207
217
  }
208
218
  else if (message.type === "data-push-status") {
209
- if (!message.success) {
210
- delete message.metadata["unique_token"];
211
- }
212
219
  if (this.onImport)
213
220
  this.onImport(message.success, message.metadata);
214
221
  if (this.isImported)
@@ -235,6 +242,7 @@ class CSVBoxButtonComponent {
235
242
  if (this.imported)
236
243
  this.imported(false);
237
244
  }
245
+ this.finishImport(ended);
238
246
  };
239
247
  }
240
248
  ngOnInit() {
@@ -288,40 +296,70 @@ class CSVBoxButtonComponent {
288
296
  }
289
297
  }
290
298
  ngOnDestroy() {
291
- this.clearProbeTimer();
292
299
  window.removeEventListener("message", this.messageListener);
293
- unregisterOpenImporter(this.registryEntry);
300
+ // Takes the holder out of document.body: left there, it would keep covering the page with
301
+ // an invisible full-screen layer that nothing is left to hide.
302
+ this.destroyImporter();
294
303
  if (this.unsubscribeOpenImporters) {
295
304
  this.unsubscribeOpenImporters();
296
305
  this.unsubscribeOpenImporters = null;
297
306
  }
298
307
  }
299
308
  handleModalClosed() {
309
+ if (this.importTracker.isInFlight()) {
310
+ // Closed after submitting and before the result arrived: keep the iframe and its listener
311
+ // so the late result still reaches onImport. It is removed once that result has been
312
+ // delivered (see finishImport), so the next open is a fresh load.
313
+ if (this.holder) {
314
+ this.holder.style.display = 'none';
315
+ this.holder.style.pointerEvents = 'auto';
316
+ }
317
+ this.isModalShown = false;
318
+ this.openModalOnIframeLoad = false;
319
+ this.clearFileAckTimer();
320
+ unregisterOpenImporter(this.registryEntry);
321
+ }
322
+ else {
323
+ this.destroyImporter();
324
+ }
325
+ if (this.onClose)
326
+ this.onClose();
327
+ if (this.isClosed)
328
+ this.isClosed();
329
+ if (this.closed)
330
+ this.closed();
331
+ }
332
+ // Called after the result of an import has been delivered. If the modal was closed in the
333
+ // meantime the iframe was only hidden, so remove it now.
334
+ finishImport(ended) {
335
+ if (ended && !this.isModalShown && this.iframe) {
336
+ this.destroyImporter();
337
+ }
338
+ }
339
+ // Puts the importer away: the next open builds a new iframe with a new token.
340
+ destroyImporter() {
300
341
  if (this.holder) {
301
342
  this.holder.style.display = 'none';
302
343
  this.holder.style.pointerEvents = 'auto';
344
+ this.holder.remove();
303
345
  }
346
+ this.holder = null;
347
+ this.iframe = null;
304
348
  this.isModalShown = false;
305
349
  this.isIframeLoaded = false;
306
350
  this.openModalOnIframeLoad = false;
307
- if (this.holder)
308
- this.holder.remove();
309
- this.holder = null;
310
- this.iframe = null;
351
+ this.messageGate.reset();
352
+ this.importTracker.reset();
311
353
  // A new iframe is built on the next open, so the origin is learned again.
312
354
  this.clearProbeTimer();
313
355
  unregisterOpenImporter(this.registryEntry);
314
- if (this.onClose)
315
- this.onClose();
316
- if (this.isClosed)
317
- this.isClosed();
318
- if (this.closed)
319
- this.closed();
320
356
  }
321
357
  initImporter() {
322
358
  if (this.loadStarted)
323
359
  this.loadStarted();
324
360
  this.uuid = generateUuid();
361
+ this.messageGate.reset();
362
+ this.importTracker.reset();
325
363
  insertCSS();
326
364
  const iframe = document.createElement("iframe");
327
365
  this.iframe = iframe;
@@ -329,17 +367,19 @@ class CSVBoxButtonComponent {
329
367
  iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
330
368
  iframe.frameBorder = "0";
331
369
  iframe.onload = () => {
370
+ this.disabled = false;
371
+ this.isIframeLoaded = true;
372
+ // The handshake goes first: a consumer that calls openModalWithFile() from the ready
373
+ // callback needs the importer to already have its customer, columns, options and token.
374
+ if (this.iframe && this.iframe.contentWindow) {
375
+ this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
376
+ }
332
377
  if (this.onReady)
333
378
  this.onReady();
334
379
  if (this.isReady)
335
380
  this.isReady();
336
381
  if (this.importerReady)
337
382
  this.importerReady();
338
- this.disabled = false;
339
- this.isIframeLoaded = true;
340
- if (this.iframe && this.iframe.contentWindow) {
341
- this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
342
- }
343
383
  if (this.openModalOnIframeLoad) {
344
384
  this.openModal();
345
385
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sumit_yewale-angular2.mjs","sources":["../../../projects/angular-adapter/src/lib/utils/insertCSS.ts","../../../projects/angular-adapter/src/lib/angular-adapter.component.ts","../../../projects/angular-adapter/src/public-api.ts","../../../projects/angular-adapter/src/sumit_yewale-angular2.ts"],"sourcesContent":["let styleElement: HTMLStyleElement\n\nconst GLOBAL_CSS = `\n.csvbox-holder {\n z-index: 2147483647;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: none;\n}\n.csvbox-holder iframe {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n}\n`\n\nexport const insertCSS = (): void => {\n if (styleElement) {\n return\n }\n\n styleElement = document.createElement('style')\n styleElement.setAttribute('type', 'text/css')\n const head = document.querySelector('head');\n if (head) {\n head.appendChild(styleElement);\n }\n\n styleElement.textContent = GLOBAL_CSS\n}\n","import {\n Component,\n OnInit,\n Input,\n OnChanges,\n SimpleChanges,\n SecurityContext,\n AfterContentInit,\n OnDestroy,\n ChangeDetectorRef,\n NgZone\n} from '@angular/core';\n\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { insertCSS } from './utils/insertCSS';\nimport { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';\n\n// How long we wait for the importer to confirm a file it was sent before giving up on it.\nconst FILE_ACK_TIMEOUT_MS = 8000;\n\n// Page-wide record of the importers that are open or opening, shared by every CSVBox adapter\n// on the page (it lives on window so separate copies of an adapter see the same list). It does\n// two things: the newest importer is stacked on top (every holder is fixed, full screen and\n// z-index 2147483647, so equal z-indexes would leave the one that comes first in the DOM on\n// top), and the other instances learn that an importer is open so they can disable their button.\ninterface OpenImporterEntry { getHolder: () => HTMLElement | null; }\ninterface OpenImporters { open: OpenImporterEntry[]; listeners: Array<() => void>; }\nconst OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';\nconst TOP_Z_INDEX = 2147483647;\n\nfunction openImporters(): OpenImporters {\n const w = window as any;\n if (!w[OPEN_IMPORTERS_KEY]) w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };\n return w[OPEN_IMPORTERS_KEY];\n}\n\nfunction restackOpenImporters(reg: OpenImporters): void {\n reg.open.forEach((entry, i) => {\n const holder = entry.getHolder();\n if (holder) holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));\n });\n}\n\nfunction registerOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n if (reg.open.indexOf(entry) >= 0) return;\n reg.open.push(entry);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction unregisterOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n const i = reg.open.indexOf(entry);\n if (i < 0) return;\n reg.open.splice(i, 1);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction isBlockedByOpenImporter(entry: OpenImporterEntry): boolean {\n const reg = openImporters();\n return reg.open.length > 0 && reg.open.indexOf(entry) < 0;\n}\n\nfunction subscribeOpenImporters(fn: () => void): () => void {\n const reg = openImporters();\n reg.listeners.push(fn);\n return () => {\n const i = reg.listeners.indexOf(fn);\n if (i >= 0) reg.listeners.splice(i, 1);\n };\n}\n\nconst appVersion = '1.1.16';\n\n@Component({\n selector: 'csvbox-button',\n standalone: true,\n template: `\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n `\n})\n\nexport class CSVBoxButtonComponent implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n\n isModalShown = false;\n\n @Input() onImport?: (success: boolean, metadata?: any) => void;\n @Input() onReady?: () => void;\n @Input() onClose?: () => void;\n @Input() onSubmit?: (metadata: any) => void;\n\n @Input() isImported?: (success: boolean, metadata?: any) => void;\n @Input() isReady?: () => void;\n @Input() isClosed?: () => void;\n @Input() isSubmitted?: (metadata: any) => void;\n\n @Input() importerReady?: () => void;\n @Input() closed?: () => void;\n @Input() submitted?: () => void;\n @Input() imported?: (success: boolean, metadata?: any) => void;\n @Input() loadStarted?: () => void;\n\n @Input() user: { [key: string]: any } | null = null;\n @Input() dynamicColumns: { [key: string]: any } | null = null;\n @Input() licenseKey: string | null = null;\n @Input() options: { [key: string]: any } | null = null;\n @Input() uuid: string = '';\n @Input() customDomain: string | null = null;\n @Input() dataLocation: string | null = null;\n @Input() language: string | null = null;\n @Input() environment: { [key: string]: any } | null = null;\n\n @Input() theme: string | null = null;\n\n @Input() isIframeLoaded: boolean = false;\n @Input() openModalOnIframeLoad: boolean = false;\n\n @Input() lazy: boolean = false;\n\n safeUrl: SafeUrl | null = null;\n\n iframe: HTMLIFrameElement | null = null;\n\n @Input() disabled: boolean = true;\n\n constructor(public sanitizer: DomSanitizer, private cdr: ChangeDetectorRef, private zone: NgZone) {}\n\n // True while a different importer on the page is open: the button stays disabled.\n blockedByOther: boolean = false;\n\n private registryEntry: OpenImporterEntry = { getHolder: () => this.holder };\n\n private fileSender = createFileSender({\n getIframe: () => this.iframe,\n getToken: () => this.uuid as string,\n getTargetOrigin: () => this.targetOrigin as string,\n getBaseDomain: () => this.baseDomain,\n takeFile: () => {\n const file = this.pendingFile;\n this.pendingFile = null;\n return file;\n },\n onSent: () => this.startFileAckTimer()\n });\n\n private unsubscribeOpenImporters: (() => void) | null = null;\n\n holder: HTMLDivElement | null = null;\n\n pendingFile: File | null = null;\n\n targetOrigin: string | undefined;\n\n // Data-location sheets redirect to another host, so the iframe origin can differ from\n // targetOrigin. baseDomain is used to check the real origin before trusting it.\n baseDomain: string = \"app.csvbox.io\";\n\n private fileAckTimer: any = null;\n\n ngOnInit(): void {\n this.uuid = generateUuid();\n const iframeUrl = buildImportUrl(\n {\n licenseKey: this.licenseKey,\n customDomain: this.customDomain,\n dataLocation: this.dataLocation,\n language: this.language,\n theme: this.theme,\n environment: this.environment\n },\n \"angular\",\n appVersion\n );\n // Default place to send the file. A file is only ever sent to a named origin, never \"*\".\n this.targetOrigin = new URL(iframeUrl).origin;\n this.baseDomain = this.customDomain || \"app.csvbox.io\";\n this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {\n this.updateUserVariable(changes['user'].currentValue);\n }\n }\n\n updateUserVariable(data: { [key: string]: any }): void {\n this.user = data;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage({\n \"customer\": data\n }, \"*\");\n }\n }\n\n private messageListener = (event: MessageEvent) => {\n // Older importers send these as bare strings, without a token.\n const legacy = classifyLegacyMessage(event.data);\n if (legacy) {\n // Legacy messages carry no token, so the only way to tell which importer sent one is its\n // window. Ignore those that came from another instance's iframe (or anywhere else).\n if (!this.iframe || event.source !== this.iframe.contentWindow) {\n return;\n }\n if (legacy.type === \"mainModalHidden\") {\n this.handleModalClosed();\n } else if (legacy.type === \"uploadSuccessful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (legacy.type === \"uploadFailed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n return;\n }\n\n // Set-file handshake messages. The shared core does not classify these, so they are\n // read here, behind the same unique_token check the core applies.\n const raw = event.data;\n if (raw && typeof raw === \"object\" && raw.data && raw.data.unique_token == this.uuid) {\n this.fileSender.learnOrigin(event);\n\n if (raw.type === \"csvbox-set-file-rejected\" && raw.data.reason === \"not-a-file\") {\n // Reply to our probe (it has no file). It only tells us the origin, so do nothing.\n return;\n }\n if (raw.type === \"csvbox-modal-shown\") {\n this.clearFileAckTimer();\n registerOpenImporter(this.registryEntry);\n // What the file path in openModal() is waiting for. display as well as\n // pointer-events: a second file declined while the first was still opening the\n // modal has put the holder away in the meantime.\n this.isModalShown = true;\n if (this.holder) {\n this.holder.style.display = 'block';\n this.holder.style.pointerEvents = 'auto';\n }\n return;\n }\n if (raw.type === \"csvbox-set-file-rejected\") {\n this.clearFileAckTimer();\n // The importer has the file and will not take it. Put the holder away only if the\n // modal was never confirmed up: a file declined while it is open leaves that modal\n // where it is, and its own 'csvbox-modal-hidden' will put the holder away.\n if (!this.isModalShown && this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n unregisterOpenImporter(this.registryEntry);\n }\n console.warn(\"[csvbox] importer declined the supplied file: \" + raw.data.reason);\n return;\n }\n }\n\n const message = classifyStructuredMessage(event.data, this.uuid);\n if (!message) {\n return;\n }\n\n if (message.type === \"data-on-submit\") {\n if (this.onSubmit) this.onSubmit(message.metadata);\n if (this.isSubmitted) this.isSubmitted(message.metadata);\n if (this.submitted) this.submitted();\n } else if (message.type === \"data-push-status\") {\n if (!message.success) {\n delete message.metadata[\"unique_token\"];\n }\n if (this.onImport) this.onImport(message.success, message.metadata);\n if (this.isImported) this.isImported(message.success, message.metadata);\n if (this.imported) this.imported(message.success, message.metadata);\n } else if (message.type === \"csvbox-modal-hidden\") {\n this.handleModalClosed();\n } else if (message.type === \"csvbox-upload-successful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (message.type === \"csvbox-upload-failed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n };\n\n ngAfterContentInit(): void {\n window.addEventListener(\"message\", this.messageListener, false);\n this.syncBlocked();\n this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());\n\n if (this.lazy) {\n this.disabled = false;\n } else {\n this.disabled = true;\n this.initImporter();\n }\n }\n\n private syncBlocked(): void {\n const blocked = isBlockedByOpenImporter(this.registryEntry);\n if (blocked !== this.blockedByOther) {\n // The registry can call back from outside Angular's zone (another instance, another app).\n this.zone.run(() => {\n this.blockedByOther = blocked;\n this.cdr.markForCheck();\n });\n }\n }\n\n ngOnDestroy(): void {\n this.clearProbeTimer();\n window.removeEventListener(\"message\", this.messageListener);\n unregisterOpenImporter(this.registryEntry);\n if (this.unsubscribeOpenImporters) {\n this.unsubscribeOpenImporters();\n this.unsubscribeOpenImporters = null;\n }\n }\n\n handleModalClosed(): void {\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n }\n this.isModalShown = false;\n this.isIframeLoaded = false;\n this.openModalOnIframeLoad = false;\n if (this.holder) this.holder.remove();\n this.holder = null;\n this.iframe = null;\n // A new iframe is built on the next open, so the origin is learned again.\n this.clearProbeTimer();\n unregisterOpenImporter(this.registryEntry);\n if (this.onClose) this.onClose();\n if (this.isClosed) this.isClosed();\n if (this.closed) this.closed();\n }\n\n initImporter(): void {\n if (this.loadStarted) this.loadStarted();\n\n this.uuid = generateUuid();\n\n insertCSS();\n\n const iframe = document.createElement(\"iframe\");\n this.iframe = iframe;\n iframe.setAttribute(\"src\", this.safeUrl?.toString() || '');\n iframe.setAttribute(\"allow\", \"clipboard-read; clipboard-write *\");\n iframe.frameBorder = \"0\";\n\n iframe.onload = () => {\n if (this.onReady) this.onReady();\n if (this.isReady) this.isReady();\n if (this.importerReady) this.importerReady();\n\n this.disabled = false;\n this.isIframeLoaded = true;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), \"*\");\n }\n if (this.openModalOnIframeLoad) {\n this.openModal();\n }\n };\n\n this.holder = document.createElement('div');\n this.holder.classList.add('csvbox-holder');\n this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);\n this.holder.appendChild(iframe);\n\n document.body.insertAdjacentElement(\n 'beforeend', this.holder\n );\n // The holder did not exist yet if openModal() asked for the importer before it was built.\n restackOpenImporters(openImporters());\n }\n\n openModal(): void {\n // Counts as open from the moment it is requested, so the other buttons are disabled while\n // this importer is still loading, and so it is stacked above any importer opened earlier.\n registerOpenImporter(this.registryEntry);\n if(!this.iframe) {\n this.openModalOnIframeLoad = true;\n this.initImporter();\n return;\n }\n if(!this.isModalShown) {\n if(this.isIframeLoaded) {\n if(this.pendingFile) {\n // The importer opens its own modal once it has the file, so that it can inject on\n // 'shown.bs.modal'. Sending 'openModal' as well would race that.\n //\n // It can also decline: wrong step, an import file URL configured on the sheet, or\n // an importer too old to know the message at all. So the holder goes up\n // click-through and stays that way until 'csvbox-modal-shown' confirms the modal\n // is really up. It covers the viewport at z-index 2147483647 and the importer\n // renders transparent with its modal closed, so arming it on an unanswered message\n // leaves an invisible sheet over the host page eating every click.\n //\n // display:block regardless, so the iframe lays out and animates normally; only\n // pointer-events is held back. isModalShown likewise waits for the confirmation,\n // or a declined file would latch the importer shut for good.\n if(this.holder) {\n this.holder.style.pointerEvents = 'none';\n this.holder.style.display = 'block';\n }\n this.fileSender.send();\n } else {\n this.isModalShown = true;\n if(this.holder) {\n // Explicit: a previously declined file leaves the holder click-through.\n this.holder.style.pointerEvents = 'auto';\n this.holder.style.display = 'block';\n }\n if(this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage('openModal', '*');\n }\n }\n } else {\n this.openModalOnIframeLoad = true;\n }\n }\n }\n\n /**\n * Open the importer on a File the host page already has, instead of the file picker.\n *\n * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)\n * or `@ViewChild(CSVBoxButtonComponent)`.\n *\n * The File crosses to the iframe by structured clone, so the importer receives the real\n * object and applies its own extension, worksheet and size rules to it -- this does not\n * bypass any of them. Pass a File; a Blob has no name for the importer to read an\n * extension from.\n */\n openModalWithFile(file: File): void {\n if(typeof File === 'undefined' || !(file instanceof File)) {\n return;\n }\n\n this.pendingFile = file;\n\n // Already open: hand it over now rather than holding it for the next open. The importer\n // takes it only while it is still on the upload step, and ignores it once the user has a\n // dataset and a mapping in progress.\n if(this.isModalShown && this.iframe && this.isIframeLoaded) {\n this.fileSender.send();\n return;\n }\n\n this.openModal();\n }\n\n clearProbeTimer(): void {\n this.clearFileAckTimer();\n this.fileSender.reset();\n }\n\n startFileAckTimer(): void {\n this.clearFileAckTimer();\n this.fileAckTimer = setTimeout(() => {\n this.fileAckTimer = null;\n this.giveUpOnFile();\n }, FILE_ACK_TIMEOUT_MS);\n }\n\n clearFileAckTimer(): void {\n if (this.fileAckTimer) {\n clearTimeout(this.fileAckTimer);\n this.fileAckTimer = null;\n }\n }\n\n // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too\n // old to know the message). Without this the holder would stay up, invisible and click-through,\n // and the other instances' buttons would stay disabled for good.\n giveUpOnFile(): void {\n if (this.isModalShown) {\n return;\n }\n const holder = this.holder;\n if (holder) {\n holder.style.display = 'none';\n holder.style.pointerEvents = 'auto';\n }\n unregisterOpenImporter(this.registryEntry);\n console.warn(\"[csvbox] the importer did not respond to the supplied file\");\n }\n}\n","/*\n * Public API Surface of angular-adapter\n */\n\n\nexport * from './lib/angular-adapter.component';\nexport * from './lib/interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;AAAA,IAAI,YAA8B,CAAA;AAElC,MAAM,UAAU,GAAG,CAAA;;;;;;;;;;;;;;;;;CAiBlB,CAAA;AAEM,MAAM,SAAS,GAAG,MAAW;AAClC,IAAA,IAAI,YAAY,EAAE;QAChB,OAAM;AACP,KAAA;AAED,IAAA,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;AAC9C,IAAA,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAC5C,IAAA,IAAI,IAAI,EAAE;AACR,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AAChC,KAAA;AAED,IAAA,YAAY,CAAC,WAAW,GAAG,UAAU,CAAA;AACvC,CAAC;;ACjBD;AACA,MAAM,mBAAmB,GAAG,IAAI,CAAC;AASjC,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,SAAS,aAAa,GAAA;IACpB,MAAM,CAAC,GAAG,MAAa,CAAC;AACxB,IAAA,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAAE,QAAA,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AAChF,IAAA,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAkB,EAAA;IAC9C,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAI;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;AACjC,QAAA,IAAI,MAAM;YAAE,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpF,KAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAwB,EAAA;AACpD,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO;AACzC,IAAA,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,IAAA,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAwB,EAAA;AACtD,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO;IAClB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,oBAAoB,CAAC,GAAG,CAAC,CAAC;AAC1B,IAAA,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAwB,EAAA;AACvD,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;AAC5B,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAc,EAAA;AAC5C,IAAA,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;AAC5B,IAAA,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvB,IAAA,OAAO,MAAK;QACV,MAAM,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,KAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,QAAQ,CAAC;MAcf,qBAAqB,CAAA;AA2ChC,IAAA,WAAA,CAAmB,SAAuB,EAAU,GAAsB,EAAU,IAAY,EAAA;QAA7E,IAAS,CAAA,SAAA,GAAT,SAAS,CAAc;QAAU,IAAG,CAAA,GAAA,GAAH,GAAG,CAAmB;QAAU,IAAI,CAAA,IAAA,GAAJ,IAAI,CAAQ;QAzChG,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QAkBZ,IAAI,CAAA,IAAA,GAAkC,IAAI,CAAC;QAC3C,IAAc,CAAA,cAAA,GAAkC,IAAI,CAAC;QACrD,IAAU,CAAA,UAAA,GAAkB,IAAI,CAAC;QACjC,IAAO,CAAA,OAAA,GAAkC,IAAI,CAAC;QAC9C,IAAI,CAAA,IAAA,GAAW,EAAE,CAAC;QAClB,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;QACnC,IAAY,CAAA,YAAA,GAAkB,IAAI,CAAC;QACnC,IAAQ,CAAA,QAAA,GAAkB,IAAI,CAAC;QAC/B,IAAW,CAAA,WAAA,GAAkC,IAAI,CAAC;QAElD,IAAK,CAAA,KAAA,GAAkB,IAAI,CAAC;QAE5B,IAAc,CAAA,cAAA,GAAY,KAAK,CAAC;QAChC,IAAqB,CAAA,qBAAA,GAAY,KAAK,CAAC;QAEvC,IAAI,CAAA,IAAA,GAAY,KAAK,CAAC;QAE/B,IAAO,CAAA,OAAA,GAAmB,IAAI,CAAC;QAE/B,IAAM,CAAA,MAAA,GAA6B,IAAI,CAAC;QAE/B,IAAQ,CAAA,QAAA,GAAY,IAAI,CAAC;;QAKlC,IAAc,CAAA,cAAA,GAAY,KAAK,CAAC;QAExB,IAAa,CAAA,aAAA,GAAsB,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpE,IAAU,CAAA,UAAA,GAAG,gBAAgB,CAAC;AACpC,YAAA,SAAS,EAAE,MAAM,IAAI,CAAC,MAAM;AAC5B,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,IAAc;AACnC,YAAA,eAAe,EAAE,MAAM,IAAI,CAAC,YAAsB;AAClD,YAAA,aAAa,EAAE,MAAM,IAAI,CAAC,UAAU;YACpC,QAAQ,EAAE,MAAK;AACb,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;AAC9B,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,gBAAA,OAAO,IAAI,CAAC;aACb;AACD,YAAA,MAAM,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE;AACvC,SAAA,CAAC,CAAC;QAEK,IAAwB,CAAA,wBAAA,GAAwB,IAAI,CAAC;QAE7D,IAAM,CAAA,MAAA,GAA0B,IAAI,CAAC;QAErC,IAAW,CAAA,WAAA,GAAgB,IAAI,CAAC;;;QAMhC,IAAU,CAAA,UAAA,GAAW,eAAe,CAAC;QAE7B,IAAY,CAAA,YAAA,GAAQ,IAAI,CAAC;AAqCzB,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,KAAmB,KAAI;;YAEhD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACjD,YAAA,IAAI,MAAM,EAAE;;;AAGV,gBAAA,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;oBAC9D,OAAO;AACR,iBAAA;AACD,gBAAA,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,EAAE;oBACrC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,iBAAA;AAAM,qBAAA,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,EAAE;oBAC7C,IAAI,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACvC,IAAI,IAAI,CAAC,UAAU;AAAE,wBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC3C,IAAI,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,iBAAA;AAAM,qBAAA,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE;oBACzC,IAAI,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACxC,IAAI,IAAI,CAAC,UAAU;AAAE,wBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBAC5C,IAAI,IAAI,CAAC,QAAQ;AAAE,wBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,iBAAA;gBACD,OAAO;AACR,aAAA;;;AAID,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC;YACvB,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,IAAI,EAAE;AACpF,gBAAA,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAEnC,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE;;oBAE/E,OAAO;AACR,iBAAA;AACD,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE;oBACrC,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,oBAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;;;AAIzC,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,IAAI,CAAC,MAAM,EAAE;wBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;wBACpC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;AAC1C,qBAAA;oBACD,OAAO;AACR,iBAAA;AACD,gBAAA,IAAI,GAAG,CAAC,IAAI,KAAK,0BAA0B,EAAE;oBAC3C,IAAI,CAAC,iBAAiB,EAAE,CAAC;;;;oBAIzB,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,EAAE;wBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;wBACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;AACzC,wBAAA,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC5C,qBAAA;oBACD,OAAO,CAAC,IAAI,CAAC,gDAAgD,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACjF,OAAO;AACR,iBAAA;AACF,aAAA;AAED,YAAA,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC,OAAO,EAAE;gBACZ,OAAO;AACR,aAAA;AAED,YAAA,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,EAAE;gBACrC,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,IAAI,CAAC,WAAW;AAAE,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACzD,IAAI,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AACtC,aAAA;AAAM,iBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE;AAC9C,gBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;AACpB,oBAAA,OAAO,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACzC,iBAAA;gBACD,IAAI,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACpE,IAAI,IAAI,CAAC,UAAU;oBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;gBACxE,IAAI,IAAI,CAAC,QAAQ;oBAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrE,aAAA;AAAM,iBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,EAAE;gBACjD,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1B,aAAA;AAAM,iBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,0BAA0B,EAAE;gBACtD,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACvC,IAAI,IAAI,CAAC,UAAU;AAAE,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxC,aAAA;AAAM,iBAAA,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,EAAE;gBAClD,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACxC,IAAI,IAAI,CAAC,UAAU;AAAE,oBAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAI,IAAI,CAAC,QAAQ;AAAE,oBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzC,aAAA;AACH,SAAC,CAAC;KA7JkG;IAkCpG,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,cAAc,CAC9B;YACE,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,SAAA,EACD,SAAS,EACT,UAAU,CACX,CAAC;;QAEF,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,IAAI,eAAe,CAAC;QACvD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC,CAAC;KAChI;AAED,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE;YACrF,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;AACvD,SAAA;KACF;AAED,IAAA,kBAAkB,CAAC,IAA4B,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC5C,YAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC;AACpC,gBAAA,UAAU,EAAE,IAAI;aACjB,EAAE,GAAG,CAAC,CAAC;AACT,SAAA;KACF;IA4FD,kBAAkB,GAAA;QAChB,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAChE,IAAI,CAAC,WAAW,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,wBAAwB,GAAG,sBAAsB,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAEjF,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACvB,SAAA;AAAM,aAAA;AACL,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,YAAY,EAAE,CAAC;AACrB,SAAA;KACF;IAEO,WAAW,GAAA;QACjB,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC5D,QAAA,IAAI,OAAO,KAAK,IAAI,CAAC,cAAc,EAAE;;AAEnC,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;AACjB,gBAAA,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;AAC9B,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;AAC1B,aAAC,CAAC,CAAC;AACJ,SAAA;KACF;IAED,WAAW,GAAA;QACT,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;AAC5D,QAAA,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,IAAI,CAAC,wBAAwB,EAAE,CAAC;AAChC,YAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC;AACtC,SAAA;KACF;IAED,iBAAiB,GAAA;QACf,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;AAC1C,SAAA;AACD,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;AAC1B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;QAEnB,IAAI,CAAC,eAAe,EAAE,CAAC;AACvB,QAAA,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;KAChC;IAED,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,EAAE,CAAC;AAEzC,QAAA,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;AAE3B,QAAA,SAAS,EAAE,CAAC;QAEZ,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;AACrB,QAAA,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,QAAA,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,mCAAmC,CAAC,CAAC;AAClE,QAAA,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC;AAEzB,QAAA,MAAM,CAAC,MAAM,GAAG,MAAK;YACnB,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,aAAa;gBAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAE7C,YAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC3B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;AAC5C,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACvH,aAAA;YACD,IAAI,IAAI,CAAC,qBAAqB,EAAE;gBAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,aAAA;AACH,SAAC,CAAC;QAEF,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEhC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CACjC,WAAW,EAAE,IAAI,CAAC,MAAM,CACzB,CAAC;;AAEF,QAAA,oBAAoB,CAAC,aAAa,EAAE,CAAC,CAAC;KACvC;IAED,SAAS,GAAA;;;AAGP,QAAA,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACzC,QAAA,IAAG,CAAC,IAAI,CAAC,MAAM,EAAE;AACb,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;YAClC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpB,OAAO;AACV,SAAA;AACD,QAAA,IAAG,CAAC,IAAI,CAAC,YAAY,EAAE;YACrB,IAAG,IAAI,CAAC,cAAc,EAAE;gBACtB,IAAG,IAAI,CAAC,WAAW,EAAE;;;;;;;;;;;;;;oBAcnB,IAAG,IAAI,CAAC,MAAM,EAAE;wBACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;wBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrC,qBAAA;AACD,oBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACxB,iBAAA;AAAM,qBAAA;AACL,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAG,IAAI,CAAC,MAAM,EAAE;;wBAEd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;wBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;AACrC,qBAAA;oBACD,IAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;wBAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACzD,qBAAA;AACF,iBAAA;AACF,aAAA;AAAM,iBAAA;AACH,gBAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;AACrC,aAAA;AACF,SAAA;KACF;AAED;;;;;;;;;;AAUG;AACH,IAAA,iBAAiB,CAAC,IAAU,EAAA;QAC1B,IAAG,OAAO,IAAI,KAAK,WAAW,IAAI,EAAE,IAAI,YAAY,IAAI,CAAC,EAAE;YACzD,OAAO;AACR,SAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;;;;QAKxB,IAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE;AAC1D,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO;AACR,SAAA;QAED,IAAI,CAAC,SAAS,EAAE,CAAC;KAClB;IAED,eAAe,GAAA;QACb,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;KACzB;IAED,iBAAiB,GAAA;QACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;AACzB,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB,EAAE,mBAAmB,CAAC,CAAC;KACzB;IAED,iBAAiB,GAAA;QACf,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAChC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AAC1B,SAAA;KACF;;;;IAKD,YAAY,GAAA;QACV,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,OAAO;AACR,SAAA;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;AAC3B,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AAC9B,YAAA,MAAM,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;AACrC,SAAA;AACD,QAAA,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;KAC5E;;kHArZU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,qBAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EATtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,WAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,IAAA,EAAA,MAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,WAAA,EAAA,aAAA,EAAA,KAAA,EAAA,OAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;AAMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;2FAGU,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAZjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,CAAA;;;;;;AAMT,EAAA,CAAA;AACF,iBAAA,CAAA;wJAMU,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAEG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAEG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,SAAS,EAAA,CAAA;sBAAjB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAEG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,YAAY,EAAA,CAAA;sBAApB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBACG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAEG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAEG,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBAMG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;;;ACjIR;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"sumit_yewale-angular2.mjs","sources":["../../../projects/angular-adapter/src/lib/utils/insertCSS.ts","../../../projects/angular-adapter/src/lib/angular-adapter.component.ts","../../../projects/angular-adapter/src/public-api.ts","../../../projects/angular-adapter/src/sumit_yewale-angular2.ts"],"sourcesContent":["let styleElement: HTMLStyleElement\n\nconst GLOBAL_CSS = `\n.csvbox-holder {\n z-index: 2147483647;\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: none;\n}\n.csvbox-holder iframe {\n height: 100%;\n width: 100%;\n position: absolute;\n top: 0px;\n left: 0px;\n}\n`\n\nexport const insertCSS = (): void => {\n if (styleElement) {\n return\n }\n\n styleElement = document.createElement('style')\n styleElement.setAttribute('type', 'text/css')\n const head = document.querySelector('head');\n if (head) {\n head.appendChild(styleElement);\n }\n\n styleElement.textContent = GLOBAL_CSS\n}\n","import {\n Component,\n OnInit,\n Input,\n OnChanges,\n SimpleChanges,\n SecurityContext,\n AfterContentInit,\n OnDestroy,\n ChangeDetectorRef,\n NgZone\n} from '@angular/core';\n\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { insertCSS } from './utils/insertCSS';\nimport { buildImportUrl, generateUuid, buildInitPayload, createMessageGate, createImportTracker, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';\n\n// How long we wait for the importer to confirm a file it was sent before giving up on it.\nconst FILE_ACK_TIMEOUT_MS = 8000;\n\n// Page-wide record of the importers that are open or opening, shared by every CSVBox adapter\n// on the page (it lives on window so separate copies of an adapter see the same list). It does\n// two things: the newest importer is stacked on top (every holder is fixed, full screen and\n// z-index 2147483647, so equal z-indexes would leave the one that comes first in the DOM on\n// top), and the other instances learn that an importer is open so they can disable their button.\ninterface OpenImporterEntry { getHolder: () => HTMLElement | null; }\ninterface OpenImporters { open: OpenImporterEntry[]; listeners: Array<() => void>; }\nconst OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';\nconst TOP_Z_INDEX = 2147483647;\n\nfunction openImporters(): OpenImporters {\n const w = window as any;\n if (!w[OPEN_IMPORTERS_KEY]) w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };\n return w[OPEN_IMPORTERS_KEY];\n}\n\nfunction restackOpenImporters(reg: OpenImporters): void {\n reg.open.forEach((entry, i) => {\n const holder = entry.getHolder();\n if (holder) holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));\n });\n}\n\nfunction registerOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n if (reg.open.indexOf(entry) >= 0) return;\n reg.open.push(entry);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction unregisterOpenImporter(entry: OpenImporterEntry): void {\n const reg = openImporters();\n const i = reg.open.indexOf(entry);\n if (i < 0) return;\n reg.open.splice(i, 1);\n restackOpenImporters(reg);\n reg.listeners.slice().forEach(fn => fn());\n}\n\nfunction isBlockedByOpenImporter(entry: OpenImporterEntry): boolean {\n const reg = openImporters();\n return reg.open.length > 0 && reg.open.indexOf(entry) < 0;\n}\n\nfunction subscribeOpenImporters(fn: () => void): () => void {\n const reg = openImporters();\n reg.listeners.push(fn);\n return () => {\n const i = reg.listeners.indexOf(fn);\n if (i >= 0) reg.listeners.splice(i, 1);\n };\n}\n\nconst appVersion = '1.1.16';\n\n@Component({\n selector: 'csvbox-button',\n standalone: true,\n template: `\n <div>\n <button [disabled]=\"disabled || blockedByOther\" (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n `\n})\n\nexport class CSVBoxButtonComponent implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n\n isModalShown = false;\n\n @Input() onImport?: (success: boolean, metadata?: any) => void;\n @Input() onReady?: () => void;\n @Input() onClose?: () => void;\n @Input() onSubmit?: (metadata: any) => void;\n\n @Input() isImported?: (success: boolean, metadata?: any) => void;\n @Input() isReady?: () => void;\n @Input() isClosed?: () => void;\n @Input() isSubmitted?: (metadata: any) => void;\n\n @Input() importerReady?: () => void;\n @Input() closed?: () => void;\n @Input() submitted?: (metadata: any) => void;\n @Input() imported?: (success: boolean, metadata?: any) => void;\n @Input() loadStarted?: () => void;\n\n @Input() user: { [key: string]: any } | null = null;\n @Input() dynamicColumns: { [key: string]: any } | null = null;\n @Input() licenseKey: string | null = null;\n @Input() options: { [key: string]: any } | null = null;\n @Input() uuid: string = '';\n @Input() customDomain: string | null = null;\n @Input() dataLocation: string | null = null;\n @Input() language: string | null = null;\n @Input() environment: { [key: string]: any } | null = null;\n\n @Input() theme: string | null = null;\n\n @Input() isIframeLoaded: boolean = false;\n @Input() openModalOnIframeLoad: boolean = false;\n\n @Input() lazy: boolean = false;\n\n safeUrl: SafeUrl | null = null;\n\n iframe: HTMLIFrameElement | null = null;\n\n @Input() disabled: boolean = true;\n\n constructor(public sanitizer: DomSanitizer, private cdr: ChangeDetectorRef, private zone: NgZone) {}\n\n // True while a different importer on the page is open: the button stays disabled.\n blockedByOther: boolean = false;\n\n private messageGate = createMessageGate();\n private importTracker = createImportTracker();\n\n private registryEntry: OpenImporterEntry = { getHolder: () => this.holder };\n\n private fileSender = createFileSender({\n getIframe: () => this.iframe,\n getToken: () => this.uuid as string,\n getTargetOrigin: () => this.targetOrigin as string,\n getBaseDomain: () => this.baseDomain,\n takeFile: () => {\n const file = this.pendingFile;\n this.pendingFile = null;\n return file;\n },\n onSent: () => this.startFileAckTimer()\n });\n\n private unsubscribeOpenImporters: (() => void) | null = null;\n\n holder: HTMLDivElement | null = null;\n\n pendingFile: File | null = null;\n\n targetOrigin: string | undefined;\n\n // Data-location sheets redirect to another host, so the iframe origin can differ from\n // targetOrigin. baseDomain is used to check the real origin before trusting it.\n baseDomain: string = \"app.csvbox.io\";\n\n private fileAckTimer: any = null;\n\n ngOnInit(): void {\n this.uuid = generateUuid();\n const iframeUrl = buildImportUrl(\n {\n licenseKey: this.licenseKey,\n customDomain: this.customDomain,\n dataLocation: this.dataLocation,\n language: this.language,\n theme: this.theme,\n environment: this.environment\n },\n \"angular\",\n appVersion\n );\n // Default place to send the file. A file is only ever sent to a named origin, never \"*\".\n this.targetOrigin = new URL(iframeUrl).origin;\n this.baseDomain = this.customDomain || \"app.csvbox.io\";\n this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {\n this.updateUserVariable(changes['user'].currentValue);\n }\n }\n\n updateUserVariable(data: { [key: string]: any }): void {\n this.user = data;\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage({\n \"customer\": data\n }, \"*\");\n }\n }\n\n private messageListener = (event: MessageEvent) => {\n // Older importers send these as bare strings, without a token.\n const legacy = classifyLegacyMessage(event.data);\n if (legacy) {\n // Legacy messages carry no token, so the only way to tell which importer sent one is its\n // window. Ignore those that came from another instance's iframe (or anywhere else).\n if (!this.iframe || event.source !== this.iframe.contentWindow) {\n return;\n }\n // A newer importer sends the typed message as well; act on that one only.\n if (!this.messageGate.allowLegacy()) {\n return;\n }\n const ended = this.importTracker.observe(legacy);\n if (legacy.type === \"mainModalHidden\") {\n this.handleModalClosed();\n } else if (legacy.type === \"uploadSuccessful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (legacy.type === \"uploadFailed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n this.finishImport(ended);\n return;\n }\n\n // Set-file handshake messages. The shared core does not classify these, so they are\n // read here, behind the same unique_token check the core applies.\n const raw = event.data;\n if (raw && typeof raw === \"object\" && raw.data && raw.data.unique_token == this.uuid) {\n this.fileSender.learnOrigin(event);\n\n if (raw.type === \"csvbox-set-file-rejected\" && raw.data.reason === \"not-a-file\") {\n // Reply to our probe (it has no file). It only tells us the origin, so do nothing.\n return;\n }\n if (raw.type === \"csvbox-modal-shown\") {\n this.clearFileAckTimer();\n registerOpenImporter(this.registryEntry);\n // What the file path in openModal() is waiting for. display as well as\n // pointer-events: a second file declined while the first was still opening the\n // modal has put the holder away in the meantime.\n this.isModalShown = true;\n if (this.holder) {\n this.holder.style.display = 'block';\n this.holder.style.pointerEvents = 'auto';\n }\n return;\n }\n if (raw.type === \"csvbox-set-file-rejected\") {\n this.clearFileAckTimer();\n // The importer has the file and will not take it. Put the holder away only if the\n // modal was never confirmed up: a file declined while it is open leaves that modal\n // where it is, and its own 'csvbox-modal-hidden' will put the holder away.\n if (!this.isModalShown && this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n unregisterOpenImporter(this.registryEntry);\n }\n console.warn(\"[csvbox] importer declined the supplied file: \" + raw.data.reason);\n return;\n }\n }\n\n const message = classifyStructuredMessage(event.data, this.uuid);\n if (!message) {\n return;\n }\n this.messageGate.markTyped();\n const ended = this.importTracker.observe(message);\n\n if (message.type === \"data-on-submit\") {\n if (this.onSubmit) this.onSubmit(message.metadata);\n if (this.isSubmitted) this.isSubmitted(message.metadata);\n if (this.submitted) this.submitted(message.metadata);\n } else if (message.type === \"data-push-status\") {\n if (this.onImport) this.onImport(message.success, message.metadata);\n if (this.isImported) this.isImported(message.success, message.metadata);\n if (this.imported) this.imported(message.success, message.metadata);\n } else if (message.type === \"csvbox-modal-hidden\") {\n this.handleModalClosed();\n } else if (message.type === \"csvbox-upload-successful\") {\n if (this.onImport) this.onImport(true);\n if (this.isImported) this.isImported(true);\n if (this.imported) this.imported(true);\n } else if (message.type === \"csvbox-upload-failed\") {\n if (this.onImport) this.onImport(false);\n if (this.isImported) this.isImported(false);\n if (this.imported) this.imported(false);\n }\n this.finishImport(ended);\n };\n\n ngAfterContentInit(): void {\n window.addEventListener(\"message\", this.messageListener, false);\n this.syncBlocked();\n this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());\n\n if (this.lazy) {\n this.disabled = false;\n } else {\n this.disabled = true;\n this.initImporter();\n }\n }\n\n private syncBlocked(): void {\n const blocked = isBlockedByOpenImporter(this.registryEntry);\n if (blocked !== this.blockedByOther) {\n // The registry can call back from outside Angular's zone (another instance, another app).\n this.zone.run(() => {\n this.blockedByOther = blocked;\n this.cdr.markForCheck();\n });\n }\n }\n\n ngOnDestroy(): void {\n window.removeEventListener(\"message\", this.messageListener);\n // Takes the holder out of document.body: left there, it would keep covering the page with\n // an invisible full-screen layer that nothing is left to hide.\n this.destroyImporter();\n if (this.unsubscribeOpenImporters) {\n this.unsubscribeOpenImporters();\n this.unsubscribeOpenImporters = null;\n }\n }\n\n handleModalClosed(): void {\n if (this.importTracker.isInFlight()) {\n // Closed after submitting and before the result arrived: keep the iframe and its listener\n // so the late result still reaches onImport. It is removed once that result has been\n // delivered (see finishImport), so the next open is a fresh load.\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n }\n this.isModalShown = false;\n this.openModalOnIframeLoad = false;\n this.clearFileAckTimer();\n unregisterOpenImporter(this.registryEntry);\n } else {\n this.destroyImporter();\n }\n if (this.onClose) this.onClose();\n if (this.isClosed) this.isClosed();\n if (this.closed) this.closed();\n }\n\n // Called after the result of an import has been delivered. If the modal was closed in the\n // meantime the iframe was only hidden, so remove it now.\n private finishImport(ended: boolean): void {\n if (ended && !this.isModalShown && this.iframe) {\n this.destroyImporter();\n }\n }\n\n // Puts the importer away: the next open builds a new iframe with a new token.\n private destroyImporter(): void {\n if (this.holder) {\n this.holder.style.display = 'none';\n this.holder.style.pointerEvents = 'auto';\n this.holder.remove();\n }\n this.holder = null;\n this.iframe = null;\n this.isModalShown = false;\n this.isIframeLoaded = false;\n this.openModalOnIframeLoad = false;\n this.messageGate.reset();\n this.importTracker.reset();\n // A new iframe is built on the next open, so the origin is learned again.\n this.clearProbeTimer();\n unregisterOpenImporter(this.registryEntry);\n }\n\n initImporter(): void {\n if (this.loadStarted) this.loadStarted();\n\n this.uuid = generateUuid();\n this.messageGate.reset();\n this.importTracker.reset();\n\n insertCSS();\n\n const iframe = document.createElement(\"iframe\");\n this.iframe = iframe;\n iframe.setAttribute(\"src\", this.safeUrl?.toString() || '');\n iframe.setAttribute(\"allow\", \"clipboard-read; clipboard-write *\");\n iframe.frameBorder = \"0\";\n\n iframe.onload = () => {\n this.disabled = false;\n this.isIframeLoaded = true;\n // The handshake goes first: a consumer that calls openModalWithFile() from the ready\n // callback needs the importer to already have its customer, columns, options and token.\n if (this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), \"*\");\n }\n if (this.onReady) this.onReady();\n if (this.isReady) this.isReady();\n if (this.importerReady) this.importerReady();\n\n if (this.openModalOnIframeLoad) {\n this.openModal();\n }\n };\n\n this.holder = document.createElement('div');\n this.holder.classList.add('csvbox-holder');\n this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);\n this.holder.appendChild(iframe);\n\n document.body.insertAdjacentElement(\n 'beforeend', this.holder\n );\n // The holder did not exist yet if openModal() asked for the importer before it was built.\n restackOpenImporters(openImporters());\n }\n\n openModal(): void {\n // Counts as open from the moment it is requested, so the other buttons are disabled while\n // this importer is still loading, and so it is stacked above any importer opened earlier.\n registerOpenImporter(this.registryEntry);\n if(!this.iframe) {\n this.openModalOnIframeLoad = true;\n this.initImporter();\n return;\n }\n if(!this.isModalShown) {\n if(this.isIframeLoaded) {\n if(this.pendingFile) {\n // The importer opens its own modal once it has the file, so that it can inject on\n // 'shown.bs.modal'. Sending 'openModal' as well would race that.\n //\n // It can also decline: wrong step, an import file URL configured on the sheet, or\n // an importer too old to know the message at all. So the holder goes up\n // click-through and stays that way until 'csvbox-modal-shown' confirms the modal\n // is really up. It covers the viewport at z-index 2147483647 and the importer\n // renders transparent with its modal closed, so arming it on an unanswered message\n // leaves an invisible sheet over the host page eating every click.\n //\n // display:block regardless, so the iframe lays out and animates normally; only\n // pointer-events is held back. isModalShown likewise waits for the confirmation,\n // or a declined file would latch the importer shut for good.\n if(this.holder) {\n this.holder.style.pointerEvents = 'none';\n this.holder.style.display = 'block';\n }\n this.fileSender.send();\n } else {\n this.isModalShown = true;\n if(this.holder) {\n // Explicit: a previously declined file leaves the holder click-through.\n this.holder.style.pointerEvents = 'auto';\n this.holder.style.display = 'block';\n }\n if(this.iframe && this.iframe.contentWindow) {\n this.iframe.contentWindow.postMessage('openModal', '*');\n }\n }\n } else {\n this.openModalOnIframeLoad = true;\n }\n }\n }\n\n /**\n * Open the importer on a File the host page already has, instead of the file picker.\n *\n * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)\n * or `@ViewChild(CSVBoxButtonComponent)`.\n *\n * The File crosses to the iframe by structured clone, so the importer receives the real\n * object and applies its own extension, worksheet and size rules to it -- this does not\n * bypass any of them. Pass a File; a Blob has no name for the importer to read an\n * extension from.\n */\n openModalWithFile(file: File): void {\n if(typeof File === 'undefined' || !(file instanceof File)) {\n return;\n }\n\n this.pendingFile = file;\n\n // Already open: hand it over now rather than holding it for the next open. The importer\n // takes it only while it is still on the upload step, and ignores it once the user has a\n // dataset and a mapping in progress.\n if(this.isModalShown && this.iframe && this.isIframeLoaded) {\n this.fileSender.send();\n return;\n }\n\n this.openModal();\n }\n\n clearProbeTimer(): void {\n this.clearFileAckTimer();\n this.fileSender.reset();\n }\n\n startFileAckTimer(): void {\n this.clearFileAckTimer();\n this.fileAckTimer = setTimeout(() => {\n this.fileAckTimer = null;\n this.giveUpOnFile();\n }, FILE_ACK_TIMEOUT_MS);\n }\n\n clearFileAckTimer(): void {\n if (this.fileAckTimer) {\n clearTimeout(this.fileAckTimer);\n this.fileAckTimer = null;\n }\n }\n\n // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too\n // old to know the message). Without this the holder would stay up, invisible and click-through,\n // and the other instances' buttons would stay disabled for good.\n giveUpOnFile(): void {\n if (this.isModalShown) {\n return;\n }\n const holder = this.holder;\n if (holder) {\n holder.style.display = 'none';\n holder.style.pointerEvents = 'auto';\n }\n unregisterOpenImporter(this.registryEntry);\n console.warn(\"[csvbox] the importer did not respond to the supplied file\");\n }\n}\n","/*\n * Public API Surface of angular-adapter\n */\n\n\nexport * from './lib/angular-adapter.component';\nexport * from './lib/interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare class CSVBoxButtonComponent implements OnInit, OnChanges, AfterCo
16
16
  isSubmitted?: (metadata: any) => void;
17
17
  importerReady?: () => void;
18
18
  closed?: () => void;
19
- submitted?: () => void;
19
+ submitted?: (metadata: any) => void;
20
20
  imported?: (success: boolean, metadata?: any) => void;
21
21
  loadStarted?: () => void;
22
22
  user: {
@@ -45,6 +45,8 @@ export declare class CSVBoxButtonComponent implements OnInit, OnChanges, AfterCo
45
45
  disabled: boolean;
46
46
  constructor(sanitizer: DomSanitizer, cdr: ChangeDetectorRef, zone: NgZone);
47
47
  blockedByOther: boolean;
48
+ private messageGate;
49
+ private importTracker;
48
50
  private registryEntry;
49
51
  private fileSender;
50
52
  private unsubscribeOpenImporters;
@@ -63,6 +65,8 @@ export declare class CSVBoxButtonComponent implements OnInit, OnChanges, AfterCo
63
65
  private syncBlocked;
64
66
  ngOnDestroy(): void;
65
67
  handleModalClosed(): void;
68
+ private finishImport;
69
+ private destroyImporter;
66
70
  initImporter(): void;
67
71
  openModal(): void;
68
72
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sumit_yewale/angular2",
3
- "version": "1.0.6",
3
+ "version": "1.0.7-fix.1",
4
4
  "description": "Standalone Angular component for csvbox.io supporting Angular version 14 till 22",
5
5
  "author": "csvbox-io",
6
6
  "license": "MIT",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "tslib": "^2.3.0",
17
- "@sumit_yewale/adapter-core": "^0.1.0"
17
+ "@sumit_yewale/adapter-core": "^0.2.0"
18
18
  },
19
19
  "keywords": [
20
20
  "csv",