@cloudbase/oauth 2.4.4-beta.0 → 2.5.0-beta.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.
Files changed (39) hide show
  1. package/.eslintrc.js +15 -0
  2. package/dist/cjs/auth/apis.d.ts +3 -3
  3. package/dist/cjs/auth/apis.js +69 -69
  4. package/dist/cjs/captcha/captcha.d.ts +9 -9
  5. package/dist/cjs/captcha/captcha.js +43 -46
  6. package/dist/cjs/index.d.ts +3 -3
  7. package/dist/cjs/index.js +6 -6
  8. package/dist/cjs/oauth2client/interface.d.ts +1 -1
  9. package/dist/cjs/oauth2client/interface.js +1 -1
  10. package/dist/cjs/oauth2client/models.js +1 -1
  11. package/dist/cjs/oauth2client/oauth2client.d.ts +31 -31
  12. package/dist/cjs/oauth2client/oauth2client.js +229 -229
  13. package/dist/cjs/utils/function/single-promise.d.ts +2 -2
  14. package/dist/cjs/utils/function/single-promise.js +40 -33
  15. package/dist/cjs/utils/uuid.js +2 -2
  16. package/dist/esm/auth/apis.d.ts +3 -3
  17. package/dist/esm/auth/apis.js +69 -69
  18. package/dist/esm/captcha/captcha.d.ts +9 -9
  19. package/dist/esm/captcha/captcha.js +44 -47
  20. package/dist/esm/index.d.ts +3 -3
  21. package/dist/esm/index.js +5 -5
  22. package/dist/esm/oauth2client/interface.d.ts +1 -1
  23. package/dist/esm/oauth2client/interface.js +1 -1
  24. package/dist/esm/oauth2client/models.js +1 -1
  25. package/dist/esm/oauth2client/oauth2client.d.ts +31 -31
  26. package/dist/esm/oauth2client/oauth2client.js +229 -229
  27. package/dist/esm/utils/function/single-promise.d.ts +2 -2
  28. package/dist/esm/utils/function/single-promise.js +40 -33
  29. package/dist/esm/utils/uuid.js +2 -2
  30. package/package.json +13 -6
  31. package/src/auth/apis.ts +135 -158
  32. package/src/captcha/captcha.ts +71 -78
  33. package/src/index.ts +13 -14
  34. package/src/oauth2client/interface.ts +5 -5
  35. package/src/oauth2client/models.ts +38 -38
  36. package/src/oauth2client/oauth2client.ts +255 -268
  37. package/src/utils/function/single-promise.ts +22 -21
  38. package/src/utils/uuid.ts +4 -4
  39. package/.eslintrc +0 -26
@@ -51,56 +51,58 @@ import { SinglePromise } from '../utils/function/single-promise';
51
51
  var RequestIdHeaderName = 'x-request-id';
52
52
  var DeviceIdHeaderName = 'x-device-id';
53
53
  var DeviceIdSectionName = 'device_id';
