@sumit_yewale/angular2 1.0.4 → 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.
- package/README.md +41 -0
- package/esm2020/lib/angular-adapter.component.mjs +360 -68
- package/fesm2015/sumit_yewale-angular2.mjs +359 -67
- package/fesm2015/sumit_yewale-angular2.mjs.map +1 -1
- package/fesm2020/sumit_yewale-angular2.mjs +359 -67
- package/fesm2020/sumit_yewale-angular2.mjs.map +1 -1
- package/lib/angular-adapter.component.d.ts +37 -4
- package/package.json +5 -8
|
@@ -1,12 +1,61 @@
|
|
|
1
1
|
import { Component, Input, SecurityContext } from '@angular/core';
|
|
2
2
|
import { insertCSS } from './utils/insertCSS';
|
|
3
|
-
import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } 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
|
+
// How long we wait for the importer to confirm a file it was sent before giving up on it.
|
|
7
|
+
const FILE_ACK_TIMEOUT_MS = 8000;
|
|
8
|
+
const OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
|
|
9
|
+
const TOP_Z_INDEX = 2147483647;
|
|
10
|
+
function openImporters() {
|
|
11
|
+
const w = window;
|
|
12
|
+
if (!w[OPEN_IMPORTERS_KEY])
|
|
13
|
+
w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
|
|
14
|
+
return w[OPEN_IMPORTERS_KEY];
|
|
15
|
+
}
|
|
16
|
+
function restackOpenImporters(reg) {
|
|
17
|
+
reg.open.forEach((entry, i) => {
|
|
18
|
+
const holder = entry.getHolder();
|
|
19
|
+
if (holder)
|
|
20
|
+
holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function registerOpenImporter(entry) {
|
|
24
|
+
const reg = openImporters();
|
|
25
|
+
if (reg.open.indexOf(entry) >= 0)
|
|
26
|
+
return;
|
|
27
|
+
reg.open.push(entry);
|
|
28
|
+
restackOpenImporters(reg);
|
|
29
|
+
reg.listeners.slice().forEach(fn => fn());
|
|
30
|
+
}
|
|
31
|
+
function unregisterOpenImporter(entry) {
|
|
32
|
+
const reg = openImporters();
|
|
33
|
+
const i = reg.open.indexOf(entry);
|
|
34
|
+
if (i < 0)
|
|
35
|
+
return;
|
|
36
|
+
reg.open.splice(i, 1);
|
|
37
|
+
restackOpenImporters(reg);
|
|
38
|
+
reg.listeners.slice().forEach(fn => fn());
|
|
39
|
+
}
|
|
40
|
+
function isBlockedByOpenImporter(entry) {
|
|
41
|
+
const reg = openImporters();
|
|
42
|
+
return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
|
|
43
|
+
}
|
|
44
|
+
function subscribeOpenImporters(fn) {
|
|
45
|
+
const reg = openImporters();
|
|
46
|
+
reg.listeners.push(fn);
|
|
47
|
+
return () => {
|
|
48
|
+
const i = reg.listeners.indexOf(fn);
|
|
49
|
+
if (i >= 0)
|
|
50
|
+
reg.listeners.splice(i, 1);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
6
53
|
const appVersion = '1.1.16';
|
|
7
54
|
export class CSVBoxButtonComponent {
|
|
8
|
-
constructor(sanitizer) {
|
|
55
|
+
constructor(sanitizer, cdr, zone) {
|
|
9
56
|
this.sanitizer = sanitizer;
|
|
57
|
+
this.cdr = cdr;
|
|
58
|
+
this.zone = zone;
|
|
10
59
|
this.isModalShown = false;
|
|
11
60
|
this.user = null;
|
|
12
61
|
this.dynamicColumns = null;
|
|
@@ -24,51 +73,117 @@ export class CSVBoxButtonComponent {
|
|
|
24
73
|
this.safeUrl = null;
|
|
25
74
|
this.iframe = null;
|
|
26
75
|
this.disabled = true;
|
|
76
|
+
// True while a different importer on the page is open: the button stays disabled.
|
|
77
|
+
this.blockedByOther = false;
|
|
78
|
+
this.messageGate = createMessageGate();
|
|
79
|
+
this.importTracker = createImportTracker();
|
|
80
|
+
this.registryEntry = { getHolder: () => this.holder };
|
|
81
|
+
this.fileSender = createFileSender({
|
|
82
|
+
getIframe: () => this.iframe,
|
|
83
|
+
getToken: () => this.uuid,
|
|
84
|
+
getTargetOrigin: () => this.targetOrigin,
|
|
85
|
+
getBaseDomain: () => this.baseDomain,
|
|
86
|
+
takeFile: () => {
|
|
87
|
+
const file = this.pendingFile;
|
|
88
|
+
this.pendingFile = null;
|
|
89
|
+
return file;
|
|
90
|
+
},
|
|
91
|
+
onSent: () => this.startFileAckTimer()
|
|
92
|
+
});
|
|
93
|
+
this.unsubscribeOpenImporters = null;
|
|
27
94
|
this.holder = null;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
95
|
+
this.pendingFile = null;
|
|
96
|
+
// Data-location sheets redirect to another host, so the iframe origin can differ from
|
|
97
|
+
// targetOrigin. baseDomain is used to check the real origin before trusting it.
|
|
98
|
+
this.baseDomain = "app.csvbox.io";
|
|
99
|
+
this.fileAckTimer = null;
|
|
100
|
+
this.messageListener = (event) => {
|
|
101
|
+
// Older importers send these as bare strings, without a token.
|
|
102
|
+
const legacy = classifyLegacyMessage(event.data);
|
|
103
|
+
if (legacy) {
|
|
104
|
+
// Legacy messages carry no token, so the only way to tell which importer sent one is its
|
|
105
|
+
// window. Ignore those that came from another instance's iframe (or anywhere else).
|
|
106
|
+
if (!this.iframe || event.source !== this.iframe.contentWindow) {
|
|
107
|
+
return;
|
|
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);
|
|
114
|
+
if (legacy.type === "mainModalHidden") {
|
|
115
|
+
this.handleModalClosed();
|
|
116
|
+
}
|
|
117
|
+
else if (legacy.type === "uploadSuccessful") {
|
|
118
|
+
if (this.onImport)
|
|
119
|
+
this.onImport(true);
|
|
120
|
+
if (this.isImported)
|
|
121
|
+
this.isImported(true);
|
|
122
|
+
if (this.imported)
|
|
123
|
+
this.imported(true);
|
|
124
|
+
}
|
|
125
|
+
else if (legacy.type === "uploadFailed") {
|
|
126
|
+
if (this.onImport)
|
|
127
|
+
this.onImport(false);
|
|
128
|
+
if (this.isImported)
|
|
129
|
+
this.isImported(false);
|
|
130
|
+
if (this.imported)
|
|
131
|
+
this.imported(false);
|
|
132
|
+
}
|
|
133
|
+
this.finishImport(ended);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Set-file handshake messages. The shared core does not classify these, so they are
|
|
137
|
+
// read here, behind the same unique_token check the core applies.
|
|
138
|
+
const raw = event.data;
|
|
139
|
+
if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == this.uuid) {
|
|
140
|
+
this.fileSender.learnOrigin(event);
|
|
141
|
+
if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
|
|
142
|
+
// Reply to our probe (it has no file). It only tells us the origin, so do nothing.
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (raw.type === "csvbox-modal-shown") {
|
|
146
|
+
this.clearFileAckTimer();
|
|
147
|
+
registerOpenImporter(this.registryEntry);
|
|
148
|
+
// What the file path in openModal() is waiting for. display as well as
|
|
149
|
+
// pointer-events: a second file declined while the first was still opening the
|
|
150
|
+
// modal has put the holder away in the meantime.
|
|
151
|
+
this.isModalShown = true;
|
|
152
|
+
if (this.holder) {
|
|
153
|
+
this.holder.style.display = 'block';
|
|
154
|
+
this.holder.style.pointerEvents = 'auto';
|
|
155
|
+
}
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (raw.type === "csvbox-set-file-rejected") {
|
|
159
|
+
this.clearFileAckTimer();
|
|
160
|
+
// The importer has the file and will not take it. Put the holder away only if the
|
|
161
|
+
// modal was never confirmed up: a file declined while it is open leaves that modal
|
|
162
|
+
// where it is, and its own 'csvbox-modal-hidden' will put the holder away.
|
|
163
|
+
if (!this.isModalShown && this.holder) {
|
|
164
|
+
this.holder.style.display = 'none';
|
|
165
|
+
this.holder.style.pointerEvents = 'auto';
|
|
166
|
+
unregisterOpenImporter(this.registryEntry);
|
|
167
|
+
}
|
|
168
|
+
console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
56
172
|
const message = classifyStructuredMessage(event.data, this.uuid);
|
|
57
173
|
if (!message) {
|
|
58
174
|
return;
|
|
59
175
|
}
|
|
176
|
+
this.messageGate.markTyped();
|
|
177
|
+
const ended = this.importTracker.observe(message);
|
|
60
178
|
if (message.type === "data-on-submit") {
|
|
61
179
|
if (this.onSubmit)
|
|
62
180
|
this.onSubmit(message.metadata);
|
|
63
181
|
if (this.isSubmitted)
|
|
64
182
|
this.isSubmitted(message.metadata);
|
|
65
183
|
if (this.submitted)
|
|
66
|
-
this.submitted();
|
|
184
|
+
this.submitted(message.metadata);
|
|
67
185
|
}
|
|
68
186
|
else if (message.type === "data-push-status") {
|
|
69
|
-
if (!message.success) {
|
|
70
|
-
delete message.metadata["unique_token"];
|
|
71
|
-
}
|
|
72
187
|
if (this.onImport)
|
|
73
188
|
this.onImport(message.success, message.metadata);
|
|
74
189
|
if (this.isImported)
|
|
@@ -95,7 +210,41 @@ export class CSVBoxButtonComponent {
|
|
|
95
210
|
if (this.imported)
|
|
96
211
|
this.imported(false);
|
|
97
212
|
}
|
|
98
|
-
|
|
213
|
+
this.finishImport(ended);
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
ngOnInit() {
|
|
217
|
+
this.uuid = generateUuid();
|
|
218
|
+
const iframeUrl = buildImportUrl({
|
|
219
|
+
licenseKey: this.licenseKey,
|
|
220
|
+
customDomain: this.customDomain,
|
|
221
|
+
dataLocation: this.dataLocation,
|
|
222
|
+
language: this.language,
|
|
223
|
+
theme: this.theme,
|
|
224
|
+
environment: this.environment
|
|
225
|
+
}, "angular", appVersion);
|
|
226
|
+
// Default place to send the file. A file is only ever sent to a named origin, never "*".
|
|
227
|
+
this.targetOrigin = new URL(iframeUrl).origin;
|
|
228
|
+
this.baseDomain = this.customDomain || "app.csvbox.io";
|
|
229
|
+
this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
|
|
230
|
+
}
|
|
231
|
+
ngOnChanges(changes) {
|
|
232
|
+
if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {
|
|
233
|
+
this.updateUserVariable(changes['user'].currentValue);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
updateUserVariable(data) {
|
|
237
|
+
this.user = data;
|
|
238
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
239
|
+
this.iframe.contentWindow.postMessage({
|
|
240
|
+
"customer": data
|
|
241
|
+
}, "*");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
ngAfterContentInit() {
|
|
245
|
+
window.addEventListener("message", this.messageListener, false);
|
|
246
|
+
this.syncBlocked();
|
|
247
|
+
this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());
|
|
99
248
|
if (this.lazy) {
|
|
100
249
|
this.disabled = false;
|
|
101
250
|
}
|
|
@@ -104,16 +253,43 @@ export class CSVBoxButtonComponent {
|
|
|
104
253
|
this.initImporter();
|
|
105
254
|
}
|
|
106
255
|
}
|
|
256
|
+
syncBlocked() {
|
|
257
|
+
const blocked = isBlockedByOpenImporter(this.registryEntry);
|
|
258
|
+
if (blocked !== this.blockedByOther) {
|
|
259
|
+
// The registry can call back from outside Angular's zone (another instance, another app).
|
|
260
|
+
this.zone.run(() => {
|
|
261
|
+
this.blockedByOther = blocked;
|
|
262
|
+
this.cdr.markForCheck();
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
ngOnDestroy() {
|
|
267
|
+
window.removeEventListener("message", this.messageListener);
|
|
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();
|
|
271
|
+
if (this.unsubscribeOpenImporters) {
|
|
272
|
+
this.unsubscribeOpenImporters();
|
|
273
|
+
this.unsubscribeOpenImporters = null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
107
276
|
handleModalClosed() {
|
|
108
|
-
if (this.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
+
}
|
|
117
293
|
if (this.onClose)
|
|
118
294
|
this.onClose();
|
|
119
295
|
if (this.isClosed)
|
|
@@ -121,30 +297,59 @@ export class CSVBoxButtonComponent {
|
|
|
121
297
|
if (this.closed)
|
|
122
298
|
this.closed();
|
|
123
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() {
|
|
309
|
+
if (this.holder) {
|
|
310
|
+
this.holder.style.display = 'none';
|
|
311
|
+
this.holder.style.pointerEvents = 'auto';
|
|
312
|
+
this.holder.remove();
|
|
313
|
+
}
|
|
314
|
+
this.holder = null;
|
|
315
|
+
this.iframe = null;
|
|
316
|
+
this.isModalShown = false;
|
|
317
|
+
this.isIframeLoaded = false;
|
|
318
|
+
this.openModalOnIframeLoad = false;
|
|
319
|
+
this.messageGate.reset();
|
|
320
|
+
this.importTracker.reset();
|
|
321
|
+
// A new iframe is built on the next open, so the origin is learned again.
|
|
322
|
+
this.clearProbeTimer();
|
|
323
|
+
unregisterOpenImporter(this.registryEntry);
|
|
324
|
+
}
|
|
124
325
|
initImporter() {
|
|
125
326
|
if (this.loadStarted)
|
|
126
327
|
this.loadStarted();
|
|
127
328
|
this.uuid = generateUuid();
|
|
329
|
+
this.messageGate.reset();
|
|
330
|
+
this.importTracker.reset();
|
|
128
331
|
insertCSS();
|
|
129
332
|
const iframe = document.createElement("iframe");
|
|
130
333
|
this.iframe = iframe;
|
|
131
334
|
iframe.setAttribute("src", this.safeUrl?.toString() || '');
|
|
335
|
+
iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
|
|
132
336
|
iframe.frameBorder = "0";
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
self.importerReady();
|
|
141
|
-
self.disabled = false;
|
|
142
|
-
self.isIframeLoaded = true;
|
|
143
|
-
if (self.iframe && self.iframe.contentWindow) {
|
|
144
|
-
self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, self.uuid), "*");
|
|
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), "*");
|
|
145
344
|
}
|
|
146
|
-
if (
|
|
147
|
-
|
|
345
|
+
if (this.onReady)
|
|
346
|
+
this.onReady();
|
|
347
|
+
if (this.isReady)
|
|
348
|
+
this.isReady();
|
|
349
|
+
if (this.importerReady)
|
|
350
|
+
this.importerReady();
|
|
351
|
+
if (this.openModalOnIframeLoad) {
|
|
352
|
+
this.openModal();
|
|
148
353
|
}
|
|
149
354
|
};
|
|
150
355
|
this.holder = document.createElement('div');
|
|
@@ -152,8 +357,13 @@ export class CSVBoxButtonComponent {
|
|
|
152
357
|
this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);
|
|
153
358
|
this.holder.appendChild(iframe);
|
|
154
359
|
document.body.insertAdjacentElement('beforeend', this.holder);
|
|
360
|
+
// The holder did not exist yet if openModal() asked for the importer before it was built.
|
|
361
|
+
restackOpenImporters(openImporters());
|
|
155
362
|
}
|
|
156
363
|
openModal() {
|
|
364
|
+
// Counts as open from the moment it is requested, so the other buttons are disabled while
|
|
365
|
+
// this importer is still loading, and so it is stacked above any importer opened earlier.
|
|
366
|
+
registerOpenImporter(this.registryEntry);
|
|
157
367
|
if (!this.iframe) {
|
|
158
368
|
this.openModalOnIframeLoad = true;
|
|
159
369
|
this.initImporter();
|
|
@@ -161,11 +371,36 @@ export class CSVBoxButtonComponent {
|
|
|
161
371
|
}
|
|
162
372
|
if (!this.isModalShown) {
|
|
163
373
|
if (this.isIframeLoaded) {
|
|
164
|
-
this.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
374
|
+
if (this.pendingFile) {
|
|
375
|
+
// The importer opens its own modal once it has the file, so that it can inject on
|
|
376
|
+
// 'shown.bs.modal'. Sending 'openModal' as well would race that.
|
|
377
|
+
//
|
|
378
|
+
// It can also decline: wrong step, an import file URL configured on the sheet, or
|
|
379
|
+
// an importer too old to know the message at all. So the holder goes up
|
|
380
|
+
// click-through and stays that way until 'csvbox-modal-shown' confirms the modal
|
|
381
|
+
// is really up. It covers the viewport at z-index 2147483647 and the importer
|
|
382
|
+
// renders transparent with its modal closed, so arming it on an unanswered message
|
|
383
|
+
// leaves an invisible sheet over the host page eating every click.
|
|
384
|
+
//
|
|
385
|
+
// display:block regardless, so the iframe lays out and animates normally; only
|
|
386
|
+
// pointer-events is held back. isModalShown likewise waits for the confirmation,
|
|
387
|
+
// or a declined file would latch the importer shut for good.
|
|
388
|
+
if (this.holder) {
|
|
389
|
+
this.holder.style.pointerEvents = 'none';
|
|
390
|
+
this.holder.style.display = 'block';
|
|
391
|
+
}
|
|
392
|
+
this.fileSender.send();
|
|
393
|
+
}
|
|
394
|
+
else {
|
|
395
|
+
this.isModalShown = true;
|
|
396
|
+
if (this.holder) {
|
|
397
|
+
// Explicit: a previously declined file leaves the holder click-through.
|
|
398
|
+
this.holder.style.pointerEvents = 'auto';
|
|
399
|
+
this.holder.style.display = 'block';
|
|
400
|
+
}
|
|
401
|
+
if (this.iframe && this.iframe.contentWindow) {
|
|
402
|
+
this.iframe.contentWindow.postMessage('openModal', '*');
|
|
403
|
+
}
|
|
169
404
|
}
|
|
170
405
|
}
|
|
171
406
|
else {
|
|
@@ -173,11 +408,68 @@ export class CSVBoxButtonComponent {
|
|
|
173
408
|
}
|
|
174
409
|
}
|
|
175
410
|
}
|
|
411
|
+
/**
|
|
412
|
+
* Open the importer on a File the host page already has, instead of the file picker.
|
|
413
|
+
*
|
|
414
|
+
* Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
|
|
415
|
+
* or `@ViewChild(CSVBoxButtonComponent)`.
|
|
416
|
+
*
|
|
417
|
+
* The File crosses to the iframe by structured clone, so the importer receives the real
|
|
418
|
+
* object and applies its own extension, worksheet and size rules to it -- this does not
|
|
419
|
+
* bypass any of them. Pass a File; a Blob has no name for the importer to read an
|
|
420
|
+
* extension from.
|
|
421
|
+
*/
|
|
422
|
+
openModalWithFile(file) {
|
|
423
|
+
if (typeof File === 'undefined' || !(file instanceof File)) {
|
|
424
|
+
return;
|
|
425
|
+
}
|
|
426
|
+
this.pendingFile = file;
|
|
427
|
+
// Already open: hand it over now rather than holding it for the next open. The importer
|
|
428
|
+
// takes it only while it is still on the upload step, and ignores it once the user has a
|
|
429
|
+
// dataset and a mapping in progress.
|
|
430
|
+
if (this.isModalShown && this.iframe && this.isIframeLoaded) {
|
|
431
|
+
this.fileSender.send();
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
this.openModal();
|
|
435
|
+
}
|
|
436
|
+
clearProbeTimer() {
|
|
437
|
+
this.clearFileAckTimer();
|
|
438
|
+
this.fileSender.reset();
|
|
439
|
+
}
|
|
440
|
+
startFileAckTimer() {
|
|
441
|
+
this.clearFileAckTimer();
|
|
442
|
+
this.fileAckTimer = setTimeout(() => {
|
|
443
|
+
this.fileAckTimer = null;
|
|
444
|
+
this.giveUpOnFile();
|
|
445
|
+
}, FILE_ACK_TIMEOUT_MS);
|
|
446
|
+
}
|
|
447
|
+
clearFileAckTimer() {
|
|
448
|
+
if (this.fileAckTimer) {
|
|
449
|
+
clearTimeout(this.fileAckTimer);
|
|
450
|
+
this.fileAckTimer = null;
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
|
|
454
|
+
// old to know the message). Without this the holder would stay up, invisible and click-through,
|
|
455
|
+
// and the other instances' buttons would stay disabled for good.
|
|
456
|
+
giveUpOnFile() {
|
|
457
|
+
if (this.isModalShown) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
const holder = this.holder;
|
|
461
|
+
if (holder) {
|
|
462
|
+
holder.style.display = 'none';
|
|
463
|
+
holder.style.pointerEvents = 'auto';
|
|
464
|
+
}
|
|
465
|
+
unregisterOpenImporter(this.registryEntry);
|
|
466
|
+
console.warn("[csvbox] the importer did not respond to the supplied file");
|
|
467
|
+
}
|
|
176
468
|
}
|
|
177
|
-
CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
+
CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
178
470
|
CSVBoxButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CSVBoxButtonComponent, isStandalone: true, selector: "csvbox-button", inputs: { onImport: "onImport", onReady: "onReady", onClose: "onClose", onSubmit: "onSubmit", isImported: "isImported", isReady: "isReady", isClosed: "isClosed", isSubmitted: "isSubmitted", importerReady: "importerReady", closed: "closed", submitted: "submitted", imported: "imported", loadStarted: "loadStarted", user: "user", dynamicColumns: "dynamicColumns", licenseKey: "licenseKey", options: "options", uuid: "uuid", customDomain: "customDomain", dataLocation: "dataLocation", language: "language", environment: "environment", theme: "theme", isIframeLoaded: "isIframeLoaded", openModalOnIframeLoad: "openModalOnIframeLoad", lazy: "lazy", disabled: "disabled" }, usesOnChanges: true, ngImport: i0, template: `
|
|
179
471
|
<div>
|
|
180
|
-
<button [disabled]="disabled" (click)="openModal()" [attr.data-csvbox-token]="uuid">
|
|
472
|
+
<button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
|
|
181
473
|
<ng-content></ng-content>
|
|
182
474
|
</button>
|
|
183
475
|
</div>
|
|
@@ -189,13 +481,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
189
481
|
standalone: true,
|
|
190
482
|
template: `
|
|
191
483
|
<div>
|
|
192
|
-
<button [disabled]="disabled" (click)="openModal()" [attr.data-csvbox-token]="uuid">
|
|
484
|
+
<button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
|
|
193
485
|
<ng-content></ng-content>
|
|
194
486
|
</button>
|
|
195
487
|
</div>
|
|
196
488
|
`
|
|
197
489
|
}]
|
|
198
|
-
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { onImport: [{
|
|
490
|
+
}], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { onImport: [{
|
|
199
491
|
type: Input
|
|
200
492
|
}], onReady: [{
|
|
201
493
|
type: Input
|
|
@@ -250,4 +542,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
250
542
|
}], disabled: [{
|
|
251
543
|
type: Input
|
|
252
544
|
}] } });
|
|
253
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRXZILE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQWM1QixNQUFNLE9BQU8scUJBQXFCO0lBMkNoQyxZQUFtQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBekMxQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQWtCWixTQUFJLEdBQWtDLElBQUksQ0FBQztRQUMzQyxtQkFBYyxHQUFrQyxJQUFJLENBQUM7UUFDckQsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsWUFBTyxHQUFrQyxJQUFJLENBQUM7UUFDOUMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLGdCQUFXLEdBQWtDLElBQUksQ0FBQztRQUVsRCxVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUUvQixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUUvQixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUUv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c0JBQVosS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi91dGlscy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25DbG9zZT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ/OiAobWV0YWRhdGE6IGFueSkgPT4gdm9pZDtcblxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgY2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogKCkgPT4gdm9pZDtcblxuICBASW5wdXQoKSB1c2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjdXN0b21Eb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBTYWZlVXJsIHwgbnVsbCA9IG51bGw7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgaG9sZGVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGNvbnN0IGlmcmFtZVVybCA9IGJ1aWxkSW1wb3J0VXJsKFxuICAgICAge1xuICAgICAgICBsaWNlbnNlS2V5OiB0aGlzLmxpY2Vuc2VLZXksXG4gICAgICAgIGN1c3RvbURvbWFpbjogdGhpcy5jdXN0b21Eb21haW4sXG4gICAgICAgIGRhdGFMb2NhdGlvbjogdGhpcy5kYXRhTG9jYXRpb24sXG4gICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICB0aGVtZTogdGhpcy50aGVtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnRcbiAgICAgIH0sXG4gICAgICBcImFuZ3VsYXJcIixcbiAgICAgIGFwcFZlcnNpb25cbiAgICApO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZShldmVudC5kYXRhLCB0aGlzLnV1aWQpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5zdWNjZXNzKSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtdXBsb2FkLWZhaWxlZFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmw/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcblxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKGJ1aWxkSW5pdFBheWxvYWQoc2VsZi51c2VyLCBzZWxmLmR5bmFtaWNDb2x1bW5zLCBzZWxmLm9wdGlvbnMsIHNlbGYudXVpZCksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gIH1cblxuICBvcGVuTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlmcmFtZSkge1xuICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYgKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ29wZW5Nb2RhbCcsICcqJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
545
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUtoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRXhNLDBGQUEwRjtBQUMxRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQVNqQyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBQ25ELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUUvQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hGLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTTtZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQXdCO0lBQ3BELE1BQU0sR0FBRyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU87SUFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEtBQXdCO0lBQ3RELE1BQU0sR0FBRyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLElBQUksQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPO0lBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0QixvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQUMsS0FBd0I7SUFDdkQsTUFBTSxHQUFHLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFDNUIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUFDLEVBQWM7SUFDNUMsTUFBTSxHQUFHLEdBQUcsYUFBYSxFQUFFLENBQUM7SUFDNUIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkIsT0FBTyxHQUFHLEVBQUU7UUFDVixNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUM7QUFjNUIsTUFBTSxPQUFPLHFCQUFxQjtJQTJDaEMsWUFBbUIsU0FBdUIsRUFBVSxHQUFzQixFQUFVLElBQVk7UUFBN0UsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQXpDaEcsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFrQlosU0FBSSxHQUFrQyxJQUFJLENBQUM7UUFDM0MsbUJBQWMsR0FBa0MsSUFBSSxDQUFDO1FBQ3JELGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBQ2pDLFlBQU8sR0FBa0MsSUFBSSxDQUFDO1FBQzlDLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDbEIsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUNuQyxhQUFRLEdBQWtCLElBQUksQ0FBQztRQUMvQixnQkFBVyxHQUFrQyxJQUFJLENBQUM7UUFFbEQsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFFNUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsMEJBQXFCLEdBQVksS0FBSyxDQUFDO1FBRXZDLFNBQUksR0FBWSxLQUFLLENBQUM7UUFFL0IsWUFBTyxHQUFtQixJQUFJLENBQUM7UUFFL0IsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFFL0IsYUFBUSxHQUFZLElBQUksQ0FBQztRQUlsQyxrRkFBa0Y7UUFDbEYsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFFeEIsZ0JBQVcsR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2xDLGtCQUFhLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztRQUV0QyxrQkFBYSxHQUFzQixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFFcEUsZUFBVSxHQUFHLGdCQUFnQixDQUFDO1lBQ3BDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUM1QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQWM7WUFDbkMsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFzQjtZQUNsRCxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDcEMsUUFBUSxFQUFFLEdBQUcsRUFBRTtnQkFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO2dCQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtTQUN2QyxDQUFDLENBQUM7UUFFSyw2QkFBd0IsR0FBd0IsSUFBSSxDQUFDO1FBRTdELFdBQU0sR0FBMEIsSUFBSSxDQUFDO1FBRXJDLGdCQUFXLEdBQWdCLElBQUksQ0FBQztRQUloQyxzRkFBc0Y7UUFDdEYsZ0ZBQWdGO1FBQ2hGLGVBQVUsR0FBVyxlQUFlLENBQUM7UUFFN0IsaUJBQVksR0FBUSxJQUFJLENBQUM7UUFxQ3pCLG9CQUFlLEdBQUcsQ0FBQyxLQUFtQixFQUFFLEVBQUU7WUFDaEQsK0RBQStEO1lBQy9ELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRCxJQUFJLE1BQU0sRUFBRTtnQkFDVix5RkFBeUY7Z0JBQ3pGLG9GQUFvRjtnQkFDcEYsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDOUQsT0FBTztpQkFDUjtnQkFDRCwwRUFBMEU7Z0JBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFFO29CQUNuQyxPQUFPO2lCQUNSO2dCQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssaUJBQWlCLEVBQUU7b0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUMxQjtxQkFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssa0JBQWtCLEVBQUU7b0JBQzdDLElBQUksSUFBSSxDQUFDLFFBQVE7d0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLENBQUMsVUFBVTt3QkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzQyxJQUFJLElBQUksQ0FBQyxRQUFRO3dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3hDO3FCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7b0JBQ3pDLElBQUksSUFBSSxDQUFDLFFBQVE7d0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDeEMsSUFBSSxJQUFJLENBQUMsVUFBVTt3QkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRO3dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pCLE9BQU87YUFDUjtZQUVELG9GQUFvRjtZQUNwRixrRUFBa0U7WUFDbEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNwRixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFbkMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLDBCQUEwQixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFlBQVksRUFBRTtvQkFDL0UsbUZBQW1GO29CQUNuRixPQUFPO2lCQUNSO2dCQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRTtvQkFDckMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3pCLG9CQUFvQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztvQkFDekMsdUVBQXVFO29CQUN2RSwrRUFBK0U7b0JBQy9FLGlEQUFpRDtvQkFDakQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3pCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTt3QkFDZixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO3dCQUNwQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO3FCQUMxQztvQkFDRCxPQUFPO2lCQUNSO2dCQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3pCLGtGQUFrRjtvQkFDbEYsbUZBQW1GO29CQUNuRiwyRUFBMkU7b0JBQzNFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7d0JBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7d0JBQ3pDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztxQkFDNUM7b0JBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNqRixPQUFPO2lCQUNSO2FBQ0Y7WUFFRCxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNaLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLElBQUksQ0FBQyxXQUFXO29CQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLElBQUksQ0FBQyxTQUFTO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ3REO2lCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRTtnQkFDOUMsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLElBQUksQ0FBQyxVQUFVO29CQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRTtpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQXFCLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2FBQzFCO2lCQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSywwQkFBMEIsRUFBRTtnQkFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUTtvQkFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLElBQUksQ0FBQyxVQUFVO29CQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNDLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QztpQkFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQUU7Z0JBQ2xELElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxJQUFJLENBQUMsVUFBVTtvQkFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekM7WUFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQztJQXRLaUcsQ0FBQztJQXFDcEcsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDM0IsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUM5QjtZQUNFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLEVBQ0QsU0FBUyxFQUNULFVBQVUsQ0FDWCxDQUFDO1FBQ0YseUZBQXlGO1FBQ3pGLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxlQUFlLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsOEJBQThCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUNqSSxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRTtZQUNyRixJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3ZEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQTRCO1FBQzdDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtZQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7Z0JBQ3BDLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDVDtJQUNILENBQUM7SUFrR0Qsa0JBQWtCO1FBQ2hCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHNCQUFzQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRWpGLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1NBQ3ZCO2FBQU07WUFDTCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUNqQixNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUNuQywwRkFBMEY7WUFDMUYsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO2dCQUNqQixJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQztnQkFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1RCwwRkFBMEY7UUFDMUYsK0RBQStEO1FBQy9ELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtZQUNqQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNuQywwRkFBMEY7WUFDMUYscUZBQXFGO1lBQ3JGLGtFQUFrRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7WUFDbkMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsc0JBQXNCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDTCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLHlEQUF5RDtJQUNqRCxZQUFZLENBQUMsS0FBYztRQUNqQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRUQsOEVBQThFO0lBQ3RFLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDdEI7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMzQiwwRUFBMEU7UUFDMUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFekMsSUFBSSxDQUFDLElBQUksR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFM0IsU0FBUyxFQUFFLENBQUM7UUFFWixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0QsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsbUNBQW1DLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUV6QixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztZQUMzQixxRkFBcUY7WUFDckYsd0ZBQXdGO1lBQ3hGLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUN2SDtZQUNELElBQUksSUFBSSxDQUFDLE9BQU87Z0JBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU87Z0JBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRTdDLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO2dCQUM5QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQ3pCLENBQUM7UUFDRiwwRkFBMEY7UUFDMUYsb0JBQW9CLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsU0FBUztRQUNQLDBGQUEwRjtRQUMxRiwwRkFBMEY7UUFDMUYsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztZQUNsQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsT0FBTztTQUNWO1FBQ0QsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBRyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN0QixJQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQ25CLGtGQUFrRjtvQkFDbEYsaUVBQWlFO29CQUNqRSxFQUFFO29CQUNGLGtGQUFrRjtvQkFDbEYsd0VBQXdFO29CQUN4RSxpRkFBaUY7b0JBQ2pGLDhFQUE4RTtvQkFDOUUsbUZBQW1GO29CQUNuRixtRUFBbUU7b0JBQ25FLEVBQUU7b0JBQ0YsK0VBQStFO29CQUMvRSxpRkFBaUY7b0JBQ2pGLDZEQUE2RDtvQkFDN0QsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNkLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7cUJBQ3JDO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7aUJBQ3hCO3FCQUFNO29CQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO29CQUN6QixJQUFHLElBQUksQ0FBQyxNQUFNLEVBQUU7d0JBQ2Qsd0VBQXdFO3dCQUN4RSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDO3dCQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO3FCQUNyQztvQkFDRCxJQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7d0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7cUJBQ3pEO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzthQUNyQztTQUNGO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxpQkFBaUIsQ0FBQyxJQUFVO1FBQzFCLElBQUcsT0FBTyxJQUFJLEtBQUssV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7WUFDekQsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFFeEIsd0ZBQXdGO1FBQ3hGLHlGQUF5RjtRQUN6RixxQ0FBcUM7UUFDckMsSUFBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztJQUVELG1HQUFtRztJQUNuRyxnR0FBZ0c7SUFDaEcsaUVBQWlFO0lBQ2pFLFlBQVk7UUFDVixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMzQixJQUFJLE1BQU0sRUFBRTtZQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7U0FDckM7UUFDRCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0lBQzdFLENBQUM7O2tIQWhjVSxxQkFBcUI7c0dBQXJCLHFCQUFxQiwwdkJBVHRCOzs7Ozs7R0FNVDsyRkFHVSxxQkFBcUI7a0JBWmpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUU7Ozs7OztHQU1UO2lCQUNGO3dKQU1VLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQU1HLFFBQVE7c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgU2VjdXJpdHlDb250ZXh0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBPbkRlc3Ryb3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBOZ1pvbmVcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi91dGlscy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY3JlYXRlTWVzc2FnZUdhdGUsIGNyZWF0ZUltcG9ydFRyYWNrZXIsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+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==
|