parse-server 4.10.10 → 4.10.13
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.
|
@@ -20,6 +20,14 @@ const crypto = require('crypto');
|
|
|
20
20
|
|
|
21
21
|
const https = require('https');
|
|
22
22
|
|
|
23
|
+
const {
|
|
24
|
+
pki
|
|
25
|
+
} = require('node-forge');
|
|
26
|
+
|
|
27
|
+
const ca = {
|
|
28
|
+
cert: null,
|
|
29
|
+
url: null
|
|
30
|
+
};
|
|
23
31
|
const cache = {}; // (publicKey -> cert) cache
|
|
24
32
|
|
|
25
33
|
function verifyPublicKeyUrl(publicKeyUrl) {
|
|
@@ -54,34 +62,60 @@ async function getAppleCertificate(publicKeyUrl) {
|
|
|
54
62
|
path: url.pathname,
|
|
55
63
|
method: 'HEAD'
|
|
56
64
|
};
|
|
57
|
-
const
|
|
65
|
+
const cert_headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
|
|
66
|
+
const validContentTypes = ['application/x-x509-ca-cert', 'application/pkix-cert'];
|
|
58
67
|
|
|
59
|
-
if (
|
|
68
|
+
if (!validContentTypes.includes(cert_headers['content-type']) || cert_headers['content-length'] == null || cert_headers['content-length'] > 10000) {
|
|
60
69
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
61
70
|
}
|
|
62
71
|
|
|
72
|
+
const {
|
|
73
|
+
certificate,
|
|
74
|
+
headers
|
|
75
|
+
} = await getCertificate(publicKeyUrl);
|
|
76
|
+
|
|
77
|
+
if (headers['cache-control']) {
|
|
78
|
+
const expire = headers['cache-control'].match(/max-age=([0-9]+)/);
|
|
79
|
+
|
|
80
|
+
if (expire) {
|
|
81
|
+
cache[publicKeyUrl] = certificate; // we'll expire the cache entry later, as per max-age
|
|
82
|
+
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
delete cache[publicKeyUrl];
|
|
85
|
+
}, parseInt(expire[1], 10) * 1000);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return verifyPublicKeyIssuer(certificate, publicKeyUrl);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getCertificate(url, buffer) {
|
|
63
93
|
return new Promise((resolve, reject) => {
|
|
64
|
-
https.get(
|
|
65
|
-
|
|
94
|
+
https.get(url, res => {
|
|
95
|
+
const data = [];
|
|
66
96
|
res.on('data', chunk => {
|
|
67
|
-
data
|
|
97
|
+
data.push(chunk);
|
|
68
98
|
});
|
|
69
99
|
res.on('end', () => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
100
|
+
if (buffer) {
|
|
101
|
+
resolve({
|
|
102
|
+
certificate: Buffer.concat(data),
|
|
103
|
+
headers: res.headers
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
74
107
|
|
|
75
|
-
|
|
76
|
-
cache[publicKeyUrl] = cert; // we'll expire the cache entry later, as per max-age
|
|
108
|
+
let cert = '';
|
|
77
109
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}, parseInt(expire[1], 10) * 1000);
|
|
81
|
-
}
|
|
110
|
+
for (const chunk of data) {
|
|
111
|
+
cert += chunk.toString('base64');
|
|
82
112
|
}
|
|
83
113
|
|
|
84
|
-
|
|
114
|
+
const certificate = convertX509CertToPEM(cert);
|
|
115
|
+
resolve({
|
|
116
|
+
certificate,
|
|
117
|
+
headers: res.headers
|
|
118
|
+
});
|
|
85
119
|
});
|
|
86
120
|
}).on('error', reject);
|
|
87
121
|
});
|
|
@@ -106,6 +140,24 @@ function verifySignature(publicKey, authData) {
|
|
|
106
140
|
if (!verifier.verify(publicKey, authData.signature, 'base64')) {
|
|
107
141
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
|
|
108
142
|
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function verifyPublicKeyIssuer(cert, publicKeyUrl) {
|
|
146
|
+
const publicKeyCert = pki.certificateFromPem(cert);
|
|
147
|
+
|
|
148
|
+
if (!ca.cert) {
|
|
149
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
if (!ca.cert.verify(publicKeyCert)) {
|
|
154
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
155
|
+
}
|
|
156
|
+
} catch (e) {
|
|
157
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return cert;
|
|
109
161
|
} // Returns a promise that fulfills if this user id is valid.
|
|
110
162
|
|
|
111
163
|
|
|
@@ -120,12 +172,31 @@ async function validateAuthData(authData) {
|
|
|
120
172
|
} // Returns a promise that fulfills if this app id is valid.
|
|
121
173
|
|
|
122
174
|
|
|
123
|
-
function validateAppId() {
|
|
124
|
-
|
|
175
|
+
async function validateAppId(appIds, authData, options = {}) {
|
|
176
|
+
if (!options.rootCertificateUrl) {
|
|
177
|
+
options.rootCertificateUrl = 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (ca.url === options.rootCertificateUrl) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const {
|
|
185
|
+
certificate,
|
|
186
|
+
headers
|
|
187
|
+
} = await getCertificate(options.rootCertificateUrl, true);
|
|
188
|
+
|
|
189
|
+
if (headers['content-type'] !== 'application/x-pem-file' || headers['content-length'] == null || headers['content-length'] > 10000) {
|
|
190
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
ca.cert = pki.certificateFromPem(certificate);
|
|
194
|
+
ca.url = options.rootCertificateUrl;
|
|
125
195
|
}
|
|
126
196
|
|
|
127
197
|
module.exports = {
|
|
128
198
|
validateAppId,
|
|
129
|
-
validateAuthData
|
|
199
|
+
validateAuthData,
|
|
200
|
+
cache
|
|
130
201
|
};
|
|
131
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ1cmwiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiaGVhZGVycyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwib24iLCJkYXRhIiwiY2h1bmsiLCJ0b1N0cmluZyIsImNlcnQiLCJleHBpcmUiLCJzZXRUaW1lb3V0IiwicGFyc2VJbnQiLCJjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4iLCJ0aW1lc3RhbXAiLCJidWZmZXIiLCJCdWZmZXIiLCJhbGxvYyIsImhpZ2giLCJsb3ciLCJ3cml0ZVVJbnQzMkJFIiwidmVyaWZ5U2lnbmF0dXJlIiwicHVibGljS2V5IiwiYXV0aERhdGEiLCJ2ZXJpZmllciIsImNyZWF0ZVZlcmlmeSIsInVwZGF0ZSIsInBsYXllcklkIiwiYnVuZGxlSWQiLCJzYWx0IiwidmVyaWZ5Iiwic2lnbmF0dXJlIiwidmFsaWRhdGVBdXRoRGF0YSIsImlkIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7Ozs7Ozs7OztBQWFBLE1BQU07QUFBRUEsRUFBQUE7QUFBRixJQUFZQyxPQUFPLENBQUMsWUFBRCxDQUF6Qjs7QUFDQSxNQUFNQyxNQUFNLEdB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QixTQUFPbEMsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDRDs7QUFFRGtDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmRixFQUFBQSxhQURlO0FBRWZGLEVBQUFBO0FBRmUsQ0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBBcHBsZSBHYW1lIENlbnRlciBBdXRoXG5odHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9nYW1la2l0L2drbG9jYWxwbGF5ZXIvMTUxNTQwNy1nZW5lcmF0ZWlkZW50aXR5dmVyaWZpY2F0aW9uc2lnbiNkaXNjdXNzaW9uXG5cbmNvbnN0IGF1dGhEYXRhID0ge1xuICBwdWJsaWNLZXlVcmw6ICdodHRwczovL3ZhbGlkLmFwcGxlLmNvbS9wdWJsaWMvdGltZW91dC5jZXInLFxuICB0aW1lc3RhbXA6IDE0NjA5ODE0MjEzMDMsXG4gIHNpZ25hdHVyZTogJ1BvRHdmMzlEQ040NjRCNDlqSkNVMGQ5WTBKJyxcbiAgc2FsdDogJ3NhbHRTVD09JyxcbiAgYnVuZGxlSWQ6ICdjb20udmFsaWQuYXBwJ1xuICBpZDogJ3BsYXllcklkJyxcbn07XG4qL1xuXG5jb25zdCB7IFBhcnNlIH0gPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcblxuY29uc3QgY2FjaGUgPSB7fTsgLy8gKHB1YmxpY0tleSAtPiBjZXJ0KSBjYWNoZVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnZXggPSAvXmh0dHBzOlxcL1xcLyg/OlstX0EtWmEtejAtOV0rXFwuKXswLH1hcHBsZVxcLmNvbVxcLy4qXFwuY2VyJC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocHVibGljS2V5VXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocHVibGljS2V5VXJsKTtcbiAgY29uc3QgaGVhZE9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgbWV0aG9kOiAnSEVBRCcsXG4gIH07XG4gIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIGh0dHBzLmdldChoZWFkT3B0aW9ucywgcmVzID0+IHJlc29sdmUocmVzLmhlYWRlcnMpKS5vbignZXJyb3InLCByZWplY3QpXG4gICk7XG4gIGlmIChcbiAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ2FwcGxpY2F0aW9uL3BraXgtY2VydCcgfHxcbiAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09IG51bGwgfHxcbiAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID4gMTAwMDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGh0dHBzXG4gICAgICAuZ2V0KHB1YmxpY0tleVVybCwgcmVzID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2VydCA9IGNvbnZlcnRYNTA5Q2VydFRvUEVNKGRhdGEpO1xuICAgICAgICAgIGlmIChyZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgICAgICAgICB2YXIgZXhwaXJlID0gcmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXS5tYXRjaCgvbWF4LWFnZT0oWzAtOV0rKS8pO1xuICAgICAgICAgICAgaWYgKGV4cGlyZSkge1xuICAgICAgICAgICAgICBjYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydDtcbiAgICAgICAgICAgICAgLy8gd2UnbGwgZXhwaXJlIHRoZSBjYWNoZSBlbnRyeSBsYXRlciwgYXMgcGVyIG1heC1hZ2VcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlW3B1YmxpY0tleVVybF07XG4gICAgICAgICAgICAgIH0sIHBhcnNlSW50KGV4cGlyZVsxXSwgMTApICogMTAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoY2VydCk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKHRpbWVzdGFtcCkge1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG5cbiAgY29uc3QgaGlnaCA9IH5+KHRpbWVzdGFtcCAvIDB4ZmZmZmZmZmYpO1xuICBjb25zdCBsb3cgPSB0aW1lc3RhbXAgJSAoMHhmZmZmZmZmZiArIDB4MSk7XG5cbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQoaGlnaCwgMTApLCAwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQobG93LCAxMCksIDQpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKSB7XG4gIGNvbnN0IHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnc2hhMjU2Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5wbGF5ZXJJZCwgJ3V0ZjgnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLmJ1bmRsZUlkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKGF1dGhEYXRhLnRpbWVzdGFtcCkpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuc2FsdCwgJ2Jhc2U2NCcpO1xuXG4gIGlmICghdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgYXV0aERhdGEuc2lnbmF0dXJlLCAnYmFzZTY0JykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgaWYgKCFhdXRoRGF0YS5pZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBhdXRoRGF0YSBpZCBtaXNzaW5nJyk7XG4gIH1cbiAgYXV0aERhdGEucGxheWVySWQgPSBhdXRoRGF0YS5pZDtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXX0=
|
|
202
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJwa2kiLCJjYSIsImNlcnQiLCJ1cmwiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiY2VydF9oZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJoZWFkZXJzIiwib24iLCJ2YWxpZENvbnRlbnRUeXBlcyIsImluY2x1ZGVzIiwiY2VydGlmaWNhdGUiLCJnZXRDZXJ0aWZpY2F0ZSIsImV4cGlyZSIsInNldFRpbWVvdXQiLCJwYXJzZUludCIsInZlcmlmeVB1YmxpY0tleUlzc3VlciIsImJ1ZmZlciIsImRhdGEiLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsImFsbG9jIiwiaGlnaCIsImxvdyIsIndyaXRlVUludDMyQkUiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwdWJsaWNLZXkiLCJhdXRoRGF0YSIsInZlcmlmaWVyIiwiY3JlYXRlVmVyaWZ5IiwidXBkYXRlIiwicGxheWVySWQiLCJidW5kbGVJZCIsInNhbHQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJwdWJsaWNLZXlDZXJ0IiwiY2VydGlmaWNhdGVGcm9tUGVtIiwiZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJvcHRpb25zIiwicm9vdENlcnRpZmljYXRlVXJsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7Ozs7O0FBYUEsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQVlDLE9BQU8sQ0FBQyxZQUFELENBQXpCOztBQUNBLE1BQU1DLE1BQU0sR0FBR0QsT0FBTyxDQUFDLFFBQUQsQ0FBdEI7O0FBQ0EsTUFBTUUsS0FBSyxHQUFHRixPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxNQUFNO0FBQUVHLEVBQUFBO0FBQUYsSUFBVUgsT0FBTyxDQUFDLFlBQUQsQ0FBdkI7O0FBQ0EsTUFBTUksRUFBRSxHQUFHO0FBQUVDLEVBQUFBLElBQUksRUFBRSxJQUFSO0FBQWNDLEVBQUFBLEdBQUcsRUFBRTtBQUFuQixDQUFYO0FBQ0EsTUFBTUMsS0FBSyxHQUFHLEVBQWQsQyxDQUFrQjs7QUFFbEIsU0FBU0Msa0JBQVQsQ0FBNEJDLFlBQTVCLEVBQTBDO0FBQ3hDLE1BQUk7QUFDRixVQUFNQyxLQUFLLEdBQUcseURBQWQ7QUFDQSxXQUFPQSxLQUFLLENBQUNDLElBQU4sQ0FBV0YsWUFBWCxDQUFQO0FBQ0QsR0FIRCxDQUdFLE9BQU9HLEtBQVAsRUFBYztBQUNkLFdBQU8sS0FBUDtBQUNEO0FBQ0Y7O0FBRUQsU0FBU0Msb0JBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDO0FBQ3RDLFFBQU1DLFNBQVMsR0FBRywrQkFBbEI7QUFDQSxRQUFNQyxVQUFVLEdBQUcsMkJBQW5CO0FBRUEsUUFBTUMsTUFBTSxHQUFHSCxRQUFmO0FBQ0EsUUFBTUksUUFBUSxHQUFHRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxJQUFJQyxNQUFKLENBQVcsU0FBWCxFQUFzQixHQUF0QixDQUFiLEVBQXlDQyxJQUF6QyxDQUE4QyxJQUE5QyxDQUFqQjtBQUVBLFNBQU9OLFNBQVMsR0FBR0csUUFBWixHQUF1QkYsVUFBOUI7QUFD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RUFBNkIsSUFBN0IsQ0FBckQ7O0FBQ0EsTUFDRTFDLE9BQU8sQ0FBQyxjQUFELENBQVAsS0FBNEIsd0JBQTVCLElBQ0FBLE9BQU8sQ0FBQyxnQkFBRCxDQUFQLElBQTZCLElBRDdCLElBRUFBLE9BQU8sQ0FBQyxnQkFBRCxDQUFQLEdBQTRCLEtBSDlCLEVBSUU7QUFDQSxVQUFNLElBQUl0QyxLQUFLLENBQUN3QixLQUFWLENBQ0p4QixLQUFLLENBQUN3QixLQUFOLENBQVlDLGdCQURSLEVBRUosMkVBRkksQ0FBTjtBQUlEOztBQUNEcEIsRUFBQUEsRUFBRSxDQUFDQyxJQUFILEdBQVVGLEdBQUcsQ0FBQ3FFLGtCQUFKLENBQXVCL0IsV0FBdkIsQ0FBVjtBQUNBckMsRUFBQUEsRUFBRSxDQUFDRSxHQUFILEdBQVN3RSxPQUFPLENBQUNDLGtCQUFqQjtBQUNEOztBQUVEQyxNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZkwsRUFBQUEsYUFEZTtBQUVmRixFQUFBQSxnQkFGZTtBQUdmbkUsRUFBQUE7QUFIZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEFwcGxlIEdhbWUgQ2VudGVyIEF1dGhcbmh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL2dhbWVraXQvZ2tsb2NhbHBsYXllci8xNTE1NDA3LWdlbmVyYXRlaWRlbnRpdHl2ZXJpZmljYXRpb25zaWduI2Rpc2N1c3Npb25cblxuY29uc3QgYXV0aERhdGEgPSB7XG4gIHB1YmxpY0tleVVybDogJ2h0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlcicsXG4gIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAgc2lnbmF0dXJlOiAnUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEonLFxuICBzYWx0OiAnc2FsdFNUPT0nLFxuICBidW5kbGVJZDogJ2NvbS52YWxpZC5hcHAnXG4gIGlkOiAncGxheWVySWQnLFxufTtcbiovXG5cbmNvbnN0IHsgUGFyc2UgfSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuY29uc3QgeyBwa2kgfSA9IHJlcXVpcmUoJ25vZGUtZm9yZ2UnKTtcbmNvbnN0IGNhID0geyBjZXJ0OiBudWxsLCB1cmw6IG51bGwgfTtcbmNvbnN0IGNhY2hlID0ge307IC8vIChwdWJsaWNLZXkgLT4gY2VydCkgY2FjaGVcblxuZnVuY3Rpb24gdmVyaWZ5UHVibGljS2V5VXJsKHB1YmxpY0tleVVybCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15odHRwczpcXC9cXC8oPzpbLV9BLVphLXowLTldK1xcLil7MCx9YXBwbGVcXC5jb21cXC8uKlxcLmNlciQvO1xuICAgIHJldHVybiByZWdleC50ZXN0KHB1YmxpY0tleVVybCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRYNTA5Q2VydFRvUEVNKFg1MDlDZXJ0KSB7XG4gIGNvbnN0IHBlbVByZUZpeCA9ICctLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cXG4nO1xuICBjb25zdCBwZW1Qb3N0Rml4ID0gJy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0nO1xuXG4gIGNvbnN0IGJhc2U2NCA9IFg1MDlDZXJ0O1xuICBjb25zdCBjZXJ0Qm9keSA9IGJhc2U2NC5tYXRjaChuZXcgUmVnRXhwKCcuezAsNjR9JywgJ2cnKSkuam9pbignXFxuJyk7XG5cbiAgcmV0dXJuIHBlbVByZUZpeCArIGNlcnRCb2R5ICsgcGVtUG9zdEZpeDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QXBwbGVDZXJ0aWZpY2F0ZShwdWJsaWNLZXlVcmwpIHtcbiAgaWYgKCF2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YFxuICAgICk7XG4gIH1cbiAgaWYgKGNhY2hlW3B1YmxpY0tleVVybF0pIHtcbiAgICByZXR1cm4gY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgfVxuICBjb25zdCB1cmwgPSBuZXcgVVJMKHB1YmxpY0tleVVybCk7XG4gIGNvbnN0IGhlYWRPcHRpb25zID0ge1xuICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgIG1ldGhvZDogJ0hFQUQnLFxuICB9O1xuICBjb25zdCBjZXJ0X2hlYWRlcnMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgIGh0dHBzLmdldChoZWFkT3B0aW9ucywgcmVzID0+IHJlc29sdmUocmVzLmhlYWRlcnMpKS5vbignZXJyb3InLCByZWplY3QpXG4gICk7XG4gIGNvbnN0IHZhbGlkQ29udGVudFR5cGVzID0gWydhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydCcsICdhcHBsaWNhdGlvbi9wa2l4LWNlcnQnXTtcbiAgaWYgKFxuICAgICF2YWxpZENvbnRlbnRUeXBlcy5pbmNsdWRlcyhjZXJ0X2hlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKSB8fFxuICAgIGNlcnRfaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PSBudWxsIHx8XG4gICAgY2VydF9oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID4gMTAwMDBcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCBnZXRDZXJ0aWZpY2F0ZShwdWJsaWNLZXlVcmwpO1xuICBpZiAoaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgY29uc3QgZXhwaXJlID0gaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG4gICAgaWYgKGV4cGlyZSkge1xuICAgICAgY2FjaGVbcHVibGljS2V5VXJsXSA9IGNlcnRpZmljYXRlO1xuICAgICAgLy8gd2UnbGwgZXhwaXJlIHRoZSBjYWNoZSBlbnRyeSBsYXRlciwgYXMgcGVyIG1heC1hZ2VcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkZWxldGUgY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICAgIH0sIHBhcnNlSW50KGV4cGlyZVsxXSwgMTApICogMTAwMCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB2ZXJpZnlQdWJsaWNLZXlJc3N1ZXIoY2VydGlmaWNhdGUsIHB1YmxpY0tleVVybCk7XG59XG5cbmZ1bmN0aW9uIGdldENlcnRpZmljYXRlKHVybCwgYnVmZmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQodXJsLCByZXMgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gW107XG4gICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICBkYXRhLnB1c2goY2h1bmspO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGJ1ZmZlcikge1xuICAgICAgICAgICAgcmVzb2x2ZSh7IGNlcnRpZmljYXRlOiBCdWZmZXIuY29uY2F0KGRhdGEpLCBoZWFkZXJzOiByZXMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGNlcnQgPSAnJztcbiAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGRhdGEpIHtcbiAgICAgICAgICAgIGNlcnQgKz0gY2h1bmsudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZSA9IGNvbnZlcnRYNTA5Q2VydFRvUEVNKGNlcnQpO1xuICAgICAgICAgIHJlc29sdmUoeyBjZXJ0aWZpY2F0ZSwgaGVhZGVyczogcmVzLmhlYWRlcnMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5vbignZXJyb3InLCByZWplY3QpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKHRpbWVzdGFtcCkge1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuYWxsb2MoOCk7XG5cbiAgY29uc3QgaGlnaCA9IH5+KHRpbWVzdGFtcCAvIDB4ZmZmZmZmZmYpO1xuICBjb25zdCBsb3cgPSB0aW1lc3RhbXAgJSAoMHhmZmZmZmZmZiArIDB4MSk7XG5cbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQoaGlnaCwgMTApLCAwKTtcbiAgYnVmZmVyLndyaXRlVUludDMyQkUocGFyc2VJbnQobG93LCAxMCksIDQpO1xuXG4gIHJldHVybiBidWZmZXI7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKSB7XG4gIGNvbnN0IHZlcmlmaWVyID0gY3J5cHRvLmNyZWF0ZVZlcmlmeSgnc2hhMjU2Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5wbGF5ZXJJZCwgJ3V0ZjgnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLmJ1bmRsZUlkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuKGF1dGhEYXRhLnRpbWVzdGFtcCkpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuc2FsdCwgJ2Jhc2U2NCcpO1xuXG4gIGlmICghdmVyaWZpZXIudmVyaWZ5KHB1YmxpY0tleSwgYXV0aERhdGEuc2lnbmF0dXJlLCAnYmFzZTY0JykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBzaWduYXR1cmUnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlJc3N1ZXIoY2VydCwgcHVibGljS2V5VXJsKSB7XG4gIGNvbnN0IHB1YmxpY0tleUNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnQpO1xuICBpZiAoIWNhLmNlcnQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0FwcGxlIEdhbWUgQ2VudGVyIGF1dGggYWRhcHRlciBwYXJhbWV0ZXIgYHJvb3RDZXJ0aWZpY2F0ZVVSTGAgaXMgaW52YWxpZC4nXG4gICAgKTtcbiAgfVxuICB0cnkge1xuICAgIGlmICghY2EuY2VydC52ZXJpZnkocHVibGljS2V5Q2VydCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2VydDtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhKSB7XG4gIGlmICghYXV0aERhdGEuaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0FwcGxlIEdhbWUgQ2VudGVyIC0gYXV0aERhdGEgaWQgbWlzc2luZycpO1xuICB9XG4gIGF1dGhEYXRhLnBsYXllcklkID0gYXV0aERhdGEuaWQ7XG4gIGNvbnN0IHB1YmxpY0tleSA9IGF3YWl0IGdldEFwcGxlQ2VydGlmaWNhdGUoYXV0aERhdGEucHVibGljS2V5VXJsKTtcbiAgcmV0dXJuIHZlcmlmeVNpZ25hdHVyZShwdWJsaWNLZXksIGF1dGhEYXRhKTtcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIGFwcCBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXBwSWQoYXBwSWRzLCBhdXRoRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGlmICghb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwpIHtcbiAgICBvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCA9XG4gICAgICAnaHR0cHM6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0LnBlbSc7XG4gIH1cbiAgaWYgKGNhLnVybCA9PT0gb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgeyBjZXJ0aWZpY2F0ZSwgaGVhZGVycyB9ID0gYXdhaXQgZ2V0Q2VydGlmaWNhdGUob3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmwsIHRydWUpO1xuICBpZiAoXG4gICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gIT09ICdhcHBsaWNhdGlvbi94LXBlbS1maWxlJyB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPT0gbnVsbCB8fFxuICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0FwcGxlIEdhbWUgQ2VudGVyIGF1dGggYWRhcHRlciBwYXJhbWV0ZXIgYHJvb3RDZXJ0aWZpY2F0ZVVSTGAgaXMgaW52YWxpZC4nXG4gICAgKTtcbiAgfVxuICBjYS5jZXJ0ID0gcGtpLmNlcnRpZmljYXRlRnJvbVBlbShjZXJ0aWZpY2F0ZSk7XG4gIGNhLnVybCA9IG9wdGlvbnMucm9vdENlcnRpZmljYXRlVXJsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YSxcbiAgY2FjaGUsXG59O1xuIl19
|