@sumit_yewale/angular 1.1.18 → 1.1.21-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.
@@ -3,15 +3,133 @@
3
3
  * Generated from: lib/csvbox-button.component.ts
4
4
  * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
5
  */
6
- import { Component, ViewChild, Input, SecurityContext } from '@angular/core';
6
+ import { Component, Input, SecurityContext, ChangeDetectorRef, NgZone } from '@angular/core';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
8
8
  import { insertCSS } from '../utlis/insertCSS';
9
- import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
9
+ import { buildImportUrl, generateUuid, buildInitPayload, createMessageGate, createImportTracker, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
10
+ // How long we wait for the importer to confirm a file it was sent before giving up on it.
10
11
  /** @type {?} */
11
- var appVersion = '1.1.16';
12
+ var FILE_ACK_TIMEOUT_MS = 8000;
13
+ /**
14
+ * @record
15
+ */
16
+ function OpenImporterEntry() { }
17
+ if (false) {
18
+ /** @type {?} */
19
+ OpenImporterEntry.prototype.getHolder;
20
+ }
21
+ /**
22
+ * @record
23
+ */
24
+ function OpenImporters() { }
25
+ if (false) {
26
+ /** @type {?} */
27
+ OpenImporters.prototype.open;
28
+ /** @type {?} */
29
+ OpenImporters.prototype.listeners;
30
+ }
31
+ /** @type {?} */
32
+ var OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
33
+ /** @type {?} */
34
+ var TOP_Z_INDEX = 2147483647;
35
+ /**
36
+ * @return {?}
37
+ */
38
+ function openImporters() {
39
+ /** @type {?} */
40
+ var w = (/** @type {?} */ (window));
41
+ if (!w[OPEN_IMPORTERS_KEY])
42
+ w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
43
+ return w[OPEN_IMPORTERS_KEY];
44
+ }
45
+ /**
46
+ * @param {?} reg
47
+ * @return {?}
48
+ */
49
+ function restackOpenImporters(reg) {
50
+ reg.open.forEach((/**
51
+ * @param {?} entry
52
+ * @param {?} i
53
+ * @return {?}
54
+ */
55
+ function (entry, i) {
56
+ /** @type {?} */
57
+ var holder = entry.getHolder();
58
+ if (holder)
59
+ holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
60
+ }));
61
+ }
62
+ /**
63
+ * @param {?} entry
64
+ * @return {?}
65
+ */
66
+ function registerOpenImporter(entry) {
67
+ /** @type {?} */
68
+ var reg = openImporters();
69
+ if (reg.open.indexOf(entry) >= 0)
70
+ return;
71
+ reg.open.push(entry);
72
+ restackOpenImporters(reg);
73
+ reg.listeners.slice().forEach((/**
74
+ * @param {?} fn
75
+ * @return {?}
76
+ */
77
+ function (fn) { return fn(); }));
78
+ }
79
+ /**
80
+ * @param {?} entry
81
+ * @return {?}
82
+ */
83
+ function unregisterOpenImporter(entry) {
84
+ /** @type {?} */
85
+ var reg = openImporters();
86
+ /** @type {?} */
87
+ var i = reg.open.indexOf(entry);
88
+ if (i < 0)
89
+ return;
90
+ reg.open.splice(i, 1);
91
+ restackOpenImporters(reg);
92
+ reg.listeners.slice().forEach((/**
93
+ * @param {?} fn
94
+ * @return {?}
95
+ */
96
+ function (fn) { return fn(); }));
97
+ }
98
+ /**
99
+ * @param {?} entry
100
+ * @return {?}
101
+ */
102
+ function isBlockedByOpenImporter(entry) {
103
+ /** @type {?} */
104
+ var reg = openImporters();
105
+ return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
106
+ }
107
+ /**
108
+ * @param {?} fn
109
+ * @return {?}
110
+ */
111
+ function subscribeOpenImporters(fn) {
112
+ /** @type {?} */
113
+ var reg = openImporters();
114
+ reg.listeners.push(fn);
115
+ return (/**
116
+ * @return {?}
117
+ */
118
+ function () {
119
+ /** @type {?} */
120
+ var i = reg.listeners.indexOf(fn);
121
+ if (i >= 0)
122
+ reg.listeners.splice(i, 1);
123
+ });
124
+ }
125
+ /** @type {?} */
126
+ var appVersion = '1.1.20';
12
127
  var CSVBoxButtonComponent = /** @class */ (function () {
13
- function CSVBoxButtonComponent(sanitizer) {
128
+ function CSVBoxButtonComponent(sanitizer, cdr, zone) {
129
+ var _this = this;
14
130
  this.sanitizer = sanitizer;
131
+ this.cdr = cdr;
132
+ this.zone = zone;
15
133
  this.isModalShown = false;
16
134
  this.licenseKey = null;
17
135
  this.uuid = null;
@@ -24,6 +142,175 @@ var CSVBoxButtonComponent = /** @class */ (function () {
24
142
  this.lazy = false;
25
143
  this.iframe = null;
26
144
  this.disabled = true;
145
+ // True while a different importer on the page is open: the button stays disabled.
146
+ this.blockedByOther = false;
147
+ this.messageGate = createMessageGate();
148
+ this.importTracker = createImportTracker();
149
+ this.registryEntry = { getHolder: (/**
150
+ * @return {?}
151
+ */
152
+ function () { return _this.holder; }) };
153
+ this.fileSender = createFileSender({
154
+ getIframe: (/**
155
+ * @return {?}
156
+ */
157
+ function () { return _this.iframe; }),
158
+ getToken: (/**
159
+ * @return {?}
160
+ */
161
+ function () { return (/** @type {?} */ (_this.uuid)); }),
162
+ getTargetOrigin: (/**
163
+ * @return {?}
164
+ */
165
+ function () { return (/** @type {?} */ (_this.targetOrigin)); }),
166
+ getBaseDomain: (/**
167
+ * @return {?}
168
+ */
169
+ function () { return _this.baseDomain; }),
170
+ takeFile: (/**
171
+ * @return {?}
172
+ */
173
+ function () {
174
+ /** @type {?} */
175
+ var file = _this.pendingFile;
176
+ _this.pendingFile = null;
177
+ return file;
178
+ }),
179
+ onSent: (/**
180
+ * @return {?}
181
+ */
182
+ function () { return _this.startFileAckTimer(); })
183
+ });
184
+ this.unsubscribeOpenImporters = null;
185
+ this.pendingFile = null;
186
+ // Data-location sheets redirect to another host, so the iframe origin can differ from
187
+ // targetOrigin. baseDomain is used to check the real origin before trusting it.
188
+ this.baseDomain = "app.csvbox.io";
189
+ this.fileAckTimer = null;
190
+ this.messageListener = (/**
191
+ * @param {?} event
192
+ * @return {?}
193
+ */
194
+ function (event) {
195
+ // Older importers send these as bare strings, without a token.
196
+ /** @type {?} */
197
+ var legacy = classifyLegacyMessage(event.data);
198
+ if (legacy) {
199
+ // Legacy messages carry no token, so the only way to tell which importer sent one is its
200
+ // window. Ignore those that came from another instance's iframe (or anywhere else).
201
+ if (!_this.iframe || event.source !== _this.iframe.contentWindow) {
202
+ return;
203
+ }
204
+ // A newer importer sends the typed message as well; act on that one only.
205
+ if (!_this.messageGate.allowLegacy()) {
206
+ return;
207
+ }
208
+ /** @type {?} */
209
+ var ended_1 = _this.importTracker.observe(legacy);
210
+ if (legacy.type === "mainModalHidden") {
211
+ _this.handleModalClosed();
212
+ }
213
+ else if (legacy.type === "uploadSuccessful") {
214
+ if (_this.onImport)
215
+ _this.onImport(true);
216
+ if (_this.isImported)
217
+ _this.isImported(true);
218
+ if (_this.imported)
219
+ _this.imported(true);
220
+ }
221
+ else if (legacy.type === "uploadFailed") {
222
+ if (_this.onImport)
223
+ _this.onImport(false);
224
+ if (_this.isImported)
225
+ _this.isImported(false);
226
+ if (_this.imported)
227
+ _this.imported(false);
228
+ }
229
+ _this.finishImport(ended_1);
230
+ return;
231
+ }
232
+ // Set-file handshake messages. The shared core does not classify these, so they are
233
+ // read here, behind the same unique_token check the core applies.
234
+ /** @type {?} */
235
+ var raw = event.data;
236
+ if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == _this.uuid) {
237
+ _this.fileSender.learnOrigin(event);
238
+ if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
239
+ // Reply to our probe (it has no file). It only tells us the origin, so do nothing.
240
+ return;
241
+ }
242
+ if (raw.type === "csvbox-modal-shown") {
243
+ _this.clearFileAckTimer();
244
+ registerOpenImporter(_this.registryEntry);
245
+ // What the file path in openModal() is waiting for. display as well as
246
+ // pointer-events: a second file declined while the first was still opening the
247
+ // modal has put the holder away in the meantime.
248
+ _this.isModalShown = true;
249
+ if (_this.holder) {
250
+ _this.holder.style.display = 'block';
251
+ _this.holder.style.pointerEvents = 'auto';
252
+ }
253
+ return;
254
+ }
255
+ if (raw.type === "csvbox-set-file-rejected") {
256
+ _this.clearFileAckTimer();
257
+ // The importer has the file and will not take it. Put the holder away only if the
258
+ // modal was never confirmed up: a file declined while it is open leaves that modal
259
+ // where it is, and its own 'csvbox-modal-hidden' will put the holder away.
260
+ if (!_this.isModalShown && _this.holder) {
261
+ _this.holder.style.display = 'none';
262
+ _this.holder.style.pointerEvents = 'auto';
263
+ unregisterOpenImporter(_this.registryEntry);
264
+ }
265
+ console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
266
+ return;
267
+ }
268
+ }
269
+ /** @type {?} */
270
+ var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
271
+ if (!message) {
272
+ return;
273
+ }
274
+ _this.messageGate.markTyped();
275
+ /** @type {?} */
276
+ var ended = _this.importTracker.observe(message);
277
+ if (message.type === "data-on-submit") {
278
+ if (_this.onSubmit)
279
+ _this.onSubmit(message.metadata);
280
+ if (_this.isSubmitted)
281
+ _this.isSubmitted(message.metadata);
282
+ if (_this.submitted)
283
+ _this.submitted(message.metadata);
284
+ }
285
+ else if (message.type === "data-push-status") {
286
+ if (_this.onImport)
287
+ _this.onImport(message.success, message.metadata);
288
+ if (_this.isImported)
289
+ _this.isImported(message.success, message.metadata);
290
+ if (_this.imported)
291
+ _this.imported(message.success, message.metadata);
292
+ }
293
+ else if (message.type === "csvbox-modal-hidden") {
294
+ _this.handleModalClosed();
295
+ }
296
+ else if (message.type === "csvbox-upload-successful") {
297
+ if (_this.onImport)
298
+ _this.onImport(true);
299
+ if (_this.isImported)
300
+ _this.isImported(true);
301
+ if (_this.imported)
302
+ _this.imported(true);
303
+ }
304
+ else if (message.type === "csvbox-upload-failed") {
305
+ if (_this.onImport)
306
+ _this.onImport(false);
307
+ if (_this.isImported)
308
+ _this.isImported(false);
309
+ if (_this.imported)
310
+ _this.imported(false);
311
+ }
312
+ _this.finishImport(ended);
313
+ });
27
314
  }
28
315
  /**
29
316
  * @return {?}
@@ -42,6 +329,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
42
329
  theme: this.theme,
43
330
  environment: this.environment
44
331
  }, "angular", appVersion);
332
+ // Default place to send the file. A file is only ever sent to a named origin, never "*".
333
+ this.targetOrigin = new URL(iframeUrl).origin;
334
+ this.baseDomain = this.customDomain || "app.csvbox.io";
45
335
  this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
46
336
  };
47
337
  /**
@@ -81,55 +371,12 @@ var CSVBoxButtonComponent = /** @class */ (function () {
81
371
  */
82
372
  function () {
83
373
  var _this = this;
84
- window.addEventListener("message", (/**
85
- * @param {?} event
374
+ window.addEventListener("message", this.messageListener, false);
375
+ this.syncBlocked();
376
+ this.unsubscribeOpenImporters = subscribeOpenImporters((/**
86
377
  * @return {?}
87
378
  */
88
- function (event) {
89
- /** @type {?} */
90
- var message = classifyStructuredMessage(event.data, (/** @type {?} */ (_this.uuid)));
91
- if (!message) {
92
- return;
93
- }
94
- if (message.type === "data-on-submit") {
95
- if (_this.onSubmit)
96
- _this.onSubmit(message.metadata);
97
- if (_this.isSubmitted)
98
- _this.isSubmitted(message.metadata);
99
- if (_this.submitted)
100
- _this.submitted(message.metadata);
101
- }
102
- else if (message.type === "data-push-status") {
103
- if (!message.success) {
104
- delete message.metadata["unique_token"];
105
- }
106
- if (_this.onImport)
107
- _this.onImport(message.success, message.metadata);
108
- if (_this.isImported)
109
- _this.isImported(message.success, message.metadata);
110
- if (_this.imported)
111
- _this.imported(message.success, message.metadata);
112
- }
113
- else if (message.type === "csvbox-modal-hidden") {
114
- _this.handleModalClosed();
115
- }
116
- else if (message.type === "csvbox-upload-successful") {
117
- if (_this.onImport)
118
- _this.onImport(true);
119
- if (_this.isImported)
120
- _this.isImported(true);
121
- if (_this.imported)
122
- _this.imported(true);
123
- }
124
- else if (message.type === "csvbox-upload-failed") {
125
- if (_this.onImport)
126
- _this.onImport(false);
127
- if (_this.isImported)
128
- _this.isImported(false);
129
- if (_this.imported)
130
- _this.imported(false);
131
- }
132
- }), false);
379
+ function () { return _this.syncBlocked(); }));
133
380
  if (this.lazy) {
134
381
  this.disabled = false;
135
382
  }
@@ -145,15 +392,22 @@ var CSVBoxButtonComponent = /** @class */ (function () {
145
392
  * @return {?}
146
393
  */
147
394
  function () {
148
- if (this.holder)
149
- this.holder.style.display = 'none';
150
- this.isModalShown = false;
151
- this.isIframeLoaded = false;
152
- this.openModalOnIframeLoad = false;
153
- if (this.holder)
154
- this.holder.remove();
155
- this.holder = null;
156
- this.iframe = null;
395
+ if (this.importTracker.isInFlight()) {
396
+ // Closed after submitting and before the result arrived: keep the iframe and its listener
397
+ // so the late result still reaches onImport. It is removed once that result has been
398
+ // delivered (see finishImport), so the next open is a fresh load.
399
+ if (this.holder) {
400
+ this.holder.style.display = 'none';
401
+ this.holder.style.pointerEvents = 'auto';
402
+ }
403
+ this.isModalShown = false;
404
+ this.openModalOnIframeLoad = false;
405
+ this.clearFileAckTimer();
406
+ unregisterOpenImporter(this.registryEntry);
407
+ }
408
+ else {
409
+ this.destroyImporter();
410
+ }
157
411
  if (this.onClose)
158
412
  this.onClose();
159
413
  if (this.isClosed)
@@ -161,6 +415,57 @@ var CSVBoxButtonComponent = /** @class */ (function () {
161
415
  if (this.closed)
162
416
  this.closed();
163
417
  };
418
+ // Called after the result of an import has been delivered. If the modal was closed in the
419
+ // meantime the iframe was only hidden, so remove it now.
420
+ // Called after the result of an import has been delivered. If the modal was closed in the
421
+ // meantime the iframe was only hidden, so remove it now.
422
+ /**
423
+ * @private
424
+ * @param {?} ended
425
+ * @return {?}
426
+ */
427
+ CSVBoxButtonComponent.prototype.finishImport =
428
+ // Called after the result of an import has been delivered. If the modal was closed in the
429
+ // meantime the iframe was only hidden, so remove it now.
430
+ /**
431
+ * @private
432
+ * @param {?} ended
433
+ * @return {?}
434
+ */
435
+ function (ended) {
436
+ if (ended && !this.isModalShown && this.iframe) {
437
+ this.destroyImporter();
438
+ }
439
+ };
440
+ // Puts the importer away: the next open builds a new iframe with a new token.
441
+ // Puts the importer away: the next open builds a new iframe with a new token.
442
+ /**
443
+ * @private
444
+ * @return {?}
445
+ */
446
+ CSVBoxButtonComponent.prototype.destroyImporter =
447
+ // Puts the importer away: the next open builds a new iframe with a new token.
448
+ /**
449
+ * @private
450
+ * @return {?}
451
+ */
452
+ function () {
453
+ if (this.holder) {
454
+ this.holder.style.display = 'none';
455
+ this.holder.style.pointerEvents = 'auto';
456
+ this.holder.remove();
457
+ }
458
+ this.holder = null;
459
+ this.iframe = null;
460
+ this.isModalShown = false;
461
+ this.isIframeLoaded = false;
462
+ this.openModalOnIframeLoad = false;
463
+ this.messageGate.reset();
464
+ this.importTracker.reset();
465
+ // A new iframe is built on the next open, so the origin is learned again.
466
+ this.clearProbeTimer();
467
+ unregisterOpenImporter(this.registryEntry);
468
+ };
164
469
  /**
165
470
  * @return {?}
166
471
  */
@@ -171,11 +476,14 @@ var CSVBoxButtonComponent = /** @class */ (function () {
171
476
  if (this.loadStarted)
172
477
  this.loadStarted();
173
478
  this.uuid = generateUuid();
479
+ this.messageGate.reset();
480
+ this.importTracker.reset();
174
481
  insertCSS();
175
482
  /** @type {?} */
176
483
  var iframe = document.createElement("iframe");
177
484
  this.iframe = iframe;
178
485
  iframe.setAttribute("src", this.safeUrl);
486
+ iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
179
487
  iframe.frameBorder = "0";
180
488
  /** @type {?} */
181
489
  var self = this;
@@ -183,17 +491,19 @@ var CSVBoxButtonComponent = /** @class */ (function () {
183
491
  * @return {?}
184
492
  */
185
493
  function () {
494
+ self.disabled = false;
495
+ self.isIframeLoaded = true;
496
+ // The handshake goes first: a consumer that calls openModalWithFile() from the ready
497
+ // callback needs the importer to already have its customer, columns, options and token.
498
+ if (self.iframe && self.iframe.contentWindow) {
499
+ self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, (/** @type {?} */ (self.uuid))), "*");
500
+ }
186
501
  if (self.onReady)
187
502
  self.onReady();
188
503
  if (self.isReady)
189
504
  self.isReady();
190
505
  if (self.importerReady)
191
506
  self.importerReady();
192
- self.disabled = false;
193
- self.isIframeLoaded = true;
194
- if (self.iframe && self.iframe.contentWindow) {
195
- self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, (/** @type {?} */ (self.uuid))), "*");
196
- }
197
507
  if (self.openModalOnIframeLoad) {
198
508
  self.openModal();
199
509
  }
@@ -203,6 +513,8 @@ var CSVBoxButtonComponent = /** @class */ (function () {
203
513
  this.holder.setAttribute('id', "csvbox-embed-" + this.uuid);
204
514
  this.holder.appendChild(iframe);
205
515
  document.body.insertAdjacentElement('beforeend', this.holder);
516
+ // The holder did not exist yet if openModal() asked for the importer before it was built.
517
+ restackOpenImporters(openImporters());
206
518
  };
207
519
  /**
208
520
  * @return {?}
@@ -211,6 +523,9 @@ var CSVBoxButtonComponent = /** @class */ (function () {
211
523
  * @return {?}
212
524
  */
213
525
  function () {
526
+ // Counts as open from the moment it is requested, so the other buttons are disabled while
527
+ // this importer is still loading, and so it is stacked above any importer opened earlier.
528
+ registerOpenImporter(this.registryEntry);
214
529
  if (!this.iframe) {
215
530
  this.openModalOnIframeLoad = true;
216
531
  this.initImporter();
@@ -218,11 +533,36 @@ var CSVBoxButtonComponent = /** @class */ (function () {
218
533
  }
219
534
  if (!this.isModalShown) {
220
535
  if (this.isIframeLoaded) {
221
- this.isModalShown = true;
222
- if (this.holder)
223
- this.holder.style.display = 'block';
224
- if (this.iframe && this.iframe.contentWindow) {
225
- this.iframe.contentWindow.postMessage('openModal', '*');
536
+ if (this.pendingFile) {
537
+ // The importer opens its own modal once it has the file, so that it can inject on
538
+ // 'shown.bs.modal'. Sending 'openModal' as well would race that.
539
+ //
540
+ // It can also decline: wrong step, an import file URL configured on the sheet, or
541
+ // an importer too old to know the message at all. So the holder goes up
542
+ // click-through and stays that way until 'csvbox-modal-shown' confirms the modal
543
+ // is really up. It covers the viewport at z-index 2147483647 and the importer
544
+ // renders transparent with its modal closed, so arming it on an unanswered message
545
+ // leaves an invisible sheet over the host page eating every click.
546
+ //
547
+ // display:block regardless, so the iframe lays out and animates normally; only
548
+ // pointer-events is held back. isModalShown likewise waits for the confirmation,
549
+ // or a declined file would latch the importer shut for good.
550
+ if (this.holder) {
551
+ this.holder.style.pointerEvents = 'none';
552
+ this.holder.style.display = 'block';
553
+ }
554
+ this.fileSender.send();
555
+ }
556
+ else {
557
+ this.isModalShown = true;
558
+ if (this.holder) {
559
+ // Explicit: a previously declined file leaves the holder click-through.
560
+ this.holder.style.pointerEvents = 'auto';
561
+ this.holder.style.display = 'block';
562
+ }
563
+ if (this.iframe && this.iframe.contentWindow) {
564
+ this.iframe.contentWindow.postMessage('openModal', '*');
565
+ }
226
566
  }
227
567
  }
228
568
  else {
@@ -230,18 +570,177 @@ var CSVBoxButtonComponent = /** @class */ (function () {
230
570
  }
231
571
  }
232
572
  };
573
+ /**
574
+ * Open the importer on a File the host page already has, instead of the file picker.
575
+ *
576
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
577
+ * or `@ViewChild(CSVBoxButtonComponent)`.
578
+ *
579
+ * The File crosses to the iframe by structured clone, so the importer receives the real
580
+ * object and applies its own extension, worksheet and size rules to it -- this does not
581
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
582
+ * extension from.
583
+ */
584
+ /**
585
+ * Open the importer on a File the host page already has, instead of the file picker.
586
+ *
587
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
588
+ * or `\@ViewChild(CSVBoxButtonComponent)`.
589
+ *
590
+ * The File crosses to the iframe by structured clone, so the importer receives the real
591
+ * object and applies its own extension, worksheet and size rules to it -- this does not
592
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
593
+ * extension from.
594
+ * @param {?} file
595
+ * @return {?}
596
+ */
597
+ CSVBoxButtonComponent.prototype.openModalWithFile = /**
598
+ * Open the importer on a File the host page already has, instead of the file picker.
599
+ *
600
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
601
+ * or `\@ViewChild(CSVBoxButtonComponent)`.
602
+ *
603
+ * The File crosses to the iframe by structured clone, so the importer receives the real
604
+ * object and applies its own extension, worksheet and size rules to it -- this does not
605
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
606
+ * extension from.
607
+ * @param {?} file
608
+ * @return {?}
609
+ */
610
+ function (file) {
611
+ if (typeof File === 'undefined' || !(file instanceof File)) {
612
+ return;
613
+ }
614
+ this.pendingFile = file;
615
+ // Already open: hand it over now rather than holding it for the next open. The importer
616
+ // takes it only while it is still on the upload step, and ignores it once the user has a
617
+ // dataset and a mapping in progress.
618
+ if (this.isModalShown && this.iframe && this.isIframeLoaded) {
619
+ this.fileSender.send();
620
+ return;
621
+ }
622
+ this.openModal();
623
+ };
624
+ /**
625
+ * @return {?}
626
+ */
627
+ CSVBoxButtonComponent.prototype.clearProbeTimer = /**
628
+ * @return {?}
629
+ */
630
+ function () {
631
+ this.clearFileAckTimer();
632
+ this.fileSender.reset();
633
+ };
634
+ /**
635
+ * @return {?}
636
+ */
637
+ CSVBoxButtonComponent.prototype.startFileAckTimer = /**
638
+ * @return {?}
639
+ */
640
+ function () {
641
+ var _this = this;
642
+ this.clearFileAckTimer();
643
+ this.fileAckTimer = setTimeout((/**
644
+ * @return {?}
645
+ */
646
+ function () {
647
+ _this.fileAckTimer = null;
648
+ _this.giveUpOnFile();
649
+ }), FILE_ACK_TIMEOUT_MS);
650
+ };
651
+ /**
652
+ * @return {?}
653
+ */
654
+ CSVBoxButtonComponent.prototype.clearFileAckTimer = /**
655
+ * @return {?}
656
+ */
657
+ function () {
658
+ if (this.fileAckTimer) {
659
+ clearTimeout(this.fileAckTimer);
660
+ this.fileAckTimer = null;
661
+ }
662
+ };
663
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
664
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
665
+ // and the other instances' buttons would stay disabled for good.
666
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
667
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
668
+ // and the other instances' buttons would stay disabled for good.
669
+ /**
670
+ * @return {?}
671
+ */
672
+ CSVBoxButtonComponent.prototype.giveUpOnFile =
673
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
674
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
675
+ // and the other instances' buttons would stay disabled for good.
676
+ /**
677
+ * @return {?}
678
+ */
679
+ function () {
680
+ if (this.isModalShown) {
681
+ return;
682
+ }
683
+ /** @type {?} */
684
+ var holder = this.holder;
685
+ if (holder) {
686
+ holder.style.display = 'none';
687
+ holder.style.pointerEvents = 'auto';
688
+ }
689
+ unregisterOpenImporter(this.registryEntry);
690
+ console.warn("[csvbox] the importer did not respond to the supplied file");
691
+ };
692
+ /**
693
+ * @private
694
+ * @return {?}
695
+ */
696
+ CSVBoxButtonComponent.prototype.syncBlocked = /**
697
+ * @private
698
+ * @return {?}
699
+ */
700
+ function () {
701
+ var _this = this;
702
+ /** @type {?} */
703
+ var blocked = isBlockedByOpenImporter(this.registryEntry);
704
+ if (blocked !== this.blockedByOther) {
705
+ // The registry can call back from outside Angular's zone (another instance, another app).
706
+ this.zone.run((/**
707
+ * @return {?}
708
+ */
709
+ function () {
710
+ _this.blockedByOther = blocked;
711
+ _this.cdr.markForCheck();
712
+ }));
713
+ }
714
+ };
715
+ /**
716
+ * @return {?}
717
+ */
718
+ CSVBoxButtonComponent.prototype.ngOnDestroy = /**
719
+ * @return {?}
720
+ */
721
+ function () {
722
+ window.removeEventListener("message", this.messageListener);
723
+ // Takes the holder out of document.body: left there, it would keep covering the page with
724
+ // an invisible full-screen layer that nothing is left to hide.
725
+ this.destroyImporter();
726
+ if (this.unsubscribeOpenImporters) {
727
+ this.unsubscribeOpenImporters();
728
+ this.unsubscribeOpenImporters = null;
729
+ }
730
+ };
233
731
  CSVBoxButtonComponent.decorators = [
234
732
  { type: Component, args: [{
235
733
  selector: 'csvbox-button',
236
- template: "\n <div>\n <button [disabled]=\"disabled\" #initiator (click)=\"openModal()\" [attr.data-csvbox-token]=\"uuid\">\n <ng-content></ng-content>\n </button>\n </div>\n "
734
+ 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 "
237
735
  }] }
238
736
  ];
239
737
  /** @nocollapse */
240
738
  CSVBoxButtonComponent.ctorParameters = function () { return [
241
- { type: DomSanitizer }
739
+ { type: DomSanitizer },
740
+ { type: ChangeDetectorRef },
741
+ { type: NgZone }
242
742
  ]; };
243
743
  CSVBoxButtonComponent.propDecorators = {
244
- initiator: [{ type: ViewChild, args: ['initiator', { static: false },] }],
245
744
  onImport: [{ type: Input }],
246
745
  onReady: [{ type: Input }],
247
746
  onClose: [{ type: Input }],
@@ -277,8 +776,6 @@ if (false) {
277
776
  /** @type {?} */
278
777
  CSVBoxButtonComponent.prototype.isModalShown;
279
778
  /** @type {?} */
280
- CSVBoxButtonComponent.prototype.initiator;
281
- /** @type {?} */
282
779
  CSVBoxButtonComponent.prototype.onImport;
283
780
  /** @type {?} */
284
781
  CSVBoxButtonComponent.prototype.onReady;
@@ -337,8 +834,61 @@ if (false) {
337
834
  /** @type {?} */
338
835
  CSVBoxButtonComponent.prototype.disabled;
339
836
  /** @type {?} */
837
+ CSVBoxButtonComponent.prototype.blockedByOther;
838
+ /**
839
+ * @type {?}
840
+ * @private
841
+ */
842
+ CSVBoxButtonComponent.prototype.messageGate;
843
+ /**
844
+ * @type {?}
845
+ * @private
846
+ */
847
+ CSVBoxButtonComponent.prototype.importTracker;
848
+ /**
849
+ * @type {?}
850
+ * @private
851
+ */
852
+ CSVBoxButtonComponent.prototype.registryEntry;
853
+ /**
854
+ * @type {?}
855
+ * @private
856
+ */
857
+ CSVBoxButtonComponent.prototype.fileSender;
858
+ /**
859
+ * @type {?}
860
+ * @private
861
+ */
862
+ CSVBoxButtonComponent.prototype.unsubscribeOpenImporters;
863
+ /** @type {?} */
340
864
  CSVBoxButtonComponent.prototype.holder;
341
865
  /** @type {?} */
866
+ CSVBoxButtonComponent.prototype.pendingFile;
867
+ /** @type {?} */
868
+ CSVBoxButtonComponent.prototype.targetOrigin;
869
+ /** @type {?} */
870
+ CSVBoxButtonComponent.prototype.baseDomain;
871
+ /**
872
+ * @type {?}
873
+ * @private
874
+ */
875
+ CSVBoxButtonComponent.prototype.fileAckTimer;
876
+ /**
877
+ * @type {?}
878
+ * @private
879
+ */
880
+ CSVBoxButtonComponent.prototype.messageListener;
881
+ /** @type {?} */
342
882
  CSVBoxButtonComponent.prototype.sanitizer;
883
+ /**
884
+ * @type {?}
885
+ * @private
886
+ */
887
+ CSVBoxButtonComponent.prototype.cdr;
888
+ /**
889
+ * @type {?}
890
+ * @private
891
+ */
892
+ CSVBoxButtonComponent.prototype.zone;
343
893
  }
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFNBQVMsRUFDVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0lBRWpILFVBQVUsR0FBRyxRQUFRO0FBRTNCO0lBdURFLCtCQUFtQixTQUFzQjtRQUF0QixjQUFTLEdBQVQsU0FBUyxDQUFhO1FBMUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQXFCWixlQUFVLEdBQWtCLElBQUksQ0FBQztRQUVqQyxTQUFJLEdBQWtCLElBQUksQ0FBQztRQUMzQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBRy9CLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBRTVCLG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUV2QyxTQUFJLEdBQVksS0FBSyxDQUFDO1FBSS9CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBRS9CLGFBQVEsR0FBWSxJQUFJLENBQUM7SUFFVSxDQUFDOzs7O0lBSTdDLHdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7O1lBQ3ZCLFNBQVMsR0FBRyxjQUFjLENBQzVCO1lB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QUE0Qjs7SUFDNUIseUNBQTZCOztJQUU3QiwyQ0FBK0I7O0lBQy9CLHdDQUE0Qjs7SUFDNUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLDhDQUFrQzs7SUFDbEMsdUNBQTJCOztJQUMzQiwwQ0FBOEI7O0lBQzlCLHlDQUE2Qjs7SUFDN0IsNENBQWdDOztJQUVoQyxxQ0FBdUI7O0lBQ3ZCLCtDQUFpQzs7SUFDakMsMkNBQTBDOztJQUMxQyx3Q0FBMEI7O0lBQzFCLHFDQUFvQzs7SUFDcEMsNkNBQTRDOztJQUM1Qyw2Q0FBNEM7O0lBQzVDLHlDQUF3Qzs7SUFDeEMsNENBQThCOztJQUU5QixzQ0FBcUM7O0lBRXJDLCtDQUF5Qzs7SUFDekMsc0RBQWdEOztJQUVoRCxxQ0FBK0I7O0lBRS9CLHdDQUFhOztJQUViLHVDQUF3Qzs7SUFFeEMseUNBQWtDOztJQUlsQyx1Q0FBWTs7SUFGQSwwQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgVmlld0NoaWxkLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi4vdXRsaXMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UgfSBmcm9tICdAc3VtaXRfeWV3YWxlL2FkYXB0ZXItY29yZSc7XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjE2JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgI2luaXRpYXRvciAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2luaXRpYXRvcicsIHtzdGF0aWM6IGZhbHNlfSkgaW5pdGlhdG9yOiBhbnk7XG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplcikge31cblxuICBob2xkZXI6IGFueTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBsZXQgaWZyYW1lVXJsID0gYnVpbGRJbXBvcnRVcmwoXG4gICAgICB7XG4gICAgICAgIGxpY2Vuc2VLZXk6IHRoaXMubGljZW5zZUtleSxcbiAgICAgICAgY3VzdG9tRG9tYWluOiB0aGlzLmN1c3RvbURvbWFpbixcbiAgICAgICAgZGF0YUxvY2F0aW9uOiB0aGlzLmRhdGFMb2NhdGlvbixcbiAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ3VhZ2UsXG4gICAgICAgIHRoZW1lOiB0aGlzLnRoZW1lLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudFxuICAgICAgfSxcbiAgICAgIFwiYW5ndWxhclwiLFxuICAgICAgYXBwVmVyc2lvblxuICAgICk7XG4gICAgdGhpcy5zYWZlVXJsID0gdGhpcy5zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGlmcmFtZVVybCkpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmKGNoYW5nZXNbXCJ1c2VyXCJdICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT0gY2hhbmdlc1sndXNlciddLnByZXZpb3VzVmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlclZhcmlhYmUoY2hhbmdlc1sndXNlciddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVXNlclZhcmlhYmUoZGF0YTogYW55KTogdm9pZCB7XG4gICAgdGhpcy51c2VyID0gZGF0YTtcbiAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7XG4gICAgICAgIFwiY3VzdG9tZXJcIiA6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBjbGFzc2lmeVN0cnVjdHVyZWRNZXNzYWdlKGV2ZW50LmRhdGEsIHRoaXMudXVpZCEpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtcHVzaC1zdGF0dXNcIikge1xuICAgICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLm1ldGFkYXRhW1widW5pcXVlX3Rva2VuXCJdO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LCBmYWxzZSk7XG5cbiAgICBpZih0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuZnJhbWVCb3JkZXIgPSBcIjBcIjtcblxuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICBpZnJhbWUub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBzZWxmLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzZWxmLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmIChzZWxmLmlmcmFtZSAmJiBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZChzZWxmLnVzZXIsIHNlbGYuZHluYW1pY0NvbHVtbnMsIHNlbGYub3B0aW9ucywgc2VsZi51dWlkISksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmKHNlbGYub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHNlbGYub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhvbGRlci5jbGFzc0xpc3QuYWRkKCdjc3Zib3gtaG9sZGVyJyk7XG4gICAgdGhpcy5ob2xkZXIuc2V0QXR0cmlidXRlKCdpZCcsIGBjc3Zib3gtZW1iZWQtJHt0aGlzLnV1aWR9YCk7XG4gICAgdGhpcy5ob2xkZXIuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcblxuICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFxuICAgICAgJ2JlZm9yZWVuZCcsIHRoaXMuaG9sZGVyXG4gICAgKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICBpZighdGhpcy5pZnJhbWUpIHtcbiAgICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYodGhpcy5pc0lmcmFtZUxvYWRlZCkge1xuICAgICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgICBpZih0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgaWYodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgnb3Blbk1vZGFsJywgJyonKTtcbiAgICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufVxuIl19
894
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3VtaXRfeWV3YWxlL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY3N2Ym94LWJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxlQUFlLEVBR2YsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztJQUdsTSxtQkFBbUIsR0FBRyxJQUFJOzs7O0FBT2hDLGdDQUFvRTs7O0lBQXRDLHNDQUFvQzs7Ozs7QUFDbEUsNEJBQW9GOzs7SUFBMUQsNkJBQTBCOztJQUFDLGtDQUE2Qjs7O0lBQzVFLGtCQUFrQixHQUFHLHVCQUF1Qjs7SUFDNUMsV0FBVyxHQUFHLFVBQVU7Ozs7QUFFOUIsU0FBUyxhQUFhOztRQUNkLENBQUMsR0FBRyxtQkFBQSxNQUFNLEVBQU87SUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQztRQUFFLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDaEYsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMvQixDQUFDOzs7OztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPOzs7OztJQUFDLFVBQUMsS0FBSyxFQUFFLENBQUM7O1lBQ2xCLE1BQU0sR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFO1FBQ2hDLElBQUksTUFBTTtZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLEVBQUMsQ0FBQztBQUNMLENBQUM7Ozs7O0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUF3Qjs7UUFDOUMsR0FBRyxHQUFHLGFBQWEsRUFBRTtJQUMzQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPO0lBQ3pDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JCLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTzs7OztJQUFDLFVBQUEsRUFBRSxJQUFJLE9BQUEsRUFBRSxFQUFFLEVBQUosQ0FBSSxFQUFDLENBQUM7QUFDNUMsQ0FBQzs7Ozs7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQXdCOztRQUNoRCxHQUFHLEdBQUcsYUFBYSxFQUFFOztRQUNyQixDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU87Ozs7SUFBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsRUFBRSxFQUFKLENBQUksRUFBQyxDQUFDO0FBQzVDLENBQUM7Ozs7O0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxLQUF3Qjs7UUFDakQsR0FBRyxHQUFHLGFBQWEsRUFBRTtJQUMzQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDNUQsQ0FBQzs7Ozs7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEVBQWM7O1FBQ3RDLEdBQUcsR0FBRyxhQUFhLEVBQUU7SUFDM0IsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkI7OztJQUFPOztZQUNDLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLEVBQUM7QUFDSixDQUFDOztJQUVLLFVBQVUsR0FBRyxRQUFRO0FBRTNCO0lBc0RFLCtCQUFtQixTQUFzQixFQUFVLEdBQXNCLEVBQVUsSUFBWTtRQUEvRixpQkFBbUc7UUFBaEYsY0FBUyxHQUFULFNBQVMsQ0FBYTtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQXpDL0YsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFvQlosZUFBVSxHQUFrQixJQUFJLENBQUM7UUFFakMsU0FBSSxHQUFrQixJQUFJLENBQUM7UUFDM0IsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUcvQixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUkvQixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUUvQixhQUFRLEdBQVksSUFBSSxDQUFDOztRQUtsQyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUV4QixnQkFBVyxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDbEMsa0JBQWEsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBRXRDLGtCQUFhLEdBQXNCLEVBQUUsU0FBUzs7O1lBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxNQUFNLEVBQVgsQ0FBVyxDQUFBLEVBQUUsQ0FBQztRQUVwRSxlQUFVLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEMsU0FBUzs7O1lBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxNQUFNLEVBQVgsQ0FBVyxDQUFBO1lBQzVCLFFBQVE7OztZQUFFLHFCQUFNLG1CQUFBLEtBQUksQ0FBQyxJQUFJLEVBQVUsR0FBQSxDQUFBO1lBQ25DLGVBQWU7OztZQUFFLHFCQUFNLG1CQUFBLEtBQUksQ0FBQyxZQUFZLEVBQVUsR0FBQSxDQUFBO1lBQ2xELGFBQWE7OztZQUFFLGNBQU0sT0FBQSxLQUFJLENBQUMsVUFBVSxFQUFmLENBQWUsQ0FBQTtZQUNwQyxRQUFROzs7WUFBRTs7b0JBQ0YsSUFBSSxHQUFHLEtBQUksQ0FBQyxXQUFXO2dCQUM3QixLQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUE7WUFDRCxNQUFNOzs7WUFBRSxjQUFNLE9BQUEsS0FBSSxDQUFDLGlCQUFpQixFQUFFLEVBQXhCLENBQXdCLENBQUE7U0FDdkMsQ0FBQyxDQUFDO1FBRUssNkJBQXdCLEdBQXdCLElBQUksQ0FBQztRQUk3RCxnQkFBVyxHQUFnQixJQUFJLENBQUM7OztRQU1oQyxlQUFVLEdBQVcsZUFBZSxDQUFDO1FBRTdCLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBcUN6QixvQkFBZTs7OztRQUFHLFVBQUMsS0FBbUI7OztnQkFFdEMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7WUFDaEQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YseUZBQXlGO2dCQUN6RixvRkFBb0Y7Z0JBQ3BGLElBQUksQ0FBQyxLQUFJLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0JBQzlELE9BQU87aUJBQ1I7Z0JBQ0QsMEVBQTBFO2dCQUMxRSxJQUFJLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDbkMsT0FBTztpQkFDUjs7b0JBQ0ssT0FBSyxHQUFHLEtBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztnQkFDaEQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGlCQUFpQixFQUFFO29CQUNyQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUI7cUJBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGtCQUFrQixFQUFFO29CQUM3QyxJQUFJLEtBQUksQ0FBQyxRQUFRO3dCQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLElBQUksS0FBSSxDQUFDLFVBQVU7d0JBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxLQUFJLENBQUMsUUFBUTt3QkFBRSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4QztxQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO29CQUN6QyxJQUFJLEtBQUksQ0FBQyxRQUFRO3dCQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hDLElBQUksS0FBSSxDQUFDLFVBQVU7d0JBQUUsS0FBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxLQUFJLENBQUMsUUFBUTt3QkFBRSxLQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN6QztnQkFDRCxLQUFJLENBQUMsWUFBWSxDQUFDLE9BQUssQ0FBQyxDQUFDO2dCQUN6QixPQUFPO2FBQ1I7Ozs7Z0JBSUssR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJO1lBQ3RCLElBQUksR0FBRyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ3BGLEtBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUVuQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssMEJBQTBCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssWUFBWSxFQUFFO29CQUMvRSxtRkFBbUY7b0JBQ25GLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG9CQUFvQixFQUFFO29CQUNyQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsb0JBQW9CLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUN6Qyx1RUFBdUU7b0JBQ3ZFLCtFQUErRTtvQkFDL0UsaURBQWlEO29CQUNqRCxLQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxLQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNmLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7d0JBQ3BDLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7cUJBQzFDO29CQUNELE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLDBCQUEwQixFQUFFO29CQUMzQyxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDekIsa0ZBQWtGO29CQUNsRixtRkFBbUY7b0JBQ25GLDJFQUEyRTtvQkFDM0UsSUFBSSxDQUFDLEtBQUksQ0FBQyxZQUFZLElBQUksS0FBSSxDQUFDLE1BQU0sRUFBRTt3QkFDckMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQzt3QkFDbkMsS0FBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQzt3QkFDekMsc0JBQXNCLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3FCQUM1QztvQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ2pGLE9BQU87aUJBQ1I7YUFDRjs7Z0JBRUcsT0FBTyxHQUFHLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsbUJBQUEsS0FBSSxDQUFDLElBQUksRUFBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1osT0FBTzthQUNSO1lBQ0QsS0FBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7Z0JBQ3ZCLEtBQUssR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFFakQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFO2dCQUNyQyxJQUFJLEtBQUksQ0FBQyxRQUFRO29CQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLEtBQUksQ0FBQyxXQUFXO29CQUFFLEtBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLEtBQUksQ0FBQyxTQUFTO29CQUFFLEtBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRTtnQkFDOUMsSUFBSSxLQUFJLENBQUMsUUFBUTtvQkFBRSxLQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLEtBQUksQ0FBQyxVQUFVO29CQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksS0FBSSxDQUFDLFFBQVE7b0JBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRTtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUU7Z0JBQ2pELEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRTtnQkFDcEQsSUFBSSxLQUFJLENBQUMsUUFBUTtvQkFBRSxLQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEtBQUksQ0FBQyxVQUFVO29CQUFFLEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLElBQUksS0FBSSxDQUFDLFFBQVE7b0JBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQztpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQUU7Z0JBQ2hELElBQUksS0FBSSxDQUFDLFFBQVE7b0JBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxLQUFJLENBQUMsVUFBVTtvQkFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLEtBQUksQ0FBQyxRQUFRO29CQUFFLEtBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDM0M7WUFDRCxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsRUFBQztJQXRLZ0csQ0FBQzs7OztJQXFDbkcsd0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLEVBQUUsQ0FBQzs7WUFDdkIsU0FBUyxHQUFHLGNBQWMsQ0FDNUI7WUFDRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztTQUM5QixFQUNELFNBQVMsRUFDVCxVQUFVLENBQ1g7UUFDRCx5RkFBeUY7UUFDekYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLGVBQWUsQ0FBQztRQUN2RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ2pJLENBQUM7Ozs7O0lBRUQsMkNBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRTtZQUNuRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxpREFBaUI7Ozs7SUFBakIsVUFBa0IsSUFBUztRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7WUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxVQUFVLEVBQUcsSUFBSTthQUNsQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDOzs7O0lBa0dELGtEQUFrQjs7O0lBQWxCO1FBQUEsaUJBV0M7UUFWQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxzQkFBc0I7OztRQUFDLGNBQU0sT0FBQSxLQUFJLENBQUMsV0FBVyxFQUFFLEVBQWxCLENBQWtCLEVBQUMsQ0FBQztRQUVqRixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUN2QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDckIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQzs7OztJQUVELGlEQUFpQjs7O0lBQWpCO1FBQ0UsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBQ25DLDBGQUEwRjtZQUMxRixxRkFBcUY7WUFDckYsa0VBQWtFO1lBQ2xFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFDO1lBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztZQUNuQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QixzQkFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUN4QjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCwwRkFBMEY7SUFDMUYseURBQXlEOzs7Ozs7OztJQUNqRCw0Q0FBWTs7Ozs7Ozs7SUFBcEIsVUFBcUIsS0FBYztRQUNqQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsOEVBQThFOzs7Ozs7SUFDdEUsK0NBQWU7Ozs7OztJQUF2QjtRQUNFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQztRQUNuQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsMEVBQTBFO1FBQzFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixzQkFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7OztJQUVELDRDQUFZOzs7SUFBWjtRQUNFLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekMsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFM0IsU0FBUyxFQUFFLENBQUM7O1lBRVIsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDOztZQUVyQixJQUFJLEdBQUcsSUFBSTtRQUNmLE1BQU0sQ0FBQyxNQUFNOzs7UUFBRztZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLHFGQUFxRjtZQUNyRix3RkFBd0Y7WUFDeEYsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsbUJBQUEsSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDeEg7WUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQyxJQUFJLElBQUksQ0FBQyxhQUFhO2dCQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUU3QyxJQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFBLENBQUE7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxrQkFBZ0IsSUFBSSxDQUFDLElBQU0sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWhDLFFBQVEsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUN6QixDQUFDO1FBQ0YsMEZBQTBGO1FBQzFGLG9CQUFvQixDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQzs7OztJQUVELHlDQUFTOzs7SUFBVDtRQUNFLDBGQUEwRjtRQUMxRiwwRkFBMEY7UUFDMUYsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsT0FBTztTQUNWO1FBQ0QsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN0QixJQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ25CLGtGQUFrRjtvQkFDbEYsaUVBQWlFO29CQUNqRSxFQUFFO29CQUNGLGtGQUFrRjtvQkFDbEYsd0VBQXdFO29CQUN4RSxpRkFBaUY7b0JBQ2pGLDhFQUE4RTtvQkFDOUUsbUZBQW1GO29CQUNuRixtRUFBbUU7b0JBQ25FLEVBQUU7b0JBQ0YsK0VBQStFO29CQUMvRSxpRkFBaUY7b0JBQ2pGLDZEQUE2RDtvQkFDN0QsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7cUJBQ3JDO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUN6QixJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2Qsd0VBQXdFO3dCQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO3dCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO3FCQUNyQztvQkFDRCxJQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7d0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7cUJBQ3pEO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7Ozs7Ozs7Ozs7Ozs7O0lBQ0gsaURBQWlCOzs7Ozs7Ozs7Ozs7O0lBQWpCLFVBQWtCLElBQVU7UUFDMUIsSUFBRyxPQUFPLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLENBQUMsRUFBRTtZQUN6RCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUV4Qix3RkFBd0Y7UUFDeEYseUZBQXlGO1FBQ3pGLHFDQUFxQztRQUNyQyxJQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQzFELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7Ozs7SUFFRCwrQ0FBZTs7O0lBQWY7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzFCLENBQUM7Ozs7SUFFRCxpREFBaUI7OztJQUFqQjtRQUFBLGlCQU1DO1FBTEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVOzs7UUFBQztZQUM3QixLQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixLQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxHQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDMUIsQ0FBQzs7OztJQUVELGlEQUFpQjs7O0lBQWpCO1FBQ0UsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsbUdBQW1HO0lBQ25HLGdHQUFnRztJQUNoRyxpRUFBaUU7Ozs7Ozs7SUFDakUsNENBQVk7Ozs7Ozs7SUFBWjtRQUNFLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixPQUFPO1NBQ1I7O1lBQ0ssTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQzFCLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztTQUNyQztRQUNELHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLDREQUE0RCxDQUFDLENBQUM7SUFDN0UsQ0FBQzs7Ozs7SUFFTywyQ0FBVzs7OztJQUFuQjtRQUFBLGlCQVNDOztZQVJPLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQzNELElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkMsMEZBQTBGO1lBQzFGLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRzs7O1lBQUM7Z0JBQ1osS0FBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUM7Z0JBQzlCLEtBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsQ0FBQyxFQUFDLENBQUM7U0FDSjtJQUNILENBQUM7Ozs7SUFFRCwyQ0FBVzs7O0lBQVg7UUFDRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1RCwwRkFBMEY7UUFDMUYsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQzs7Z0JBNWNGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFLHFNQU1UO2lCQUNGOzs7O2dCQXhFUSxZQUFZO2dCQUpuQixpQkFBaUI7Z0JBQ2pCLE1BQU07OzsyQkFpRkwsS0FBSzswQkFDTCxLQUFLOzBCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFFTCxLQUFLOzBCQUNMLEtBQUs7MkJBQ0wsS0FBSzs4QkFDTCxLQUFLO2dDQUVMLEtBQUs7eUJBQ0wsS0FBSzs0QkFDTCxLQUFLOzJCQUNMLEtBQUs7OEJBQ0wsS0FBSzt1QkFFTCxLQUFLO2lDQUNMLEtBQUs7NkJBQ0wsS0FBSzswQkFDTCxLQUFLO3VCQUNMLEtBQUs7K0JBQ0wsS0FBSzsrQkFDTCxLQUFLOzJCQUNMLEtBQUs7OEJBQ0wsS0FBSzt3QkFFTCxLQUFLO2lDQUVMLEtBQUs7d0NBQ0wsS0FBSzt1QkFFTCxLQUFLOzJCQU1MLEtBQUs7O0lBeVpSLDRCQUFDO0NBQUEsQUE3Y0QsSUE2Y0M7U0FsY1kscUJBQXFCOzs7SUFFaEMsNkNBQXFCOztJQUVyQix5Q0FBNkI7O0lBQzdCLHdDQUE0Qjs7SUFDNUIsd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBRTdCLDJDQUErQjs7SUFDL0Isd0NBQTRCOztJQUM1Qix5Q0FBNkI7O0lBQzdCLDRDQUFnQzs7SUFFaEMsOENBQWtDOztJQUNsQyx1Q0FBMkI7O0lBQzNCLDBDQUE4Qjs7SUFDOUIseUNBQTZCOztJQUM3Qiw0Q0FBZ0M7O0lBRWhDLHFDQUF1Qjs7SUFDdkIsK0NBQWlDOztJQUNqQywyQ0FBMEM7O0lBQzFDLHdDQUEwQjs7SUFDMUIscUNBQW9DOztJQUNwQyw2Q0FBNEM7O0lBQzVDLDZDQUE0Qzs7SUFDNUMseUNBQXdDOztJQUN4Qyw0Q0FBOEI7O0lBRTlCLHNDQUFxQzs7SUFFckMsK0NBQXlDOztJQUN6QyxzREFBZ0Q7O0lBRWhELHFDQUErQjs7SUFFL0Isd0NBQWE7O0lBRWIsdUNBQXdDOztJQUV4Qyx5Q0FBa0M7O0lBS2xDLCtDQUFnQzs7Ozs7SUFFaEMsNENBQTBDOzs7OztJQUMxQyw4Q0FBOEM7Ozs7O0lBRTlDLDhDQUE0RTs7Ozs7SUFFNUUsMkNBV0c7Ozs7O0lBRUgseURBQTZEOztJQUU3RCx1Q0FBWTs7SUFFWiw0Q0FBZ0M7O0lBRWhDLDZDQUFpQzs7SUFJakMsMkNBQXFDOzs7OztJQUVyQyw2Q0FBaUM7Ozs7O0lBcUNqQyxnREE4RkU7O0lBdEtVLDBDQUE2Qjs7Ozs7SUFBRSxvQ0FBOEI7Ozs7O0lBQUUscUNBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4uL3V0bGlzL2luc2VydENTUyc7XG5pbXBvcnQgeyBidWlsZEltcG9ydFVybCwgZ2VuZXJhdGVVdWlkLCBidWlsZEluaXRQYXlsb2FkLCBjcmVhdGVNZXNzYWdlR2F0ZSwgY3JlYXRlSW1wb3J0VHJhY2tlciwgY3JlYXRlRmlsZVNlbmRlciwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSwgY2xhc3NpZnlMZWdhY3lNZXNzYWdlIH0gZnJvbSAnQHN1bWl0X3lld2FsZS9hZGFwdGVyLWNvcmUnO1xuXG4vLyBIb3cgbG9uZyB3ZSB3YWl0IGZvciB0aGUgaW1wb3J0ZXIgdG8gY29uZmlybSBhIGZpbGUgaXQgd2FzIHNlbnQgYmVmb3JlIGdpdmluZyB1cCBvbiBpdC5cbmNvbnN0IEZJTEVfQUNLX1RJTUVPVVRfTVMgPSA4MDAwO1xuXG4vLyBQYWdlLXdpZGUgcmVjb3JkIG9mIHRoZSBpbXBvcnRlcnMgdGhhdCBhcmUgb3BlbiBvciBvcGVuaW5nLCBzaGFyZWQgYnkgZXZlcnkgQ1NWQm94IGFkYXB0ZXJcbi8vIG9uIHRoZSBwYWdlIChpdCBsaXZlcyBvbiB3aW5kb3cgc28gc2VwYXJhdGUgY29waWVzIG9mIGFuIGFkYXB0ZXIgc2VlIHRoZSBzYW1lIGxpc3QpLiBJdCBkb2VzXG4vLyB0d28gdGhpbmdzOiB0aGUgbmV3ZXN0IGltcG9ydGVyIGlzIHN0YWNrZWQgb24gdG9wIChldmVyeSBob2xkZXIgaXMgZml4ZWQsIGZ1bGwgc2NyZWVuIGFuZFxuLy8gei1pbmRleCAyMTQ3NDgzNjQ3LCBzbyBlcXVhbCB6LWluZGV4ZXMgd291bGQgbGVhdmUgdGhlIG9uZSB0aGF0IGNvbWVzIGZpcnN0IGluIHRoZSBET00gb25cbi8vIHRvcCksIGFuZCB0aGUgb3RoZXIgaW5zdGFuY2VzIGxlYXJuIHRoYXQgYW4gaW1wb3J0ZXIgaXMgb3BlbiBzbyB0aGV5IGNhbiBkaXNhYmxlIHRoZWlyIGJ1dHRvbi5cbmludGVyZmFjZSBPcGVuSW1wb3J0ZXJFbnRyeSB7IGdldEhvbGRlcjogKCkgPT4gSFRNTEVsZW1lbnQgfCBudWxsOyB9XG5pbnRlcmZhY2UgT3BlbkltcG9ydGVycyB7IG9wZW46IE9wZW5JbXBvcnRlckVudHJ5W107IGxpc3RlbmVyczogQXJyYXk8KCkgPT4gdm9pZD47IH1cbmNvbnN0IE9QRU5fSU1QT1JURVJTX0tFWSA9ICdfX2NzdmJveE9wZW5JbXBvcnRlcnMnO1xuY29uc3QgVE9QX1pfSU5ERVggPSAyMTQ3NDgzNjQ3O1xuXG5mdW5jdGlvbiBvcGVuSW1wb3J0ZXJzKCk6IE9wZW5JbXBvcnRlcnMge1xuICBjb25zdCB3ID0gd2luZG93IGFzIGFueTtcbiAgaWYgKCF3W09QRU5fSU1QT1JURVJTX0tFWV0pIHdbT1BFTl9JTVBPUlRFUlNfS0VZXSA9IHsgb3BlbjogW10sIGxpc3RlbmVyczogW10gfTtcbiAgcmV0dXJuIHdbT1BFTl9JTVBPUlRFUlNfS0VZXTtcbn1cblxuZnVuY3Rpb24gcmVzdGFja09wZW5JbXBvcnRlcnMocmVnOiBPcGVuSW1wb3J0ZXJzKTogdm9pZCB7XG4gIHJlZy5vcGVuLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7XG4gICAgY29uc3QgaG9sZGVyID0gZW50cnkuZ2V0SG9sZGVyKCk7XG4gICAgaWYgKGhvbGRlcikgaG9sZGVyLnN0eWxlLnpJbmRleCA9IFN0cmluZyhUT1BfWl9JTkRFWCAtIChyZWcub3Blbi5sZW5ndGggLSAxIC0gaSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJPcGVuSW1wb3J0ZXIoZW50cnk6IE9wZW5JbXBvcnRlckVudHJ5KTogdm9pZCB7XG4gIGNvbnN0IHJlZyA9IG9wZW5JbXBvcnRlcnMoKTtcbiAgaWYgKHJlZy5vcGVuLmluZGV4T2YoZW50cnkpID49IDApIHJldHVybjtcbiAgcmVnLm9wZW4ucHVzaChlbnRyeSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGNvbnN0IGkgPSByZWcub3Blbi5pbmRleE9mKGVudHJ5KTtcbiAgaWYgKGkgPCAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnNwbGljZShpLCAxKTtcbiAgcmVzdGFja09wZW5JbXBvcnRlcnMocmVnKTtcbiAgcmVnLmxpc3RlbmVycy5zbGljZSgpLmZvckVhY2goZm4gPT4gZm4oKSk7XG59XG5cbmZ1bmN0aW9uIGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IGJvb2xlYW4ge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIHJldHVybiByZWcub3Blbi5sZW5ndGggPiAwICYmIHJlZy5vcGVuLmluZGV4T2YoZW50cnkpIDwgMDtcbn1cblxuZnVuY3Rpb24gc3Vic2NyaWJlT3BlbkltcG9ydGVycyhmbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIHJlZy5saXN0ZW5lcnMucHVzaChmbik7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgY29uc3QgaSA9IHJlZy5saXN0ZW5lcnMuaW5kZXhPZihmbik7XG4gICAgaWYgKGkgPj0gMCkgcmVnLmxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gIH07XG59XG5cbmNvbnN0IGFwcFZlcnNpb24gPSAnMS4xLjIwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY3N2Ym94LWJ1dHRvbicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdj5cbiAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGJsb2NrZWRCeU90aGVyXCIgKGNsaWNrKT1cIm9wZW5Nb2RhbCgpXCIgW2F0dHIuZGF0YS1jc3Zib3gtdG9rZW5dPVwidXVpZFwiPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcblxuZXhwb3J0IGNsYXNzIENTVkJveEJ1dHRvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIG9uUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgb25DbG9zZT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgaXNSZWFkeT86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpc1N1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIGltcG9ydGVyUmVhZHk/OiBGdW5jdGlvbjtcbiAgQElucHV0KCkgY2xvc2VkPzogRnVuY3Rpb247XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBpbXBvcnRlZD86IEZ1bmN0aW9uO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86IEZ1bmN0aW9uO1xuXG4gIEBJbnB1dCgpIHVzZXI/OiBvYmplY3Q7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zPzogb2JqZWN0O1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9ucz86IG9iamVjdDtcbiAgQElucHV0KCkgdXVpZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGN1c3RvbURvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGFMb2NhdGlvbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxhbmd1YWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZW52aXJvbm1lbnQ/OiBvYmplY3Q7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBhbnk7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOkRvbVNhbml0aXplciwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICAvLyBUcnVlIHdoaWxlIGEgZGlmZmVyZW50IGltcG9ydGVyIG9uIHRoZSBwYWdlIGlzIG9wZW46IHRoZSBidXR0b24gc3RheXMgZGlzYWJsZWQuXG4gIGJsb2NrZWRCeU90aGVyOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBtZXNzYWdlR2F0ZSA9IGNyZWF0ZU1lc3NhZ2VHYXRlKCk7XG4gIHByaXZhdGUgaW1wb3J0VHJhY2tlciA9IGNyZWF0ZUltcG9ydFRyYWNrZXIoKTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IGFueTtcblxuICBwZW5kaW5nRmlsZTogRmlsZSB8IG51bGwgPSBudWxsO1xuXG4gIHRhcmdldE9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIERhdGEtbG9jYXRpb24gc2hlZXRzIHJlZGlyZWN0IHRvIGFub3RoZXIgaG9zdCwgc28gdGhlIGlmcmFtZSBvcmlnaW4gY2FuIGRpZmZlciBmcm9tXG4gIC8vIHRhcmdldE9yaWdpbi4gYmFzZURvbWFpbiBpcyB1c2VkIHRvIGNoZWNrIHRoZSByZWFsIG9yaWdpbiBiZWZvcmUgdHJ1c3RpbmcgaXQuXG4gIGJhc2VEb21haW46IHN0cmluZyA9IFwiYXBwLmNzdmJveC5pb1wiO1xuXG4gIHByaXZhdGUgZmlsZUFja1RpbWVyOiBhbnkgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGxldCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZihjaGFuZ2VzW1widXNlclwiXSAmJiBjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlICE9IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJlKGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVzZXJWYXJpYWJlKGRhdGE6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCIgOiBkYXRhXG4gICAgICB9LCBcIipcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlTGlzdGVuZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgIC8vIE9sZGVyIGltcG9ydGVycyBzZW5kIHRoZXNlIGFzIGJhcmUgc3RyaW5ncywgd2l0aG91dCBhIHRva2VuLlxuICAgIGNvbnN0IGxlZ2FjeSA9IGNsYXNzaWZ5TGVnYWN5TWVzc2FnZShldmVudC5kYXRhKTtcbiAgICBpZiAobGVnYWN5KSB7XG4gICAgICAvLyBMZWdhY3kgbWVzc2FnZXMgY2Fycnkgbm8gdG9rZW4sIHNvIHRoZSBvbmx5IHdheSB0byB0ZWxsIHdoaWNoIGltcG9ydGVyIHNlbnQgb25lIGlzIGl0c1xuICAgICAgLy8gd2luZG93LiBJZ25vcmUgdGhvc2UgdGhhdCBjYW1lIGZyb20gYW5vdGhlciBpbnN0YW5jZSdzIGlmcmFtZSAob3IgYW55d2hlcmUgZWxzZSkuXG4gICAgICBpZiAoIXRoaXMuaWZyYW1lIHx8IGV2ZW50LnNvdXJjZSAhPT0gdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBBIG5ld2VyIGltcG9ydGVyIHNlbmRzIHRoZSB0eXBlZCBtZXNzYWdlIGFzIHdlbGw7IGFjdCBvbiB0aGF0IG9uZSBvbmx5LlxuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VHYXRlLmFsbG93TGVnYWN5KCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZW5kZWQgPSB0aGlzLmltcG9ydFRyYWNrZXIub2JzZXJ2ZShsZWdhY3kpO1xuICAgICAgaWYgKGxlZ2FjeS50eXBlID09PSBcIm1haW5Nb2RhbEhpZGRlblwiKSB7XG4gICAgICAgIHRoaXMuaGFuZGxlTW9kYWxDbG9zZWQoKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkU3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChsZWdhY3kudHlwZSA9PT0gXCJ1cGxvYWRGYWlsZWRcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZChmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZmluaXNoSW1wb3J0KGVuZGVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTZXQtZmlsZSBoYW5kc2hha2UgbWVzc2FnZXMuIFRoZSBzaGFyZWQgY29yZSBkb2VzIG5vdCBjbGFzc2lmeSB0aGVzZSwgc28gdGhleSBhcmVcbiAgICAvLyByZWFkIGhlcmUsIGJlaGluZCB0aGUgc2FtZSB1bmlxdWVfdG9rZW4gY2hlY2sgdGhlIGNvcmUgYXBwbGllcy5cbiAgICBjb25zdCByYXcgPSBldmVudC5kYXRhO1xuICAgIGlmIChyYXcgJiYgdHlwZW9mIHJhdyA9PT0gXCJvYmplY3RcIiAmJiByYXcuZGF0YSAmJiByYXcuZGF0YS51bmlxdWVfdG9rZW4gPT0gdGhpcy51dWlkKSB7XG4gICAgICB0aGlzLmZpbGVTZW5kZXIubGVhcm5PcmlnaW4oZXZlbnQpO1xuXG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIgJiYgcmF3LmRhdGEucmVhc29uID09PSBcIm5vdC1hLWZpbGVcIikge1xuICAgICAgICAvLyBSZXBseSB0byBvdXIgcHJvYmUgKGl0IGhhcyBubyBmaWxlKS4gSXQgb25seSB0ZWxscyB1cyB0aGUgb3JpZ2luLCBzbyBkbyBub3RoaW5nLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLXNob3duXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgICAgICAvLyBXaGF0IHRoZSBmaWxlIHBhdGggaW4gb3Blbk1vZGFsKCkgaXMgd2FpdGluZyBmb3IuIGRpc3BsYXkgYXMgd2VsbCBhc1xuICAgICAgICAvLyBwb2ludGVyLWV2ZW50czogYSBzZWNvbmQgZmlsZSBkZWNsaW5lZCB3aGlsZSB0aGUgZmlyc3Qgd2FzIHN0aWxsIG9wZW5pbmcgdGhlXG4gICAgICAgIC8vIG1vZGFsIGhhcyBwdXQgdGhlIGhvbGRlciBhd2F5IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcudHlwZSA9PT0gXCJjc3Zib3gtc2V0LWZpbGUtcmVqZWN0ZWRcIikge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICAgIC8vIFRoZSBpbXBvcnRlciBoYXMgdGhlIGZpbGUgYW5kIHdpbGwgbm90IHRha2UgaXQuIFB1dCB0aGUgaG9sZGVyIGF3YXkgb25seSBpZiB0aGVcbiAgICAgICAgLy8gbW9kYWwgd2FzIG5ldmVyIGNvbmZpcm1lZCB1cDogYSBmaWxlIGRlY2xpbmVkIHdoaWxlIGl0IGlzIG9wZW4gbGVhdmVzIHRoYXQgbW9kYWxcbiAgICAgICAgLy8gd2hlcmUgaXQgaXMsIGFuZCBpdHMgb3duICdjc3Zib3gtbW9kYWwtaGlkZGVuJyB3aWxsIHB1dCB0aGUgaG9sZGVyIGF3YXkuXG4gICAgICAgIGlmICghdGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICAgICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcIltjc3Zib3hdIGltcG9ydGVyIGRlY2xpbmVkIHRoZSBzdXBwbGllZCBmaWxlOiBcIiArIHJhdy5kYXRhLnJlYXNvbik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkISk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWVzc2FnZUdhdGUubWFya1R5cGVkKCk7XG4gICAgY29uc3QgZW5kZWQgPSB0aGlzLmltcG9ydFRyYWNrZXIub2JzZXJ2ZShtZXNzYWdlKTtcblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1vbi1zdWJtaXRcIikge1xuICAgICAgaWYgKHRoaXMub25TdWJtaXQpIHRoaXMub25TdWJtaXQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLnN1Ym1pdHRlZCkgdGhpcy5zdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChtZXNzYWdlLnN1Y2Nlc3MsIG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC1tb2RhbC1oaWRkZW5cIikge1xuICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtc3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKHRydWUpO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBcImNzdmJveC11cGxvYWQtZmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuZmluaXNoSW1wb3J0KGVuZGVkKTtcbiAgfTtcblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyLCBmYWxzZSk7XG4gICAgdGhpcy5zeW5jQmxvY2tlZCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gc3Vic2NyaWJlT3BlbkltcG9ydGVycygoKSA9PiB0aGlzLnN5bmNCbG9ja2VkKCkpO1xuXG4gICAgaWYodGhpcy5sYXp5KSB7XG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVNb2RhbENsb3NlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbXBvcnRUcmFja2VyLmlzSW5GbGlnaHQoKSkge1xuICAgICAgLy8gQ2xvc2VkIGFmdGVyIHN1Ym1pdHRpbmcgYW5kIGJlZm9yZSB0aGUgcmVzdWx0IGFycml2ZWQ6IGtlZXAgdGhlIGlmcmFtZSBhbmQgaXRzIGxpc3RlbmVyXG4gICAgICAvLyBzbyB0aGUgbGF0ZSByZXN1bHQgc3RpbGwgcmVhY2hlcyBvbkltcG9ydC4gSXQgaXMgcmVtb3ZlZCBvbmNlIHRoYXQgcmVzdWx0IGhhcyBiZWVuXG4gICAgICAvLyBkZWxpdmVyZWQgKHNlZSBmaW5pc2hJbXBvcnQpLCBzbyB0aGUgbmV4dCBvcGVuIGlzIGEgZnJlc2ggbG9hZC5cbiAgICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgfVxuICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSBmYWxzZTtcbiAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9uQ2xvc2UpIHRoaXMub25DbG9zZSgpO1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB0aGlzLmlzQ2xvc2VkKCk7XG4gICAgaWYgKHRoaXMuY2xvc2VkKSB0aGlzLmNsb3NlZCgpO1xuICB9XG5cbiAgLy8gQ2FsbGVkIGFmdGVyIHRoZSByZXN1bHQgb2YgYW4gaW1wb3J0IGhhcyBiZWVuIGRlbGl2ZXJlZC4gSWYgdGhlIG1vZGFsIHdhcyBjbG9zZWQgaW4gdGhlXG4gIC8vIG1lYW50aW1lIHRoZSBpZnJhbWUgd2FzIG9ubHkgaGlkZGVuLCBzbyByZW1vdmUgaXQgbm93LlxuICBwcml2YXRlIGZpbmlzaEltcG9ydChlbmRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChlbmRlZCAmJiAhdGhpcy5pc01vZGFsU2hvd24gJiYgdGhpcy5pZnJhbWUpIHtcbiAgICAgIHRoaXMuZGVzdHJveUltcG9ydGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gUHV0cyB0aGUgaW1wb3J0ZXIgYXdheTogdGhlIG5leHQgb3BlbiBidWlsZHMgYSBuZXcgaWZyYW1lIHdpdGggYSBuZXcgdG9rZW4uXG4gIHByaXZhdGUgZGVzdHJveUltcG9ydGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgICB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIHRoaXMubWVzc2FnZUdhdGUucmVzZXQoKTtcbiAgICB0aGlzLmltcG9ydFRyYWNrZXIucmVzZXQoKTtcbiAgICAvLyBBIG5ldyBpZnJhbWUgaXMgYnVpbHQgb24gdGhlIG5leHQgb3Blbiwgc28gdGhlIG9yaWdpbiBpcyBsZWFybmVkIGFnYWluLlxuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgdW5yZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICB9XG5cbiAgaW5pdEltcG9ydGVyKCkge1xuICAgIGlmICh0aGlzLmxvYWRTdGFydGVkKSB0aGlzLmxvYWRTdGFydGVkKCk7XG5cbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICB0aGlzLm1lc3NhZ2VHYXRlLnJlc2V0KCk7XG4gICAgdGhpcy5pbXBvcnRUcmFja2VyLnJlc2V0KCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGxldCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHNlbGYuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHNlbGYuaXNJZnJhbWVMb2FkZWQgPSB0cnVlO1xuICAgICAgLy8gVGhlIGhhbmRzaGFrZSBnb2VzIGZpcnN0OiBhIGNvbnN1bWVyIHRoYXQgY2FsbHMgb3Blbk1vZGFsV2l0aEZpbGUoKSBmcm9tIHRoZSByZWFkeVxuICAgICAgLy8gY2FsbGJhY2sgbmVlZHMgdGhlIGltcG9ydGVyIHRvIGFscmVhZHkgaGF2ZSBpdHMgY3VzdG9tZXIsIGNvbHVtbnMsIG9wdGlvbnMgYW5kIHRva2VuLlxuICAgICAgaWYgKHNlbGYuaWZyYW1lICYmIHNlbGYuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShidWlsZEluaXRQYXlsb2FkKHNlbGYudXNlciwgc2VsZi5keW5hbWljQ29sdW1ucywgc2VsZi5vcHRpb25zLCBzZWxmLnV1aWQhKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHNlbGYub25SZWFkeSkgc2VsZi5vblJlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pc1JlYWR5KSBzZWxmLmlzUmVhZHkoKTtcbiAgICAgIGlmIChzZWxmLmltcG9ydGVyUmVhZHkpIHNlbGYuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICBpZihzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBzeW5jQmxvY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBibG9ja2VkID0gaXNCbG9ja2VkQnlPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBpZiAoYmxvY2tlZCAhPT0gdGhpcy5ibG9ja2VkQnlPdGhlcikge1xuICAgICAgLy8gVGhlIHJlZ2lzdHJ5IGNhbiBjYWxsIGJhY2sgZnJvbSBvdXRzaWRlIEFuZ3VsYXIncyB6b25lIChhbm90aGVyIGluc3RhbmNlLCBhbm90aGVyIGFwcCkuXG4gICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5ibG9ja2VkQnlPdGhlciA9IGJsb2NrZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICAvLyBUYWtlcyB0aGUgaG9sZGVyIG91dCBvZiBkb2N1bWVudC5ib2R5OiBsZWZ0IHRoZXJlLCBpdCB3b3VsZCBrZWVwIGNvdmVyaW5nIHRoZSBwYWdlIHdpdGhcbiAgICAvLyBhbiBpbnZpc2libGUgZnVsbC1zY3JlZW4gbGF5ZXIgdGhhdCBub3RoaW5nIGlzIGxlZnQgdG8gaGlkZS5cbiAgICB0aGlzLmRlc3Ryb3lJbXBvcnRlcigpO1xuICAgIGlmICh0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycykge1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==