@cloudbase/auth 2.23.4-alpha.0 → 2.24.0

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.
@@ -0,0 +1,1515 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __rest = (this && this.__rest) || function (s, e) {
50
+ var t = {};
51
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
52
+ t[p] = s[p];
53
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
54
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
55
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
56
+ t[p[i]] = s[p[i]];
57
+ }
58
+ return t;
59
+ };
60
+ Object.defineProperty(exports, "__esModule", { value: true });
61
+ exports.SbaseApi = exports.isBrowser = void 0;
62
+ var oauth_1 = require("@cloudbase/oauth");
63
+ var _1 = require(".");
64
+ var utils_1 = require("./utils");
65
+ var utilities_1 = require("@cloudbase/utilities");
66
+ var utilities_2 = require("./utilities");
67
+ var isBrowser = function () { return typeof window !== 'undefined' && typeof document !== 'undefined'; };
68
+ exports.isBrowser = isBrowser;
69
+ var SbaseApi = (function () {
70
+ function SbaseApi(config) {
71
+ this.listeners = new Map();
72
+ this.hasListenerSetUp = false;
73
+ this.config = config;
74
+ this.oauthInstance = config.oauthInstance;
75
+ this.cache = config.cache;
76
+ this.init();
77
+ }
78
+ Object.defineProperty(SbaseApi.prototype, "currentUser", {
79
+ get: function () {
80
+ var loginState = this.hasLoginState();
81
+ if (loginState) {
82
+ return loginState.user || null;
83
+ }
84
+ return null;
85
+ },
86
+ enumerable: false,
87
+ configurable: true
88
+ });
89
+ SbaseApi.prototype.hasLoginState = function () {
90
+ throw new Error('Auth.hasLoginState() is not implemented');
91
+ };
92
+ SbaseApi.prototype.setAccessKey = function () {
93
+ return __awaiter(this, void 0, void 0, function () {
94
+ return __generator(this, function (_a) {
95
+ throw new Error('Auth.setAccessKey() is not implemented');
96
+ });
97
+ });
98
+ };
99
+ SbaseApi.prototype.signIn = function (_params) {
100
+ return __awaiter(this, void 0, void 0, function () {
101
+ return __generator(this, function (_a) {
102
+ throw new Error('Auth.signIn() is not implemented');
103
+ });
104
+ });
105
+ };
106
+ SbaseApi.prototype.signInWithProvider = function (_params) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ return __generator(this, function (_a) {
109
+ throw new Error('Auth.signInWithProvider() is not implemented');
110
+ });
111
+ });
112
+ };
113
+ SbaseApi.prototype.genProviderRedirectUri = function (_params) {
114
+ return __awaiter(this, void 0, void 0, function () {
115
+ return __generator(this, function (_a) {
116
+ throw new Error('Auth.genProviderRedirectUri() is not implemented');
117
+ });
118
+ });
119
+ };
120
+ SbaseApi.prototype.getAccessToken = function () {
121
+ return __awaiter(this, void 0, void 0, function () {
122
+ return __generator(this, function (_a) {
123
+ throw new Error('Auth.getAccessToken() is not implemented');
124
+ });
125
+ });
126
+ };
127
+ SbaseApi.prototype.getUserInfo = function () {
128
+ return __awaiter(this, void 0, void 0, function () {
129
+ return __generator(this, function (_a) {
130
+ throw new Error('Auth.getUserInfo() is not implemented');
131
+ });
132
+ });
133
+ };
134
+ SbaseApi.prototype.updateUserBasicInfo = function (_params) {
135
+ return __awaiter(this, void 0, void 0, function () {
136
+ return __generator(this, function (_a) {
137
+ throw new Error('Auth.updateUserBasicInfo() is not implemented');
138
+ });
139
+ });
140
+ };
141
+ SbaseApi.prototype.setCustomSignFunc = function (_getTickFn) {
142
+ throw new Error('Auth.setCustomSignFunc() is not implemented');
143
+ };
144
+ SbaseApi.prototype.grantProviderToken = function (_params) {
145
+ return __awaiter(this, void 0, void 0, function () {
146
+ return __generator(this, function (_a) {
147
+ throw new Error('Auth.grantProviderToken() is not implemented');
148
+ });
149
+ });
150
+ };
151
+ SbaseApi.prototype.bindWithProvider = function (_params) {
152
+ return __awaiter(this, void 0, void 0, function () {
153
+ return __generator(this, function (_a) {
154
+ throw new Error('Auth.bindWithProvider() is not implemented');
155
+ });
156
+ });
157
+ };
158
+ SbaseApi.prototype.signInWithUsername = function (_params) {
159
+ return __awaiter(this, void 0, void 0, function () {
160
+ return __generator(this, function (_a) {
161
+ throw new Error('Auth.signInWithUsername() is not implemented');
162
+ });
163
+ });
164
+ };
165
+ SbaseApi.prototype.getVerification = function (_params, _options) {
166
+ return __awaiter(this, void 0, void 0, function () {
167
+ return __generator(this, function (_a) {
168
+ throw new Error('Auth.getVerification() is not implemented');
169
+ });
170
+ });
171
+ };
172
+ SbaseApi.prototype.createLoginState = function (_params, _options) {
173
+ return __awaiter(this, void 0, void 0, function () {
174
+ return __generator(this, function (_a) {
175
+ throw new Error('Auth.createLoginState() is not implemented');
176
+ });
177
+ });
178
+ };
179
+ SbaseApi.prototype.verify = function (_params) {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ return __generator(this, function (_a) {
182
+ throw new Error('Auth.verify() is not implemented');
183
+ });
184
+ });
185
+ };
186
+ SbaseApi.prototype.signInAnonymously = function (params) {
187
+ return __awaiter(this, void 0, void 0, function () {
188
+ var loginState, _a, _b, session, error_1;
189
+ return __generator(this, function (_c) {
190
+ switch (_c.label) {
191
+ case 0:
192
+ _c.trys.push([0, 4, , 5]);
193
+ return [4, this.oauthInstance.authApi.signInAnonymously(params)];
194
+ case 1:
195
+ _c.sent();
196
+ return [4, this.createLoginState()];
197
+ case 2:
198
+ loginState = _c.sent();
199
+ return [4, this.getSession()];
200
+ case 3:
201
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
202
+ return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
203
+ case 4:
204
+ error_1 = _c.sent();
205
+ return [2, { data: {}, error: new oauth_1.AuthError(error_1) }];
206
+ case 5: return [2];
207
+ }
208
+ });
209
+ });
210
+ };
211
+ SbaseApi.prototype.signUp = function (params) {
212
+ return __awaiter(this, void 0, void 0, function () {
213
+ var verificationInfo_1, error_2;
214
+ var _this = this;
215
+ return __generator(this, function (_a) {
216
+ switch (_a.label) {
217
+ case 0:
218
+ _a.trys.push([0, 2, , 3]);
219
+ this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
220
+ return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
221
+ case 1:
222
+ verificationInfo_1 = _a.sent();
223
+ return [2, {
224
+ data: {
225
+ verifyOtp: function (_a) {
226
+ var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_1.verification_id : _b;
227
+ return __awaiter(_this, void 0, void 0, function () {
228
+ var verificationTokenRes, data, _c, _d, session, error_3;
229
+ return __generator(this, function (_e) {
230
+ switch (_e.label) {
231
+ case 0:
232
+ _e.trys.push([0, 8, , 9]);
233
+ return [4, this.verify({
234
+ verification_id: messageId || verificationInfo_1.verification_id,
235
+ verification_code: token,
236
+ })];
237
+ case 1:
238
+ verificationTokenRes = _e.sent();
239
+ if (!verificationInfo_1.is_user) return [3, 3];
240
+ return [4, this.signIn({
241
+ username: params.email || this.formatPhone(params.phone),
242
+ verification_token: verificationTokenRes.verification_token,
243
+ })];
244
+ case 2:
245
+ _e.sent();
246
+ return [3, 6];
247
+ case 3:
248
+ data = JSON.parse(JSON.stringify(params));
249
+ delete data.email;
250
+ delete data.phone;
251
+ return [4, this.oauthInstance.authApi.signUp(__assign(__assign(__assign({}, data), (params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })), { verification_token: verificationTokenRes.verification_token, verification_code: token }))];
252
+ case 4:
253
+ _e.sent();
254
+ return [4, this.createLoginState()];
255
+ case 5:
256
+ _e.sent();
257
+ _e.label = 6;
258
+ case 6: return [4, this.getSession()];
259
+ case 7:
260
+ _c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
261
+ return [2, { data: { user: session.user, session: session }, error: null }];
262
+ case 8:
263
+ error_3 = _e.sent();
264
+ return [2, { data: {}, error: new oauth_1.AuthError(error_3) }];
265
+ case 9: return [2];
266
+ }
267
+ });
268
+ });
269
+ },
270
+ },
271
+ error: null,
272
+ }];
273
+ case 2:
274
+ error_2 = _a.sent();
275
+ return [2, { data: {}, error: new oauth_1.AuthError(error_2) }];
276
+ case 3: return [2];
277
+ }
278
+ });
279
+ });
280
+ };
281
+ SbaseApi.prototype.signOut = function (params) {
282
+ return __awaiter(this, void 0, void 0, function () {
283
+ var userInfoKey, res, error_4;
284
+ return __generator(this, function (_a) {
285
+ switch (_a.label) {
286
+ case 0:
287
+ _a.trys.push([0, 3, , 4]);
288
+ userInfoKey = this.cache.keys.userInfoKey;
289
+ return [4, this.oauthInstance.authApi.signOut(params)];
290
+ case 1:
291
+ res = _a.sent();
292
+ return [4, this.cache.removeStoreAsync(userInfoKey)];
293
+ case 2:
294
+ _a.sent();
295
+ this.setAccessKey();
296
+ _1.eventBus.fire(oauth_1.EVENTS.LOGIN_STATE_CHANGED, { eventType: oauth_1.LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
297
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
298
+ return [2, __assign(__assign({}, res), { data: {}, error: null })];
299
+ case 3:
300
+ error_4 = _a.sent();
301
+ return [2, { data: {}, error: new oauth_1.AuthError(error_4) }];
302
+ case 4: return [2];
303
+ }
304
+ });
305
+ });
306
+ };
307
+ SbaseApi.prototype.onAuthStateChange = function (callback) {
308
+ var _this = this;
309
+ if (!this.hasListenerSetUp) {
310
+ this.setupListeners();
311
+ this.hasListenerSetUp = true;
312
+ }
313
+ var id = Math.random().toString(36);
314
+ if (!this.listeners.has(id)) {
315
+ this.listeners.set(id, new Set());
316
+ }
317
+ this.listeners.get(id).add(callback);
318
+ var subscription = {
319
+ id: id,
320
+ callback: callback,
321
+ unsubscribe: function () {
322
+ var callbacks = _this.listeners.get(id);
323
+ if (callbacks) {
324
+ callbacks.delete(callback);
325
+ if (callbacks.size === 0) {
326
+ _this.listeners.delete(id);
327
+ }
328
+ }
329
+ },
330
+ };
331
+ return {
332
+ data: { subscription: subscription },
333
+ };
334
+ };
335
+ SbaseApi.prototype.signInWithPassword = function (params) {
336
+ return __awaiter(this, void 0, void 0, function () {
337
+ var _a, _b, session, error_5;
338
+ return __generator(this, function (_c) {
339
+ switch (_c.label) {
340
+ case 0:
341
+ _c.trys.push([0, 3, , 4]);
342
+ this.validateAtLeastOne(params, [['username'], ['email'], ['phone']], 'You must provide either username, email, or phone');
343
+ this.validateParams(params, {
344
+ password: { required: true, message: 'Password is required' },
345
+ });
346
+ return [4, this.signIn({
347
+ username: params.username || params.email || this.formatPhone(params.phone),
348
+ password: params.password,
349
+ })];
350
+ case 1:
351
+ _c.sent();
352
+ return [4, this.getSession()];
353
+ case 2:
354
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
355
+ return [2, { data: { user: session.user, session: session }, error: null }];
356
+ case 3:
357
+ error_5 = _c.sent();
358
+ return [2, { data: {}, error: new oauth_1.AuthError(error_5) }];
359
+ case 4: return [2];
360
+ }
361
+ });
362
+ });
363
+ };
364
+ SbaseApi.prototype.signInWithIdToken = function (params) {
365
+ return __awaiter(this, void 0, void 0, function () {
366
+ var _a, _b, session, error_6;
367
+ return __generator(this, function (_c) {
368
+ switch (_c.label) {
369
+ case 0:
370
+ _c.trys.push([0, 3, , 4]);
371
+ this.validateParams(params, {
372
+ token: { required: true, message: 'Token is required' },
373
+ });
374
+ return [4, this.signInWithProvider({
375
+ provider_token: params.token,
376
+ })];
377
+ case 1:
378
+ _c.sent();
379
+ return [4, this.getSession()];
380
+ case 2:
381
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
382
+ return [2, { data: { user: session.user, session: session }, error: null }];
383
+ case 3:
384
+ error_6 = _c.sent();
385
+ return [2, { data: {}, error: new oauth_1.AuthError(error_6) }];
386
+ case 4: return [2];
387
+ }
388
+ });
389
+ });
390
+ };
391
+ SbaseApi.prototype.signInWithOtp = function (params) {
392
+ return __awaiter(this, void 0, void 0, function () {
393
+ var verificationInfo_2, error_7;
394
+ var _this = this;
395
+ return __generator(this, function (_a) {
396
+ switch (_a.label) {
397
+ case 0:
398
+ _a.trys.push([0, 2, , 3]);
399
+ this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
400
+ return [4, this.getVerification(params.email ? { email: params.email } : { phone_number: this.formatPhone(params.phone) })];
401
+ case 1:
402
+ verificationInfo_2 = _a.sent();
403
+ return [2, {
404
+ data: {
405
+ user: null,
406
+ session: null,
407
+ verifyOtp: function (_a) {
408
+ var token = _a.token, _b = _a.messageId, messageId = _b === void 0 ? verificationInfo_2.verification_id : _b;
409
+ return __awaiter(_this, void 0, void 0, function () {
410
+ return __generator(this, function (_c) {
411
+ return [2, this.verifyOtp({
412
+ email: params.email,
413
+ phone: params.phone,
414
+ token: token,
415
+ messageId: messageId,
416
+ })];
417
+ });
418
+ });
419
+ },
420
+ },
421
+ error: null,
422
+ }];
423
+ case 2:
424
+ error_7 = _a.sent();
425
+ return [2, { data: {}, error: new oauth_1.AuthError(error_7) }];
426
+ case 3: return [2];
427
+ }
428
+ });
429
+ });
430
+ };
431
+ SbaseApi.prototype.verifyOAuth = function (params) {
432
+ return __awaiter(this, void 0, void 0, function () {
433
+ var data, code, state, cacheData, provider, token, res, localSearch, error_8;
434
+ return __generator(this, function (_a) {
435
+ switch (_a.label) {
436
+ case 0:
437
+ data = {};
438
+ _a.label = 1;
439
+ case 1:
440
+ _a.trys.push([1, 7, , 8]);
441
+ code = (params === null || params === void 0 ? void 0 : params.code) || utilities_1.utils.getQuery('code');
442
+ state = (params === null || params === void 0 ? void 0 : params.state) || utilities_1.utils.getQuery('state');
443
+ if (!code) {
444
+ return [2, { data: {}, error: new oauth_1.AuthError({ message: 'Code is required' }) }];
445
+ }
446
+ if (!state) {
447
+ return [2, { data: {}, error: new oauth_1.AuthError({ message: 'State is required' }) }];
448
+ }
449
+ cacheData = (0, utils_1.getBrowserSession)(state);
450
+ data.type = cacheData === null || cacheData === void 0 ? void 0 : cacheData.type;
451
+ provider = (params === null || params === void 0 ? void 0 : params.provider) || (cacheData === null || cacheData === void 0 ? void 0 : cacheData.provider) || utilities_1.utils.getQuery('provider');
452
+ if (!provider) {
453
+ return [2, { data: data, error: new oauth_1.AuthError({ message: 'Provider is required' }) }];
454
+ }
455
+ return [4, this.grantProviderToken({
456
+ provider_id: provider,
457
+ provider_redirect_uri: location.origin + location.pathname,
458
+ provider_code: code,
459
+ })];
460
+ case 2:
461
+ token = (_a.sent()).provider_token;
462
+ res = void 0;
463
+ if (!(cacheData.type === oauth_1.OAUTH_TYPE.BIND_IDENTITY)) return [3, 4];
464
+ return [4, this.oauthInstance.authApi.toBindIdentity({ provider_token: token, provider: provider, fireEvent: true })];
465
+ case 3:
466
+ res = _a.sent();
467
+ return [3, 6];
468
+ case 4: return [4, this.signInWithIdToken({
469
+ token: token,
470
+ })];
471
+ case 5:
472
+ res = _a.sent();
473
+ res.data = __assign(__assign({}, data), res.data);
474
+ _a.label = 6;
475
+ case 6:
476
+ localSearch = new URLSearchParams(location === null || location === void 0 ? void 0 : location.search);
477
+ localSearch.delete('code');
478
+ localSearch.delete('state');
479
+ (0, utils_1.addUrlSearch)((cacheData === null || cacheData === void 0 ? void 0 : cacheData.search) === undefined ? "?".concat(localSearch.toString()) : cacheData === null || cacheData === void 0 ? void 0 : cacheData.search, (cacheData === null || cacheData === void 0 ? void 0 : cacheData.hash) || location.hash);
480
+ (0, utils_1.removeBrowserSession)(state);
481
+ return [2, res];
482
+ case 7:
483
+ error_8 = _a.sent();
484
+ return [2, { data: data, error: new oauth_1.AuthError(error_8) }];
485
+ case 8: return [2];
486
+ }
487
+ });
488
+ });
489
+ };
490
+ SbaseApi.prototype.signInWithOAuth = function (params) {
491
+ var _a, _b, _c, _d, _e;
492
+ return __awaiter(this, void 0, void 0, function () {
493
+ var href, urlObject, provider_redirect_uri, state, uri, decodedUri, finalUri, url_1, error_9;
494
+ return __generator(this, function (_f) {
495
+ switch (_f.label) {
496
+ case 0:
497
+ _f.trys.push([0, 2, , 3]);
498
+ this.validateParams(params, {
499
+ provider: { required: true, message: 'Provider is required' },
500
+ });
501
+ href = ((_a = params.options) === null || _a === void 0 ? void 0 : _a.redirectTo) || location.href;
502
+ urlObject = new URL(href);
503
+ provider_redirect_uri = urlObject.origin + urlObject.pathname;
504
+ state = ((_b = params.options) === null || _b === void 0 ? void 0 : _b.state) || "prd-".concat(params.provider, "-").concat(Math.random().toString(36)
505
+ .slice(2));
506
+ return [4, this.genProviderRedirectUri({
507
+ provider_id: params.provider,
508
+ provider_redirect_uri: provider_redirect_uri,
509
+ state: state,
510
+ })];
511
+ case 1:
512
+ uri = (_f.sent()).uri;
513
+ decodedUri = decodeURIComponent(uri);
514
+ finalUri = decodedUri;
515
+ if ((_c = params.options) === null || _c === void 0 ? void 0 : _c.queryParams) {
516
+ url_1 = new URL(decodedUri);
517
+ Object.entries(params.options.queryParams).forEach(function (_a) {
518
+ var key = _a[0], value = _a[1];
519
+ url_1.searchParams.set(key, value);
520
+ });
521
+ finalUri = url_1.toString();
522
+ }
523
+ (0, utils_1.saveToBrowserSession)(state, {
524
+ provider: params.provider,
525
+ search: urlObject.search,
526
+ hash: urlObject.hash,
527
+ type: ((_d = params.options) === null || _d === void 0 ? void 0 : _d.type) || oauth_1.OAUTH_TYPE.SIGN_IN,
528
+ });
529
+ if ((0, exports.isBrowser)() && !((_e = params.options) === null || _e === void 0 ? void 0 : _e.skipBrowserRedirect)) {
530
+ window.location.assign(finalUri);
531
+ }
532
+ return [2, { data: { url: finalUri, provider: params.provider }, error: null }];
533
+ case 2:
534
+ error_9 = _f.sent();
535
+ return [2, { data: {}, error: new oauth_1.AuthError(error_9) }];
536
+ case 3: return [2];
537
+ }
538
+ });
539
+ });
540
+ };
541
+ SbaseApi.prototype.signInWithSSO = function () {
542
+ return __awaiter(this, void 0, void 0, function () {
543
+ return __generator(this, function (_a) {
544
+ return [2];
545
+ });
546
+ });
547
+ };
548
+ SbaseApi.prototype.signInWithWeb3 = function () {
549
+ return __awaiter(this, void 0, void 0, function () {
550
+ return __generator(this, function (_a) {
551
+ return [2];
552
+ });
553
+ });
554
+ };
555
+ SbaseApi.prototype.getClaims = function () {
556
+ return __awaiter(this, void 0, void 0, function () {
557
+ var accessToken, parsedToken, error_10;
558
+ return __generator(this, function (_a) {
559
+ switch (_a.label) {
560
+ case 0:
561
+ _a.trys.push([0, 2, , 3]);
562
+ return [4, this.getAccessToken()];
563
+ case 1:
564
+ accessToken = (_a.sent()).accessToken;
565
+ parsedToken = (0, oauth_1.weappJwtDecodeAll)(accessToken);
566
+ return [2, { data: parsedToken, error: null }];
567
+ case 2:
568
+ error_10 = _a.sent();
569
+ return [2, { data: {}, error: new oauth_1.AuthError(error_10) }];
570
+ case 3: return [2];
571
+ }
572
+ });
573
+ });
574
+ };
575
+ SbaseApi.prototype.resetPasswordForEmail = function (emailOrPhone, options) {
576
+ return __awaiter(this, void 0, void 0, function () {
577
+ var redirectTo_1, isEmail_1, verificationParams, formattedPhone, verificationInfo_3, error_11;
578
+ var _this = this;
579
+ return __generator(this, function (_a) {
580
+ switch (_a.label) {
581
+ case 0:
582
+ _a.trys.push([0, 2, , 3]);
583
+ this.validateParams({ emailOrPhone: emailOrPhone }, {
584
+ emailOrPhone: { required: true, message: 'Email or phone is required' },
585
+ });
586
+ redirectTo_1 = (options || {}).redirectTo;
587
+ isEmail_1 = emailOrPhone.includes('@');
588
+ verificationParams = void 0;
589
+ if (isEmail_1) {
590
+ verificationParams = { email: emailOrPhone };
591
+ }
592
+ else {
593
+ formattedPhone = this.formatPhone(emailOrPhone);
594
+ verificationParams = { phone_number: formattedPhone };
595
+ }
596
+ return [4, this.getVerification(verificationParams)];
597
+ case 1:
598
+ verificationInfo_3 = _a.sent();
599
+ return [2, {
600
+ data: {
601
+ updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
602
+ var verificationTokenRes, res, error_12;
603
+ return __generator(this, function (_a) {
604
+ switch (_a.label) {
605
+ case 0:
606
+ this.validateParams(attributes, {
607
+ nonce: { required: true, message: 'Nonce is required' },
608
+ password: { required: true, message: 'Password is required' },
609
+ });
610
+ _a.label = 1;
611
+ case 1:
612
+ _a.trys.push([1, 5, , 6]);
613
+ return [4, this.verify({
614
+ verification_id: verificationInfo_3.verification_id,
615
+ verification_code: attributes.nonce,
616
+ })];
617
+ case 2:
618
+ verificationTokenRes = _a.sent();
619
+ return [4, this.oauthInstance.authApi.resetPassword({
620
+ email: isEmail_1 ? emailOrPhone : undefined,
621
+ phone: !isEmail_1 ? emailOrPhone : undefined,
622
+ new_password: attributes.password,
623
+ verification_token: verificationTokenRes.verification_token,
624
+ })];
625
+ case 3:
626
+ _a.sent();
627
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY });
628
+ return [4, this.signInWithPassword({
629
+ email: isEmail_1 ? emailOrPhone : undefined,
630
+ phone: !isEmail_1 ? emailOrPhone : undefined,
631
+ password: attributes.password,
632
+ })];
633
+ case 4:
634
+ res = _a.sent();
635
+ if (redirectTo_1 && (0, exports.isBrowser)()) {
636
+ window.location.assign(redirectTo_1);
637
+ }
638
+ return [2, res];
639
+ case 5:
640
+ error_12 = _a.sent();
641
+ return [2, { data: {}, error: new oauth_1.AuthError(error_12) }];
642
+ case 6: return [2];
643
+ }
644
+ });
645
+ }); },
646
+ },
647
+ error: null,
648
+ }];
649
+ case 2:
650
+ error_11 = _a.sent();
651
+ return [2, { data: {}, error: new oauth_1.AuthError(error_11) }];
652
+ case 3: return [2];
653
+ }
654
+ });
655
+ });
656
+ };
657
+ SbaseApi.prototype.resetPasswordForOld = function (params) {
658
+ return __awaiter(this, void 0, void 0, function () {
659
+ var _a, _b, session, error_13;
660
+ return __generator(this, function (_c) {
661
+ switch (_c.label) {
662
+ case 0:
663
+ _c.trys.push([0, 3, , 4]);
664
+ return [4, this.oauthInstance.authApi.updatePasswordByOld({
665
+ old_password: params.old_password,
666
+ new_password: params.new_password,
667
+ })];
668
+ case 1:
669
+ _c.sent();
670
+ return [4, this.getSession()];
671
+ case 2:
672
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
673
+ return [2, { data: { user: session.user, session: session }, error: null }];
674
+ case 3:
675
+ error_13 = _c.sent();
676
+ return [2, { data: {}, error: new oauth_1.AuthError(error_13) }];
677
+ case 4: return [2];
678
+ }
679
+ });
680
+ });
681
+ };
682
+ SbaseApi.prototype.verifyOtp = function (params) {
683
+ return __awaiter(this, void 0, void 0, function () {
684
+ var type, _a, _b, session, error_14;
685
+ return __generator(this, function (_c) {
686
+ switch (_c.label) {
687
+ case 0:
688
+ _c.trys.push([0, 6, , 7]);
689
+ type = params.type;
690
+ this.validateParams(params, {
691
+ token: { required: true, message: 'Token is required' },
692
+ messageId: { required: true, message: 'messageId is required' },
693
+ });
694
+ if (!['phone_change', 'email_change'].includes(type)) return [3, 2];
695
+ return [4, this.verify({
696
+ verification_id: params.messageId,
697
+ verification_code: params.token,
698
+ })];
699
+ case 1:
700
+ _c.sent();
701
+ return [3, 4];
702
+ case 2: return [4, this.signInWithUsername({
703
+ verificationInfo: { verification_id: params.messageId, is_user: true },
704
+ verificationCode: params.token,
705
+ username: params.email || this.formatPhone(params.phone) || '',
706
+ loginType: params.email ? 'email' : 'phone',
707
+ })];
708
+ case 3:
709
+ _c.sent();
710
+ _c.label = 4;
711
+ case 4: return [4, this.getSession()];
712
+ case 5:
713
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
714
+ return [2, { data: { user: session.user, session: session }, error: null }];
715
+ case 6:
716
+ error_14 = _c.sent();
717
+ return [2, { data: {}, error: new oauth_1.AuthError(error_14) }];
718
+ case 7: return [2];
719
+ }
720
+ });
721
+ });
722
+ };
723
+ SbaseApi.prototype.getSession = function () {
724
+ return __awaiter(this, void 0, void 0, function () {
725
+ var credentials, _a, _b, user, error_15;
726
+ return __generator(this, function (_c) {
727
+ switch (_c.label) {
728
+ case 0:
729
+ _c.trys.push([0, 3, , 4]);
730
+ return [4, this.oauthInstance.oauth2client.getCredentials()];
731
+ case 1:
732
+ credentials = _c.sent();
733
+ if (!credentials || credentials.scope === 'accessKey') {
734
+ return [2, { data: { session: null }, error: null }];
735
+ }
736
+ return [4, this.getUser()];
737
+ case 2:
738
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
739
+ return [2, { data: { session: __assign(__assign({}, credentials), { user: user }) }, error: null }];
740
+ case 3:
741
+ error_15 = _c.sent();
742
+ return [2, { data: {}, error: new oauth_1.AuthError(error_15) }];
743
+ case 4: return [2];
744
+ }
745
+ });
746
+ });
747
+ };
748
+ SbaseApi.prototype.refreshSession = function (refresh_token) {
749
+ return __awaiter(this, void 0, void 0, function () {
750
+ var credentials, newTokens, _a, _b, user, error_16;
751
+ return __generator(this, function (_c) {
752
+ switch (_c.label) {
753
+ case 0:
754
+ _c.trys.push([0, 4, , 5]);
755
+ return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
756
+ case 1:
757
+ credentials = _c.sent();
758
+ credentials.refresh_token = refresh_token || credentials.refresh_token;
759
+ return [4, this.oauthInstance.oauth2client.refreshToken(credentials)];
760
+ case 2:
761
+ newTokens = _c.sent();
762
+ return [4, this.getUser()];
763
+ case 3:
764
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, user = _b.user;
765
+ return [2, { data: { user: user, session: __assign(__assign({}, newTokens), { user: user }) }, error: null }];
766
+ case 4:
767
+ error_16 = _c.sent();
768
+ return [2, { data: {}, error: new oauth_1.AuthError(error_16) }];
769
+ case 5: return [2];
770
+ }
771
+ });
772
+ });
773
+ };
774
+ SbaseApi.prototype.getUser = function () {
775
+ return __awaiter(this, void 0, void 0, function () {
776
+ var user, _a, error_17;
777
+ return __generator(this, function (_b) {
778
+ switch (_b.label) {
779
+ case 0:
780
+ _b.trys.push([0, 2, , 3]);
781
+ _a = this.convertToUser;
782
+ return [4, this.getUserInfo()];
783
+ case 1:
784
+ user = _a.apply(this, [_b.sent()]);
785
+ return [2, { data: { user: user }, error: null }];
786
+ case 2:
787
+ error_17 = _b.sent();
788
+ return [2, { data: {}, error: new oauth_1.AuthError(error_17) }];
789
+ case 3: return [2];
790
+ }
791
+ });
792
+ });
793
+ };
794
+ SbaseApi.prototype.refreshUser = function () {
795
+ return __awaiter(this, void 0, void 0, function () {
796
+ var _a, _b, session, error_18;
797
+ return __generator(this, function (_c) {
798
+ switch (_c.label) {
799
+ case 0:
800
+ _c.trys.push([0, 3, , 4]);
801
+ return [4, this.currentUser.refresh()];
802
+ case 1:
803
+ _c.sent();
804
+ return [4, this.getSession()];
805
+ case 2:
806
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
807
+ return [2, { data: { user: session.user, session: session }, error: null }];
808
+ case 3:
809
+ error_18 = _c.sent();
810
+ return [2, { data: {}, error: new oauth_1.AuthError(error_18) }];
811
+ case 4: return [2];
812
+ }
813
+ });
814
+ });
815
+ };
816
+ SbaseApi.prototype.updateUser = function (params) {
817
+ return __awaiter(this, void 0, void 0, function () {
818
+ var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, user, error_19;
819
+ var _this = this;
820
+ return __generator(this, function (_a) {
821
+ switch (_a.label) {
822
+ case 0:
823
+ _a.trys.push([0, 7, , 8]);
824
+ hasValue = Object.keys(params).some(function (key) { return params[key] !== undefined && params[key] !== null && params[key] !== ''; });
825
+ if (!hasValue) {
826
+ throw new oauth_1.AuthError({ message: 'At least one field must be provided for update' });
827
+ }
828
+ email = params.email, phone = params.phone, restParams = __rest(params, ["email", "phone"]);
829
+ needsEmailVerification_1 = email !== undefined;
830
+ needsPhoneVerification = phone !== undefined;
831
+ extraRes = {};
832
+ if (!(needsEmailVerification_1 || needsPhoneVerification)) return [3, 3];
833
+ verificationParams = void 0;
834
+ if (needsEmailVerification_1) {
835
+ verificationParams = { email: params.email };
836
+ verificationType_1 = 'email_change';
837
+ }
838
+ else {
839
+ formattedPhone = this.formatPhone(params.phone);
840
+ verificationParams = { phone_number: formattedPhone };
841
+ verificationType_1 = 'phone_change';
842
+ }
843
+ return [4, this.getVerification(verificationParams)];
844
+ case 1:
845
+ verificationInfo_4 = _a.sent();
846
+ return [4, this.updateUserBasicInfo(restParams)];
847
+ case 2:
848
+ _a.sent();
849
+ extraRes = {
850
+ messageId: verificationInfo_4.verification_id,
851
+ verifyOtp: function (verifyParams) { return __awaiter(_this, void 0, void 0, function () {
852
+ var user_1, error_20;
853
+ return __generator(this, function (_a) {
854
+ switch (_a.label) {
855
+ case 0:
856
+ _a.trys.push([0, 11, , 12]);
857
+ if (!(verifyParams.email && params.email === verifyParams.email)) return [3, 3];
858
+ return [4, this.verifyOtp({
859
+ type: 'email_change',
860
+ email: params.email,
861
+ token: verifyParams.token,
862
+ messageId: verificationInfo_4.verification_id,
863
+ })];
864
+ case 1:
865
+ _a.sent();
866
+ return [4, this.updateUserBasicInfo({ email: params.email })];
867
+ case 2:
868
+ _a.sent();
869
+ return [3, 9];
870
+ case 3:
871
+ if (!(verifyParams.phone && params.phone === verifyParams.phone)) return [3, 6];
872
+ return [4, this.verifyOtp({
873
+ type: 'phone_change',
874
+ phone: params.phone,
875
+ token: verifyParams.token,
876
+ messageId: verificationInfo_4.verification_id,
877
+ })];
878
+ case 4:
879
+ _a.sent();
880
+ return [4, this.updateUserBasicInfo({ phone: params.phone })];
881
+ case 5:
882
+ _a.sent();
883
+ return [3, 9];
884
+ case 6: return [4, this.verifyOtp({
885
+ type: verificationType_1,
886
+ email: needsEmailVerification_1 ? params.email : undefined,
887
+ phone: !needsEmailVerification_1 ? params.phone : undefined,
888
+ token: verifyParams.token,
889
+ messageId: verificationInfo_4.verification_id,
890
+ })];
891
+ case 7:
892
+ _a.sent();
893
+ return [4, this.updateUserBasicInfo(params)];
894
+ case 8:
895
+ _a.sent();
896
+ _a.label = 9;
897
+ case 9: return [4, this.getUser()];
898
+ case 10:
899
+ user_1 = (_a.sent()).data.user;
900
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
901
+ return [2, { data: { user: user_1 }, error: null }];
902
+ case 11:
903
+ error_20 = _a.sent();
904
+ return [2, { data: {}, error: new oauth_1.AuthError(error_20) }];
905
+ case 12: return [2];
906
+ }
907
+ });
908
+ }); },
909
+ };
910
+ return [3, 5];
911
+ case 3: return [4, this.updateUserBasicInfo(params)];
912
+ case 4:
913
+ _a.sent();
914
+ _a.label = 5;
915
+ case 5: return [4, this.getUser()];
916
+ case 6:
917
+ user = (_a.sent()).data.user;
918
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
919
+ return [2, { data: __assign({ user: user }, extraRes), error: null }];
920
+ case 7:
921
+ error_19 = _a.sent();
922
+ return [2, { data: {}, error: new oauth_1.AuthError(error_19) }];
923
+ case 8: return [2];
924
+ }
925
+ });
926
+ });
927
+ };
928
+ SbaseApi.prototype.getUserIdentities = function () {
929
+ var _a;
930
+ return __awaiter(this, void 0, void 0, function () {
931
+ var providers, error_21;
932
+ return __generator(this, function (_b) {
933
+ switch (_b.label) {
934
+ case 0:
935
+ _b.trys.push([0, 2, , 3]);
936
+ return [4, this.oauthInstance.authApi.getProviders()];
937
+ case 1:
938
+ providers = _b.sent();
939
+ return [2, { data: { identities: (_a = providers === null || providers === void 0 ? void 0 : providers.data) === null || _a === void 0 ? void 0 : _a.filter(function (v) { return !!v.bind; }) }, error: null }];
940
+ case 2:
941
+ error_21 = _b.sent();
942
+ return [2, { data: {}, error: new oauth_1.AuthError(error_21) }];
943
+ case 3: return [2];
944
+ }
945
+ });
946
+ });
947
+ };
948
+ SbaseApi.prototype.linkIdentity = function (params) {
949
+ return __awaiter(this, void 0, void 0, function () {
950
+ var error_22;
951
+ return __generator(this, function (_a) {
952
+ switch (_a.label) {
953
+ case 0:
954
+ _a.trys.push([0, 2, , 3]);
955
+ this.validateParams(params, {
956
+ provider: { required: true, message: 'Provider is required' },
957
+ });
958
+ return [4, this.signInWithOAuth({
959
+ provider: params.provider,
960
+ options: {
961
+ type: oauth_1.OAUTH_TYPE.BIND_IDENTITY,
962
+ },
963
+ })];
964
+ case 1:
965
+ _a.sent();
966
+ return [2, { data: { provider: params.provider }, error: null }];
967
+ case 2:
968
+ error_22 = _a.sent();
969
+ return [2, { data: {}, error: new oauth_1.AuthError(error_22) }];
970
+ case 3: return [2];
971
+ }
972
+ });
973
+ });
974
+ };
975
+ SbaseApi.prototype.unlinkIdentity = function (params) {
976
+ return __awaiter(this, void 0, void 0, function () {
977
+ var error_23;
978
+ return __generator(this, function (_a) {
979
+ switch (_a.label) {
980
+ case 0:
981
+ _a.trys.push([0, 2, , 3]);
982
+ this.validateParams(params, {
983
+ provider: { required: true, message: 'Provider is required' },
984
+ });
985
+ return [4, this.oauthInstance.authApi.unbindProvider({ provider_id: params.provider })];
986
+ case 1:
987
+ _a.sent();
988
+ return [2, { data: {}, error: null }];
989
+ case 2:
990
+ error_23 = _a.sent();
991
+ return [2, { data: {}, error: new oauth_1.AuthError(error_23) }];
992
+ case 3: return [2];
993
+ }
994
+ });
995
+ });
996
+ };
997
+ SbaseApi.prototype.reauthenticate = function () {
998
+ return __awaiter(this, void 0, void 0, function () {
999
+ var user, userInfo_1, verificationInfo_5, error_24;
1000
+ var _this = this;
1001
+ return __generator(this, function (_a) {
1002
+ switch (_a.label) {
1003
+ case 0:
1004
+ _a.trys.push([0, 3, , 4]);
1005
+ return [4, this.getUser()];
1006
+ case 1:
1007
+ user = (_a.sent()).data.user;
1008
+ this.validateAtLeastOne(user, [['email', 'phone']], 'You must provide either an email or phone number');
1009
+ userInfo_1 = user.email ? { email: user.email } : { phone_number: this.formatPhone(user.phone) };
1010
+ return [4, this.getVerification(userInfo_1)];
1011
+ case 2:
1012
+ verificationInfo_5 = _a.sent();
1013
+ return [2, {
1014
+ data: {
1015
+ updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
1016
+ var verificationTokenRes, sudoRes, _a, _b, session, error_25;
1017
+ return __generator(this, function (_c) {
1018
+ switch (_c.label) {
1019
+ case 0:
1020
+ this.validateParams(attributes, {
1021
+ nonce: { required: true, message: 'Nonce is required' },
1022
+ });
1023
+ _c.label = 1;
1024
+ case 1:
1025
+ _c.trys.push([1, 9, , 10]);
1026
+ if (!attributes.password) return [3, 5];
1027
+ return [4, this.verify({
1028
+ verification_id: verificationInfo_5.verification_id,
1029
+ verification_code: attributes.nonce,
1030
+ })];
1031
+ case 2:
1032
+ verificationTokenRes = _c.sent();
1033
+ return [4, this.oauthInstance.authApi.sudo({
1034
+ verification_token: verificationTokenRes.verification_token,
1035
+ })];
1036
+ case 3:
1037
+ sudoRes = _c.sent();
1038
+ return [4, this.oauthInstance.authApi.setPassword({
1039
+ new_password: attributes.password,
1040
+ sudo_token: sudoRes.sudo_token,
1041
+ })];
1042
+ case 4:
1043
+ _c.sent();
1044
+ return [3, 7];
1045
+ case 5: return [4, this.signInWithUsername(__assign(__assign({ verificationInfo: verificationInfo_5, verificationCode: attributes.nonce }, userInfo_1), { loginType: userInfo_1.email ? 'email' : 'phone' }))];
1046
+ case 6:
1047
+ _c.sent();
1048
+ _c.label = 7;
1049
+ case 7: return [4, this.getSession()];
1050
+ case 8:
1051
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1052
+ return [2, { data: { user: session.user, session: session }, error: null }];
1053
+ case 9:
1054
+ error_25 = _c.sent();
1055
+ return [2, { data: {}, error: new oauth_1.AuthError(error_25) }];
1056
+ case 10: return [2];
1057
+ }
1058
+ });
1059
+ }); },
1060
+ },
1061
+ error: null,
1062
+ }];
1063
+ case 3:
1064
+ error_24 = _a.sent();
1065
+ return [2, { data: {}, error: new oauth_1.AuthError(error_24) }];
1066
+ case 4: return [2];
1067
+ }
1068
+ });
1069
+ });
1070
+ };
1071
+ SbaseApi.prototype.resend = function (params) {
1072
+ return __awaiter(this, void 0, void 0, function () {
1073
+ var target, data, verificationId, error_26;
1074
+ return __generator(this, function (_a) {
1075
+ switch (_a.label) {
1076
+ case 0:
1077
+ _a.trys.push([0, 2, , 3]);
1078
+ this.validateAtLeastOne(params, [['email'], ['phone']], 'You must provide either an email or phone number');
1079
+ target = params.type === 'signup' ? 'ANY' : 'USER';
1080
+ data = { target: target };
1081
+ if ('email' in params) {
1082
+ data.email = params.email;
1083
+ }
1084
+ if ('phone' in params) {
1085
+ data.phone_number = this.formatPhone(params.phone);
1086
+ }
1087
+ return [4, this.oauthInstance.authApi.getVerification(data)];
1088
+ case 1:
1089
+ verificationId = (_a.sent()).verification_id;
1090
+ return [2, {
1091
+ data: { messageId: verificationId },
1092
+ error: null,
1093
+ }];
1094
+ case 2:
1095
+ error_26 = _a.sent();
1096
+ return [2, {
1097
+ data: {},
1098
+ error: new oauth_1.AuthError(error_26),
1099
+ }];
1100
+ case 3: return [2];
1101
+ }
1102
+ });
1103
+ });
1104
+ };
1105
+ SbaseApi.prototype.setSession = function (params) {
1106
+ return __awaiter(this, void 0, void 0, function () {
1107
+ var _a, _b, session, error_27;
1108
+ return __generator(this, function (_c) {
1109
+ switch (_c.label) {
1110
+ case 0:
1111
+ _c.trys.push([0, 3, , 4]);
1112
+ this.validateParams(params, {
1113
+ access_token: { required: true, message: 'Access token is required' },
1114
+ refresh_token: { required: true, message: 'Refresh token is required' },
1115
+ });
1116
+ return [4, this.oauthInstance.oauth2client.refreshToken(params, { throwOnError: true })];
1117
+ case 1:
1118
+ _c.sent();
1119
+ return [4, this.getSession()];
1120
+ case 2:
1121
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1122
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
1123
+ return [2, { data: { user: session.user, session: session }, error: null }];
1124
+ case 3:
1125
+ error_27 = _c.sent();
1126
+ return [2, { data: {}, error: new oauth_1.AuthError(error_27) }];
1127
+ case 4: return [2];
1128
+ }
1129
+ });
1130
+ });
1131
+ };
1132
+ SbaseApi.prototype.exchangeCodeForSession = function () {
1133
+ return __awaiter(this, void 0, void 0, function () {
1134
+ return __generator(this, function (_a) {
1135
+ return [2];
1136
+ });
1137
+ });
1138
+ };
1139
+ SbaseApi.prototype.deleteUser = function (params) {
1140
+ return __awaiter(this, void 0, void 0, function () {
1141
+ var sudo_token, error_28;
1142
+ return __generator(this, function (_a) {
1143
+ switch (_a.label) {
1144
+ case 0:
1145
+ _a.trys.push([0, 3, , 4]);
1146
+ this.validateParams(params, {
1147
+ password: { required: true, message: 'Password is required' },
1148
+ });
1149
+ return [4, this.oauthInstance.authApi.sudo(params)];
1150
+ case 1:
1151
+ sudo_token = (_a.sent()).sudo_token;
1152
+ return [4, this.oauthInstance.authApi.deleteMe({ sudo_token: sudo_token })];
1153
+ case 2:
1154
+ _a.sent();
1155
+ return [2, { data: {}, error: null }];
1156
+ case 3:
1157
+ error_28 = _a.sent();
1158
+ return [2, { data: {}, error: new oauth_1.AuthError(error_28) }];
1159
+ case 4: return [2];
1160
+ }
1161
+ });
1162
+ });
1163
+ };
1164
+ SbaseApi.prototype.toDefaultLoginPage = function (params) {
1165
+ if (params === void 0) { params = {}; }
1166
+ return __awaiter(this, void 0, void 0, function () {
1167
+ var configVersion, query, redirectUri, urlObj, loginPage;
1168
+ return __generator(this, function (_a) {
1169
+ try {
1170
+ configVersion = params.config_version || 'env';
1171
+ query = Object.keys(params.query || {})
1172
+ .map(function (key) { return "".concat(key, "=").concat(params.query[key]); })
1173
+ .join('&');
1174
+ if (utilities_2.adapterForWxMp.isMatch()) {
1175
+ wx.navigateTo({ url: "/packages/$wd_system/pages/login/index".concat(query ? "?".concat(query) : '') });
1176
+ }
1177
+ else {
1178
+ redirectUri = params.redirect_uri || window.location.href;
1179
+ urlObj = new URL(redirectUri);
1180
+ loginPage = "".concat(urlObj.origin, "/__auth/?app_id=").concat(params.app_id || '', "&env_id=").concat(this.config.env, "&client_id=").concat(this.config.clientId || this.config.env, "&config_version=").concat(configVersion, "&redirect_uri=").concat(encodeURIComponent(redirectUri)).concat(query ? "&".concat(query) : '');
1181
+ window.location.href = loginPage;
1182
+ }
1183
+ return [2, { data: {}, error: null }];
1184
+ }
1185
+ catch (error) {
1186
+ return [2, { data: {}, error: new oauth_1.AuthError(error) }];
1187
+ }
1188
+ return [2];
1189
+ });
1190
+ });
1191
+ };
1192
+ SbaseApi.prototype.signInWithCustomTicket = function (getTickFn) {
1193
+ return __awaiter(this, void 0, void 0, function () {
1194
+ var loginState, _a, _b, session, error_29;
1195
+ return __generator(this, function (_c) {
1196
+ switch (_c.label) {
1197
+ case 0:
1198
+ if (getTickFn) {
1199
+ this.setCustomSignFunc(getTickFn);
1200
+ }
1201
+ _c.label = 1;
1202
+ case 1:
1203
+ _c.trys.push([1, 5, , 6]);
1204
+ return [4, this.oauthInstance.authApi.signInWithCustomTicket()];
1205
+ case 2:
1206
+ _c.sent();
1207
+ return [4, this.createLoginState()];
1208
+ case 3:
1209
+ loginState = _c.sent();
1210
+ return [4, this.getSession()];
1211
+ case 4:
1212
+ _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1213
+ return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1214
+ case 5:
1215
+ error_29 = _c.sent();
1216
+ return [2, { data: {}, error: new oauth_1.AuthError(error_29) }];
1217
+ case 6: return [2];
1218
+ }
1219
+ });
1220
+ });
1221
+ };
1222
+ SbaseApi.prototype.signInWithOpenId = function (_a) {
1223
+ var _b = _a === void 0 ? {} : _a, _c = _b.useWxCloud, useWxCloud = _c === void 0 ? true : _c;
1224
+ return __awaiter(this, void 0, void 0, function () {
1225
+ var wxInfo, mainFunc, loginState, _d, _e, session, error_30;
1226
+ var _this = this;
1227
+ return __generator(this, function (_f) {
1228
+ switch (_f.label) {
1229
+ case 0:
1230
+ if (!utilities_2.adapterForWxMp.isMatch()) {
1231
+ throw Error('wx api undefined');
1232
+ }
1233
+ wxInfo = wx.getAccountInfoSync().miniProgram;
1234
+ mainFunc = function (code) { return __awaiter(_this, void 0, void 0, function () {
1235
+ var result, credentials, error_31;
1236
+ return __generator(this, function (_a) {
1237
+ switch (_a.label) {
1238
+ case 0:
1239
+ result = undefined;
1240
+ credentials = undefined;
1241
+ _a.label = 1;
1242
+ case 1:
1243
+ _a.trys.push([1, 4, , 5]);
1244
+ return [4, this.oauthInstance.authApi.grantProviderToken({
1245
+ provider_id: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1246
+ provider_code: code,
1247
+ provider_params: {
1248
+ provider_code_type: 'open_id',
1249
+ appid: wxInfo === null || wxInfo === void 0 ? void 0 : wxInfo.appId,
1250
+ },
1251
+ }, useWxCloud)];
1252
+ case 2:
1253
+ result = _a.sent();
1254
+ if ((result === null || result === void 0 ? void 0 : result.error_code) || !result.provider_token) {
1255
+ throw result;
1256
+ }
1257
+ return [4, this.oauthInstance.authApi.signInWithProvider({ provider_token: result.provider_token }, useWxCloud)];
1258
+ case 3:
1259
+ credentials = _a.sent();
1260
+ if (credentials === null || credentials === void 0 ? void 0 : credentials.error_code) {
1261
+ throw credentials;
1262
+ }
1263
+ return [3, 5];
1264
+ case 4:
1265
+ error_31 = _a.sent();
1266
+ throw error_31;
1267
+ case 5: return [4, this.oauthInstance.oauth2client.setCredentials(credentials)];
1268
+ case 6:
1269
+ _a.sent();
1270
+ return [2];
1271
+ }
1272
+ });
1273
+ }); };
1274
+ _f.label = 1;
1275
+ case 1:
1276
+ _f.trys.push([1, 5, , 6]);
1277
+ return [4, new Promise(function (resolve, reject) {
1278
+ wx.login({
1279
+ success: function (res) { return __awaiter(_this, void 0, void 0, function () {
1280
+ var error_32;
1281
+ return __generator(this, function (_a) {
1282
+ switch (_a.label) {
1283
+ case 0:
1284
+ _a.trys.push([0, 2, , 3]);
1285
+ return [4, mainFunc(res.code)];
1286
+ case 1:
1287
+ _a.sent();
1288
+ resolve(true);
1289
+ return [3, 3];
1290
+ case 2:
1291
+ error_32 = _a.sent();
1292
+ reject(error_32);
1293
+ return [3, 3];
1294
+ case 3: return [2];
1295
+ }
1296
+ });
1297
+ }); },
1298
+ fail: function (res) {
1299
+ var error = new Error(res === null || res === void 0 ? void 0 : res.errMsg);
1300
+ error.code = res === null || res === void 0 ? void 0 : res.errno;
1301
+ reject(error);
1302
+ },
1303
+ });
1304
+ })];
1305
+ case 2:
1306
+ _f.sent();
1307
+ return [4, this.createLoginState()];
1308
+ case 3:
1309
+ loginState = _f.sent();
1310
+ return [4, this.getSession()];
1311
+ case 4:
1312
+ _d = (_f.sent()).data, _e = _d === void 0 ? {} : _d, session = _e.session;
1313
+ return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1314
+ case 5:
1315
+ error_30 = _f.sent();
1316
+ return [2, { data: {}, error: new oauth_1.AuthError(error_30) }];
1317
+ case 6: return [2];
1318
+ }
1319
+ });
1320
+ });
1321
+ };
1322
+ SbaseApi.prototype.signInWithPhoneAuth = function (_a) {
1323
+ var _b = _a.phoneCode, phoneCode = _b === void 0 ? '' : _b;
1324
+ return __awaiter(this, void 0, void 0, function () {
1325
+ var wxInfo, providerInfo, code, providerToken, signInRes, error_33, loginState, _c, _d, session;
1326
+ return __generator(this, function (_e) {
1327
+ switch (_e.label) {
1328
+ case 0:
1329
+ if (!utilities_2.adapterForWxMp.isMatch()) {
1330
+ return [2, { data: {}, error: new oauth_1.AuthError({ message: 'wx api undefined' }) }];
1331
+ }
1332
+ wxInfo = wx.getAccountInfoSync().miniProgram;
1333
+ providerInfo = {
1334
+ provider_params: { provider_code_type: 'phone' },
1335
+ provider_id: wxInfo.appId,
1336
+ };
1337
+ return [4, wx.login()];
1338
+ case 1:
1339
+ code = (_e.sent()).code;
1340
+ providerInfo.provider_code = code;
1341
+ _e.label = 2;
1342
+ case 2:
1343
+ _e.trys.push([2, 6, , 7]);
1344
+ return [4, this.oauthInstance.authApi.grantProviderToken(providerInfo)];
1345
+ case 3:
1346
+ providerToken = _e.sent();
1347
+ if (providerToken.error_code) {
1348
+ throw providerToken;
1349
+ }
1350
+ return [4, this.oauthInstance.authApi.patchProviderToken({
1351
+ provider_token: providerToken.provider_token,
1352
+ provider_id: wxInfo.appId,
1353
+ provider_params: {
1354
+ code: phoneCode,
1355
+ provider_code_type: 'phone',
1356
+ },
1357
+ })];
1358
+ case 4:
1359
+ providerToken = _e.sent();
1360
+ if (providerToken.error_code) {
1361
+ throw providerToken;
1362
+ }
1363
+ return [4, this.oauthInstance.authApi.signInWithProvider({
1364
+ provider_token: providerToken.provider_token,
1365
+ })];
1366
+ case 5:
1367
+ signInRes = _e.sent();
1368
+ if (signInRes === null || signInRes === void 0 ? void 0 : signInRes.error_code) {
1369
+ throw signInRes;
1370
+ }
1371
+ return [3, 7];
1372
+ case 6:
1373
+ error_33 = _e.sent();
1374
+ return [2, { data: {}, error: new oauth_1.AuthError(error_33) }];
1375
+ case 7: return [4, this.createLoginState()];
1376
+ case 8:
1377
+ loginState = _e.sent();
1378
+ return [4, this.getSession()];
1379
+ case 9:
1380
+ _c = (_e.sent()).data, _d = _c === void 0 ? {} : _c, session = _d.session;
1381
+ return [2, __assign(__assign({}, loginState), { data: { user: session.user, session: session }, error: null })];
1382
+ }
1383
+ });
1384
+ });
1385
+ };
1386
+ SbaseApi.prototype.formatPhone = function (phone) {
1387
+ if (!/\s+/.test(phone) && /^\+\d{1,3}\d+/.test(phone)) {
1388
+ return phone.replace(/^(\+\d{1,2})(\d+)$/, '$1 $2');
1389
+ }
1390
+ return /^\+\d{1,3}\s+/.test(phone) ? phone : "+86 ".concat(phone);
1391
+ };
1392
+ SbaseApi.prototype.notifyListeners = function (event, session, info) {
1393
+ this.listeners.forEach(function (callbacks) {
1394
+ callbacks.forEach(function (callback) {
1395
+ try {
1396
+ callback(event, session, info);
1397
+ }
1398
+ catch (error) {
1399
+ console.error('Error in auth state change callback:', error);
1400
+ }
1401
+ });
1402
+ });
1403
+ return;
1404
+ };
1405
+ SbaseApi.prototype.init = function () {
1406
+ return __awaiter(this, void 0, void 0, function () {
1407
+ var credentials, error_34;
1408
+ return __generator(this, function (_a) {
1409
+ switch (_a.label) {
1410
+ case 0:
1411
+ _a.trys.push([0, 2, , 3]);
1412
+ return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
1413
+ case 1:
1414
+ credentials = _a.sent();
1415
+ if (credentials) {
1416
+ _1.eventBus.fire(oauth_1.EVENTS.AUTH_STATE_CHANGED, { event: oauth_1.AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
1417
+ }
1418
+ return [3, 3];
1419
+ case 2:
1420
+ error_34 = _a.sent();
1421
+ return [3, 3];
1422
+ case 3: return [2, { error: null }];
1423
+ }
1424
+ });
1425
+ });
1426
+ };
1427
+ SbaseApi.prototype.setupListeners = function () {
1428
+ var _this = this;
1429
+ _1.eventBus.on(oauth_1.EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
1430
+ var event, info, session;
1431
+ var _a, _b;
1432
+ return __generator(this, function (_c) {
1433
+ switch (_c.label) {
1434
+ case 0:
1435
+ event = (_a = params === null || params === void 0 ? void 0 : params.data) === null || _a === void 0 ? void 0 : _a.event;
1436
+ info = (_b = params === null || params === void 0 ? void 0 : params.data) === null || _b === void 0 ? void 0 : _b.info;
1437
+ return [4, this.getSession()];
1438
+ case 1:
1439
+ session = (_c.sent()).data.session;
1440
+ this.notifyListeners(event, session, info);
1441
+ return [2];
1442
+ }
1443
+ });
1444
+ }); });
1445
+ };
1446
+ SbaseApi.prototype.convertToUser = function (userInfo) {
1447
+ var _a, _b, _c;
1448
+ if (!userInfo)
1449
+ return null;
1450
+ var email = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.username);
1451
+ var phone = userInfo === null || userInfo === void 0 ? void 0 : userInfo.phone_number;
1452
+ var userId = (userInfo === null || userInfo === void 0 ? void 0 : userInfo.sub) || (userInfo === null || userInfo === void 0 ? void 0 : userInfo.uid) || '';
1453
+ return {
1454
+ id: userId,
1455
+ aud: 'authenticated',
1456
+ role: userInfo.groups,
1457
+ email: email || '',
1458
+ email_confirmed_at: (userInfo === null || userInfo === void 0 ? void 0 : userInfo.email_verified) ? userInfo.created_at : userInfo.created_at,
1459
+ phone: phone,
1460
+ phone_confirmed_at: phone ? userInfo.created_at : undefined,
1461
+ confirmed_at: userInfo.created_at,
1462
+ last_sign_in_at: userInfo.last_sign_in_at,
1463
+ app_metadata: {
1464
+ provider: ((_a = userInfo.loginType) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || 'cloudbase',
1465
+ providers: [((_b = userInfo.loginType) === null || _b === void 0 ? void 0 : _b.toLowerCase()) || 'cloudbase'],
1466
+ },
1467
+ user_metadata: {
1468
+ name: userInfo === null || userInfo === void 0 ? void 0 : userInfo.name,
1469
+ picture: userInfo === null || userInfo === void 0 ? void 0 : userInfo.picture,
1470
+ username: userInfo === null || userInfo === void 0 ? void 0 : userInfo.username,
1471
+ gender: userInfo === null || userInfo === void 0 ? void 0 : userInfo.gender,
1472
+ locale: userInfo === null || userInfo === void 0 ? void 0 : userInfo.locale,
1473
+ uid: userInfo.uid,
1474
+ nickName: userInfo.nickName,
1475
+ avatarUrl: userInfo.avatarUrl,
1476
+ location: userInfo.location,
1477
+ hasPassword: userInfo.hasPassword,
1478
+ },
1479
+ identities: ((_c = userInfo === null || userInfo === void 0 ? void 0 : userInfo.providers) === null || _c === void 0 ? void 0 : _c.map(function (p) { return ({
1480
+ id: p.id || '',
1481
+ identity_id: p.id || '',
1482
+ user_id: userId,
1483
+ identity_data: {
1484
+ provider_id: p.id,
1485
+ provider_user_id: p.provider_user_id,
1486
+ name: p.name,
1487
+ },
1488
+ provider: p.id || 'cloudbase',
1489
+ created_at: userInfo.created_at,
1490
+ updated_at: userInfo.updated_at,
1491
+ last_sign_in_at: userInfo.last_sign_in_at,
1492
+ }); })) || [],
1493
+ created_at: userInfo.created_at,
1494
+ updated_at: userInfo.updated_at,
1495
+ is_anonymous: userInfo.name === 'anonymous',
1496
+ };
1497
+ };
1498
+ SbaseApi.prototype.validateParams = function (params, rules) {
1499
+ for (var _i = 0, _a = Object.entries(rules); _i < _a.length; _i++) {
1500
+ var _b = _a[_i], key = _b[0], rule = _b[1];
1501
+ if (rule.required && ((params === null || params === void 0 ? void 0 : params[key]) === undefined || (params === null || params === void 0 ? void 0 : params[key]) === null || (params === null || params === void 0 ? void 0 : params[key]) === '')) {
1502
+ throw new oauth_1.AuthError({ message: rule.message });
1503
+ }
1504
+ }
1505
+ };
1506
+ SbaseApi.prototype.validateAtLeastOne = function (params, fieldGroups, message) {
1507
+ var hasValue = fieldGroups.some(function (group) { return group.some(function (field) { return (params === null || params === void 0 ? void 0 : params[field]) !== undefined && (params === null || params === void 0 ? void 0 : params[field]) !== null && (params === null || params === void 0 ? void 0 : params[field]) !== ''; }); });
1508
+ if (!hasValue) {
1509
+ throw new oauth_1.AuthError({ message: message });
1510
+ }
1511
+ };
1512
+ return SbaseApi;
1513
+ }());
1514
+ exports.SbaseApi = SbaseApi;
1515
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Jhc2VBcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2Jhc2VBcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLDBDQU95QjtBQWdDekIsc0JBQThDO0FBQzlDLGlDQUFxRztBQUNyRyxrREFBNEM7QUFDNUMseUNBQTRDO0FBQ3JDLElBQU0sU0FBUyxHQUFHLGNBQU0sT0FBQSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFoRSxDQUFnRSxDQUFBO0FBQWxGLFFBQUEsU0FBUyxhQUF5RTtBQUkvRjtJQU9FLGtCQUFZLE1BQXlEO1FBSDdELGNBQVMsR0FBZ0QsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNsRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFHOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDYixDQUFDO0lBS0Qsc0JBQUksaUNBQVc7YUFBZjtZQUNFLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUV2QyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxPQUFPLFVBQVUsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFBO2FBQy9CO1lBQ0QsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDOzs7T0FBQTtJQUVELGdDQUFhLEdBQWI7UUFDRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVLLCtCQUFZLEdBQWxCOzs7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0Ms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TUFBTSx1QkFBTixNQUFNLENBQUcsR0FBRyxDQUFDLE1BQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ3BHLE1BQU0sSUFBSSxpQkFBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO2FBQy9DO1NBQ0Y7SUFDSCxDQUFDO0lBS08scUNBQWtCLEdBQTFCLFVBQTJCLE1BQVcsRUFBRSxXQUF1QixFQUFFLE9BQWU7UUFDOUUsSUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRyxLQUFLLENBQUMsTUFBSyxTQUFTLElBQUksQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUcsS0FBSyxDQUFDLE1BQUssSUFBSSxJQUFJLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFHLEtBQUssQ0FBQyxNQUFLLEVBQUUsRUFBbkYsQ0FBbUYsQ0FBQyxFQUF4RyxDQUF3RyxDQUFFLENBQUE7UUFFckosSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxpQkFBUyxDQUFDLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQyxDQUFBO1NBQ2pDO0lBQ0gsQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBcDZDRCxJQW82Q0M7QUFwNkNZLDRCQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlQXV0aENvbmZpZyB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvYXV0aCdcbmltcG9ydCB0eXBlIHsgYXV0aE1vZGVscywgQ2xvdWRiYXNlT0F1dGgsIENyZWRlbnRpYWxzIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB7XG4gIHdlYXBwSnd0RGVjb2RlQWxsLFxuICBFVkVOVFMsXG4gIEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLFxuICBBdXRoRXJyb3IsXG4gIE9BVVRIX1RZUEUsXG4gIExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSxcbn0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIENvbW1vblJlcyxcbiAgRGVsZXRlTWVSZXEsXG4gIEdldENsYWltc1JlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIEdldFVzZXJSZXMsXG4gIExpbmtJZGVudGl0eVJlcSxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVxLFxuICBSZXNlbmRSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgU2V0U2Vzc2lvblJlcSxcbiAgU2lnbkluQW5vbnltb3VzbHlSZXEsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBTaWduSW5SZXMsXG4gIFNpZ25JbldpdGhJZFRva2VuUmVxLFxuICBTaWduSW5XaXRoT0F1dGhSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnblVwUmVzLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlckF0dHJpYnV0ZXMsXG4gIFVwZGF0ZVVzZXJSZXEsXG4gIFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T3RwUmVxLFxufSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgeyBldmVudEJ1cywgTG9naW5TdGF0ZSwgVXNlciB9IGZyb20gJy4nXG5pbXBvcnQgeyBzYXZlVG9Ccm93c2VyU2Vzc2lvbiwgZ2V0QnJvd3NlclNlc3Npb24sIHJlbW92ZUJyb3dzZXJTZXNzaW9uLCBhZGRVcmxTZWFyY2ggfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7IGFkYXB0ZXJGb3JXeE1wIH0gZnJvbSAnLi91dGlsaXRpZXMnXG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gKCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG5kZWNsYXJlIGNvbnN0IHd4OiBhbnlcblxuZXhwb3J0IGNsYXNzIFNiYXNlQXBpIHtcbiAgcmVhZG9ubHkgY29uZmlnOiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1xuICBvYXV0aEluc3RhbmNlOiBDbG91ZGJhc2VPQXV0aFxuICByZWFkb25seSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBNYXA8c3RyaW5nLCBTZXQ8T25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaz4+ID0gbmV3IE1hcCgpXG4gIHByaXZhdGUgaGFzTGlzdGVuZXJTZXRVcCA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBJQ2xvdWRiYXNlQXV0aENvbmZpZyAmIHsgY2FjaGU6IElDbG91ZGJhc2VDYWNoZSB9KSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICB0aGlzLm9hdXRoSW5zdGFuY2UgPSBjb25maWcub2F1dGhJbnN0YW5jZVxuICAgIHRoaXMuY2FjaGUgPSBjb25maWcuY2FjaGVcbiAgICB0aGlzLmluaXQoKVxuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPluW9k+WJjeeZu+W9leeahOeUqOaIt+S/oeaBry3lkIzmraVcbiAgICovXG4gIGdldCBjdXJyZW50VXNlcigpIHtcbiAgICBjb25zdCBsb2dpblN0YXRlID0gdGhpcy5oYXNMb2dpblN0YXRlKClcblxuICAgIGlmIChsb2dpblN0YXRlKSB7XG4gICAgICByZXR1cm4gbG9naW5TdGF0ZS51c2VyIHx8IG51bGxcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGhhc0xvZ2luU3RhdGUoKTogTG9naW5TdGF0ZSB8IG51bGwge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5oYXNMb2dpblN0YXRlKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIHNldEFjY2Vzc0tleSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguc2V0QWNjZXNzS2V5KCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIHNpZ25JbihfcGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25JblJlcXVlc3QpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguc2lnbkluKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIHNpZ25JbldpdGhQcm92aWRlcihfcGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25JbldpdGhQcm92aWRlclJlcXVlc3QpOiBQcm9taXNlPExvZ2luU3RhdGU+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguc2lnbkluV2l0aFByb3ZpZGVyKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIGdlblByb3ZpZGVyUmVkaXJlY3RVcmkoX3BhcmFtczogYXV0aE1vZGVscy5HZW5Qcm92aWRlclJlZGlyZWN0VXJpUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlc3BvbnNlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLmdlblByb3ZpZGVyUmVkaXJlY3RVcmkoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKTogUHJvbWlzZTx7XG4gICAgYWNjZXNzVG9rZW46IGFueVxuICAgIGVudjogc3RyaW5nXG4gIH0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguZ2V0QWNjZXNzVG9rZW4oKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgZ2V0VXNlckluZm8oKTogUHJvbWlzZTwoYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHwgbnVsbD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5nZXRVc2VySW5mbygpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyB1cGRhdGVVc2VyQmFzaWNJbmZvKF9wYXJhbXM6IGF1dGhNb2RlbHMuTW9kaWZ5VXNlckJhc2ljSW5mb1JlcXVlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGgudXBkYXRlVXNlckJhc2ljSW5mbygpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBzZXRDdXN0b21TaWduRnVuYyhfZ2V0VGlja0ZuOiBhdXRoTW9kZWxzLkdldEN1c3RvbVNpZ25UaWNrZXRGbik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5zZXRDdXN0b21TaWduRnVuYygpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBncmFudFByb3ZpZGVyVG9rZW4oX3BhcmFtczogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXF1ZXN0LCk6IFByb21pc2U8YXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5ncmFudFByb3ZpZGVyVG9rZW4oKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgYmluZFdpdGhQcm92aWRlcihfcGFyYW1zOiBhdXRoTW9kZWxzLkJpbmRXaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLmJpbmRXaXRoUHJvdmlkZXIoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgc2lnbkluV2l0aFVzZXJuYW1lKF9wYXJhbXM6IHtcbiAgICB2ZXJpZmljYXRpb25JbmZvPzogeyB2ZXJpZmljYXRpb25faWQ6IHN0cmluZzsgaXNfdXNlcjogYm9vbGVhbiB9XG4gICAgdmVyaWZpY2F0aW9uQ29kZT86IHN0cmluZ1xuICAgIHVzZXJuYW1lPzogc3RyaW5nIC8vIOeUqOaIt+WQjeensO+8jOmVv+W6piA1LTI0IOS9je+8jOaUr+aMgeWtl+espuS4reiLseaWh+OAgeaVsOWtl+OAgeeJueauiuWtl+espu+8iOS7heaUr+aMgV8t77yJ77yM5LiN5pSv5oyB5Lit5paHXG4gICAgYmluZEluZm8/OiBhbnlcbiAgICBsb2dpblR5cGU/OiBzdHJpbmdcbiAgICBhdXRvU2lnblVwPzogYm9vbGVhblxuICB9KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLnNpZ25JbldpdGhVc2VybmFtZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBnZXRWZXJpZmljYXRpb24oXG4gICAgX3BhcmFtczogYXV0aE1vZGVscy5HZXRWZXJpZmljYXRpb25SZXF1ZXN0LFxuICAgIF9vcHRpb25zPzogeyB3aXRoQ2FwdGNoYTogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVzcG9uc2U+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguZ2V0VmVyaWZpY2F0aW9uKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUxvZ2luU3RhdGUoXG4gICAgX3BhcmFtcz86IHsgdmVyc2lvbj86IHN0cmluZzsgcXVlcnk/OiBhbnkgfSxcbiAgICBfb3B0aW9ucz86IHsgYXN5bmNSZWZyZXNoVXNlcj86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLmNyZWF0ZUxvZ2luU3RhdGUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgdmVyaWZ5KF9wYXJhbXM6IGF1dGhNb2RlbHMuVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8YXV0aE1vZGVscy5WZXJpZnlSZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC52ZXJpZnkoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW5hbm9ueW1vdXNseVxuICAgKiBTaWduIGluIGEgdXNlciBhbm9ueW1vdXNseS5cbiAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgYXV0aC5zaWduSW5Bbm9ueW1vdXNseSgpO1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zICBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbkFub255bW91c2x5KHBhcmFtczogU2lnbkluQW5vbnltb3VzbHlSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5Bbm9ueW1vdXNseShwYXJhbXMpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWdudXBcbiAgICogU2lnbiB1cCBhIG5ldyB1c2VyIHdpdGggZW1haWwgb3IgcGhvbmUgdXNpbmcgYSBvbmUtdGltZSBwYXNzd29yZCAoT1RQKS4gSWYgdGhlIGFjY291bnQgbm90IGV4aXN0LCBhIG5ldyBhY2NvdW50IHdpbGwgYmUgY3JlYXRlZC5cbiAgICogbGV0IHNpZ25VcFJlc29sdmUgPSBudWxsO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwcC5hdXRoLnNpZ25VcCh7XG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICB9KTtcblxuICAgIHNpZ25VcFJlc29sdmUgPSByZXMuZGF0YS52ZXJpZnlcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNpZ25VcFJlc29sdmUoY29kZSk7XG5cbiAgICAvLyByZXMuZGF0YS5jYWxsYmFja+aUr+aMgSBtZXNzYWdlSWQg5Y+C5pWw55So5LqO6YeN5paw5Y+R6YCB6aqM6K+B56CB6L+b6KGM6aqM6K+B77yMbWVzc2FnZUlkIOWPr+S7peS7jiByZXNlbmQoKSDmlrnms5XkuK3ojrflj5ZcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnJlc2VuZCh7XG4gICAgICB0eXBlOiBcInNpZ251cFwiLFxuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSlcbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduVXBSZXNvbHZlKGNvZGUsIGRhdGEubWVzc2FnZUlkKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25VcFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25VcChwYXJhbXM6IGF1dGhNb2RlbHMuU2lnblVwUmVxdWVzdCk6IFByb21pc2U8U2lnblVwUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0sKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLy8g56ys5LqM5q2l77ya562J5b6F55So5oi36L6T5YWl6aqM6K+B56CB77yI6YCa6L+HIFByb21pc2Ug5YyF6KOF55So5oi36L6T5YWl5LqL5Lu277yJXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAoeyB0b2tlbiwgbWVzc2FnZUlkID0gdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQgfSk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDnrKzkuInmraXvvJrlvoXnlKjmiLfovpPlhaXlrozpqozor4HnoIHkuYvlkI7vvIzpqozor4Hnn63kv6Hpqozor4HnoIFcbiAgICAgICAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uVG9rZW5SZXMgPSBhd2FpdCB0aGlzLnZlcmlmeSh7XG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiBtZXNzYWdlSWQgfHwgdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIC8vIOesrOWbm+atpe+8muazqOWGjOW5tueZu+W9leaIluebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLflt7Lnu4/lrZjlnKjvvIznm7TmjqXnmbvlvZVcbiAgICAgICAgICAgICAgaWYgKHZlcmlmaWNhdGlvbkluZm8uaXNfdXNlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2lnbkluKHtcbiAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiBwYXJhbXMuZW1haWwgfHwgdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzms6jlhoznlKjmiLdcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLmVtYWlsXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEucGhvbmVcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcCh7XG4gICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgLi4uKHBhcmFtcy5lbWFpbCA/IHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9IDogeyBwaG9uZV9udW1iZXI6IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSB9KSxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWdub3V0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGguc2lnbk91dCgpO1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduT3V0KHBhcmFtcz86IGF1dGhNb2RlbHMuU2lnbm91dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQgfCBhdXRoTW9kZWxzLlNpZ25vdXRSZXBvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbk91dChwYXJhbXMpXG4gICAgICBhd2FpdCB0aGlzLmNhY2hlLnJlbW92ZVN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgICB0aGlzLnNldEFjY2Vzc0tleSgpXG5cbiAgICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkxPR0lOX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnRUeXBlOiBMT0dJTl9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTl9PVVQgfSlcblxuICAgICAgZXZlbnRCdXMuZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfT1VUIH0pXG5cbiAgICAgIC8vIHJlc+i/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgICByZXR1cm4geyAuLi5yZXMsIGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtb25hdXRoc3RhdGVjaGFuZ2VcbiAgICogUmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBldmVyeSB0aW1lIGFuIGF1dGggZXZlbnQgaGFwcGVucy4gU2FmZSB0byB1c2Ugd2l0aG91dCBhbiBhc3luYyBmdW5jdGlvbiBhcyBjYWxsYmFjay5cbiAgICogY29uc3QgeyBkYXRhIH0gPSBhcHAuYXV0aC5vbkF1dGhTdGF0ZUNoYW5nZSgoZXZlbnQsIHNlc3Npb24pID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBzZXNzaW9uKTtcbiAgICAgIGlmIChldmVudCA9PT0gXCJJTklUSUFMX1NFU1NJT05cIikge1xuICAgICAgICAvLyBoYW5kbGUgaW5pdGlhbCBzZXNzaW9uXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlNJR05FRF9JTlwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBzaWduIGluIGV2ZW50XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlNJR05FRF9PVVRcIikge1xuICAgICAgICAvLyBoYW5kbGUgc2lnbiBvdXQgZXZlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiUEFTU1dPUkRfUkVDT1ZFUllcIikge1xuICAgICAgICAvLyBoYW5kbGUgcGFzc3dvcmQgcmVjb3ZlcnkgZXZlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiVE9LRU5fUkVGUkVTSEVEXCIpIHtcbiAgICAgICAgLy8gaGFuZGxlIHRva2VuIHJlZnJlc2hlZCBldmVudFxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJVU0VSX1VQREFURURcIikge1xuICAgICAgICAvLyBoYW5kbGUgdXNlciB1cGRhdGVkIGV2ZW50XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gY2FsbCB1bnN1YnNjcmliZSB0byByZW1vdmUgdGhlIGNhbGxiYWNrXG4gICAgZGF0YS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqIEByZXR1cm5zIFByb21pc2U8eyBkYXRhOiB7IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIH0sIGVycm9yOiBFcnJvciB8IG51bGwgfT5cbiAgICovXG4gIG9uQXV0aFN0YXRlQ2hhbmdlKGNhbGxiYWNrOiBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmhhc0xpc3RlbmVyU2V0VXApIHtcbiAgICAgIHRoaXMuc2V0dXBMaXN0ZW5lcnMoKVxuICAgICAgdGhpcy5oYXNMaXN0ZW5lclNldFVwID0gdHJ1ZVxuICAgIH1cblxuICAgIGNvbnN0IGlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNilcblxuICAgIGlmICghdGhpcy5saXN0ZW5lcnMuaGFzKGlkKSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuc2V0KGlkLCBuZXcgU2V0KCkpXG4gICAgfVxuXG4gICAgdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKSEuYWRkKGNhbGxiYWNrKVxuXG4gICAgLy8g6L+U5ZueIFN1YnNjcmlwdGlvbiDlr7nosaFcbiAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB7XG4gICAgICBpZCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGlkKVxuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjaylcbiAgICAgICAgICBpZiAoY2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShpZClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHsgc3Vic2NyaXB0aW9uIH0sXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRocGFzc3dvcmRcbiAgICogTG9nIGluIGFuIGV4aXN0aW5nIHVzZXIgd2l0aCBhbiBlbWFpbCBhbmQgcGFzc3dvcmQgb3IgcGhvbmUgYW5kIHBhc3N3b3JkIG9yIHVzZXJuYW1lIGFuZCBwYXNzd29yZC5cbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5zaWduSW5XaXRoUGFzc3dvcmQoe1xuICAgICAgdXNlcm5hbWU6IFwieHh4XCIsXG4gICAgICBwYXNzd29yZDogXCJ4eHhcIixcbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aFBhc3N3b3JkKHBhcmFtczogU2lnbkluV2l0aFBhc3N3b3JkUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadXNlcm5hbWUvZW1haWwvcGhvbmXkuInpgInkuIDvvIxwYXNzd29yZOW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUoXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgW1sndXNlcm5hbWUnXSwgWydlbWFpbCddLCBbJ3Bob25lJ11dLFxuICAgICAgICAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgdXNlcm5hbWUsIGVtYWlsLCBvciBwaG9uZScsXG4gICAgICApXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5zaWduSW4oe1xuICAgICAgICB1c2VybmFtZTogcGFyYW1zLnVzZXJuYW1lIHx8IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSksXG4gICAgICAgIHBhc3N3b3JkOiBwYXJhbXMucGFzc3dvcmQsXG4gICAgICB9KVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aGlkdG9rZW5cbiAgICog56ys5LiJ5pa55bmz5Y+w55m75b2V44CC5aaC5p6c55So5oi35LiN5a2Y5Zyo77yM5Lya5qC55o2u5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8j+S4reWvueW6lOi6q+S7vea6kOeahOeZu+W9leaooeW8j+mFjee9ru+8jOWIpOaWreaYr+WQpuiHquWKqOazqOWGjFxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aElkVG9rZW4ocGFyYW1zOiBTaWduSW5XaXRoSWRUb2tlblJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnRva2Vu5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICB0b2tlbjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Rva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoUHJvdmlkZXIoe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcGFyYW1zLnRva2VuLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhvdHBcbiAgICogTG9nIGluIGEgdXNlciB1c2luZyBhIG9uZS10aW1lIHBhc3N3b3JkIChPVFApLlxuICAgKiBsZXQgc2lnblJlc29sdmUgPSBudWxsO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGFwcC5hdXRoLnNpZ25JbldpdGhPdHAoe1xuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSk7XG5cbiAgICBzaWduUmVzb2x2ZSA9IHJlcy5kYXRhLnZlcmlmeVxuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgc2lnblJlc29sdmUoY29kZSk7XG5cbiAgICAvLyByZXMuZGF0YS5jYWxsYmFja+aUr+aMgSBtZXNzYWdlSWQg5Y+C5pWw55So5LqO6YeN5paw5Y+R6YCB6aqM6K+B56CB6L+b6KGM6aqM6K+B77yMbWVzc2FnZUlkIOWPr+S7peS7jiByZXNlbmQoKSDmlrnms5XkuK3ojrflj5ZcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnJlc2VuZCh7XG4gICAgICB0eXBlOiBcInNpZ251cFwiLFxuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSlcbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduVXBSZXNvbHZlKGNvZGUsIGRhdGEubWVzc2FnZUlkKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JbldpdGhPdHBSZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoT3RwKHBhcmFtczogU2lnbkluV2l0aE90cFJlcSk6IFByb21pc2U8U2lnbkluV2l0aE90cFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJplbWFpbOaIlnBob25l5b+F5aGr5YW25LiAXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShwYXJhbXMsIFtbJ2VtYWlsJ10sIFsncGhvbmUnXV0sICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhbiBlbWFpbCBvciBwaG9uZSBudW1iZXInKVxuXG4gICAgICAvLyDnrKzkuIDmraXvvJrlj5HpgIHpqozor4HnoIHlubblrZjlgqggdmVyaWZpY2F0aW9uSW5mb1xuICAgICAgY29uc3QgdmVyaWZpY2F0aW9uSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VmVyaWZpY2F0aW9uKHBhcmFtcy5lbWFpbCA/IHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9IDogeyBwaG9uZV9udW1iZXI6IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSB9LClcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHVzZXI6IG51bGwsXG4gICAgICAgICAgc2Vzc2lvbjogbnVsbCxcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgICBtZXNzYWdlSWQsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5qCh6aqM56ys5LiJ5pa55bmz5Y+w5o6I5p2D55m75b2V5Zue6LCD77yM6ZyA5YWI6LCD55SoIHNpZ25JbldpdGhPQXV0aCDnlJ/miJDnrKzkuInmlrnlubPlj7DmjojmnYMgVXJp77yM6K6/6Zeu6K+lIFVyaSDlkI7vvIzkvJrot7PovazliLDnrKzkuInmlrnlubPlj7DmjojmnYPpobXpnaLvvIzmjojmnYPlrozmiJDlkI7lm57osIPlm57mnaXlho3osIPnlKjor6Xmlrnms5XvvIzkuI3kvKDlj4LmlbDliJnku44gdXJsIHF1ZXJ5IOWSjCBzZXNzaW9uU3RvcmFnZSDkuK3ojrflj5ZcbiAgICogLy8gMS4g6I635Y+W56ys5LiJ5pa55bmz5Y+w5o6I5p2D6aG15Zyw5Z2AXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhcHAuYXV0aC5zaWduSW5XaXRoT0F1dGgoe1xuICAgICAgcHJvdmlkZXI6ICdzdHJpbmcnXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHJlZGlyZWN0VG86ICdodHRwczovL2V4YW1wbGUuY29tL2NhbGxiYWNrJ1xuICAgICAgICBzdGF0ZTogJ3N0cmluZydcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gMi4g6K6/6ZeudXJpIO+8iOWmgiBsb2NhdGlvbi5ocmVmID0gdXJp77yJXG5cbiAgICAvLyAzLiDmoKHpqoznrKzkuInmlrnlubPlj7DmjojmnYPlm57osINcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnZlcmlmeU9BdXRoKClcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHZlcmlmeU9BdXRoKHBhcmFtcz86IFZlcmlmeU9BdXRoUmVxKTogUHJvbWlzZTxTaWduSW5SZXMgfCBMaW5rSWRlbnRpdHlSZXM+IHtcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fVxuICAgIHRyeSB7XG4gICAgICAvLyDlm57osIPoh7MgcHJvdmlkZXJfcmVkaXJlY3RfdXJpIOWcsOWdgO+8iHVybCBxdWVyeeS4reaQuuW4piDmjojmnYNjb2Rl77yMc3RhdGXnrYnlj4LmlbDvvInvvIzmraTml7bmo4Dmn6Ugc3RhdGUg5piv5ZCm56ym5ZCI6aKE5pyf77yI5aaCIOiHquW3seiuvue9rueahCB3eF9vcGVuKVxuICAgICAgY29uc3QgY29kZSA9IHBhcmFtcz8uY29kZSB8fCB1dGlscy5nZXRRdWVyeSgnY29kZScpXG4gICAgICBjb25zdCBzdGF0ZSA9IHBhcmFtcz8uc3RhdGUgfHwgdXRpbHMuZ2V0UXVlcnkoJ3N0YXRlJylcblxuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaY29kZeWSjHN0YXRl5b+F5aGrXG4gICAgICBpZiAoIWNvZGUpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ0NvZGUgaXMgcmVxdWlyZWQnIH0pIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGF0ZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnU3RhdGUgaXMgcmVxdWlyZWQnIH0pIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FjaGVEYXRhID0gZ2V0QnJvd3NlclNlc3Npb24oc3RhdGUpXG4gICAgICBkYXRhLnR5cGUgPSBjYWNoZURhdGE/LnR5cGVcblxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBwYXJhbXM/LnByb3ZpZGVyIHx8IGNhY2hlRGF0YT8ucHJvdmlkZXIgfHwgdXRpbHMuZ2V0UXVlcnkoJ3Byb3ZpZGVyJylcblxuICAgICAgaWYgKCFwcm92aWRlcikge1xuICAgICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICAvLyBzdGF0ZeespuWQiOmihOacn++8jOWImeiOt+WPluivpeS4ieaWueW5s+WPsHRva2VuXG4gICAgICBjb25zdCB7IHByb3ZpZGVyX3Rva2VuOiB0b2tlbiB9ID0gYXdhaXQgdGhpcy5ncmFudFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICBwcm92aWRlcl9pZDogcHJvdmlkZXIsXG4gICAgICAgIHByb3ZpZGVyX3JlZGlyZWN0X3VyaTogbG9jYXRpb24ub3JpZ2luICsgbG9jYXRpb24ucGF0aG5hbWUsIC8vIOaMh+WumuS4ieaWueW5s+WPsOi3s+WbnueahCB1cmwg5Zyw5Z2AXG4gICAgICAgIHByb3ZpZGVyX2NvZGU6IGNvZGUsIC8vIOesrOS4ieaWueW5s+WPsOi3s+i9rOWbnumhtemdouaXtu+8jHVybCBwYXJhbSDkuK3mkLrluKbnmoQgY29kZSDlj4LmlbBcbiAgICAgIH0pXG5cbiAgICAgIGxldCByZXM6IFNpZ25JblJlcyB8IExpbmtJZGVudGl0eVJlc1xuXG4gICAgICBpZiAoY2FjaGVEYXRhLnR5cGUgPT09IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSkge1xuICAgICAgICByZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS50b0JpbmRJZGVudGl0eSh7IHByb3ZpZGVyX3Rva2VuOiB0b2tlbiwgcHJvdmlkZXIsIGZpcmVFdmVudDogdHJ1ZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g6YCa6L+HIHByb3ZpZGVyX3Rva2VuIOS7heeZu+W9leaIlueZu+W9leW5tuazqOWGjO+8iOS4juS6keW8gOWPkeW5s+WPsC3nmbvlvZXmlrnlvI8t6Lqr5Lu95rqQ55m75b2V5qih5byP6YWN572u5pyJ5YWz77yJXG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMuc2lnbkluV2l0aElkVG9rZW4oe1xuICAgICAgICAgIHRva2VuLFxuICAgICAgICB9KVxuICAgICAgICByZXMuZGF0YSA9IHsgLi4uZGF0YSwgLi4ucmVzLmRhdGEgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2NhbFNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMobG9jYXRpb24/LnNlYXJjaClcbiAgICAgIGxvY2FsU2VhcmNoLmRlbGV0ZSgnY29kZScpXG4gICAgICBsb2NhbFNlYXJjaC5kZWxldGUoJ3N0YXRlJylcbiAgICAgIGFkZFVybFNlYXJjaChcbiAgICAgICAgY2FjaGVEYXRhPy5zZWFyY2ggPT09IHVuZGVmaW5lZCA/IGA/JHtsb2NhbFNlYXJjaC50b1N0cmluZygpfWAgOiBjYWNoZURhdGE/LnNlYXJjaCxcbiAgICAgICAgY2FjaGVEYXRhPy5oYXNoIHx8IGxvY2F0aW9uLmhhc2gsXG4gICAgICApXG4gICAgICByZW1vdmVCcm93c2VyU2Vzc2lvbihzdGF0ZSlcblxuICAgICAgcmV0dXJuIHJlc1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhLCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG9hdXRoXG4gICAqIOeUn+aIkOesrOS4ieaWueW5s+WPsOaOiOadgyBVcmkg77yI5aaC5b6u5L+h5LqM57u056CB5omr56CB5o6I5p2D572R6aG177yJXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5PQXV0aFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPQXV0aChwYXJhbXM6IFNpZ25JbldpdGhPQXV0aFJlcSk6IFByb21pc2U8U2lnbkluT0F1dGhSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBocmVmID0gcGFyYW1zLm9wdGlvbnM/LnJlZGlyZWN0VG8gfHwgbG9jYXRpb24uaHJlZlxuXG4gICAgICBjb25zdCB1cmxPYmplY3QgPSBuZXcgVVJMKGhyZWYpXG5cbiAgICAgIGNvbnN0IHByb3ZpZGVyX3JlZGlyZWN0X3VyaSA9IHVybE9iamVjdC5vcmlnaW4gKyB1cmxPYmplY3QucGF0aG5hbWVcblxuICAgICAgY29uc3Qgc3RhdGUgPSBwYXJhbXMub3B0aW9ucz8uc3RhdGUgfHwgYHByZC0ke3BhcmFtcy5wcm92aWRlcn0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KVxuICAgICAgICAuc2xpY2UoMil9YFxuXG4gICAgICBjb25zdCB7IHVyaSB9ID0gYXdhaXQgdGhpcy5nZW5Qcm92aWRlclJlZGlyZWN0VXJpKHtcbiAgICAgICAgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpLFxuICAgICAgICBzdGF0ZSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIOWvuSBVUkwg6L+b6KGM6Kej56CBXG4gICAgICBjb25zdCBkZWNvZGVkVXJpID0gZGVjb2RlVVJJQ29tcG9uZW50KHVyaSlcblxuICAgICAgLy8g5ZCI5bm26aKd5aSW55qE5p+l6K+i5Y+C5pWwXG4gICAgICBsZXQgZmluYWxVcmkgPSBkZWNvZGVkVXJpXG5cbiAgICAgIGlmIChwYXJhbXMub3B0aW9ucz8ucXVlcnlQYXJhbXMpIHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChkZWNvZGVkVXJpKVxuICAgICAgICBPYmplY3QuZW50cmllcyhwYXJhbXMub3B0aW9ucy5xdWVyeVBhcmFtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgdXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgICAgfSlcbiAgICAgICAgZmluYWxVcmkgPSB1cmwudG9TdHJpbmcoKVxuICAgICAgfVxuXG4gICAgICBzYXZlVG9Ccm93c2VyU2Vzc2lvbihzdGF0ZSwge1xuICAgICAgICBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBzZWFyY2g6IHVybE9iamVjdC5zZWFyY2gsXG4gICAgICAgIGhhc2g6IHVybE9iamVjdC5oYXNoLFxuICAgICAgICB0eXBlOiBwYXJhbXMub3B0aW9ucz8udHlwZSB8fCBPQVVUSF9UWVBFLlNJR05fSU4sXG4gICAgICB9KVxuXG4gICAgICBpZiAoaXNCcm93c2VyKCkgJiYgIXBhcmFtcy5vcHRpb25zPy5za2lwQnJvd3NlclJlZGlyZWN0KSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oZmluYWxVcmkpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXJsOiBmaW5hbFVyaSwgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRoc3NvXG4gIGFzeW5jIHNpZ25JbldpdGhTU08oKSB7XG4gICAgLy9cbiAgfVxuXG4gIC8vIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRod2ViM1xuICBhc3luYyBzaWduSW5XaXRoV2ViMygpIHtcbiAgICAvL1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldGNsYWltc1xuICBhc3luYyBnZXRDbGFpbXMoKTogUHJvbWlzZTxHZXRDbGFpbXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhY2Nlc3NUb2tlbiB9ID0gYXdhaXQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpXG4gICAgICBjb25zdCBwYXJzZWRUb2tlbiA9IHdlYXBwSnd0RGVjb2RlQWxsKGFjY2Vzc1Rva2VuKVxuICAgICAgcmV0dXJuIHsgZGF0YTogcGFyc2VkVG9rZW4sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1yZXNldHBhc3N3b3JkZm9yZW1haWxcbiAgICog6YCa6L+HIGVtYWlsIOaIluaJi+acuuWPt+mHjee9ruWvhueggVxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnJlc2V0UGFzc3dvcmRGb3JFbWFpbChcInh4eEB4eC5jb21cIik7XG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVzZXRQYXNzd29yZEZvckVtYWlsKFwiMTM4MDAxMzgwMDBcIik7XG5cbiAgICAgYXdhaXQgZGF0YS51cGRhdGVVc2VyKGNvZGUsIG5ld1Bhc3NXb3JkKTtcbiAgICpcbiAgICogQHBhcmFtIGVtYWlsT3JQaG9uZSDpgq7nrrHmiJbmiYvmnLrlj7dcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZXNldFBhc3N3b3JkRm9yRW1haWxSZXM+XG4gICAqL1xuICBhc3luYyByZXNldFBhc3N3b3JkRm9yRW1haWwoXG4gICAgZW1haWxPclBob25lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgcmVkaXJlY3RUbz86IHN0cmluZyB9LFxuICApOiBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJplbWFpbE9yUGhvbmXlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMoXG4gICAgICAgIHsgZW1haWxPclBob25lIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBlbWFpbE9yUGhvbmU6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdFbWFpbCBvciBwaG9uZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgfSxcbiAgICAgIClcblxuICAgICAgY29uc3QgeyByZWRpcmVjdFRvIH0gPSBvcHRpb25zIHx8IHt9XG5cbiAgICAgIC8vIOWIpOaWreaYr+mCrueusei/mOaYr+aJi+acuuWPt1xuICAgICAgY29uc3QgaXNFbWFpbCA9IGVtYWlsT3JQaG9uZS5pbmNsdWRlcygnQCcpXG4gICAgICBsZXQgdmVyaWZpY2F0aW9uUGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfVxuXG4gICAgICBpZiAoaXNFbWFpbCkge1xuICAgICAgICB2ZXJpZmljYXRpb25QYXJhbXMgPSB7IGVtYWlsOiBlbWFpbE9yUGhvbmUgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g5q2j6KeE5YyW5omL5py65Y+3XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShlbWFpbE9yUGhvbmUpXG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSB9XG4gICAgICB9XG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24odmVyaWZpY2F0aW9uUGFyYW1zKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLy8g56ys5LqM5q2l77ya562J5b6F55So5oi36L6T5YWl6aqM6K+B56CB77yI6YCa6L+HIFByb21pc2Ug5YyF6KOF55So5oi36L6T5YWl5LqL5Lu277yJXG4gICAgICAgICAgdXBkYXRlVXNlcjogYXN5bmMgKGF0dHJpYnV0ZXM6IFVwZGF0ZVVzZXJBdHRyaWJ1dGVzKTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMoYXR0cmlidXRlcywge1xuICAgICAgICAgICAgICBub25jZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ05vbmNlIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgemqjOivgeeggVxuICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25faWQ6IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBhdHRyaWJ1dGVzLm5vbmNlLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnJlc2V0UGFzc3dvcmQoe1xuICAgICAgICAgICAgICAgIGVtYWlsOiBpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBob25lOiAhaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgZXZlbnRCdXMuZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5QQVNTV09SRF9SRUNPVkVSWSB9KVxuXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2lnbkluV2l0aFBhc3N3b3JkKHtcbiAgICAgICAgICAgICAgICBlbWFpbDogaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBwaG9uZTogIWlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0VG8gJiYgaXNCcm93c2VyKCkpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uYXNzaWduKHJlZGlyZWN0VG8pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gcmVzXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/h+aXp+WvhueggemHjee9ruWvhueggVxuICAgKiBAcGFyYW0gbmV3X3Bhc3N3b3JkXG4gICAqIEBwYXJhbSBvbGRfcGFzc3dvcmRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JPbGQocGFyYW1zOiBSZXNldFBhc3N3b3JkRm9yT2xkUmVxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVwZGF0ZVBhc3N3b3JkQnlPbGQoe1xuICAgICAgICBvbGRfcGFzc3dvcmQ6IHBhcmFtcy5vbGRfcGFzc3dvcmQsXG4gICAgICAgIG5ld19wYXNzd29yZDogcGFyYW1zLm5ld19wYXNzd29yZCxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXZlcmlmeW90cFxuICAgKiBMb2cgaW4gYSB1c2VyIGdpdmVuIGEgVXNlciBzdXBwbGllZCBPVFAgYW5kIHZlcmlmaWNhdGlvbklkIHJlY2VpdmVkIHRocm91Z2ggbW9iaWxlIG9yIGVtYWlsLlxuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgYXBwLmF1dGguZ2V0VmVyaWZpY2F0aW9uKHtcbiAgICAgIHBob25lOiBcInh4eHh4eFwiLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwcC5hdXRoLnZlcmlmeU90cCh7XG4gICAgICB0eXBlOiBcInNtc1wiLFxuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgICB0b2tlbjogXCJ4eHh4eHhcIixcbiAgICAgIHZlcmlmaWNhdGlvbkluZm8sXG4gICAgfSlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHZlcmlmeU90cChwYXJhbXM6IFZlcmlmeU90cFJlcSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdHlwZSB9ID0gcGFyYW1zXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp0b2tlbuWSjHZlcmlmaWNhdGlvbkluZm/lv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHRva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnVG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgIG1lc3NhZ2VJZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ21lc3NhZ2VJZCBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGlmIChbJ3Bob25lX2NoYW5nZScsICdlbWFpbF9jaGFuZ2UnXS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeSh7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiBwYXJhbXMubWVzc2FnZUlkLFxuICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBwYXJhbXMudG9rZW4sXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uSW5mbzogeyB2ZXJpZmljYXRpb25faWQ6IHBhcmFtcy5tZXNzYWdlSWQsIGlzX3VzZXI6IHRydWUgfSxcbiAgICAgICAgICB2ZXJpZmljYXRpb25Db2RlOiBwYXJhbXMudG9rZW4sXG4gICAgICAgICAgdXNlcm5hbWU6IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfHwgJycsXG4gICAgICAgICAgbG9naW5UeXBlOiBwYXJhbXMuZW1haWwgPyAnZW1haWwnIDogJ3Bob25lJyxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0U2Vzc2lvblxuICAgKiBSZXR1cm5zIHRoZSBzZXNzaW9uLCByZWZyZXNoaW5nIGl0IGlmIG5lY2Vzc2FyeS5cbiAgICogVGhlIHNlc3Npb24gcmV0dXJuZWQgY2FuIGJlIG51bGwgaWYgdGhlIHNlc3Npb24gaXMgbm90IGRldGVjdGVkIHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIGV2ZW50IGEgdXNlciBpcyBub3Qgc2lnbmVkLWluIG9yIGhhcyBsb2dnZWQgb3V0LlxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmdldFNlc3Npb24oKVxuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIGdldFNlc3Npb24oKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5nZXRDcmVkZW50aWFscygpXG5cbiAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhY2Nlc3NLZXknKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHsgc2Vzc2lvbjogbnVsbCB9LCBlcnJvcjogbnVsbCB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyB1c2VyIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uOiB7IC4uLmNyZWRlbnRpYWxzLCB1c2VyIH0gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlZnJlc2hzZXNzaW9uXG4gICAqIOaXoOiuuui/h+acn+eKtuaAgeWmguS9le+8jOmDvei/lOWbnuS4gOS4quaWsOeahOS8muivneOAguaOpeWPl+S4gOS4quWPr+mAieeahHJlZnJlc2hfdG9rZW7jgILlpoLmnpzmnKrkvKDlhaXlvZPliY3kvJror53vvIzliJlyZWZyZXNoU2Vzc2lvbigp5bCG5bCd6K+V5LuOZ2V0U2Vzc2lvbigp5Lit5qOA57Si5a6D44CC5aaC5p6c5b2T5YmN5Lya6K+d55qE5Yi35paw5Luk54mM5peg5pWI77yM5YiZ5Lya5oqb5Ye65LiA5Liq6ZSZ6K+v44CCXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVmcmVzaFNlc3Npb24oKVxuICAgKiBAcGFyYW0gcmVmcmVzaF90b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHJlZnJlc2hTZXNzaW9uKHJlZnJlc2hfdG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgY3JlZGVudGlhbHMucmVmcmVzaF90b2tlbiA9IHJlZnJlc2hfdG9rZW4gfHwgY3JlZGVudGlhbHMucmVmcmVzaF90b2tlblxuICAgICAgY29uc3QgbmV3VG9rZW5zID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5yZWZyZXNoVG9rZW4oY3JlZGVudGlhbHMpXG4gICAgICBjb25zdCB7IGRhdGE6IHsgdXNlciB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgc2Vzc2lvbjogeyAuLi5uZXdUb2tlbnMsIHVzZXIgfSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0dXNlclxuICAgKiDlpoLmnpzlrZjlnKjnjrDmnInkvJror53vvIzliJnojrflj5blvZPliY3nlKjmiLfor6bnu4bkv6Hmga/jgILmraTmlrnms5XkvJrlkJHmnI3liqHlmajlj5HotbfnvZHnu5zor7fmsYLvvIzlm6DmraTov5Tlm57nmoTlgLzmmK/nnJ/lrp7nmoTvvIzlj6/nlKjkuo7liLblrprmjojmnYPop4TliJnjgIJcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5nZXRVc2VyKClcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcigpOiBQcm9taXNlPEdldFVzZXJSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IHRoaXMuY29udmVydFRvVXNlcihhd2FpdCB0aGlzLmdldFVzZXJJbmZvKCkpXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXIgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yi35paw55So5oi35L+h5oGvXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFVzZXIoKTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jdXJyZW50VXNlci5yZWZyZXNoKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVwZGF0ZXVzZXJcbiAgICog5pu05paw55So5oi35L+h5oGvXG4gICAqIC0g5LiN5pSv5oyB5pu05paw5a+G56CB77yM5pu05paw5a+G56CB6K+35L2/55SoIHJlc2V0UGFzc3dvcmRGb3JFbWFpbCDmiJYgcmVhdXRoZW50aWNhdGVcbiAgICogLSDlpoLmnpzmm7TmlrAgZW1haWwg5oiWIHBob25l77yM6ZyA6KaB5YWI5Y+R6YCB6aqM6K+B56CB77yM54S25ZCO6LCD55So6L+U5Zue55qEIHZlcmlmeU90cCDlm57osIPov5vooYzpqozor4FcbiAgICpcbiAgICogLy8g5pu05paw5LiN6ZyA6KaB6aqM6K+B55qE5a2X5q61XG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgudXBkYXRlVXNlcih7XG4gICAgICB1c2VybmFtZTogXCJ4eHhcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcInh4eFwiLFxuICAgICAgYXZhdGFyX3VybDogXCJ4eHhcIixcbiAgICAgIG5pY2tuYW1lOiBcInh4eFwiLFxuICAgICAgZ2VuZGVyOiAnTUFMRSdcbiAgICB9KVxuICAgKlxuICAgKiAvLyDmm7TmlrAgZW1haWwg5oiWIHBob25l77yI6ZyA6KaB6aqM6K+B77yJXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgudXBkYXRlVXNlcih7XG4gICAgICBlbWFpbDogXCJuZXdAZXhhbXBsZS5jb21cIlxuICAgIH0pXG4gICAqIC8vIOiwg+eUqCB2ZXJpZnlPdHAg5Zue6LCD6aqM6K+BXG4gICAqIGF3YWl0IGRhdGEudmVyaWZ5T3RwKHsgZW1haWw6IFwibmV3QGV4YW1wbGUuY29tXCIsIHRva2VuOiBcIjEyMzQ1NlwiIH0pXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VyUmVzIHwgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXM+XG4gICAqL1xuICBhc3luYyB1cGRhdGVVc2VyKHBhcmFtczogVXBkYXRlVXNlclJlcSk6IFByb21pc2U8R2V0VXNlclJlcyB8IFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8muiHs+WwkeacieS4gOS4quabtOaWsOWtl+auteiiq+aPkOS+m1xuICAgICAgY29uc3QgaGFzVmFsdWUgPSBPYmplY3Qua2V5cyhwYXJhbXMpLnNvbWUoa2V5ID0+IHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQgJiYgcGFyYW1zW2tleV0gIT09IG51bGwgJiYgcGFyYW1zW2tleV0gIT09ICcnLClcbiAgICAgIGlmICghaGFzVmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZCBmb3IgdXBkYXRlJyB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGVtYWlsLCBwaG9uZSwgLi4ucmVzdFBhcmFtcyB9ID0gcGFyYW1zXG5cbiAgICAgIC8vIOajgOafpeaYr+WQpumcgOimgeabtOaWsCBlbWFpbCDmiJYgcGhvbmVcbiAgICAgIGNvbnN0IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPSBlbWFpbCAhPT0gdW5kZWZpbmVkXG4gICAgICBjb25zdCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uID0gcGhvbmUgIT09IHVuZGVmaW5lZFxuXG4gICAgICBsZXQgZXh0cmFSZXMgPSB7fVxuXG4gICAgICBpZiAobmVlZHNFbWFpbFZlcmlmaWNhdGlvbiB8fCBuZWVkc1Bob25lVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgIC8vIOmcgOimgeWPkemAgemqjOivgeeggVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uUGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uVHlwZTogJ2VtYWlsX2NoYW5nZScgfCAncGhvbmVfY2hhbmdlJ1xuXG4gICAgICAgIGlmIChuZWVkc0VtYWlsVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBlbWFpbDogcGFyYW1zLmVtYWlsIH1cbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlID0gJ2VtYWlsX2NoYW5nZSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQaG9uZSA9IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKVxuICAgICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSB9XG4gICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZSA9ICdwaG9uZV9jaGFuZ2UnXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlj5HpgIHpqozor4HnoIFcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvblBhcmFtcylcblxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocmVzdFBhcmFtcylcblxuICAgICAgICBleHRyYVJlcyA9IHtcbiAgICAgICAgICBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkLFxuICAgICAgICAgIHZlcmlmeU90cDogYXN5bmMgKHZlcmlmeVBhcmFtczogeyBlbWFpbD86IHN0cmluZzsgcGhvbmU/OiBzdHJpbmc7IHRva2VuOiBzdHJpbmcgfSk6IFByb21pc2U8R2V0VXNlclJlcz4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKHZlcmlmeVBhcmFtcy5lbWFpbCAmJiBwYXJhbXMuZW1haWwgPT09IHZlcmlmeVBhcmFtcy5lbWFpbCkge1xuICAgICAgICAgICAgICAgIC8vIOmqjOivgeeggemqjOivgVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdlbWFpbF9jaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IHBhcmFtcy5lbWFpbCxcbiAgICAgICAgICAgICAgICAgIHRva2VuOiB2ZXJpZnlQYXJhbXMudG9rZW4sXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9KVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZlcmlmeVBhcmFtcy5waG9uZSAmJiBwYXJhbXMucGhvbmUgPT09IHZlcmlmeVBhcmFtcy5waG9uZSkge1xuICAgICAgICAgICAgICAgIC8vIOmqjOivgeeggemqjOivgVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdwaG9uZV9jaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgcGhvbmU6IHBhcmFtcy5waG9uZSxcbiAgICAgICAgICAgICAgICAgIHRva2VuOiB2ZXJpZnlQYXJhbXMudG9rZW4sXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHsgcGhvbmU6IHBhcmFtcy5waG9uZSB9KVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudmVyaWZ5T3RwKHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHZlcmlmaWNhdGlvblR5cGUsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogbmVlZHNFbWFpbFZlcmlmaWNhdGlvbiA/IHBhcmFtcy5lbWFpbCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHBob25lOiAhbmVlZHNFbWFpbFZlcmlmaWNhdGlvbiA/IHBhcmFtcy5waG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHRva2VuOiB2ZXJpZnlQYXJhbXMudG9rZW4sXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlSWQ6IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8g6aqM6K+B5oiQ5Yqf5ZCO5pu05paw55So5oi35L+h5oGvXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtcylcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgICAgICAgICAgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpXG4gICAgICAgICAgICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4jemcgOimgemqjOivge+8jOebtOaOpeabtOaWsFxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuICAgICAgZXZlbnRCdXMuZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5VU0VSX1VQREFURUQgfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyLCAuLi5leHRyYVJlcyB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0dXNlcmlkZW50aXRpZXNcbiAgICog6I635Y+W5omA5pyJ6Lqr5Lu95rqQXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGguZ2V0VXNlcklkZW50aXRpZXMoKVxuICAgKiBAcmV0dXJucyBQcm9taXNlPEdldFVzZXJJZGVudGl0aWVzUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0VXNlcklkZW50aXRpZXMoKTogUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm92aWRlcnMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5nZXRQcm92aWRlcnMoKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IGlkZW50aXRpZXM6IHByb3ZpZGVycz8uZGF0YT8uZmlsdGVyKHYgPT4gISF2LmJpbmQpIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1saW5raWRlbnRpdHlcbiAgICog57uR5a6a6Lqr5Lu95rqQ5Yiw5b2T5YmN55So5oi377yM5aaC5p6c5bey5pyJ55So5oi357uR5a6a6K+l6Lqr5Lu95rqQ77yM5Lya5oqb5Ye66ZSZ6K+vXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgubGlua0lkZW50aXR5KHtcbiAgICAgIHByb3ZpZGVyOiAnc3RyaW5nJ1xuICAgIH0pXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+XG4gICAqL1xuICBhc3luYyBsaW5rSWRlbnRpdHkocGFyYW1zOiBMaW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPExpbmtJZGVudGl0eVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aE9BdXRoKHtcbiAgICAgICAgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlcixcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHR5cGU6IE9BVVRIX1RZUEUuQklORF9JREVOVElUWSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgcHJvdmlkZXI6IHBhcmFtcy5wcm92aWRlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdW5saW5raWRlbnRpdHlcbiAgICog6Kej57uR6Lqr5Lu95rqQXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgudW5saW5rSWRlbnRpdHkoe1xuICAgICAgcHJvdmlkZXI6IFwieHh4XCJcbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8Q29tbW9uUmVzPlxuICAgKi9cbiAgYXN5bmMgdW5saW5rSWRlbnRpdHkocGFyYW1zOiBVbmxpbmtJZGVudGl0eVJlcSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnByb3ZpZGVy5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwcm92aWRlcjogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudW5iaW5kUHJvdmlkZXIoeyBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVhdXRoZW50aWNhdGlvblxuICAgKiDph43mlrDorqTor4HjgILpgJrov4flj5HpgIHpqozor4HnoIHmnaXph43mlrDorqTor4HnlKjmiLfouqvku73vvIzmlK/mjIHmm7TmlrDlr4bnoIFcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZWF1dGhlbnRpY2F0ZSgpXG5cbiAgICAgYXdhaXQgZGF0YS51cGRhdGVVc2VyKGNvZGUsIG5ld1Bhc3NXb3JkKVxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlYXV0aGVudGljYXRlUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVhdXRoZW50aWNhdGUoKTogUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGE6IHsgdXNlciB9LFxuICAgICAgfSA9IGF3YWl0IHRoaXMuZ2V0VXNlcigpXG5cbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHVzZXIsIFtbJ2VtYWlsJywgJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcbiAgICAgIGNvbnN0IHVzZXJJbmZvID0gdXNlci5lbWFpbCA/IHsgZW1haWw6IHVzZXIuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHVzZXIucGhvbmUpIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih1c2VySW5mbylcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHVwZGF0ZVVzZXI6IGFzeW5jIChhdHRyaWJ1dGVzOiBVcGRhdGVVc2VyQXR0cmlidXRlcyk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgICAgbm9uY2U6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdOb25jZSBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcy5wYXNzd29yZCkge1xuICAgICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgemqjOivgeeggVxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9jb2RlOiBhdHRyaWJ1dGVzLm5vbmNlLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvLyDnrKzlm5vmraXvvJrojrflj5Ygc3Vkb190b2tlblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1ZG9SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgICBuZXdfcGFzc3dvcmQ6IGF0dHJpYnV0ZXMucGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICBzdWRvX3Rva2VuOiBzdWRvUmVzLnN1ZG9fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhVc2VybmFtZSh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25JbmZvLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICAgIC4uLnVzZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgbG9naW5UeXBlOiB1c2VySW5mby5lbWFpbCA/ICdlbWFpbCcgOiAncGhvbmUnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVzZW5kXG4gICAqIOmHjeaWsOWPkemAgemqjOivgeeggVxuICAgKiAtIOWQkeeUqOaIt+mHjeaWsOWPkemAgemCrueuseOAgeaJi+acuuWPt+azqOWGjOaIlueZu+W9leeahOmqjOivgeeggeOAglxuICAgKiAtIOWPr+S7pemAmui/h+WGjeasoeiwg+eUqCBzaWduSW5XaXRoT3RwKCkg5pa55rOV5p2l6YeN5paw5Y+R6YCB6aqM6K+B56CB55m75b2V44CCXG4gICAqIC0g5Y+v5Lul6YCa6L+H5YaN5qyh6LCD55SoIHNpZ25VcCgpIOaWueazleadpemHjeaWsOWPkemAgemqjOivgeeggeazqOWGjOOAglxuICAgKiAtIOatpOaWueazleS7heWcqOiwg+eUqCBzaWduSW5XaXRoT3RwKCkg5oiWIHNpZ25VcCgpIOWQju+8jOmHjeaWsOWPkemAgemqjOivgeegge+8jOaUtuWIsOmqjOivgeeggeWQjuWGjee7p+e7reiwg+eUqCBzaWduSW5XaXRoT3RwKCkg5oiWIHNpZ25VcCgpIOeahGNhbGxiYWNr5Y+C5pWw77yM5bCGbWVzc2FnZUlk5Lyg5YWlY2FsbGJhY2vjgIJcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwLmF1dGguc2lnbkluV2l0aE90cCh7IHBob25lOiBcInh4eFwiIH0pO1xuXG4gICAgbGV0IHNpZ25SZXNvbHZlID0gcmVzdWx0LmRhdGEudmVyaWZ5XG5cbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnJlc2VuZCh7XG4gICAgICB0eXBlOiBcInNpZ251cFwiLFxuICAgICAgcGhvbmU6IFwieHh4XCIsXG4gICAgfSlcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNpZ25SZXNvbHZlKGNvZGUsIGRhdGEubWVzc2FnZUlkKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2VuZFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2VuZChwYXJhbXM6IFJlc2VuZFJlcSk6IFByb21pc2U8UmVzZW5kUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IHBhcmFtcy50eXBlID09PSAnc2lnbnVwJyA/ICdBTlknIDogJ1VTRVInXG4gICAgICBjb25zdCBkYXRhOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZV9udW1iZXI/OiBzdHJpbmc7IHRhcmdldDogJ1VTRVInIHwgJ0FOWScgfSA9IHsgdGFyZ2V0IH1cbiAgICAgIGlmICgnZW1haWwnIGluIHBhcmFtcykge1xuICAgICAgICBkYXRhLmVtYWlsID0gcGFyYW1zLmVtYWlsXG4gICAgICB9XG5cbiAgICAgIGlmICgncGhvbmUnIGluIHBhcmFtcykge1xuICAgICAgICBkYXRhLnBob25lX251bWJlciA9IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKVxuICAgICAgfVxuXG4gICAgICAvLyDph43mlrDlj5HpgIHpqozor4HnoIFcbiAgICAgIGNvbnN0IHsgdmVyaWZpY2F0aW9uX2lkOiB2ZXJpZmljYXRpb25JZCB9ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0VmVyaWZpY2F0aW9uKGRhdGEpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHsgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JZCB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpLFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2V0c2Vzc2lvblxuICAgKiDkvb/nlKhhY2Nlc3NfdG9rZW7lkoxyZWZyZXNoX3Rva2Vu5p2l6K6+572u5Lya6K+dXG4gICAqIOWmguaenOaIkOWKn++8jOWImeS8muinpuWPkeS4gOS4qlNJR05FRF9JTuS6i+S7tlxuICAgKiBjb25zdCB7IGRhdGEsIGVycm9yIH0gPSBhd2FpdCBhcHAuYXV0aC5zZXRTZXNzaW9uKHtcbiAgICAgIGFjY2Vzc190b2tlbixcbiAgICAgIHJlZnJlc2hfdG9rZW5cbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2V0U2Vzc2lvbihwYXJhbXM6IFNldFNlc3Npb25SZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBhY2Nlc3NfdG9rZW46IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdBY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgIHJlZnJlc2hfdG9rZW46IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdSZWZyZXNoIHRva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5yZWZyZXNoVG9rZW4ocGFyYW1zLCB7IHRocm93T25FcnJvcjogdHJ1ZSB9KVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuU0lHTkVEX0lOIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWV4Y2hhbmdlY29kZWZvcnNlc3Npb25cbiAgYXN5bmMgZXhjaGFuZ2VDb2RlRm9yU2Vzc2lvbigpIHtcbiAgICAvL1xuICB9XG5cbiAgLyoqXG4gICAqIOWIoOmZpOW9k+WJjeeUqOaIt1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBkZWxldGVVc2VyKHBhcmFtczogRGVsZXRlTWVSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywge1xuICAgICAgICBwYXNzd29yZDogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ1Bhc3N3b3JkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgY29uc3QgeyBzdWRvX3Rva2VuIH0gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zdWRvKHBhcmFtcylcblxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZGVsZXRlTWUoeyBzdWRvX3Rva2VuIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDot7Povazns7vnu5/pu5jorqTnmbvlvZXpobVcbiAgICogQHJldHVybnMge1Byb21pc2U8YXV0aE1vZGVscy5Ub0RlZmF1bHRMb2dpblBhZ2U+fVxuICAgKiBAbWVtYmVyb2YgQXV0aFxuICAgKi9cbiAgYXN5bmMgdG9EZWZhdWx0TG9naW5QYWdlKHBhcmFtczogYXV0aE1vZGVscy5Ub0RlZmF1bHRMb2dpblBhZ2UgPSB7fSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNvbmZpZ1ZlcnNpb24gPSBwYXJhbXMuY29uZmlnX3ZlcnNpb24gfHwgJ2VudidcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gT2JqZWN0LmtleXMocGFyYW1zLnF1ZXJ5IHx8IHt9KVxuICAgICAgICAubWFwKGtleSA9PiBgJHtrZXl9PSR7cGFyYW1zLnF1ZXJ5W2tleV19YClcbiAgICAgICAgLmpvaW4oJyYnKVxuXG4gICAgICBpZiAoYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICAgIHd4Lm5hdmlnYXRlVG8oeyB1cmw6IGAvcGFja2FnZXMvJHdkX3N5c3RlbS9wYWdlcy9sb2dpbi9pbmRleCR7cXVlcnkgPyBgPyR7cXVlcnl9YCA6ICcnfWAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gcGFyYW1zLnJlZGlyZWN0X3VyaSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHJlZGlyZWN0VXJpKVxuICAgICAgICBjb25zdCBsb2dpblBhZ2UgPSBgJHt1cmxPYmoub3JpZ2lufS9fX2F1dGgvP2FwcF9pZD0ke3BhcmFtcy5hcHBfaWQgfHwgJyd9JmVudl9pZD0ke3RoaXMuY29uZmlnLmVudn0mY2xpZW50X2lkPSR7XG4gICAgICAgICAgdGhpcy5jb25maWcuY2xpZW50SWQgfHwgdGhpcy5jb25maWcuZW52XG4gICAgICAgIH0mY29uZmlnX3ZlcnNpb249JHtjb25maWdWZXJzaW9ufSZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocmVkaXJlY3RVcmkpfSR7cXVlcnkgPyBgJiR7cXVlcnl9YCA6ICcnfWBcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBsb2dpblBhZ2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDoh6rlrprkuYnnmbvlvZVcbiAgICogQHBhcmFtIGdldFRpY2tGbiAoKSA9PiBQcm9taXNlPHN0cmluZz4sIOiOt+WPluiHquWumuS5ieeZu+W9lSB0aWNrZXQg55qE5Ye95pWwXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoQ3VzdG9tVGlja2V0KGdldFRpY2tGbj86IGF1dGhNb2RlbHMuR2V0Q3VzdG9tU2lnblRpY2tldEZuKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoZ2V0VGlja0ZuKSB7XG4gICAgICB0aGlzLnNldEN1c3RvbVNpZ25GdW5jKGdldFRpY2tGbilcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aEN1c3RvbVRpY2tldCgpXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j29wZW5JZOmdmem7mOeZu+W9lVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE9wZW5JZCh7IHVzZVd4Q2xvdWQgPSB0cnVlIH0gPSB7fSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgaWYgKCFhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgIHRocm93IEVycm9yKCd3eCBhcGkgdW5kZWZpbmVkJylcbiAgICB9XG4gICAgY29uc3Qgd3hJbmZvID0gd3guZ2V0QWNjb3VudEluZm9TeW5jKCkubWluaVByb2dyYW1cblxuICAgIGNvbnN0IG1haW5GdW5jID0gYXN5bmMgKGNvZGUpID0+IHtcbiAgICAgIGxldCByZXN1bHQ6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSxcbiAgICAgICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdvcGVuX2lkJyxcbiAgICAgICAgICAgICAgYXBwaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgocmVzdWx0IGFzIGFueSk/LmVycm9yX2NvZGUgfHwgIXJlc3VsdC5wcm92aWRlcl90b2tlbikge1xuICAgICAgICAgIHRocm93IHJlc3VsdFxuICAgICAgICB9XG5cbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoUHJvdmlkZXIoXG4gICAgICAgICAgeyBwcm92aWRlcl90b2tlbjogcmVzdWx0LnByb3ZpZGVyX3Rva2VuIH0sXG4gICAgICAgICAgdXNlV3hDbG91ZCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICgoY3JlZGVudGlhbHMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICAgIHRocm93IGNyZWRlbnRpYWxzXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yXG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzIGFzIENyZWRlbnRpYWxzKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHd4LmxvZ2luKHtcbiAgICAgICAgICBzdWNjZXNzOiBhc3luYyAocmVzOiB7IGNvZGU6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCBtYWluRnVuYyhyZXMuY29kZSlcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihyZXM/LmVyck1zZylcbiAgICAgICAgICAgIDsoZXJyb3IgYXMgYW55KS5jb2RlID0gcmVzPy5lcnJub1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWwj+eoi+W6j+aJi+acuuWPt+aOiOadg+eZu+W9le+8jOebruWJjeWPquaUr+aMgeWFqOaJmOeuoeaJi+acuuWPt+aOiOadg+eZu+W9lVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aFBob25lQXV0aCh7IHBob25lQ29kZSA9ICcnIH0pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnd3ggYXBpIHVuZGVmaW5lZCcgfSkgfVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuICAgIGNvbnN0IHByb3ZpZGVySW5mbyA9IHtcbiAgICAgIHByb3ZpZGVyX3BhcmFtczogeyBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScgfSxcbiAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8uYXBwSWQsXG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2RlIH0gPSBhd2FpdCB3eC5sb2dpbigpXG4gICAgOyhwcm92aWRlckluZm8gYXMgYW55KS5wcm92aWRlcl9jb2RlID0gY29kZVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBwcm92aWRlclRva2VuID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ3JhbnRQcm92aWRlclRva2VuKHByb3ZpZGVySW5mbylcbiAgICAgIGlmIChwcm92aWRlclRva2VuLmVycm9yX2NvZGUpIHtcbiAgICAgICAgdGhyb3cgcHJvdmlkZXJUb2tlblxuICAgICAgfVxuXG4gICAgICBwcm92aWRlclRva2VuID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucGF0Y2hQcm92aWRlclRva2VuKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICAgIHByb3ZpZGVyX2lkOiB3eEluZm8uYXBwSWQsXG4gICAgICAgIHByb3ZpZGVyX3BhcmFtczoge1xuICAgICAgICAgIGNvZGU6IHBob25lQ29kZSxcbiAgICAgICAgICBwcm92aWRlcl9jb2RlX3R5cGU6ICdwaG9uZScsXG4gICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgaWYgKHByb3ZpZGVyVG9rZW4uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBwcm92aWRlclRva2VuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNpZ25JblJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwcm92aWRlclRva2VuLnByb3ZpZGVyX3Rva2VuLFxuICAgICAgfSlcblxuICAgICAgaWYgKChzaWduSW5SZXMgYXMgYW55KT8uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBzaWduSW5SZXNcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAvLyBsb2dpblN0YXRl6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFBob25lKHBob25lOiBzdHJpbmcpIHtcbiAgICBpZiAoIS9cXHMrLy50ZXN0KHBob25lKSAmJiAvXlxcK1xcZHsxLDN9XFxkKy8udGVzdChwaG9uZSkpIHtcbiAgICAgIHJldHVybiBwaG9uZS5yZXBsYWNlKC9eKFxcK1xcZHsxLDJ9KShcXGQrKSQvLCAnJDEgJDInKVxuICAgIH1cbiAgICByZXR1cm4gL15cXCtcXGR7MSwzfVxccysvLnRlc3QocGhvbmUpID8gcGhvbmUgOiBgKzg2ICR7cGhvbmV9YFxuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pOiBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrIHtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChjYWxsYmFja3MpID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbGxiYWNrKGV2ZW50LCBzZXNzaW9uLCBpbmZvKVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGF1dGggc3RhdGUgY2hhbmdlIGNhbGxiYWNrOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gICAgcmV0dXJuXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXQoKTogUHJvbWlzZTx7IGVycm9yOiBFcnJvciB8IG51bGwgfT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgICAgaWYgKGNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuSU5JVElBTF9TRVNTSU9OIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgd2hlbiBjaGVja2luZyBmb3IgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogbnVsbCB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCkge1xuICAgIGV2ZW50QnVzLm9uKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gcGFyYW1zPy5kYXRhPy5ldmVudFxuICAgICAgY29uc3QgaW5mbyA9IHBhcmFtcz8uZGF0YT8uaW5mb1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHNlc3Npb24gfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhldmVudCwgc2Vzc2lvbiwgaW5mbylcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VG9Vc2VyKHVzZXJJbmZvOiBhdXRoTW9kZWxzLlVzZXJJbmZvICYgUGFydGlhbDxVc2VyPikge1xuICAgIGlmICghdXNlckluZm8pIHJldHVybiBudWxsXG5cbiAgICAvLyDkvJjlhYjkvb/nlKggdXNlckluZm8g5Lit55qE5pWw5o2u77yIVjMgQVBJ77yJXG4gICAgY29uc3QgZW1haWwgPSB1c2VySW5mbz8uZW1haWwgfHwgdXNlckluZm8/LnVzZXJuYW1lXG4gICAgY29uc3QgcGhvbmUgPSB1c2VySW5mbz8ucGhvbmVfbnVtYmVyXG4gICAgY29uc3QgdXNlcklkID0gdXNlckluZm8/LnN1YiB8fCB1c2VySW5mbz8udWlkIHx8ICcnXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHVzZXJJZCxcbiAgICAgIGF1ZDogJ2F1dGhlbnRpY2F0ZWQnLFxuICAgICAgcm9sZTogdXNlckluZm8uZ3JvdXBzLFxuICAgICAgZW1haWw6IGVtYWlsIHx8ICcnLFxuICAgICAgZW1haWxfY29uZmlybWVkX2F0OiB1c2VySW5mbz8uZW1haWxfdmVyaWZpZWQgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgIHBob25lLFxuICAgICAgcGhvbmVfY29uZmlybWVkX2F0OiBwaG9uZSA/IHVzZXJJbmZvLmNyZWF0ZWRfYXQgOiB1bmRlZmluZWQsXG4gICAgICBjb25maXJtZWRfYXQ6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBsYXN0X3NpZ25faW5fYXQ6IHVzZXJJbmZvLmxhc3Rfc2lnbl9pbl9hdCxcbiAgICAgIGFwcF9tZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlcjogdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnLFxuICAgICAgICBwcm92aWRlcnM6IFt1c2VySW5mby5sb2dpblR5cGU/LnRvTG93ZXJDYXNlKCkgfHwgJ2Nsb3VkYmFzZSddLFxuICAgICAgfSxcbiAgICAgIHVzZXJfbWV0YWRhdGE6IHtcbiAgICAgICAgLy8gVjMgQVBJIOeUqOaIt+S/oeaBr1xuICAgICAgICBuYW1lOiB1c2VySW5mbz8ubmFtZSxcbiAgICAgICAgcGljdHVyZTogdXNlckluZm8/LnBpY3R1cmUsXG4gICAgICAgIHVzZXJuYW1lOiB1c2VySW5mbz8udXNlcm5hbWUsIC8vIOeUqOaIt+WQjeensO+8jOmVv+W6piA1LTI0IOS9je+8jOaUr+aMgeWtl+espuS4reiLseaWh+OAgeaVsOWtl+OAgeeJueauiuWtl+espu+8iOS7heaUr+aMgV8t77yJ77yM5LiN5pSv5oyB5Lit5paHXG4gICAgICAgIGdlbmRlcjogdXNlckluZm8/LmdlbmRlcixcbiAgICAgICAgbG9jYWxlOiB1c2VySW5mbz8ubG9jYWxlLFxuICAgICAgICAvLyBWMiBBUEkg5YW85a6577yI5L2/55SoIGFueSDpgb/lhY3nsbvlnovplJnor6/vvIlcbiAgICAgICAgdWlkOiB1c2VySW5mby51aWQsXG4gICAgICAgIG5pY2tOYW1lOiB1c2VySW5mby5uaWNrTmFtZSxcbiAgICAgICAgYXZhdGFyVXJsOiB1c2VySW5mby5hdmF0YXJVcmwsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIGlkZW50aXRpZXM6XG4gICAgICAgIHVzZXJJbmZvPy5wcm92aWRlcnM/Lm1hcChwID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgaWRlbnRpdHlfaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgICAgICAgIGlkZW50aXR5X2RhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXJfdXNlcl9pZDogcC5wcm92aWRlcl91c2VyX2lkLFxuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHAuaWQgfHwgJ2Nsb3VkYmFzZScsXG4gICAgICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICB1cGRhdGVkX2F0OiB1c2VySW5mby51cGRhdGVkX2F0LFxuICAgICAgICAgIGxhc3Rfc2lnbl9pbl9hdDogdXNlckluZm8ubGFzdF9zaWduX2luX2F0LFxuICAgICAgICB9KSkgfHwgW10sXG4gICAgICBjcmVhdGVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgIGlzX2Fub255bW91czogdXNlckluZm8ubmFtZSA9PT0gJ2Fub255bW91cycsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPguaVsOagoemqjOi+heWKqeaWueazlVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IGFueSwgcnVsZXM6IHsgW2tleTogc3RyaW5nXTogeyByZXF1aXJlZD86IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9IH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJ1bGVdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bGVzKSkge1xuICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgKHBhcmFtcz8uW2tleV0gPT09IHVuZGVmaW5lZCB8fCBwYXJhbXM/LltrZXldID09PSBudWxsIHx8IHBhcmFtcz8uW2tleV0gPT09ICcnKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogcnVsZS5tZXNzYWdlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOW/heWhq+WPguaVsOe7hO+8iOiHs+WwkeacieS4gOS4quWPguaVsOW/hemhu+acieWAvO+8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zOiBhbnksIGZpZWxkR3JvdXBzOiBzdHJpbmdbXVtdLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IGZpZWxkR3JvdXBzLnNvbWUoZ3JvdXAgPT4gZ3JvdXAuc29tZShmaWVsZCA9PiBwYXJhbXM/LltmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXM/LltmaWVsZF0gIT09IG51bGwgJiYgcGFyYW1zPy5bZmllbGRdICE9PSAnJyksKVxuXG4gICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2UgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==