54
- export var defaultRequest = function (url, options) { return __awaiter(void 0, void 0, void 0, function () {
55
- var result, responseError, copyOptions, responseResult, jsonResponse, error_1;
56
- return __generator(this, function (_a) {
57
- switch (_a.label) {
58
- case 0:
59
- result = null;
60
- responseError = null;
61
- _a.label = 1;
62
- case 1:
63
- _a.trys.push([1, 4, , 5]);
64
- copyOptions = Object.assign({}, options);
65
- if (!copyOptions.method) {
66
- copyOptions.method = 'GET';
67
- }
68
- if (copyOptions.body && typeof copyOptions.body !== 'string') {
69
- copyOptions.body = JSON.stringify(copyOptions.body);
70
- }
71
- return [4, fetch(url, copyOptions)];
72
- case 2:
73
- responseResult = _a.sent();
74
- return [4, responseResult.json()];
75
- case 3:
76
- jsonResponse = _a.sent();
77
- if (jsonResponse === null || jsonResponse === void 0 ? void 0 : jsonResponse.error) {
78
- responseError = jsonResponse;
79
- responseError.error_uri = new URL(url).pathname;
80
- }
81
- else {
82
- result = jsonResponse;
83
- }
84
- return [3, 5];
85
- case 4:
86
- error_1 = _a.sent();
87
- responseError = {
88
- error: ErrorType.UNREACHABLE,
89
- error_description: error_1.message,
90
- error_uri: new URL(url).pathname,
91
- };
92
- return [3, 5];
93
- case 5:
94
- if (responseError) {
95
- throw responseError;
96
- }
97
- else {
98
- return [2, result];
99
- }
100
- return [2];
101
- }
54
+ export var defaultRequest = function (url, options) {
55
+ return __awaiter(this, void 0, void 0, function () {
56
+ var result, responseError, copyOptions, responseResult, jsonResponse, error_1;
57
+ return __generator(this, function (_a) {
58
+ switch (_a.label) {
59
+ case 0:
60
+ result = null;
61
+ responseError = null;
62
+ _a.label = 1;
63
+ case 1:
64
+ _a.trys.push([1, 4, , 5]);
65
+ copyOptions = Object.assign({}, options);
66
+ if (!copyOptions.method) {
67
+ copyOptions.method = 'GET';
68
+ }
69
+ if (copyOptions.body && typeof copyOptions.body !== 'string') {
70
+ copyOptions.body = JSON.stringify(copyOptions.body);
71
+ }
72
+ return [4, fetch(url, copyOptions)];
73
+ case 2:
74
+ responseResult = _a.sent();
75
+ return [4, responseResult.json()];
76
+ case 3:
77
+ jsonResponse = _a.sent();
78
+ if (jsonResponse === null || jsonResponse === void 0 ? void 0 : jsonResponse.error) {
79
+ responseError = jsonResponse;
80
+ responseError.error_uri = new URL(url).pathname;
81
+ }
82
+ else {
83
+ result = jsonResponse;
84
+ }
85
+ return [3, 5];
86
+ case 4:
87
+ error_1 = _a.sent();
88
+ responseError = {
89
+ error: ErrorType.UNREACHABLE,
90
+ error_description: error_1.message,
91
+ error_uri: new URL(url).pathname,
92
+ };
93
+ return [3, 5];
94
+ case 5:
95
+ if (responseError) {
96
+ throw responseError;
97
+ }
98
+ else {
99
+ return [2, result];
100
+ }
101
+ return [2];
102
+ }
103
+ });
102
104
  });
103
- }); };
105
+ };
104
106
  export var toResponseError = function (error, options) {
105
107
  var responseError;
106
108
  var formatOptions = options || {};
@@ -173,11 +175,28 @@ function isCredentialsExpired(credentials) {
173
175
  }
174
176
  var LocalCredentials = (function () {
175
177
  function LocalCredentials(options) {
176
- this._credentials = null;
177
- this._singlePromise = new SinglePromise();
178
- this._tokenSectionName = options.tokenSectionName;
179
- this._storage = options.storage;
178
+ this.credentials = null;
179
+ this.singlePromise = new SinglePromise();
180
+ this.tokenSectionName = options.tokenSectionName;
181
+ this.storage = options.storage;
180
182
  }
183
+ LocalCredentials.prototype.getStorageCredentialsSync = function () {
184
+ var credentials = null;
185
+ var tokenStr = this.storage.getItemSync(this.tokenSectionName);
186
+ if (tokenStr !== undefined && tokenStr !== null) {
187
+ try {
188
+ credentials = JSON.parse(tokenStr);
189
+ if (credentials === null || credentials === void 0 ? void 0 : credentials.expires_at) {
190
+ credentials.expires_at = new Date(credentials.expires_at);
191
+ }
192
+ }
193
+ catch (error) {
194
+ this.storage.removeItem(this.tokenSectionName);
195
+ credentials = null;
196
+ }
197
+ }
198
+ return credentials;
199
+ };
181
200
  LocalCredentials.prototype.setCredentials = function (credentials) {
182
201
  return __awaiter(this, void 0, void 0, function () {
183
202
  var tokenStr;
@@ -186,23 +205,23 @@ var LocalCredentials = (function () {
186
205
  case 0:
187
206
  if (!(credentials === null || credentials === void 0 ? void 0 : credentials.expires_in)) return [3, 3];
188
207
  credentials.expires_at = new Date(Date.now() + (credentials.expires_in - 30) * 1000);
189
- if (!this._storage) return [3, 2];
208
+ if (!this.storage) return [3, 2];
190
209
  tokenStr = JSON.stringify(credentials);
191
- return [4, this._storage.setItem(this._tokenSectionName, tokenStr)];
210
+ return [4, this.storage.setItem(this.tokenSectionName, tokenStr)];
192
211
  case 1:
193
212
  _a.sent();
194
213
  _a.label = 2;
195
214
  case 2:
196
- this._credentials = credentials;
215
+ this.credentials = credentials;
197
216
  return [3, 6];
198
217
  case 3:
199
- if (!this._storage) return [3, 5];
200
- return [4, this._storage.removeItem(this._tokenSectionName)];
218
+ if (!this.storage) return [3, 5];
219
+ return [4, this.storage.removeItem(this.tokenSectionName)];
201
220
  case 4:
202
221
  _a.sent();
203
222
  _a.label = 5;
204
223
  case 5:
205
- this._credentials = null;
224
+ this.credentials = null;
206
225
  _a.label = 6;
207
226
  case 6: return [2];
208
227
  }
@@ -213,35 +232,35 @@ var LocalCredentials = (function () {
213
232
  return __awaiter(this, void 0, void 0, function () {
214
233
  var _this = this;
215
234
  return __generator(this, function (_a) {
216
- return [2, this._singlePromise.run('getCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
235
+ return [2, this.singlePromise.run('getCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
217
236
  var _a;
218
237
  return __generator(this, function (_b) {
219
238
  switch (_b.label) {
220
239
  case 0:
221
- if (!isCredentialsExpired(this._credentials)) return [3, 2];
240
+ if (!isCredentialsExpired(this.credentials)) return [3, 2];
222
241
  _a = this;
223
- return [4, this._getStorageCredentials()];
242
+ return [4, this.getStorageCredentials()];
224
243
  case 1:
225
- _a._credentials = _b.sent();
244
+ _a.credentials = _b.sent();
226
245
  _b.label = 2;
227
- case 2: return [2, this._credentials];
246
+ case 2: return [2, this.credentials];
228
247
  }
229
248
  });
230
249
  }); })];
231
250
  });
232
251
  });
233
252
  };
234
- LocalCredentials.prototype._getStorageCredentials = function () {
253
+ LocalCredentials.prototype.getStorageCredentials = function () {
235
254
  return __awaiter(this, void 0, void 0, function () {
236
255
  var _this = this;
237
256
  return __generator(this, function (_a) {
238
- return [2, this._singlePromise.run('_getStorageCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
257
+ return [2, this.singlePromise.run('_getStorageCredentials', function () { return __awaiter(_this, void 0, void 0, function () {
239
258
  var credentials, tokenStr, error_2;
240
259
  return __generator(this, function (_a) {
241
260
  switch (_a.label) {
242
261
  case 0:
243
262
  credentials = null;
244
- return [4, this._storage.getItem(this._tokenSectionName)];
263
+ return [4, this.storage.getItem(this.tokenSectionName)];
245
264
  case 1:
246
265
  tokenStr = _a.sent();
247
266
  if (!(tokenStr !== undefined && tokenStr !== null)) return [3, 5];
@@ -255,7 +274,7 @@ var LocalCredentials = (function () {
255
274
  return [3, 5];
256
275
  case 3:
257
276
  error_2 = _a.sent();
258
- return [4, this._storage.removeItem(this._tokenSectionName)];
277
+ return [4, this.storage.removeItem(this.tokenSectionName)];
259
278
  case 4:
260
279
  _a.sent();
261
280
  credentials = null;
@@ -267,64 +286,47 @@ var LocalCredentials = (function () {
267
286
  });
268
287
  });
269
288
  };
270
- LocalCredentials.prototype._getStorageCredentialsSync = function () {
271
- var credentials = null;
272
- var tokenStr = this._storage.getItemSync(this._tokenSectionName);
273
- if (tokenStr !== undefined && tokenStr !== null) {
274
- try {
275
- credentials = JSON.parse(tokenStr);
276
- if (credentials === null || credentials === void 0 ? void 0 : credentials.expires_at) {
277
- credentials.expires_at = new Date(credentials.expires_at);
278
- }
279
- }
280
- catch (error) {
281
- this._storage.removeItem(this._tokenSectionName);
282
- credentials = null;
283
- }
284
- }
285
- return credentials;
286
- };
287
289
  return LocalCredentials;
288
290
  }());
289
291
  export { LocalCredentials };
290
292
  var OAuth2Client = (function () {
291
293
  function OAuth2Client(options) {
292
- this._singlePromise = new SinglePromise();
293
- this._apiOrigin = options.apiOrigin;
294
- this._clientId = options.clientId;
295
- this._retry = this._formatRetry(options.retry, OAuth2Client._defaultRetry);
296
- if (options.baseRequest != undefined) {
297
- this._baseRequest = options.baseRequest;
294
+ this.singlePromise = new SinglePromise();
295
+ this.apiOrigin = options.apiOrigin;
296
+ this.clientId = options.clientId;
297
+ this.retry = this.formatRetry(options.retry, OAuth2Client.defaultRetry);
298
+ if (options.baseRequest) {
299
+ this.baseRequest = options.baseRequest;
298
300
  }
299
301
  else {
300
- this._baseRequest = defaultRequest;
302
+ this.baseRequest = defaultRequest;
301
303
  }
302
- this._tokenInURL = options.tokenInURL;
303
- this._headers = options.headers;
304
- this._storage = options.storage || defaultStorage;
305
- this._localCredentials = new LocalCredentials({
306
- tokenSectionName: 'credentials_' + options.clientId,
307
- storage: this._storage,
304
+ this.tokenInURL = options.tokenInURL;
305
+ this.headers = options.headers;
306
+ this.storage = options.storage || defaultStorage;
307
+ this.localCredentials = new LocalCredentials({
308
+ tokenSectionName: "credentials_" + options.clientId,
309
+ storage: this.storage,
308
310
  });
309
- this._clientSecret = options.clientSecret;
310
- this._refreshTokenFunc =
311
- options.refreshTokenFunc || this._defaultRefreshTokenFunc;
311
+ this.clientSecret = options.clientSecret;
312
+ this.refreshTokenFunc = options.refreshTokenFunc || this.defaultRefreshTokenFunc;
312
313
  }
313
314
  OAuth2Client.prototype.setCredentials = function (credentials) {
314
- return this._localCredentials.setCredentials(credentials);
315
+ return this.localCredentials.setCredentials(credentials);
315
316
  };
316
317
  OAuth2Client.prototype.getAccessToken = function () {
317
318
  return __awaiter(this, void 0, void 0, function () {
318
- var credentials;
319
+ var credentials, respErr;
319
320
  return __generator(this, function (_a) {
320
321
  switch (_a.label) {
321
- case 0: return [4, this._getCredentials()];
322
+ case 0: return [4, this.getCredentials()];
322
323
  case 1:
323
324
  credentials = _a.sent();
324
325
  if (credentials === null || credentials === void 0 ? void 0 : credentials.access_token) {
325
326
  return [2, Promise.resolve(credentials.access_token)];
326
327
  }
327
- return [2, Promise.reject({ error: ErrorType.UNAUTHENTICATED })];
328
+ respErr = { error: ErrorType.UNAUTHENTICATED };
329
+ return [2, Promise.reject(respErr)];
328
330
  }
329
331
  });
330
332
  });
@@ -338,47 +340,46 @@ var OAuth2Client = (function () {
338
340
  if (!options) {
339
341
  options = {};
340
342
  }
341
- retry = this._formatRetry(options.retry, this._retry);
343
+ retry = this.formatRetry(options.retry, this.retry);
342
344
  options.headers = options.headers || {};
343
- if (this._headers) {
344
- options.headers = __assign(__assign({}, this._headers), options.headers);
345
+ if (this.headers) {
346
+ options.headers = __assign(__assign({}, this.headers), options.headers);
345
347
  }
346
348
  if (!options.headers[RequestIdHeaderName]) {
347
349
  options.headers[RequestIdHeaderName] = generateRequestId();
348
350
  }
349
351
  if (!!options.headers[DeviceIdHeaderName]) return [3, 2];
350
- return [4, this._getDeviceId()];
352
+ return [4, this.getDeviceId()];
351
353
  case 1:
352
354
  deviceId = _a.sent();
353
355
  options.headers[DeviceIdHeaderName] = deviceId;
354
356
  _a.label = 2;
355
357
  case 2:
356
358
  if (!(options === null || options === void 0 ? void 0 : options.withCredentials)) return [3, 4];
357
- return [4, this._getCredentials()];
359
+ return [4, this.getCredentials()];
358
360
  case 3:
359
361
  credentials = _a.sent();
360
362
  if (credentials) {
361
- if (this._tokenInURL) {
363
+ if (this.tokenInURL) {
362
364
  if (url.indexOf('?') < 0) {
363
365
  url += '?';
364
366
  }
365
- url += 'access_token=' + credentials.access_token;
367
+ url += "access_token=" + credentials.access_token;
366
368
  }
367
369
  else {
368
- options.headers['Authorization'] =
369
- credentials.token_type + ' ' + credentials.access_token;
370
+ options.headers.Authorization = credentials.token_type + " " + credentials.access_token;
370
371
  }
371
372
  }
372
373
  return [3, 5];
373
374
  case 4:
374
- if (this._clientId && url.indexOf('client_id') < 0) {
375
+ if (this.clientId && url.indexOf('client_id') < 0) {
375
376
  url += url.indexOf('?') < 0 ? '?' : '&';
376
- url += 'client_id=' + this._clientId;
377
+ url += "client_id=" + this.clientId;
377
378
  }
378
379
  _a.label = 5;
379
380
  case 5:
380
381
  if (url.startsWith('/')) {
381
- url = this._apiOrigin + url;
382
+ url = this.apiOrigin + url;
382
383
  }
383
384
  response = null;
384
385
  maxRequestTimes = retry + 1;
@@ -389,7 +390,7 @@ var OAuth2Client = (function () {
389
390
  _a.label = 7;
390
391
  case 7:
391
392
  _a.trys.push([7, 9, , 12]);
392
- return [4, this._baseRequest(url, options)];
393
+ return [4, this.baseRequest(url, options)];
393
394
  case 8:
394
395
  response = _a.sent();
395
396
  return [3, 15];
@@ -401,13 +402,13 @@ var OAuth2Client = (function () {
401
402
  _a.sent();
402
403
  return [2, Promise.reject(responseError_1)];
403
404
  case 11:
404
- if (requestTime === retry ||
405
- !responseError_1 ||
406
- responseError_1.error !== 'unreachable') {
405
+ if (requestTime === retry
406
+ || !responseError_1
407
+ || responseError_1.error !== 'unreachable') {
407
408
  return [2, Promise.reject(responseError_1)];
408
409
  }
409
410
  return [3, 12];
410
- case 12: return [4, this._sleep(OAuth2Client._retryInterval)];
411
+ case 12: return [4, this.sleep(OAuth2Client.retryInterval)];
411
412
  case 13:
412
413
  _a.sent();
413
414
  _a.label = 14;
@@ -419,11 +420,73 @@ var OAuth2Client = (function () {
419
420
  });
420
421
  });
421
422
  };
422
- OAuth2Client.prototype._checkRetry = function (retry) {
423
+ OAuth2Client.prototype.getCredentials = function () {
424
+ return __awaiter(this, void 0, void 0, function () {
425
+ var credentials;
426
+ return __generator(this, function (_a) {
427
+ switch (_a.label) {
428
+ case 0: return [4, this.localCredentials.getCredentials()];
429
+ case 1:
430
+ credentials = _a.sent();
431
+ if (!isCredentialsExpired(credentials)) return [3, 5];
432
+ if (!(credentials && credentials.scope === 'anonymous')) return [3, 3];
433
+ return [4, this.anonymousSignIn(credentials)];
434
+ case 2:
435
+ credentials = _a.sent();
436
+ return [3, 5];
437
+ case 3: return [4, this.refreshToken(credentials)];
438
+ case 4:
439
+ credentials = _a.sent();
440
+ _a.label = 5;
441
+ case 5: return [2, credentials];
442
+ }
443
+ });
444
+ });
445
+ };
446
+ OAuth2Client.prototype.getCredentialsSync = function () {
447
+ var credentials = this.localCredentials.getStorageCredentialsSync();
448
+ return credentials;
449
+ };
450
+ OAuth2Client.prototype.getCredentialsAsync = function () {
451
+ return this.localCredentials.getCredentials();
452
+ };
453
+ OAuth2Client.prototype.getScope = function () {
454
+ return __awaiter(this, void 0, void 0, function () {
455
+ var credentials;
456
+ return __generator(this, function (_a) {
457
+ switch (_a.label) {
458
+ case 0: return [4, this.localCredentials.getCredentials()];
459
+ case 1:
460
+ credentials = _a.sent();
461
+ if (!credentials) {
462
+ return [2, this.unAuthenticatedError('credentials not found')];
463
+ }
464
+ return [2, credentials.scope];
465
+ }
466
+ });
467
+ });
468
+ };
469
+ OAuth2Client.prototype.getGroups = function () {
470
+ return __awaiter(this, void 0, void 0, function () {
471
+ var credentials;
472
+ return __generator(this, function (_a) {
473
+ switch (_a.label) {
474
+ case 0: return [4, this.localCredentials.getCredentials()];
475
+ case 1:
476
+ credentials = _a.sent();
477
+ if (!credentials) {
478
+ return [2, this.unAuthenticatedError('credentials not found')];
479
+ }
480
+ return [2, credentials.groups];
481
+ }
482
+ });
483
+ });
484
+ };
485
+ OAuth2Client.prototype.checkRetry = function (retry) {
423
486
  var responseError = null;
424
- if (typeof retry !== 'number' ||
425
- retry < OAuth2Client._minRetry ||
426
- retry > OAuth2Client._maxRetry) {
487
+ if (typeof retry !== 'number'
488
+ || retry < OAuth2Client.minRetry
489
+ || retry > OAuth2Client.maxRetry) {
427
490
  responseError = {
428
491
  error: ErrorType.UNREACHABLE,
429
492
  error_description: 'wrong options param: retry',
@@ -434,15 +497,13 @@ var OAuth2Client = (function () {
434
497
  }
435
498
  return retry;
436
499
  };
437
- OAuth2Client.prototype._formatRetry = function (retry, defaultVale) {
500
+ OAuth2Client.prototype.formatRetry = function (retry, defaultVale) {
438
501
  if (typeof retry === 'undefined') {
439
502
  return defaultVale;
440
503
  }
441
- else {
442
- return this._checkRetry(retry);
443
- }
504
+ return this.checkRetry(retry);
444
505
  };
445
- OAuth2Client.prototype._sleep = function (ms) {
506
+ OAuth2Client.prototype.sleep = function (ms) {
446
507
  return __awaiter(this, void 0, void 0, function () {
447
508
  return __generator(this, function (_a) {
448
509
  return [2, new Promise(function (resolve) {
@@ -453,35 +514,35 @@ var OAuth2Client = (function () {
453
514
  });
454
515
  });
455
516
  };
456
- OAuth2Client.prototype._refreshToken = function (credentials) {
517
+ OAuth2Client.prototype.refreshToken = function (credentials) {
457
518
  return __awaiter(this, void 0, void 0, function () {
458
519
  var _this = this;
459
520
  return __generator(this, function (_a) {
460
- return [2, this._singlePromise.run('_refreshToken', function () { return __awaiter(_this, void 0, void 0, function () {
521
+ return [2, this.singlePromise.run('_refreshToken', function () { return __awaiter(_this, void 0, void 0, function () {
461
522
  var newCredentials, error_3;
462
523
  return __generator(this, function (_a) {
463
524
  switch (_a.label) {
464
525
  case 0:
465
526
  if (!credentials || !credentials.refresh_token) {
466
- return [2, this._unAuthenticatedError('no refresh token found in credentials')];
527
+ return [2, this.unAuthenticatedError('no refresh token found in credentials')];
467
528
  }
468
529
  _a.label = 1;
469
530
  case 1:
470
531
  _a.trys.push([1, 4, , 7]);
471
- return [4, this._refreshTokenFunc(credentials.refresh_token)];
532
+ return [4, this.refreshTokenFunc(credentials.refresh_token)];
472
533
  case 2:
473
534
  newCredentials = _a.sent();
474
- return [4, this._localCredentials.setCredentials(newCredentials)];
535
+ return [4, this.localCredentials.setCredentials(newCredentials)];
475
536
  case 3:
476
537
  _a.sent();
477
538
  return [2, newCredentials];
478
539
  case 4:
479
540
  error_3 = _a.sent();
480
541
  if (!(error_3.error === ErrorType.INVALID_GRANT)) return [3, 6];
481
- return [4, this._localCredentials.setCredentials(null)];
542
+ return [4, this.localCredentials.setCredentials(null)];
482
543
  case 5:
483
544
  _a.sent();
484
- return [2, this._unAuthenticatedError(error_3.error_description)];
545
+ return [2, this.unAuthenticatedError(error_3.error_description)];
485
546
  case 6: return [2, Promise.reject(error_3)];
486
547
  case 7: return [2];
487
548
  }
@@ -490,17 +551,17 @@ var OAuth2Client = (function () {
490
551
  });
491
552
  });
492
553
  };
493
- OAuth2Client.prototype._anonymousSignIn = function (credentials) {
554
+ OAuth2Client.prototype.anonymousSignIn = function (credentials) {
494
555
  return __awaiter(this, void 0, void 0, function () {
495
556
  var _this = this;
496
557
  return __generator(this, function (_a) {
497
- return [2, this._singlePromise.run('_anonymous', function () { return __awaiter(_this, void 0, void 0, function () {
558
+ return [2, this.singlePromise.run('_anonymous', function () { return __awaiter(_this, void 0, void 0, function () {
498
559
  var newCredentials, error_4;
499
560
  return __generator(this, function (_a) {
500
561
  switch (_a.label) {
501
562
  case 0:
502
563
  if (!credentials || credentials.scope !== 'anonymous') {
503
- return [2, this._unAuthenticatedError('no anonymous in credentials')];
564
+ return [2, this.unAuthenticatedError('no anonymous in credentials')];
504
565
  }
505
566
  _a.label = 1;
506
567
  case 1:
@@ -508,23 +569,23 @@ var OAuth2Client = (function () {
508
569
  return [4, this.request('/auth/v1/signin/anonymously', {
509
570
  method: 'POST',
510
571
  body: {
511
- client_id: this._clientId,
512
- client_secret: this._clientSecret,
572
+ client_id: this.clientId,
573
+ client_secret: this.clientSecret,
513
574
  },
514
575
  })];
515
576
  case 2:
516
577
  newCredentials = _a.sent();
517
- return [4, this._localCredentials.setCredentials(newCredentials)];
578
+ return [4, this.localCredentials.setCredentials(newCredentials)];
518
579
  case 3:
519
580
  _a.sent();
520
581
  return [2, newCredentials];
521
582
  case 4:
522
583
  error_4 = _a.sent();
523
584
  if (!(error_4.error === ErrorType.INVALID_GRANT)) return [3, 6];
524
- return [4, this._localCredentials.setCredentials(null)];
585
+ return [4, this.localCredentials.setCredentials(null)];
525
586
  case 5:
526
587
  _a.sent();
527
- return [2, this._unAuthenticatedError(error_4.error_description)];
588
+ return [2, this.unAuthenticatedError(error_4.error_description)];
528
589
  case 6: return [2, Promise.reject(error_4)];
529
590
  case 7: return [2];
530
591
  }
@@ -533,120 +594,59 @@ var OAuth2Client = (function () {
533
594
  });
534
595
  });
535
596
  };
536
- OAuth2Client.prototype._defaultRefreshTokenFunc = function (refreshToken) {
597
+ OAuth2Client.prototype.defaultRefreshTokenFunc = function (refreshToken) {
537
598
  if (refreshToken === undefined || refreshToken === '') {
538
- return this._unAuthenticatedError('refresh token not found');
599
+ return this.unAuthenticatedError('refresh token not found');
539
600
  }
540
601
  return this.request('/auth/v1/token', {
541
602
  method: 'POST',
542
603
  body: {
543
- client_id: this._clientId,
544
- client_secret: this._clientSecret,
604
+ client_id: this.clientId,
605
+ client_secret: this.clientSecret,
545
606
  grant_type: 'refresh_token',
546
607
  refresh_token: refreshToken,
547
608
  },
548
609
  });
549
610
  };
550
- OAuth2Client.prototype._getCredentials = function () {
551
- return __awaiter(this, void 0, void 0, function () {
552
- var credentials;
553
- return __generator(this, function (_a) {
554
- switch (_a.label) {
555
- case 0: return [4, this._localCredentials.getCredentials()];
556
- case 1:
557
- credentials = _a.sent();
558
- if (!isCredentialsExpired(credentials)) return [3, 5];
559
- if (!(credentials && credentials.scope === 'anonymous')) return [3, 3];
560
- return [4, this._anonymousSignIn(credentials)];
561
- case 2:
562
- credentials = _a.sent();
563
- return [3, 5];
564
- case 3: return [4, this._refreshToken(credentials)];
565
- case 4:
566
- credentials = _a.sent();
567
- _a.label = 5;
568
- case 5: return [2, credentials];
569
- }
570
- });
571
- });
572
- };
573
- OAuth2Client.prototype.getCredentialsSync = function () {
574
- var credentials = this._localCredentials._getStorageCredentialsSync();
575
- return credentials;
576
- };
577
- OAuth2Client.prototype.getCredentialsAsync = function () {
578
- return this._localCredentials.getCredentials();
579
- };
580
- OAuth2Client.prototype.getScope = function () {
581
- return __awaiter(this, void 0, void 0, function () {
582
- var credentials;
583
- return __generator(this, function (_a) {
584
- switch (_a.label) {
585
- case 0: return [4, this._localCredentials.getCredentials()];
586
- case 1:
587
- credentials = _a.sent();
588
- if (credentials == null) {
589
- return [2, this._unAuthenticatedError("credentials not found")];
590
- }
591
- return [2, credentials.scope];
592
- }
593
- });
594
- });
595
- };
596
- OAuth2Client.prototype.getGroups = function () {
597
- return __awaiter(this, void 0, void 0, function () {
598
- var credentials;
599
- return __generator(this, function (_a) {
600
- switch (_a.label) {
601
- case 0: return [4, this._localCredentials.getCredentials()];
602
- case 1:
603
- credentials = _a.sent();
604
- if (credentials == null) {
605
- return [2, this._unAuthenticatedError("credentials not found")];
606
- }
607
- return [2, credentials.groups];
608
- }
609
- });
610
- });
611
- };
612
- OAuth2Client.prototype._getDeviceId = function () {
611
+ OAuth2Client.prototype.getDeviceId = function () {
613
612
  return __awaiter(this, void 0, void 0, function () {
614
613
  var deviceId;
615
614
  return __generator(this, function (_a) {
616
615
  switch (_a.label) {
617
616
  case 0:
618
- if (this._deviceID) {
619
- return [2, this._deviceID];
617
+ if (this.deviceID) {
618
+ return [2, this.deviceID];
620
619
  }
621
- return [4, this._storage.getItem(DeviceIdSectionName)];
620
+ return [4, this.storage.getItem(DeviceIdSectionName)];
622
621
  case 1:
623
622
  deviceId = _a.sent();
624
- if (!!(typeof deviceId === 'string' &&
625
- deviceId.length >= 16 &&
626
- deviceId.length <= 48)) return [3, 3];
623
+ if (!!(typeof deviceId === 'string'
624
+ && deviceId.length >= 16
625
+ && deviceId.length <= 48)) return [3, 3];
627
626
  deviceId = uuidv4();
628
- return [4, this._storage.setItem(DeviceIdSectionName, deviceId)];
627
+ return [4, this.storage.setItem(DeviceIdSectionName, deviceId)];
629
628
  case 2:
630
629
  _a.sent();
631
630
  _a.label = 3;
632
631
  case 3:
633
- this._deviceID = deviceId;
632
+ this.deviceID = deviceId;
634
633
  return [2, deviceId];
635
634
  }
636
635
  });
637
636
  });
638
637
  };
639
- OAuth2Client.prototype._unAuthenticatedError = function (err) {
640
- return Promise.reject({
638
+ OAuth2Client.prototype.unAuthenticatedError = function (err) {
639
+ var respErr = {
641
640
  error: ErrorType.UNAUTHENTICATED,
642
641
  error_description: err,
643
- });
642
+ };
643
+ return Promise.reject(respErr);
644
644
  };
645
- OAuth2Client._defaultRetry = 2;
646
- OAuth2Client._minRetry = 0;
647
- OAuth2Client._maxRetry = 5;
648
- OAuth2Client._retryInterval = 1000;
645
+ OAuth2Client.defaultRetry = 2;
646
+ OAuth2Client.minRetry = 0;
647
+ OAuth2Client.maxRetry = 5;
648
+ OAuth2Client.retryInterval = 1000;
649
649
  return OAuth2Client;
650
650
  }());
651
651
  export { OAuth2Client };
652
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29hdXRoMmNsaWVudC9vYXV0aDJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBYXJDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWpFLElBQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBQzNDLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLElBQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDO0FBU3hDLE1BQU0sQ0FBQyxJQUFNLGNBQWMsR0FBb0IsVUFDN0MsR0FBVyxFQUNYLE9BQXdCOzs7OztnQkFFcEIsTUFBTSxHQUFhLElBQUksQ0FBQztnQkFDeEIsYUFBYSxHQUF5QixJQUFJLENBQUM7Ozs7Z0JBR3ZDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZCLFdBQVcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2lCQUM1QjtnQkFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksT0FBTyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtvQkFDNUQsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDckQ7Z0JBQ2dDLFdBQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBQTs7Z0JBQXhELGNBQWMsR0FBYSxTQUE2QjtnQkFDekMsV0FBTSxjQUFjLENBQUMs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LE1BQU0sQ0FBQztZQUNwQixLQUFLLEVBQUUsU0FBUyxDQUFDLGVBQWU7WUFDaEMsaUJBQWlCLEVBQUUsR0FBRztTQUNOLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBdlZjLDBCQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLHNCQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2Qsc0JBQVMsR0FBRyxDQUFDLENBQUM7SUFDZCwyQkFBYyxHQUFHLElBQUksQ0FBQztJQXFWdkMsbUJBQUM7Q0FBQSxBQXpWRCxJQXlWQztTQXpWWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXJyb3JUeXBlIH0gZnJvbSAnLi9jb25zdHMnO1xuXG5pbXBvcnQgeyBBdXRoQ2xpZW50LCBTaW1wbGVTdG9yYWdlIH0gZnJvbSAnLi9pbnRlcmZhY2UnO1xuXG5pbXBvcnQge1xuICBDcmVkZW50aWFscyxcbiAgUmVzcG9uc2VFcnJvcixcbiAgUmVxdWVzdE9wdGlvbnMsXG4gIFJlcXVlc3RGdW5jdGlvbixcbiAgT0F1dGgyQ2xpZW50T3B0aW9ucyxcbiAgQXV0aENsaWVudFJlcXVlc3RPcHRpb25zLFxufSBmcm9tICcuL21vZGVscyc7XG5cbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4uL3V0aWxzL3V1aWQnO1xuXG5pbXBvcnQgeyBTaW5nbGVQcm9taXNlIH0gZnJvbSAnLi4vdXRpbHMvZnVuY3Rpb24vc2luZ2xlLXByb21pc2UnO1xuXG5jb25zdCBSZXF1ZXN0SWRIZWFkZXJOYW1lID0gJ3gtcmVxdWVzdC1pZCc7XG5jb25zdCBEZXZpY2VJZEhlYWRlck5hbWUgPSAneC1kZXZpY2UtaWQnO1xuY29uc3QgRGV2aWNlSWRTZWN0aW9uTmFtZSA9ICdkZXZpY2VfaWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvUmVzcG9uc2VFcnJvck9wdGlvbnMge1xuICBlcnJvcj86IEVycm9yVHlwZTtcbiAgZXJyb3JfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICBlcnJvcl91cmk/OiBzdHJpbmcgfCBudWxsO1xuICBkZXRhaWxzPzogYW55IHwgbnVsbDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0OiBSZXF1ZXN0RnVuY3Rpb24gPSBhc3luYyA8VD4oXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMsXG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgbGV0IHJlc3VsdDogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIC8vIE9iamVjdHMgbXVzdCBiZSBjb3BpZWQgdG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgZGF0YSBzdWNoIGFzIGJvZHkuXG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKTtcbiAgICBpZiAoIWNvcHlPcHRpb25zLm1ldGhvZCkge1xuICAgICAgY29weU9wdGlvbnMubWV0aG9kID0gJ0dFVCc7XG4gICAgfVxuICAgIGlmIChjb3B5T3B0aW9ucy5ib2R5ICYmIHR5cGVvZiBjb3B5T3B0aW9ucy5ib2R5ICE9PSAnc3RyaW5nJykge1xuICAgICAgY29weU9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KGNvcHlPcHRpb25zLmJvZHkpO1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZVJlc3VsdDogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGNvcHlPcHRpb25zKTtcbiAgICBjb25zdCBqc29uUmVzcG9uc2UgPSBhd2FpdCByZXNwb25zZVJlc3VsdC5qc29uKCk7XG4gICAgaWYgKGpzb25SZXNwb25zZT8uZXJyb3IpIHtcbiAgICAgIHJlc3BvbnNlRXJyb3IgPSBqc29uUmVzcG9uc2UgYXMgUmVzcG9uc2VFcnJvcjtcbiAgICAgIHJlc3BvbnNlRXJyb3IuZXJyb3JfdXJpID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBqc29uUmVzcG9uc2UgYXMgVDtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBFcnJvclR5cGUuVU5SRUFDSEFCTEUsXG4gICAgICBlcnJvcl9kZXNjcmlwdGlvbjogZXJyb3IubWVzc2FnZSxcbiAgICAgIGVycm9yX3VyaTogbmV3IFVSTCh1cmwpLnBhdGhuYW1lLFxuICAgIH07XG4gIH1cbiAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICB0aHJvdyByZXNwb25zZUVycm9yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0b1Jlc3BvbnNlRXJyb3IgPSAoXG4gIGVycm9yOiBSZXNwb25zZUVycm9yIHwgRXJyb3IsXG4gIG9wdGlvbnM/OiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zLFxuKTogUmVzcG9uc2VFcnJvciA9PiB7XG4gIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yO1xuICBjb25zdCBmb3JtYXRPcHRpb25zOiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgZXJyb3I6IGZvcm1hdE9wdGlvbnMuZXJyb3IgfHwgRXJyb3JUeXBlLkxPQ0FMLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGZvcm1hdE9wdGlvbnMuZXJyb3JfZGVzY3JpcHRpb24gfHwgZXJyb3IubWVzc2FnZSxcbiAgICAgIGVycm9yX3VyaTogZm9ybWF0T3B0aW9ucy5lcnJvcl91cmksXG4gICAgICBkZXRhaWxzOiBmb3JtYXRPcHRpb25zLmRldGFpbHMgfHwgZXJyb3Iuc3RhY2ssXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmb3JtYXRFcnJvcjogVG9SZXNwb25zZUVycm9yT3B0aW9ucyA9IGVycm9yIHx8IHt9O1xuICAgIHJlc3BvbnNlRXJyb3IgPSB7XG4gICAgICBlcnJvcjogZm9ybWF0T3B0aW9ucy5lcnJvciB8fCBmb3JtYXRFcnJvci5lcnJvciB8fCBFcnJvclR5cGUuTE9DQUwsXG4gICAgICBlcnJvcl9kZXNjcmlwdGlvbjpcbiAgICAgICAgZm9ybWF0T3B0aW9ucy5lcnJvcl9kZXNjcmlwdGlvbiB8fCBmb3JtYXRFcnJvci5lcnJvcl9kZXNjcmlwdGlvbixcbiAgICAgIGVycm9yX3VyaTogZm9ybWF0T3B0aW9ucy5lcnJvcl91cmkgfHwgZm9ybWF0RXJyb3IuZXJyb3JfdXJpLFxuICAgICAgZGV0YWlsczogZm9ybWF0T3B0aW9ucy5kZXRhaWxzIHx8IGZvcm1hdEVycm9yLmRldGFpbHMsXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2VFcnJvcjtcbn07XG5cbi8qKlxuICogR2VuZXJhdGUgcmVxdWVzdCBpZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmVxdWVzdElkKCk6IHN0cmluZyB7XG4gIHJldHVybiB1dWlkdjQoKTtcbn1cblxuXG4vKipcbiAqIERlZmF1bHQgU3RvcmFnZS5cbiAqL1xuY2xhc3MgRGVmYXVsdFN0b3JhZ2UgaW1wbGVtZW50cyBTaW1wbGVTdG9yYWdlIHtcbiAgLyoqXG4gICAgICogR2V0IGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICBhc3luYyBnZXRJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmVtb3ZlIGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICBhc3luYyByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBTZXQgaXRlbS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICovXG4gIGFzeW5jIHNldEl0ZW0oa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBHZXQgaXRlbSBzeW5jLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgZ2V0SXRlbVN5bmMoa2V5OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgaXRlbSBzeW5jLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgcmVtb3ZlSXRlbVN5bmMoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIFNldCBpdGVtIHN5bmMuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgICAqL1xuICBzZXRJdGVtU3luYyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdFN0b3JhZ2UgPSBuZXcgRGVmYXVsdFN0b3JhZ2UoKTtcblxuaW50ZXJmYWNlIExvY2FsQ3JlZGVudGlhbHNPcHRpb25zIHtcbiAgdG9rZW5TZWN0aW9uTmFtZTogc3RyaW5nO1xuICBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNyZWRlbnRpYWxzIGlzIGV4cGlyZWQuXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gIGxldCBpc0V4cGlyZWQgPSB0cnVlO1xuICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQgJiYgY3JlZGVudGlhbHM/LmFjY2Vzc190b2tlbikge1xuICAgIGlzRXhwaXJlZCA9IGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPCBuZXcgRGF0ZSgpO1xuICB9XG4gIHJldHVybiBpc0V4cGlyZWQ7XG59XG5cbi8qKlxuICogTG9jYWwgY3JlZGVudGlhbHMuXG4gKiBMb2NhbCBjcmVkZW50aWFscywgd2l0aCBtZW1vcnkgY2FjaGUgYW5kIHN0b3JhZ2UgY2FjaGUuXG4gKiBJZiB0aGUgbWVtb3J5IGNhY2hlIGV4cGlyZXMsIHRoZSBzdG9yYWdlIGNhY2hlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxDcmVkZW50aWFscyB7XG4gIHByaXZhdGUgX3Rva2VuU2VjdGlvbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTaW1wbGVTdG9yYWdlO1xuXG4gIHByaXZhdGUgX2NyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX3NpbmdsZVByb21pc2U6IFNpbmdsZVByb21pc2UgPSBuZXcgU2luZ2xlUHJvbWlzZSgpO1xuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0xvY2FsQ3JlZGVudGlhbHNPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbENyZWRlbnRpYWxzT3B0aW9ucykge1xuICAgIHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUgPSBvcHRpb25zLnRva2VuU2VjdGlvbk5hbWU7XG4gICAgdGhpcy5fc3RvcmFnZSA9IG9wdGlvbnMuc3RvcmFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRDcmVkZW50aWFscyBQcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBmZXRjaCBhcGkgcmVxdWVzdCBpbXBsZW1lbnRhdGlvbiB3aXRoIGF1dGggY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRDcmVkZW50aWFscyhjcmVkZW50aWFscz86IENyZWRlbnRpYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGNyZWRlbnRpYWxzPy5leHBpcmVzX2luKSB7XG4gICAgICBjcmVkZW50aWFscy5leHBpcmVzX2F0ID0gbmV3IERhdGUoXG4gICAgICAgIERhdGUubm93KCkgKyAoY3JlZGVudGlhbHMuZXhwaXJlc19pbiAtIDMwKSAqIDEwMDAsXG4gICAgICApO1xuICAgICAgaWYgKHRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNyZWRlbnRpYWxzKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUsIHRva2VuU3RyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9zdG9yYWdlKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLl90b2tlblNlY3Rpb25OYW1lKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NyZWRlbnRpYWxzID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fc2luZ2xlUHJvbWlzZS5ydW4oJ2dldENyZWRlbnRpYWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGlzQ3JlZGVudGlhbHNFeHBpcmVkKHRoaXMuX2NyZWRlbnRpYWxzKSkge1xuICAgICAgICB0aGlzLl9jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2dldFN0b3JhZ2VDcmVkZW50aWFscygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2NyZWRlbnRpYWxzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdG9yYWdlIGNyZWRlbnRpYWxzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZVByb21pc2UucnVuKCdfZ2V0U3RvcmFnZUNyZWRlbnRpYWxzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGw7XG4gICAgICBjb25zdCB0b2tlblN0cjogc3RyaW5nID0gYXdhaXQgdGhpcy5fc3RvcmFnZS5nZXRJdGVtKFxuICAgICAgICB0aGlzLl90b2tlblNlY3Rpb25OYW1lLFxuICAgICAgKTtcbiAgICAgIGlmICh0b2tlblN0ciAhPT0gdW5kZWZpbmVkICYmIHRva2VuU3RyICE9PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBKU09OLnBhcnNlKHRva2VuU3RyKTtcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShjcmVkZW50aWFscy5leHBpcmVzX2F0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUpO1xuICAgICAgICAgIGNyZWRlbnRpYWxzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF9nZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGw7XG4gICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IHRoaXMuX3N0b3JhZ2UuZ2V0SXRlbVN5bmMoXG4gICAgICB0aGlzLl90b2tlblNlY3Rpb25OYW1lLFxuICAgICk7XG4gICAgaWYgKHRva2VuU3RyICE9PSB1bmRlZmluZWQgJiYgdG9rZW5TdHIgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gSlNPTi5wYXJzZSh0b2tlblN0cik7XG4gICAgICAgIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19hdCkge1xuICAgICAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShjcmVkZW50aWFscy5leHBpcmVzX2F0KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuX3Rva2VuU2VjdGlvbk5hbWUpO1xuICAgICAgICBjcmVkZW50aWFscyA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbn1cblxuLyoqXG4gKiBPQXV0aDJDbGllbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoMkNsaWVudCBpbXBsZW1lbnRzIEF1dGhDbGllbnQge1xuICBwcml2YXRlIHN0YXRpYyBfZGVmYXVsdFJldHJ5ID0gMjtcbiAgcHJpdmF0ZSBzdGF0aWMgX21pblJldHJ5ID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgX21heFJldHJ5ID0gNTtcbiAgcHJpdmF0ZSBzdGF0aWMgX3JldHJ5SW50ZXJ2YWwgPSAxMDAwO1xuXG4gIHByaXZhdGUgX2FwaU9yaWdpbjogc3RyaW5nO1xuICBwcml2YXRlIF9jbGllbnRJZDogc3RyaW5nO1xuICBwcml2YXRlIF9yZXRyeTogbnVtYmVyO1xuICBwcml2YXRlIF9jbGllbnRTZWNyZXQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2Jhc2VSZXF1ZXN0OiA8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zLFxuICApID0+IFByb21pc2U8VD47XG4gIHByaXZhdGUgX2xvY2FsQ3JlZGVudGlhbHM6IExvY2FsQ3JlZGVudGlhbHM7XG4gIHByaXZhdGUgX3N0b3JhZ2U6IFNpbXBsZVN0b3JhZ2U7XG4gIHByaXZhdGUgX2RldmljZUlEPzogc3RyaW5nO1xuICBwcml2YXRlIF90b2tlbkluVVJMPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVmcmVzaFRva2VuRnVuYzogKHJlZnJlc2hUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxDcmVkZW50aWFscz47XG4gIHByaXZhdGUgX2hlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIF9zaW5nbGVQcm9taXNlOiBTaW5nbGVQcm9taXNlID0gbmV3IFNpbmdsZVByb21pc2UoKTtcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPQXV0aDJDbGllbnRPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBPQXV0aDJDbGllbnRPcHRpb25zKSB7XG4gICAgdGhpcy5fYXBpT3JpZ2luID0gb3B0aW9ucy5hcGlPcmlnaW47XG4gICAgdGhpcy5fY2xpZW50SWQgPSBvcHRpb25zLmNsaWVudElkO1xuICAgIHRoaXMuX3JldHJ5ID0gdGhpcy5fZm9ybWF0UmV0cnkob3B0aW9ucy5yZXRyeSwgT0F1dGgyQ2xpZW50Ll9kZWZhdWx0UmV0cnkpO1xuICAgIGlmIChvcHRpb25zLmJhc2VSZXF1ZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fYmFzZVJlcXVlc3QgPSBvcHRpb25zLmJhc2VSZXF1ZXN0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9iYXNlUmVxdWVzdCA9IGRlZmF1bHRSZXF1ZXN0O1xuICAgIH1cbiAgICB0aGlzLl90b2tlbkluVVJMID0gb3B0aW9ucy50b2tlbkluVVJMO1xuICAgIHRoaXMuX2hlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHRoaXMuX3N0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2UgfHwgZGVmYXVsdFN0b3JhZ2U7XG4gICAgdGhpcy5fbG9jYWxDcmVkZW50aWFscyA9IG5ldyBMb2NhbENyZWRlbnRpYWxzKHtcbiAgICAgIHRva2VuU2VjdGlvbk5hbWU6ICdjcmVkZW50aWFsc18nICsgb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgIHN0b3JhZ2U6IHRoaXMuX3N0b3JhZ2UsXG4gICAgfSk7XG4gICAgdGhpcy5fY2xpZW50U2VjcmV0ID0gb3B0aW9ucy5jbGllbnRTZWNyZXQ7XG4gICAgdGhpcy5fcmVmcmVzaFRva2VuRnVuYyA9XG4gICAgICBvcHRpb25zLnJlZnJlc2hUb2tlbkZ1bmMgfHwgdGhpcy5fZGVmYXVsdFJlZnJlc2hUb2tlbkZ1bmM7XG4gIH1cblxuICAvKipcbiAgICogc2V0Q3JlZGVudGlhbHMgUHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgZmV0Y2ggYXBpIHJlcXVlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBhdXRoIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBwdWJsaWMgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM/OiBDcmVkZW50aWFscyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRBY2Nlc3NUb2tlbiByZXR1cm4gYSB2YWxpZGF0ZSBhY2Nlc3MgdG9rZW5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2dldENyZWRlbnRpYWxzKCk7XG4gICAgaWYgKGNyZWRlbnRpYWxzPy5hY2Nlc3NfdG9rZW4pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHsgZXJyb3I6IEVycm9yVHlwZS5VTkFVVEhFTlRJQ0FURUQgfSBhcyBSZXNwb25zZUVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXF1ZXN0IGh0dHAgbGlrZSBzaW1wbGUgZmV0Y2ggYXBpLCBleHA6cmVxdWVzdCgnL3YxL3VzZXIvbWUnLCB7d2l0aENyZWRlbnRpYWxzOnRydWV9KVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7QXV0aENsaWVudFJlcXVlc3RPcHRpb25zfSBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zPzogQXV0aENsaWVudFJlcXVlc3RPcHRpb25zLFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgcmV0cnk6IG51bWJlciA9IHRoaXMuX2Zvcm1hdFJldHJ5KG9wdGlvbnMucmV0cnksIHRoaXMuX3JldHJ5KTtcbiAgICBvcHRpb25zLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnMgfHwge307XG4gICAgaWYgKHRoaXMuX2hlYWRlcnMpIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVycyA9IHtcbiAgICAgICAgLi4udGhpcy5faGVhZGVycyxcbiAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnNbUmVxdWVzdElkSGVhZGVyTmFtZV0pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tSZXF1ZXN0SWRIZWFkZXJOYW1lXSA9IGdlbmVyYXRlUmVxdWVzdElkKCk7XG4gICAgfVxuICAgIGlmICghb3B0aW9ucy5oZWFkZXJzW0RldmljZUlkSGVhZGVyTmFtZV0pIHtcbiAgICAgIGNvbnN0IGRldmljZUlkID0gYXdhaXQgdGhpcy5fZ2V0RGV2aWNlSWQoKTtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tEZXZpY2VJZEhlYWRlck5hbWVdID0gZGV2aWNlSWQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy53aXRoQ3JlZGVudGlhbHMpIHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBpZiAodGhpcy5fdG9rZW5JblVSTCkge1xuICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgICAgdXJsICs9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgICAgdXJsICs9ICdhY2Nlc3NfdG9rZW49JyArIGNyZWRlbnRpYWxzLmFjY2Vzc190b2tlbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9XG4gICAgICAgICAgICBjcmVkZW50aWFscy50b2tlbl90eXBlICsgJyAnICsgY3JlZGVudGlhbHMuYWNjZXNzX3Rva2VuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9jbGllbnRJZCAmJiB1cmwuaW5kZXhPZignY2xpZW50X2lkJykgPCAwKSB7XG4gICAgICAgIHVybCArPSB1cmwuaW5kZXhPZignPycpIDwgMCA/ICc/JyA6ICcmJztcbiAgICAgICAgdXJsICs9ICdjbGllbnRfaWQ9JyArIHRoaXMuX2NsaWVudElkO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gdGhpcy5fYXBpT3JpZ2luICsgdXJsO1xuICAgIH1cbiAgICBsZXQgcmVzcG9uc2U6IFQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCBtYXhSZXF1ZXN0VGltZXM6IG51bWJlciA9IHJldHJ5ICsgMTtcbiAgICBmb3IgKFxuICAgICAgbGV0IHJlcXVlc3RUaW1lID0gMDtcbiAgICAgIHJlcXVlc3RUaW1lIDwgbWF4UmVxdWVzdFRpbWVzO1xuICAgICAgcmVxdWVzdFRpbWUrK1xuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9iYXNlUmVxdWVzdDxUPih1cmwsIG9wdGlvbnMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2ggKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMud2l0aENyZWRlbnRpYWxzICYmIHJlc3BvbnNlRXJyb3IgJiYgcmVzcG9uc2VFcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2V0Q3JlZGVudGlhbHMobnVsbCk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWVzdFRpbWUgPT09IHJldHJ5IHx8XG4gICAgICAgICAgIXJlc3BvbnNlRXJyb3IgfHxcbiAgICAgICAgICByZXNwb25zZUVycm9yLmVycm9yICE9PSAndW5yZWFjaGFibGUnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5fc2xlZXAoT0F1dGgyQ2xpZW50Ll9yZXRyeUludGVydmFsKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSBfY2hlY2tSZXRyeShyZXRyeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiByZXRyeSAhPT0gJ251bWJlcicgfHxcbiAgICAgIHJldHJ5IDwgT0F1dGgyQ2xpZW50Ll9taW5SZXRyeSB8fFxuICAgICAgcmV0cnkgPiBPQXV0aDJDbGllbnQuX21heFJldHJ5XG4gICAgKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogJ3dyb25nIG9wdGlvbnMgcGFyYW06IHJldHJ5JyxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChyZXNwb25zZUVycm9yKSB7XG4gICAgICB0aHJvdyByZXNwb25zZUVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmV0cnk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWxlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgX2Zvcm1hdFJldHJ5KHJldHJ5OiBudW1iZXIsIGRlZmF1bHRWYWxlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0eXBlb2YgcmV0cnkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9jaGVja1JldHJ5KHJldHJ5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2xlZXAuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0sIG1zKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIGV4cGlyZWQgdG9rZW4uXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcmVmcmVzaFRva2VuKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5fc2luZ2xlUHJvbWlzZS5ydW4oJ19yZWZyZXNoVG9rZW4nLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWNyZWRlbnRpYWxzIHx8ICFjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWRFcnJvcignbm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjcmVkZW50aWFscycpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fcmVmcmVzaFRva2VuRnVuYyhcbiAgICAgICAgICBjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuLFxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKTtcbiAgICAgICAgcmV0dXJuIG5ld0NyZWRlbnRpYWxzXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuZXJyb3IgPT09IEVycm9yVHlwZS5JTlZBTElEX0dSQU5UKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5fbG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhudWxsKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkRXJyb3IoZXJyb3IuZXJyb3JfZGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYW5vbnltb3VzIHNpZ25JblxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Fub255bW91c1NpZ25JbihjcmVkZW50aWFsczogQ3JlZGVudGlhbHMpOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbmdsZVByb21pc2UucnVuKCdfYW5vbnltb3VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5zY29wZSAhPT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZEVycm9yKCdubyBhbm9ueW1vdXMgaW4gY3JlZGVudGlhbHMnKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG5ld0NyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMucmVxdWVzdCgnL2F1dGgvdjEvc2lnbmluL2Fub255bW91c2x5Jywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IHtcbiAgICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5fY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2xvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobmV3Q3JlZGVudGlhbHMpO1xuICAgICAgICByZXR1cm4gbmV3Q3JlZGVudGlhbHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLklOVkFMSURfR1JBTlQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG51bGwpO1xuICAgICAgICAgIHJldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWRFcnJvcihlcnJvci5lcnJvcl9kZXNjcmlwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJlZnJlc2ggdG9rZW4gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZyZXNoVG9rZW5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwcml2YXRlIF9kZWZhdWx0UmVmcmVzaFRva2VuRnVuYyhcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICBpZiAocmVmcmVzaFRva2VuID09PSB1bmRlZmluZWQgfHwgcmVmcmVzaFRva2VuID09PSAnJykge1xuICAgICAgcmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZEVycm9yKCdyZWZyZXNoIHRva2VuIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCcvYXV0aC92MS90b2tlbicsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keToge1xuICAgICAgICBjbGllbnRfaWQ6IHRoaXMuX2NsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLl9jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3JlZGVudGlhbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgX2dldENyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2xvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBpZiAoaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHMpKSB7XG4gICAgICBpZiAoY3JlZGVudGlhbHMgJiYgY3JlZGVudGlhbHMuc2NvcGUgPT09ICdhbm9ueW1vdXMnKSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fYW5vbnltb3VzU2lnbkluKGNyZWRlbnRpYWxzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLl9yZWZyZXNoVG9rZW4oY3JlZGVudGlhbHMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gdGhpcy5fbG9jYWxDcmVkZW50aWFscy5fZ2V0U3RvcmFnZUNyZWRlbnRpYWxzU3luYygpO1xuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgcHVibGljIGdldENyZWRlbnRpYWxzQXN5bmMoKTogUHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fbG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2NvcGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5fbG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpO1xuICAgIGlmIChjcmVkZW50aWFscyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdW5BdXRoZW50aWNhdGVkRXJyb3IoXCJjcmVkZW50aWFscyBub3QgZm91bmRcIilcbiAgICB9XG4gICAgcmV0dXJuIGNyZWRlbnRpYWxzLnNjb3BlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEdyb3VwcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuX2xvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKTtcbiAgICBpZiAoY3JlZGVudGlhbHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VuQXV0aGVudGljYXRlZEVycm9yKFwiY3JlZGVudGlhbHMgbm90IGZvdW5kXCIpXG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFscy5ncm91cHM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgZGV2aWNlSWRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2dldERldmljZUlkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuX2RldmljZUlEKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGV2aWNlSUQ7XG4gICAgfVxuICAgIGxldCBkZXZpY2VJZDogc3RyaW5nID0gYXdhaXQgdGhpcy5fc3RvcmFnZS5nZXRJdGVtKFxuICAgICAgRGV2aWNlSWRTZWN0aW9uTmFtZSxcbiAgICApO1xuICAgIGlmICghKHR5cGVvZiBkZXZpY2VJZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgIGRldmljZUlkLmxlbmd0aCA+PSAxNiAmJlxuICAgICAgZGV2aWNlSWQubGVuZ3RoIDw9IDQ4KSkge1xuICAgICAgZGV2aWNlSWQgPSB1dWlkdjQoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbShEZXZpY2VJZFNlY3Rpb25OYW1lLCBkZXZpY2VJZCk7XG4gICAgfVxuICAgIHRoaXMuX2RldmljZUlEID0gZGV2aWNlSWQ7XG4gICAgcmV0dXJuIGRldmljZUlkO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bkF1dGhlbnRpY2F0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn1cbiAgICovXG4gIHByaXZhdGUgX3VuQXV0aGVudGljYXRlZEVycm9yPFQ+KGVycj86IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICBlcnJvcjogRXJyb3JUeXBlLlVOQVVUSEVOVElDQVRFRCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBlcnIsXG4gICAgfSBhcyBSZXNwb25zZUVycm9yKTtcbiAgfVxufVxuIl19
652
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL29hdXRoMmNsaWVudC9vYXV0aDJjbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBYXBDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBRWhFLElBQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFBO0FBQzFDLElBQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFBO0FBQ3hDLElBQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFBO0FBVXZDLE1BQU0sQ0FBQyxJQUFNLGNBQWMsR0FBb0IsVUFDN0MsR0FBVyxFQUNYLE9BQXdCOzs7Ozs7b0JBRXBCLE1BQU0sR0FBYSxJQUFJLENBQUE7b0JBQ3ZCLGFBQWEsR0FBeUIsSUFBSSxDQUFBOzs7O29CQUd0QyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7b0JBQzlDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO3dCQUN2QixXQUFXLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtxQkFDM0I7b0JBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLE9BQU8sV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7d0JBQzVELFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ3BEO29CQUNnQyxXQUFNLEtBQUssQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUE7O29CQUF4RCxjQUFjLEdBQWEsU0FBNkI7b0JBQ3pDLFdBQU0sY0FBYyxDQUFD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Q2hDLGlCQUFpQixFQUFFLEdBQUc7U0FDdkIsQ0FBQTtRQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNoQyxDQUFDO0lBaFZjLHlCQUFZLEdBQUcsQ0FBQyxDQUFBO0lBQ2hCLHFCQUFRLEdBQUcsQ0FBQyxDQUFBO0lBQ1oscUJBQVEsR0FBRyxDQUFDLENBQUE7SUFDWiwwQkFBYSxHQUFHLElBQUksQ0FBQTtJQThVckMsbUJBQUM7Q0FBQSxBQWxWRCxJQWtWQztTQWxWWSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXJyb3JUeXBlIH0gZnJvbSAnLi9jb25zdHMnXG5cbmltcG9ydCB7IEF1dGhDbGllbnQsIFNpbXBsZVN0b3JhZ2UgfSBmcm9tICcuL2ludGVyZmFjZSdcblxuaW1wb3J0IHtcbiAgQ3JlZGVudGlhbHMsXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFJlcXVlc3RPcHRpb25zLFxuICBSZXF1ZXN0RnVuY3Rpb24sXG4gIE9BdXRoMkNsaWVudE9wdGlvbnMsXG4gIEF1dGhDbGllbnRSZXF1ZXN0T3B0aW9ucyxcbn0gZnJvbSAnLi9tb2RlbHMnXG5cbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gJy4uL3V0aWxzL3V1aWQnXG5cbmltcG9ydCB7IFNpbmdsZVByb21pc2UgfSBmcm9tICcuLi91dGlscy9mdW5jdGlvbi9zaW5nbGUtcHJvbWlzZSdcblxuY29uc3QgUmVxdWVzdElkSGVhZGVyTmFtZSA9ICd4LXJlcXVlc3QtaWQnXG5jb25zdCBEZXZpY2VJZEhlYWRlck5hbWUgPSAneC1kZXZpY2UtaWQnXG5jb25zdCBEZXZpY2VJZFNlY3Rpb25OYW1lID0gJ2RldmljZV9pZCdcblxuZXhwb3J0IGludGVyZmFjZSBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zIHtcbiAgZXJyb3I/OiBFcnJvclR5cGU7XG4gIGVycm9yX2Rlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgZXJyb3JfdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgZGV0YWlscz86IGFueSB8IG51bGw7XG59XG5cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0OiBSZXF1ZXN0RnVuY3Rpb24gPSBhc3luYyBmdW5jdGlvbiA8VD4oXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNcbik6IFByb21pc2U8VD4ge1xuICBsZXQgcmVzdWx0OiBUIHwgbnVsbCA9IG51bGxcbiAgbGV0IHJlc3BvbnNlRXJyb3I6IFJlc3BvbnNlRXJyb3IgfCBudWxsID0gbnVsbFxuICB0cnkge1xuICAgIC8vIE9iamVjdHMgbXVzdCBiZSBjb3BpZWQgdG8gcHJldmVudCBtb2RpZmljYXRpb24gb2YgZGF0YSBzdWNoIGFzIGJvZHkuXG4gICAgY29uc3QgY29weU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKVxuICAgIGlmICghY29weU9wdGlvbnMubWV0aG9kKSB7XG4gICAgICBjb3B5T3B0aW9ucy5tZXRob2QgPSAnR0VUJ1xuICAgIH1cbiAgICBpZiAoY29weU9wdGlvbnMuYm9keSAmJiB0eXBlb2YgY29weU9wdGlvbnMuYm9keSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvcHlPcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShjb3B5T3B0aW9ucy5ib2R5KVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZVJlc3VsdDogUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIGNvcHlPcHRpb25zKVxuICAgIGNvbnN0IGpzb25SZXNwb25zZSA9IGF3YWl0IHJlc3BvbnNlUmVzdWx0Lmpzb24oKVxuICAgIGlmIChqc29uUmVzcG9uc2U/LmVycm9yKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ganNvblJlc3BvbnNlIGFzIFJlc3BvbnNlRXJyb3JcbiAgICAgIHJlc3BvbnNlRXJyb3IuZXJyb3JfdXJpID0gbmV3IFVSTCh1cmwpLnBhdGhuYW1lXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGpzb25SZXNwb25zZSBhcyBUXG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJlc3BvbnNlRXJyb3IgPSB7XG4gICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycm9yLm1lc3NhZ2UsXG4gICAgICBlcnJvcl91cmk6IG5ldyBVUkwodXJsKS5wYXRobmFtZSxcbiAgICB9XG4gIH1cbiAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICB0aHJvdyByZXNwb25zZUVycm9yXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCB0b1Jlc3BvbnNlRXJyb3IgPSAoXG4gIGVycm9yOiBSZXNwb25zZUVycm9yIHwgRXJyb3IsXG4gIG9wdGlvbnM/OiBUb1Jlc3BvbnNlRXJyb3JPcHRpb25zLFxuKTogUmVzcG9uc2VFcnJvciA9PiB7XG4gIGxldCByZXNwb25zZUVycm9yOiBSZXNwb25zZUVycm9yXG4gIGNvbnN0IGZvcm1hdE9wdGlvbnM6IFRvUmVzcG9uc2VFcnJvck9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBmb3JtYXRPcHRpb25zLmVycm9yIHx8IEVycm9yVHlwZS5MT0NBTCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOiBmb3JtYXRPcHRpb25zLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGVycm9yLm1lc3NhZ2UsXG4gICAgICBlcnJvcl91cmk6IGZvcm1hdE9wdGlvbnMuZXJyb3JfdXJpLFxuICAgICAgZGV0YWlsczogZm9ybWF0T3B0aW9ucy5kZXRhaWxzIHx8IGVycm9yLnN0YWNrLFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmb3JtYXRFcnJvcjogVG9SZXNwb25zZUVycm9yT3B0aW9ucyA9IGVycm9yIHx8IHt9XG4gICAgcmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBmb3JtYXRPcHRpb25zLmVycm9yIHx8IGZvcm1hdEVycm9yLmVycm9yIHx8IEVycm9yVHlwZS5MT0NBTCxcbiAgICAgIGVycm9yX2Rlc2NyaXB0aW9uOlxuICAgICAgICBmb3JtYXRPcHRpb25zLmVycm9yX2Rlc2NyaXB0aW9uIHx8IGZvcm1hdEVycm9yLmVycm9yX2Rlc2NyaXB0aW9uLFxuICAgICAgZXJyb3JfdXJpOiBmb3JtYXRPcHRpb25zLmVycm9yX3VyaSB8fCBmb3JtYXRFcnJvci5lcnJvcl91cmksXG4gICAgICBkZXRhaWxzOiBmb3JtYXRPcHRpb25zLmRldGFpbHMgfHwgZm9ybWF0RXJyb3IuZGV0YWlscyxcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlRXJyb3Jcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSByZXF1ZXN0IGlkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHV1aWR2NCgpXG59XG5cblxuLyoqXG4gKiBEZWZhdWx0IFN0b3JhZ2UuXG4gKi9cbmNsYXNzIERlZmF1bHRTdG9yYWdlIGltcGxlbWVudHMgU2ltcGxlU3RvcmFnZSB7XG4gIC8qKlxuICAgICAqIEdldCBpdGVtLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgYXN5bmMgZ2V0SXRlbShrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KVxuICB9XG5cbiAgLyoqXG4gICAgICogUmVtb3ZlIGl0ZW0uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqL1xuICBhc3luYyByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSlcbiAgfVxuXG4gIC8qKlxuICAgICAqIFNldCBpdGVtLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgYXN5bmMgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKVxuICB9XG5cbiAgLyoqXG4gICAgICogR2V0IGl0ZW0gc3luYy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICovXG4gIGdldEl0ZW1TeW5jKGtleTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpXG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgaXRlbSBzeW5jLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKi9cbiAgcmVtb3ZlSXRlbVN5bmMoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KVxuICB9XG5cbiAgLyoqXG4gICAgICogU2V0IGl0ZW0gc3luYy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAgICovXG4gIHNldEl0ZW1TeW5jKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTdG9yYWdlID0gbmV3IERlZmF1bHRTdG9yYWdlKClcblxuaW50ZXJmYWNlIExvY2FsQ3JlZGVudGlhbHNPcHRpb25zIHtcbiAgdG9rZW5TZWN0aW9uTmFtZTogc3RyaW5nO1xuICBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGNyZWRlbnRpYWxzIGlzIGV4cGlyZWQuXG4gKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVkZW50aWFsc0V4cGlyZWQoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogYm9vbGVhbiB7XG4gIGxldCBpc0V4cGlyZWQgPSB0cnVlXG4gIGlmIChjcmVkZW50aWFscz8uZXhwaXJlc19hdCAmJiBjcmVkZW50aWFscz8uYWNjZXNzX3Rva2VuKSB7XG4gICAgaXNFeHBpcmVkID0gY3JlZGVudGlhbHMuZXhwaXJlc19hdCA8IG5ldyBEYXRlKClcbiAgfVxuICByZXR1cm4gaXNFeHBpcmVkXG59XG5cbi8qKlxuICogTG9jYWwgY3JlZGVudGlhbHMuXG4gKiBMb2NhbCBjcmVkZW50aWFscywgd2l0aCBtZW1vcnkgY2FjaGUgYW5kIHN0b3JhZ2UgY2FjaGUuXG4gKiBJZiB0aGUgbWVtb3J5IGNhY2hlIGV4cGlyZXMsIHRoZSBzdG9yYWdlIGNhY2hlIGlzIGF1dG9tYXRpY2FsbHkgbG9hZGVkLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxDcmVkZW50aWFscyB7XG4gIHByaXZhdGUgdG9rZW5TZWN0aW9uTmFtZTogc3RyaW5nXG5cbiAgcHJpdmF0ZSBzdG9yYWdlOiBTaW1wbGVTdG9yYWdlXG5cbiAgcHJpdmF0ZSBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgfCBudWxsID0gbnVsbFxuXG4gIHByaXZhdGUgc2luZ2xlUHJvbWlzZTogU2luZ2xlUHJvbWlzZSA9IG5ldyBTaW5nbGVQcm9taXNlKClcblxuICAvKipcbiAgICogY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtMb2NhbENyZWRlbnRpYWxzT3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTG9jYWxDcmVkZW50aWFsc09wdGlvbnMpIHtcbiAgICB0aGlzLnRva2VuU2VjdGlvbk5hbWUgPSBvcHRpb25zLnRva2VuU2VjdGlvbk5hbWVcbiAgICB0aGlzLnN0b3JhZ2UgPSBvcHRpb25zLnN0b3JhZ2VcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKCk6IENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IG51bGxcbiAgICBjb25zdCB0b2tlblN0cjogc3RyaW5nID0gdGhpcy5zdG9yYWdlLmdldEl0ZW1TeW5jKHRoaXMudG9rZW5TZWN0aW9uTmFtZSwpXG4gICAgaWYgKHRva2VuU3RyICE9PSB1bmRlZmluZWQgJiYgdG9rZW5TdHIgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gSlNPTi5wYXJzZSh0b2tlblN0cilcbiAgICAgICAgaWYgKGNyZWRlbnRpYWxzPy5leHBpcmVzX2F0KSB7XG4gICAgICAgICAgY3JlZGVudGlhbHMuZXhwaXJlc19hdCA9IG5ldyBEYXRlKGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSlcbiAgICAgICAgY3JlZGVudGlhbHMgPSBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgLyoqXG4gICAqIHNldENyZWRlbnRpYWxzIFByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIGZldGNoIGFwaSByZXF1ZXN0IGltcGxlbWVudGF0aW9uIHdpdGggYXV0aCBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldENyZWRlbnRpYWxzKGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfaW4pIHtcbiAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShEYXRlLm5vdygpICsgKGNyZWRlbnRpYWxzLmV4cGlyZXNfaW4gLSAzMCkgKiAxMDAwLClcbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNyZWRlbnRpYWxzKVxuICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnRva2VuU2VjdGlvbk5hbWUsIHRva2VuU3RyKVxuICAgICAgfVxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnN0b3JhZ2UpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy50b2tlblNlY3Rpb25OYW1lKVxuICAgICAgfVxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNyZWRlbnRpYWxzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD59XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q3JlZGVudGlhbHMoKTogUHJvbWlzZTxDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5zaW5nbGVQcm9taXNlLnJ1bignZ2V0Q3JlZGVudGlhbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoaXNDcmVkZW50aWFsc0V4cGlyZWQodGhpcy5jcmVkZW50aWFscykpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKClcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc3RvcmFnZSBjcmVkZW50aWFscy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3RvcmFnZUNyZWRlbnRpYWxzKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc2luZ2xlUHJvbWlzZS5ydW4oJ19nZXRTdG9yYWdlQ3JlZGVudGlhbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gbnVsbFxuICAgICAgY29uc3QgdG9rZW5TdHI6IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMudG9rZW5TZWN0aW9uTmFtZSwpXG4gICAgICBpZiAodG9rZW5TdHIgIT09IHVuZGVmaW5lZCAmJiB0b2tlblN0ciAhPT0gbnVsbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNyZWRlbnRpYWxzID0gSlNPTi5wYXJzZSh0b2tlblN0cilcbiAgICAgICAgICBpZiAoY3JlZGVudGlhbHM/LmV4cGlyZXNfYXQpIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzLmV4cGlyZXNfYXQgPSBuZXcgRGF0ZShjcmVkZW50aWFscy5leHBpcmVzX2F0KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnRva2VuU2VjdGlvbk5hbWUpXG4gICAgICAgICAgY3JlZGVudGlhbHMgPSBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVkZW50aWFsc1xuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBPQXV0aDJDbGllbnRcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoMkNsaWVudCBpbXBsZW1lbnRzIEF1dGhDbGllbnQge1xuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0UmV0cnkgPSAyXG4gIHByaXZhdGUgc3RhdGljIG1pblJldHJ5ID0gMFxuICBwcml2YXRlIHN0YXRpYyBtYXhSZXRyeSA9IDVcbiAgcHJpdmF0ZSBzdGF0aWMgcmV0cnlJbnRlcnZhbCA9IDEwMDBcblxuICBwcml2YXRlIGFwaU9yaWdpbjogc3RyaW5nXG4gIHByaXZhdGUgY2xpZW50SWQ6IHN0cmluZ1xuICBwcml2YXRlIHJldHJ5OiBudW1iZXJcbiAgcHJpdmF0ZSBjbGllbnRTZWNyZXQ/OiBzdHJpbmdcbiAgcHJpdmF0ZSBiYXNlUmVxdWVzdDogPFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyxcbiAgKSA9PiBQcm9taXNlPFQ+XG4gIHByaXZhdGUgbG9jYWxDcmVkZW50aWFsczogTG9jYWxDcmVkZW50aWFsc1xuICBwcml2YXRlIHN0b3JhZ2U6IFNpbXBsZVN0b3JhZ2VcbiAgcHJpdmF0ZSBkZXZpY2VJRD86IHN0cmluZ1xuICBwcml2YXRlIHRva2VuSW5VUkw/OiBib29sZWFuXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuRnVuYzogKHJlZnJlc2hUb2tlbj86IHN0cmluZykgPT4gUHJvbWlzZTxDcmVkZW50aWFscz5cbiAgcHJpdmF0ZSBoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICBwcml2YXRlIHNpbmdsZVByb21pc2U6IFNpbmdsZVByb21pc2UgPSBuZXcgU2luZ2xlUHJvbWlzZSgpXG5cbiAgLyoqXG4gICAqIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T0F1dGgyQ2xpZW50T3B0aW9uc30gb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT0F1dGgyQ2xpZW50T3B0aW9ucykge1xuICAgIHRoaXMuYXBpT3JpZ2luID0gb3B0aW9ucy5hcGlPcmlnaW5cbiAgICB0aGlzLmNsaWVudElkID0gb3B0aW9ucy5jbGllbnRJZFxuICAgIHRoaXMucmV0cnkgPSB0aGlzLmZvcm1hdFJldHJ5KG9wdGlvbnMucmV0cnksIE9BdXRoMkNsaWVudC5kZWZhdWx0UmV0cnkpXG4gICAgaWYgKG9wdGlvbnMuYmFzZVJlcXVlc3QpIHtcbiAgICAgIHRoaXMuYmFzZVJlcXVlc3QgPSBvcHRpb25zLmJhc2VSZXF1ZXN0XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmFzZVJlcXVlc3QgPSBkZWZhdWx0UmVxdWVzdFxuICAgIH1cbiAgICB0aGlzLnRva2VuSW5VUkwgPSBvcHRpb25zLnRva2VuSW5VUkxcbiAgICB0aGlzLmhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnNcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgdGhpcy5zdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlIHx8IGRlZmF1bHRTdG9yYWdlXG4gICAgdGhpcy5sb2NhbENyZWRlbnRpYWxzID0gbmV3IExvY2FsQ3JlZGVudGlhbHMoe1xuICAgICAgdG9rZW5TZWN0aW9uTmFtZTogYGNyZWRlbnRpYWxzXyR7b3B0aW9ucy5jbGllbnRJZH1gLFxuICAgICAgc3RvcmFnZTogdGhpcy5zdG9yYWdlLFxuICAgIH0pXG4gICAgdGhpcy5jbGllbnRTZWNyZXQgPSBvcHRpb25zLmNsaWVudFNlY3JldFxuICAgIHRoaXMucmVmcmVzaFRva2VuRnVuYyA9ICAgICAgb3B0aW9ucy5yZWZyZXNoVG9rZW5GdW5jIHx8IHRoaXMuZGVmYXVsdFJlZnJlc2hUb2tlbkZ1bmNcbiAgfVxuXG4gIC8qKlxuICAgKiBzZXRDcmVkZW50aWFscyBQcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSBmZXRjaCBhcGkgcmVxdWVzdCBpbXBsZW1lbnRhdGlvbiB3aXRoIGF1dGggY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHtDcmVkZW50aWFsc30gY3JlZGVudGlhbHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHB1YmxpYyBzZXRDcmVkZW50aWFscyhjcmVkZW50aWFscz86IENyZWRlbnRpYWxzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhjcmVkZW50aWFscylcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRBY2Nlc3NUb2tlbiByZXR1cm4gYSB2YWxpZGF0ZSBhY2Nlc3MgdG9rZW5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgIGlmIChjcmVkZW50aWFscz8uYWNjZXNzX3Rva2VuKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNyZWRlbnRpYWxzLmFjY2Vzc190b2tlbilcbiAgICB9XG4gICAgY29uc3QgcmVzcEVycjogUmVzcG9uc2VFcnJvciA9IHsgZXJyb3I6IEVycm9yVHlwZS5VTkFVVEhFTlRJQ0FURUQgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwRXJyKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlcXVlc3QgaHR0cCBsaWtlIHNpbXBsZSBmZXRjaCBhcGksIGV4cDpyZXF1ZXN0KCcvdjEvdXNlci9tZScsIHt3aXRoQ3JlZGVudGlhbHM6dHJ1ZX0pXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtBdXRoQ2xpZW50UmVxdWVzdE9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXF1ZXN0PFQ+KFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBBdXRoQ2xpZW50UmVxdWVzdE9wdGlvbnMsXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9XG4gICAgfVxuICAgIGNvbnN0IHJldHJ5OiBudW1iZXIgPSB0aGlzLmZvcm1hdFJldHJ5KG9wdGlvbnMucmV0cnksIHRoaXMucmV0cnkpXG4gICAgb3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XG4gICAgaWYgKHRoaXMuaGVhZGVycykge1xuICAgICAgb3B0aW9ucy5oZWFkZXJzID0ge1xuICAgICAgICAuLi50aGlzLmhlYWRlcnMsXG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnNbUmVxdWVzdElkSGVhZGVyTmFtZV0pIHtcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tSZXF1ZXN0SWRIZWFkZXJOYW1lXSA9IGdlbmVyYXRlUmVxdWVzdElkKClcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmhlYWRlcnNbRGV2aWNlSWRIZWFkZXJOYW1lXSkge1xuICAgICAgY29uc3QgZGV2aWNlSWQgPSBhd2FpdCB0aGlzLmdldERldmljZUlkKClcbiAgICAgIG9wdGlvbnMuaGVhZGVyc1tEZXZpY2VJZEhlYWRlck5hbWVdID0gZGV2aWNlSWRcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LndpdGhDcmVkZW50aWFscykge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBpZiAodGhpcy50b2tlbkluVVJMKSB7XG4gICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJz8nXG4gICAgICAgICAgfVxuICAgICAgICAgIHVybCArPSBgYWNjZXNzX3Rva2VuPSR7Y3JlZGVudGlhbHMuYWNjZXNzX3Rva2VufWBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuQXV0aG9yaXphdGlvbiA9ICAgICAgICAgICAgYCR7Y3JlZGVudGlhbHMudG9rZW5fdHlwZX0gJHtjcmVkZW50aWFscy5hY2Nlc3NfdG9rZW59YFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNsaWVudElkICYmIHVybC5pbmRleE9mKCdjbGllbnRfaWQnKSA8IDApIHtcbiAgICAgICAgdXJsICs9IHVybC5pbmRleE9mKCc/JykgPCAwID8gJz8nIDogJyYnXG4gICAgICAgIHVybCArPSBgY2xpZW50X2lkPSR7dGhpcy5jbGllbnRJZH1gXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICB1cmwgPSB0aGlzLmFwaU9yaWdpbiArIHVybFxuICAgIH1cbiAgICBsZXQgcmVzcG9uc2U6IFQgfCBudWxsID0gbnVsbFxuICAgIGNvbnN0IG1heFJlcXVlc3RUaW1lczogbnVtYmVyID0gcmV0cnkgKyAxXG4gICAgZm9yIChcbiAgICAgIGxldCByZXF1ZXN0VGltZSA9IDA7XG4gICAgICByZXF1ZXN0VGltZSA8IG1heFJlcXVlc3RUaW1lcztcbiAgICAgIHJlcXVlc3RUaW1lKytcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iYXNlUmVxdWVzdDxUPih1cmwsIG9wdGlvbnMpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChyZXNwb25zZUVycm9yKSB7XG4gICAgICAgIGlmIChvcHRpb25zLndpdGhDcmVkZW50aWFscyAmJiByZXNwb25zZUVycm9yICYmIHJlc3BvbnNlRXJyb3IuZXJyb3IgPT09IEVycm9yVHlwZS5VTkFVVEhFTlRJQ0FURUQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldENyZWRlbnRpYWxzKG51bGwpXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BvbnNlRXJyb3IpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVxdWVzdFRpbWUgPT09IHJldHJ5XG4gICAgICAgICAgfHwgIXJlc3BvbnNlRXJyb3JcbiAgICAgICAgICB8fCByZXNwb25zZUVycm9yLmVycm9yICE9PSAndW5yZWFjaGFibGUnXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXNwb25zZUVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNsZWVwKE9BdXRoMkNsaWVudC5yZXRyeUludGVydmFsKVxuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdldCBjcmVkZW50aWFscy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDcmVkZW50aWFscygpOiBQcm9taXNlPENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICAgIGxldCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgIGlmIChpc0NyZWRlbnRpYWxzRXhwaXJlZChjcmVkZW50aWFscykpIHtcbiAgICAgIGlmIChjcmVkZW50aWFscyAmJiBjcmVkZW50aWFscy5zY29wZSA9PT0gJ2Fub255bW91cycpIHtcbiAgICAgICAgY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmFub255bW91c1NpZ25JbihjcmVkZW50aWFscylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oY3JlZGVudGlhbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFsc1xuICB9XG5cbiAgcHVibGljIGdldENyZWRlbnRpYWxzU3luYygpOiBDcmVkZW50aWFscyB8IG51bGwge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRTdG9yYWdlQ3JlZGVudGlhbHNTeW5jKClcbiAgICByZXR1cm4gY3JlZGVudGlhbHNcbiAgfVxuXG4gIHB1YmxpYyBnZXRDcmVkZW50aWFsc0FzeW5jKCk6IFByb21pc2U8Q3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2NvcGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuZ2V0Q3JlZGVudGlhbHMoKVxuICAgIGlmICghY3JlZGVudGlhbHMpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKCdjcmVkZW50aWFscyBub3QgZm91bmQnKVxuICAgIH1cbiAgICByZXR1cm4gY3JlZGVudGlhbHMuc2NvcGVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRHcm91cHMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IoJ2NyZWRlbnRpYWxzIG5vdCBmb3VuZCcpXG4gICAgfVxuICAgIHJldHVybiBjcmVkZW50aWFscy5ncm91cHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayByZXRyeSB2YWx1ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHJldHJ5XG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgY2hlY2tSZXRyeShyZXRyeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBsZXQgcmVzcG9uc2VFcnJvcjogUmVzcG9uc2VFcnJvciB8IG51bGwgPSBudWxsXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHJldHJ5ICE9PSAnbnVtYmVyJ1xuICAgICAgfHwgcmV0cnkgPCBPQXV0aDJDbGllbnQubWluUmV0cnlcbiAgICAgIHx8IHJldHJ5ID4gT0F1dGgyQ2xpZW50Lm1heFJldHJ5XG4gICAgKSB7XG4gICAgICByZXNwb25zZUVycm9yID0ge1xuICAgICAgICBlcnJvcjogRXJyb3JUeXBlLlVOUkVBQ0hBQkxFLFxuICAgICAgICBlcnJvcl9kZXNjcmlwdGlvbjogJ3dyb25nIG9wdGlvbnMgcGFyYW06IHJldHJ5JyxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlRXJyb3IpIHtcbiAgICAgIHRocm93IHJlc3BvbnNlRXJyb3JcbiAgICB9XG4gICAgcmV0dXJuIHJldHJ5XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IHJldHJ5IHZhbHVlLlxuICAgKiBAcGFyYW0ge251bWJlcn0gcmV0cnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlZmF1bHRWYWxlXG4gICAqIEByZXR1cm4ge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgZm9ybWF0UmV0cnkocmV0cnk6IG51bWJlciwgZGVmYXVsdFZhbGU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiByZXRyeSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jaGVja1JldHJ5KHJldHJ5KVxuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKVxuICAgICAgfSwgbXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIGV4cGlyZWQgdG9rZW4uXG4gICAqIEBwYXJhbSB7Q3JlZGVudGlhbHN9IGNyZWRlbnRpYWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q3JlZGVudGlhbHM+fVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoVG9rZW4oY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzKTogUHJvbWlzZTxDcmVkZW50aWFscz4ge1xuICAgIHJldHVybiB0aGlzLnNpbmdsZVByb21pc2UucnVuKCdfcmVmcmVzaFRva2VuJywgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCAhY3JlZGVudGlhbHMucmVmcmVzaF90b2tlbikge1xuICAgICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcignbm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjcmVkZW50aWFscycpXG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuZXdDcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbkZ1bmMoY3JlZGVudGlhbHMucmVmcmVzaF90b2tlbiwpXG4gICAgICAgIGF3YWl0IHRoaXMubG9jYWxDcmVkZW50aWFscy5zZXRDcmVkZW50aWFscyhuZXdDcmVkZW50aWFscylcbiAgICAgICAgcmV0dXJuIG5ld0NyZWRlbnRpYWxzXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IuZXJyb3IgPT09IEVycm9yVHlwZS5JTlZBTElEX0dSQU5UKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG51bGwpXG4gICAgICAgICAgcmV0dXJuIHRoaXMudW5BdXRoZW50aWNhdGVkRXJyb3IoZXJyb3IuZXJyb3JfZGVzY3JpcHRpb24pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogYW5vbnltb3VzIHNpZ25JblxuICAgKiBAcGFyYW0ge0NyZWRlbnRpYWxzfSBjcmVkZW50aWFsc1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPENyZWRlbnRpYWxzPn1cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYW5vbnltb3VzU2lnbkluKGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyk6IFByb21pc2U8Q3JlZGVudGlhbHM+IHtcbiAgICByZXR1cm4gdGhpcy5zaW5nbGVQcm9taXNlLnJ1bignX2Fub255bW91cycsIGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghY3JlZGVudGlhbHMgfHwgY3JlZGVudGlhbHMuc2NvcGUgIT09ICdhbm9ueW1vdXMnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKCdubyBhbm9ueW1vdXMgaW4gY3JlZGVudGlhbHMnKVxuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbmV3Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZXF1ZXN0KCcvYXV0aC92MS9zaWduaW4vYW5vbnltb3VzbHknLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICAgYXdhaXQgdGhpcy5sb2NhbENyZWRlbnRpYWxzLnNldENyZWRlbnRpYWxzKG5ld0NyZWRlbnRpYWxzKVxuICAgICAgICByZXR1cm4gbmV3Q3JlZGVudGlhbHNcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5lcnJvciA9PT0gRXJyb3JUeXBlLklOVkFMSURfR1JBTlQpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvY2FsQ3JlZGVudGlhbHMuc2V0Q3JlZGVudGlhbHMobnVsbClcbiAgICAgICAgICByZXR1cm4gdGhpcy51bkF1dGhlbnRpY2F0ZWRFcnJvcihlcnJvci5lcnJvcl9kZXNjcmlwdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJlZnJlc2ggdG9rZW4gZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWZyZXNoVG9rZW5cbiAgICogQHJldHVybiB7UHJvbWlzZTxDcmVkZW50aWFscz59XG4gICAqL1xuICBwcml2YXRlIGRlZmF1bHRSZWZyZXNoVG9rZW5GdW5jKHJlZnJlc2hUb2tlbj86IHN0cmluZywpOiBQcm9taXNlPENyZWRlbnRpYWxzPiB7XG4gICAgaWYgKHJlZnJlc2hUb2tlbiA9PT0gdW5kZWZpbmVkIHx8IHJlZnJlc2hUb2tlbiA9PT0gJycpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuQXV0aGVudGljYXRlZEVycm9yKCdyZWZyZXNoIHRva2VuIG5vdCBmb3VuZCcpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJy9hdXRoL3YxL3Rva2VuJywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiB7XG4gICAgICAgIGNsaWVudF9pZDogdGhpcy5jbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogdGhpcy5jbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgfSxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZXZpY2VJZFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXREZXZpY2VJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmRldmljZUlEKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZXZpY2VJRFxuICAgIH1cbiAgICBsZXQgZGV2aWNlSWQ6IHN0cmluZyA9IGF3YWl0IHRoaXMuc3RvcmFnZS5nZXRJdGVtKERldmljZUlkU2VjdGlvbk5hbWUsKVxuICAgIGlmICghKHR5cGVvZiBkZXZpY2VJZCA9PT0gJ3N0cmluZydcbiAgICAgICYmIGRldmljZUlkLmxlbmd0aCA+PSAxNlxuICAgICAgJiYgZGV2aWNlSWQubGVuZ3RoIDw9IDQ4KSkge1xuICAgICAgZGV2aWNlSWQgPSB1dWlkdjQoKVxuICAgICAgYXdhaXQgdGhpcy5zdG9yYWdlLnNldEl0ZW0oRGV2aWNlSWRTZWN0aW9uTmFtZSwgZGV2aWNlSWQpXG4gICAgfVxuICAgIHRoaXMuZGV2aWNlSUQgPSBkZXZpY2VJZFxuICAgIHJldHVybiBkZXZpY2VJZFxuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bkF1dGhlbnRpY2F0ZWQgZXJyb3IuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBlcnJcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn1cbiAgICovXG4gIHByaXZhdGUgdW5BdXRoZW50aWNhdGVkRXJyb3I8VD4oZXJyPzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgcmVzcEVycjogUmVzcG9uc2VFcnJvciA9IHtcbiAgICAgIGVycm9yOiBFcnJvclR5cGUuVU5BVVRIRU5USUNBVEVELFxuICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVycixcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3BFcnIpXG4gIH1cbn1cbiJdfQ==