@cloudbase/auth 2.24.8 → 2.24.10

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.
@@ -57,7 +57,6 @@ var __rest = (this && this.__rest) || function (s, e) {
57
57
  return t;
58
58
  };
59
59
  import { weappJwtDecodeAll, EVENTS, AUTH_STATE_CHANGED_TYPE, AuthError, OAUTH_TYPE, LOGIN_STATE_CHANGED_TYPE, } from '@cloudbase/oauth';
60
- import { eventBus } from '.';
61
60
  import { saveToBrowserSession, getBrowserSession, removeBrowserSession, addUrlSearch } from './utils';
62
61
  import { utils } from '@cloudbase/utilities';
63
62
  import { adapterForWxMp } from './utilities';
@@ -281,25 +280,26 @@ var SbaseApi = (function () {
281
280
  });
282
281
  };
283
282
  SbaseApi.prototype.signOut = function (params) {
283
+ var _a, _b;
284
284
  return __awaiter(this, void 0, void 0, function () {
285
285
  var userInfoKey, res, error_4;
286
- return __generator(this, function (_a) {
287
- switch (_a.label) {
286
+ return __generator(this, function (_c) {
287
+ switch (_c.label) {
288
288
  case 0:
289
- _a.trys.push([0, 3, , 4]);
289
+ _c.trys.push([0, 3, , 4]);
290
290
  userInfoKey = this.cache.keys.userInfoKey;
291
291
  return [4, this.oauthInstance.authApi.signOut(params)];
292
292
  case 1:
293
- res = _a.sent();
293
+ res = _c.sent();
294
294
  return [4, this.cache.removeStoreAsync(userInfoKey)];
295
295
  case 2:
296
- _a.sent();
296
+ _c.sent();
297
297
  this.setAccessKey();
298
- eventBus.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
299
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
298
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.LOGIN_STATE_CHANGED, { eventType: LOGIN_STATE_CHANGED_TYPE.SIGN_OUT });
299
+ (_b = this.config.eventBus) === null || _b === void 0 ? void 0 : _b.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_OUT });
300
300
  return [2, __assign(__assign({}, res), { data: {}, error: null })];
301
301
  case 3:
302
- error_4 = _a.sent();
302
+ error_4 = _c.sent();
303
303
  return [2, { data: {}, error: new AuthError(error_4) }];
304
304
  case 4: return [2];
305
305
  }
@@ -599,22 +599,23 @@ var SbaseApi = (function () {
599
599
  data: {
600
600
  updateUser: function (attributes) { return __awaiter(_this, void 0, void 0, function () {
601
601
  var verificationTokenRes, res, error_12;
602
- return __generator(this, function (_a) {
603
- switch (_a.label) {
602
+ var _a;
603
+ return __generator(this, function (_b) {
604
+ switch (_b.label) {
604
605
  case 0:
605
606
  this.validateParams(attributes, {
606
607
  nonce: { required: true, message: 'Nonce is required' },
607
608
  password: { required: true, message: 'Password is required' },
608
609
  });
609
- _a.label = 1;
610
+ _b.label = 1;
610
611
  case 1:
611
- _a.trys.push([1, 5, , 6]);
612
+ _b.trys.push([1, 5, , 6]);
612
613
  return [4, this.verify({
613
614
  verification_id: verificationInfo_3.verification_id,
614
615
  verification_code: attributes.nonce,
615
616
  })];
616
617
  case 2:
617
- verificationTokenRes = _a.sent();
618
+ verificationTokenRes = _b.sent();
618
619
  return [4, this.oauthInstance.authApi.resetPassword({
619
620
  email: isEmail_1 ? emailOrPhone : undefined,
620
621
  phone: !isEmail_1 ? emailOrPhone : undefined,
@@ -622,21 +623,21 @@ var SbaseApi = (function () {
622
623
  verification_token: verificationTokenRes.verification_token,
623
624
  })];
624
625
  case 3:
625
- _a.sent();
626
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY });
626
+ _b.sent();
627
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.PASSWORD_RECOVERY });
627
628
  return [4, this.signInWithPassword({
628
629
  email: isEmail_1 ? emailOrPhone : undefined,
629
630
  phone: !isEmail_1 ? emailOrPhone : undefined,
630
631
  password: attributes.password,
631
632
  })];
632
633
  case 4:
633
- res = _a.sent();
634
+ res = _b.sent();
634
635
  if (redirectTo_1 && isBrowser()) {
635
636
  window.location.assign(redirectTo_1);
636
637
  }
637
638
  return [2, res];
638
639
  case 5:
639
- error_12 = _a.sent();
640
+ error_12 = _b.sent();
640
641
  return [2, { data: {}, error: new AuthError(error_12) }];
641
642
  case 6: return [2];
642
643
  }
@@ -813,13 +814,14 @@ var SbaseApi = (function () {
813
814
  });
814
815
  };
815
816
  SbaseApi.prototype.updateUser = function (params) {
817
+ var _a;
816
818
  return __awaiter(this, void 0, void 0, function () {
817
- var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, _a, user, error_19;
819
+ var hasValue, email, phone, restParams, needsEmailVerification_1, needsPhoneVerification, extraRes, verificationParams, verificationType_1, formattedPhone, verificationInfo_4, _b, user, error_19;
818
820
  var _this = this;
819
- return __generator(this, function (_b) {
820
- switch (_b.label) {
821
+ return __generator(this, function (_c) {
822
+ switch (_c.label) {
821
823
  case 0:
822
- _b.trys.push([0, 8, , 9]);
824
+ _c.trys.push([0, 8, , 9]);
823
825
  hasValue = Object.keys(params).some(function (key) { return params[key] !== undefined && params[key] !== null && params[key] !== ''; });
824
826
  if (!hasValue) {
825
827
  throw new AuthError({ message: 'At least one field must be provided for update' });
@@ -841,23 +843,24 @@ var SbaseApi = (function () {
841
843
  }
842
844
  return [4, this.getVerification(verificationParams)];
843
845
  case 1:
844
- verificationInfo_4 = _b.sent();
845
- _a = Object.keys(restParams).length > 0;
846
- if (!_a) return [3, 3];
846
+ verificationInfo_4 = _c.sent();
847
+ _b = Object.keys(restParams).length > 0;
848
+ if (!_b) return [3, 3];
847
849
  return [4, this.updateUserBasicInfo(restParams)];
848
850
  case 2:
849
- _a = (_b.sent());
850
- _b.label = 3;
851
+ _b = (_c.sent());
852
+ _c.label = 3;
851
853
  case 3:
852
- _a;
854
+ _b;
853
855
  extraRes = {
854
856
  messageId: verificationInfo_4.verification_id,
855
857
  verifyOtp: function (verifyParams) { return __awaiter(_this, void 0, void 0, function () {
856
858
  var user_1, error_20;
857
- return __generator(this, function (_a) {
858
- switch (_a.label) {
859
+ var _a;
860
+ return __generator(this, function (_b) {
861
+ switch (_b.label) {
859
862
  case 0:
860
- _a.trys.push([0, 11, , 12]);
863
+ _b.trys.push([0, 11, , 12]);
861
864
  if (!(verifyParams.email && params.email === verifyParams.email)) return [3, 3];
862
865
  return [4, this.verifyOtp({
863
866
  type: 'email_change',
@@ -866,10 +869,10 @@ var SbaseApi = (function () {
866
869
  messageId: verificationInfo_4.verification_id,
867
870
  })];
868
871
  case 1:
869
- _a.sent();
872
+ _b.sent();
870
873
  return [4, this.updateUserBasicInfo({ email: params.email })];
871
874
  case 2:
872
- _a.sent();
875
+ _b.sent();
873
876
  return [3, 9];
874
877
  case 3:
875
878
  if (!(verifyParams.phone && params.phone === verifyParams.phone)) return [3, 6];
@@ -880,10 +883,10 @@ var SbaseApi = (function () {
880
883
  messageId: verificationInfo_4.verification_id,
881
884
  })];
882
885
  case 4:
883
- _a.sent();
886
+ _b.sent();
884
887
  return [4, this.updateUserBasicInfo({ phone: this.formatPhone(params.phone) })];
885
888
  case 5:
886
- _a.sent();
889
+ _b.sent();
887
890
  return [3, 9];
888
891
  case 6: return [4, this.verifyOtp({
889
892
  type: verificationType_1,
@@ -893,18 +896,18 @@ var SbaseApi = (function () {
893
896
  messageId: verificationInfo_4.verification_id,
894
897
  })];
895
898
  case 7:
896
- _a.sent();
899
+ _b.sent();
897
900
  return [4, this.updateUserBasicInfo(params)];
898
901
  case 8:
899
- _a.sent();
900
- _a.label = 9;
902
+ _b.sent();
903
+ _b.label = 9;
901
904
  case 9: return [4, this.getUser()];
902
905
  case 10:
903
- user_1 = (_a.sent()).data.user;
904
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
906
+ user_1 = (_b.sent()).data.user;
907
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
905
908
  return [2, { data: { user: user_1 }, error: null }];
906
909
  case 11:
907
- error_20 = _a.sent();
910
+ error_20 = _b.sent();
908
911
  return [2, { data: {}, error: new AuthError(error_20) }];
909
912
  case 12: return [2];
910
913
  }
@@ -914,15 +917,15 @@ var SbaseApi = (function () {
914
917
  return [3, 6];
915
918
  case 4: return [4, this.updateUserBasicInfo(params)];
916
919
  case 5:
917
- _b.sent();
918
- _b.label = 6;
920
+ _c.sent();
921
+ _c.label = 6;
919
922
  case 6: return [4, this.getUser()];
920
923
  case 7:
921
- user = (_b.sent()).data.user;
922
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
924
+ user = (_c.sent()).data.user;
925
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.USER_UPDATED });
923
926
  return [2, { data: __assign({ user: user }, extraRes), error: null }];
924
927
  case 8:
925
- error_19 = _b.sent();
928
+ error_19 = _c.sent();
926
929
  return [2, { data: {}, error: new AuthError(error_19) }];
927
930
  case 9: return [2];
928
931
  }
@@ -1107,26 +1110,27 @@ var SbaseApi = (function () {
1107
1110
  });
1108
1111
  };
1109
1112
  SbaseApi.prototype.setSession = function (params) {
1113
+ var _a;
1110
1114
  return __awaiter(this, void 0, void 0, function () {
1111
- var _a, _b, session, error_27;
1112
- return __generator(this, function (_c) {
1113
- switch (_c.label) {
1115
+ var _b, _c, session, error_27;
1116
+ return __generator(this, function (_d) {
1117
+ switch (_d.label) {
1114
1118
  case 0:
1115
- _c.trys.push([0, 3, , 4]);
1119
+ _d.trys.push([0, 3, , 4]);
1116
1120
  this.validateParams(params, {
1117
1121
  access_token: { required: true, message: 'Access token is required' },
1118
1122
  refresh_token: { required: true, message: 'Refresh token is required' },
1119
1123
  });
1120
1124
  return [4, this.oauthInstance.oauth2client.refreshToken(params, { throwOnError: true })];
1121
1125
  case 1:
1122
- _c.sent();
1126
+ _d.sent();
1123
1127
  return [4, this.getSession()];
1124
1128
  case 2:
1125
- _a = (_c.sent()).data, _b = _a === void 0 ? {} : _a, session = _b.session;
1126
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
1129
+ _b = (_d.sent()).data, _c = _b === void 0 ? {} : _b, session = _c.session;
1130
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.SIGNED_IN });
1127
1131
  return [2, { data: { user: session.user, session: session }, error: null }];
1128
1132
  case 3:
1129
- error_27 = _c.sent();
1133
+ error_27 = _d.sent();
1130
1134
  return [2, { data: {}, error: new AuthError(error_27) }];
1131
1135
  case 4: return [2];
1132
1136
  }
@@ -1407,21 +1411,22 @@ var SbaseApi = (function () {
1407
1411
  return;
1408
1412
  };
1409
1413
  SbaseApi.prototype.init = function () {
1414
+ var _a;
1410
1415
  return __awaiter(this, void 0, void 0, function () {
1411
1416
  var credentials, error_34;
1412
- return __generator(this, function (_a) {
1413
- switch (_a.label) {
1417
+ return __generator(this, function (_b) {
1418
+ switch (_b.label) {
1414
1419
  case 0:
1415
- _a.trys.push([0, 2, , 3]);
1420
+ _b.trys.push([0, 2, , 3]);
1416
1421
  return [4, this.oauthInstance.oauth2client.localCredentials.getCredentials()];
1417
1422
  case 1:
1418
- credentials = _a.sent();
1423
+ credentials = _b.sent();
1419
1424
  if (credentials) {
1420
- eventBus.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
1425
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.fire(EVENTS.AUTH_STATE_CHANGED, { event: AUTH_STATE_CHANGED_TYPE.INITIAL_SESSION });
1421
1426
  }
1422
1427
  return [3, 3];
1423
1428
  case 2:
1424
- error_34 = _a.sent();
1429
+ error_34 = _b.sent();
1425
1430
  return [3, 3];
1426
1431
  case 3: return [2, { error: null }];
1427
1432
  }
@@ -1430,7 +1435,8 @@ var SbaseApi = (function () {
1430
1435
  };
1431
1436
  SbaseApi.prototype.setupListeners = function () {
1432
1437
  var _this = this;
1433
- eventBus.on(EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
1438
+ var _a;
1439
+ (_a = this.config.eventBus) === null || _a === void 0 ? void 0 : _a.on(EVENTS.AUTH_STATE_CHANGED, function (params) { return __awaiter(_this, void 0, void 0, function () {
1434
1440
  var event, info, session;
1435
1441
  var _a, _b;
1436
1442
  return __generator(this, function (_c) {
@@ -1516,4 +1522,4 @@ var SbaseApi = (function () {
1516
1522
  return SbaseApi;
1517
1523
  }());
1518
1524
  export { SbaseApi };
1519
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Jhc2VBcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2Jhc2VBcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLHdCQUF3QixHQUN6QixNQUFNLGtCQUFrQixDQUFBO0FBZ0N6QixPQUFPLEVBQUUsUUFBUSxFQUFvQixNQUFNLEdBQUcsQ0FBQTtBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3JHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxjQUFNLE9BQUEsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBaEUsQ0FBZ0UsQ0FBQTtBQUkvRjtJQU9FLGtCQUFZLE1BQXlEO1FBSDdELGNBQVMsR0FBZ0QsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNsRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFHOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDYixDQUFDO0lBS0Qsc0JBQUksaUNBQVc7YUFBZjtZQUNFLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZ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LENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFHLEtBQUssQ0FBQyxNQUFLLFNBQVMsSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRyxLQUFLLENBQUMsTUFBSyxJQUFJLElBQUksQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUcsS0FBSyxDQUFDLE1BQUssRUFBRSxFQUFuRixDQUFtRixDQUFDLEVBQXhHLENBQXdHLENBQUUsQ0FBQTtRQUVySixJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFFLE9BQU8sU0FBQSxFQUFFLENBQUMsQ0FBQTtTQUNqQztJQUNILENBQUM7SUFDSCxlQUFDO0FBQUQsQ0FBQyxBQXo2Q0QsSUF5NkNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlQXV0aENvbmZpZyB9IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvYXV0aCdcbmltcG9ydCB0eXBlIHsgYXV0aE1vZGVscywgQ2xvdWRiYXNlT0F1dGgsIENyZWRlbnRpYWxzIH0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB0eXBlIHsgSUNsb3VkYmFzZUNhY2hlIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9jYWNoZSdcbmltcG9ydCB7XG4gIHdlYXBwSnd0RGVjb2RlQWxsLFxuICBFVkVOVFMsXG4gIEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLFxuICBBdXRoRXJyb3IsXG4gIE9BVVRIX1RZUEUsXG4gIExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRSxcbn0gZnJvbSAnQGNsb3VkYmFzZS9vYXV0aCdcbmltcG9ydCB7XG4gIENvbW1vblJlcyxcbiAgRGVsZXRlTWVSZXEsXG4gIEdldENsYWltc1JlcyxcbiAgR2V0VXNlcklkZW50aXRpZXNSZXMsXG4gIEdldFVzZXJSZXMsXG4gIExpbmtJZGVudGl0eVJlcSxcbiAgTGlua0lkZW50aXR5UmVzLFxuICBPbkF1dGhTdGF0ZUNoYW5nZUNhbGxiYWNrLFxuICBSZWF1dGhlbnRpY2F0ZVJlcyxcbiAgUmVzZW5kUmVxLFxuICBSZXNlbmRSZXMsXG4gIFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvck9sZFJlcSxcbiAgU2V0U2Vzc2lvblJlcSxcbiAgU2lnbkluQW5vbnltb3VzbHlSZXEsXG4gIFNpZ25Jbk9BdXRoUmVzLFxuICBTaWduSW5SZXMsXG4gIFNpZ25JbldpdGhJZFRva2VuUmVxLFxuICBTaWduSW5XaXRoT0F1dGhSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXEsXG4gIFNpZ25JbldpdGhPdHBSZXMsXG4gIFNpZ25JbldpdGhQYXNzd29yZFJlcSxcbiAgU2lnblVwUmVzLFxuICBVbmxpbmtJZGVudGl0eVJlcSxcbiAgVXBkYXRlVXNlckF0dHJpYnV0ZXMsXG4gIFVwZGF0ZVVzZXJSZXEsXG4gIFVwZGF0ZVVzZXJXaXRoVmVyaWZpY2F0aW9uUmVzLFxuICBWZXJpZnlPQXV0aFJlcSxcbiAgVmVyaWZ5T3RwUmVxLFxufSBmcm9tICcuL3R5cGUnXG5pbXBvcnQgeyBldmVudEJ1cywgTG9naW5TdGF0ZSwgVXNlciB9IGZyb20gJy4nXG5pbXBvcnQgeyBzYXZlVG9Ccm93c2VyU2Vzc2lvbiwgZ2V0QnJvd3NlclNlc3Npb24sIHJlbW92ZUJyb3dzZXJTZXNzaW9uLCBhZGRVcmxTZWFyY2ggfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICdAY2xvdWRiYXNlL3V0aWxpdGllcydcbmltcG9ydCB7IGFkYXB0ZXJGb3JXeE1wIH0gZnJvbSAnLi91dGlsaXRpZXMnXG5leHBvcnQgY29uc3QgaXNCcm93c2VyID0gKCkgPT4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJ1xuXG5kZWNsYXJlIGNvbnN0IHd4OiBhbnlcblxuZXhwb3J0IGNsYXNzIFNiYXNlQXBpIHtcbiAgcmVhZG9ubHkgY29uZmlnOiBJQ2xvdWRiYXNlQXV0aENvbmZpZ1xuICBvYXV0aEluc3RhbmNlOiBDbG91ZGJhc2VPQXV0aFxuICByZWFkb25seSBjYWNoZTogSUNsb3VkYmFzZUNhY2hlXG4gIHByaXZhdGUgbGlzdGVuZXJzOiBNYXA8c3RyaW5nLCBTZXQ8T25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjaz4+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+S7peS7jiByZXNlbmQoKSDmlrnms5XkuK3ojrflj5ZcbiAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnJlc2VuZCh7XG4gICAgICB0eXBlOiBcInNpZ251cFwiLFxuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSlcbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduVXBSZXNvbHZlKGNvZGUsIGRhdGEubWVzc2FnZUlkKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25VcFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25VcChwYXJhbXM6IGF1dGhNb2RlbHMuU2lnblVwUmVxdWVzdCk6IFByb21pc2U8U2lnblVwUmVzPiB7XG4gICAgaWYgKHBhcmFtcy5waG9uZV9udW1iZXIgfHwgcGFyYW1zLnZlcmlmaWNhdGlvbl9jb2RlIHx8IHBhcmFtcy52ZXJpZmljYXRpb25fdG9rZW4gfHwgcGFyYW1zLnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduVXAocGFyYW1zKVxuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpIGFzIGFueVxuICAgIH1cbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yaZW1haWzmiJZwaG9uZeW/heWhq+WFtuS4gFxuICAgICAgdGhpcy52YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zLCBbWydlbWFpbCddLCBbJ3Bob25lJ11dLCAnWW91IG11c3QgcHJvdmlkZSBlaXRoZXIgYW4gZW1haWwgb3IgcGhvbmUgbnVtYmVyJylcblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbihwYXJhbXMuZW1haWwgPyB7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSA6IHsgcGhvbmVfbnVtYmVyOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSwpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh7IHRva2VuLCBtZXNzYWdlSWQgPSB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCB9KTogUHJvbWlzZTxTaWduSW5SZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIC8vIOesrOS4ieatpe+8muW+heeUqOaIt+i+k+WFpeWujOmqjOivgeeggeS5i+WQju+8jOmqjOivgeefreS/oemqjOivgeeggVxuICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25faWQ6IG1lc3NhZ2VJZCB8fCB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgLy8g56ys5Zub5q2l77ya5rOo5YaM5bm255m75b2V5oiW55u05o6l55m75b2VXG4gICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+W3sue7j+WtmOWcqO+8jOebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uSW5mby5pc191c2VyKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduSW4oe1xuICAgICAgICAgICAgICAgICAgdXNlcm5hbWU6IHBhcmFtcy5lbWFpbCB8fCB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSksXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIOWmguaenOeUqOaIt+S4jeWtmOWcqO+8jOazqOWGjOeUqOaIt1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtcykpXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEuZW1haWxcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5waG9uZVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHtcbiAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAuLi4ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25vdXRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgYXV0aC5zaWduT3V0KCk7XG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHNpZ25PdXQocGFyYW1zPzogYXV0aE1vZGVscy5TaWdub3V0UmVxdWVzdCk6IFByb21pc2U8dm9pZCB8IGF1dGhNb2RlbHMuU2lnbm91dFJlcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB1c2VySW5mb0tleSB9ID0gdGhpcy5jYWNoZS5rZXlzXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduT3V0KHBhcmFtcylcbiAgICAgIGF3YWl0IHRoaXMuY2FjaGUucmVtb3ZlU3RvcmVBc3luYyh1c2VySW5mb0tleSlcbiAgICAgIHRoaXMuc2V0QWNjZXNzS2V5KClcblxuICAgICAgZXZlbnRCdXMuZmlyZShFVkVOVFMuTE9HSU5fU1RBVEVfQ0hBTkdFRCwgeyBldmVudFR5cGU6IExPR0lOX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdOX09VVCB9KVxuXG4gICAgICBldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9PVVQgfSlcblxuICAgICAgLy8gcmVz6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLnJlcywgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1vbmF1dGhzdGF0ZWNoYW5nZVxuICAgKiBSZWNlaXZlIGEgbm90aWZpY2F0aW9uIGV2ZXJ5IHRpbWUgYW4gYXV0aCBldmVudCBoYXBwZW5zLiBTYWZlIHRvIHVzZSB3aXRob3V0IGFuIGFzeW5jIGZ1bmN0aW9uIGFzIGNhbGxiYWNrLlxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGFwcC5hdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKChldmVudCwgc2Vzc2lvbikgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXZlbnQsIHNlc3Npb24pO1xuICAgICAgaWYgKGV2ZW50ID09PSBcIklOSVRJQUxfU0VTU0lPTlwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBpbml0aWFsIHNlc3Npb25cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiU0lHTkVEX0lOXCIpIHtcbiAgICAgICAgLy8gaGFuZGxlIHNpZ24gaW4gZXZlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiU0lHTkVEX09VVFwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBzaWduIG91dCBldmVudFxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJQQVNTV09SRF9SRUNPVkVSWVwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBwYXNzd29yZCByZWNvdmVyeSBldmVudFxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJUT0tFTl9SRUZSRVNIRURcIikge1xuICAgICAgICAvLyBoYW5kbGUgdG9rZW4gcmVmcmVzaGVkIGV2ZW50XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlVTRVJfVVBEQVRFRFwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSB1c2VyIHVwZGF0ZWQgZXZlbnRcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBjYWxsIHVuc3Vic2NyaWJlIHRvIHJlbW92ZSB0aGUgY2FsbGJhY2tcbiAgICBkYXRhLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHJldHVybnMgUHJvbWlzZTx7IGRhdGE6IHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfSwgZXJyb3I6IEVycm9yIHwgbnVsbCB9PlxuICAgKi9cbiAgb25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2s6IE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJTZXRVcCkge1xuICAgICAgdGhpcy5zZXR1cExpc3RlbmVycygpXG4gICAgICB0aGlzLmhhc0xpc3RlbmVyU2V0VXAgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoaWQsIG5ldyBTZXQoKSlcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbmVycy5nZXQoaWQpIS5hZGQoY2FsbGJhY2spXG5cbiAgICAvLyDov5Tlm54gU3Vic2NyaXB0aW9uIOWvueixoVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgIGlkLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmxpc3RlbmVycy5nZXQoaWQpXG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuICAgICAgICAgIGlmIChjYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGlkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogeyBzdWJzY3JpcHRpb24gfSxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhwYXNzd29yZFxuICAgKiBMb2cgaW4gYW4gZXhpc3RpbmcgdXNlciB3aXRoIGFuIGVtYWlsIGFuZCBwYXNzd29yZCBvciBwaG9uZSBhbmQgcGFzc3dvcmQgb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnNpZ25JbldpdGhQYXNzd29yZCh7XG4gICAgICB1c2VybmFtZTogXCJ4eHhcIixcbiAgICAgIHBhc3N3b3JkOiBcInh4eFwiLFxuICAgIH0pXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGFzc3dvcmQocGFyYW1zOiBTaWduSW5XaXRoUGFzc3dvcmRSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp1c2VybmFtZS9lbWFpbC9waG9uZeS4iemAieS4gO+8jHBhc3N3b3Jk5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbWyd1c2VybmFtZSddLCBbJ2VtYWlsJ10sIFsncGhvbmUnXV0sXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciB1c2VybmFtZSwgZW1haWwsIG9yIHBob25lJyxcbiAgICAgIClcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBwYXJhbXMudXNlcm5hbWUgfHwgcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCxcbiAgICAgICAgLi4uKHBhcmFtcy5pc19lbmNyeXB0ID8geyBpc0VuY3J5cHQ6IHRydWUsIHZlcnNpb246ICd2MicgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRoaWR0b2tlblxuICAgKiDnrKzkuInmlrnlubPlj7DnmbvlvZXjgILlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzkvJrmoLnmja7kupHlvIDlj5HlubPlj7At55m75b2V5pa55byP5Lit5a+55bqU6Lqr5Lu95rqQ55qE55m75b2V5qih5byP6YWN572u77yM5Yik5pat5piv5ZCm6Ieq5Yqo5rOo5YaMXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoSWRUb2tlbihwYXJhbXM6IFNpZ25JbldpdGhJZFRva2VuUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadG9rZW7lv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHRva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnVG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwYXJhbXMudG9rZW4sXG4gICAgICB9KVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG90cFxuICAgKiBMb2cgaW4gYSB1c2VyIHVzaW5nIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkuXG4gICAqIGxldCBzaWduUmVzb2x2ZSA9IG51bGw7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBwLmF1dGguc2lnbkluV2l0aE90cCh7XG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICB9KTtcblxuICAgIHNpZ25SZXNvbHZlID0gcmVzLmRhdGEudmVyaWZ5XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduUmVzb2x2ZShjb2RlKTtcblxuICAgIC8vIHJlcy5kYXRhLmNhbGxiYWNr5pSv5oyBIG1lc3NhZ2VJZCDlj4LmlbDnlKjkuo7ph43mlrDlj5HpgIHpqozor4HnoIHov5vooYzpqozor4HvvIxtZXNzYWdlSWQg5Y+v5Lul5LuOIHJlc2VuZCgpIOaWueazleS4reiOt+WPllxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVzZW5kKHtcbiAgICAgIHR5cGU6IFwic2lnbnVwXCIsXG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICB9KVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNpZ25VcFJlc29sdmUoY29kZSwgZGF0YS5tZXNzYWdlSWQpO1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluV2l0aE90cFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPdHAocGFyYW1zOiBTaWduSW5XaXRoT3RwUmVxKTogUHJvbWlzZTxTaWduSW5XaXRoT3RwUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0sKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHZlcmlmeU90cDogYXN5bmMgKHsgdG9rZW4sIG1lc3NhZ2VJZCA9IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkIH0pOiBQcm9taXNlPFNpZ25JblJlcz4gPT4gdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgZW1haWw6IHBhcmFtcy5lbWFpbCxcbiAgICAgICAgICAgIHBob25lOiBwYXJhbXMucGhvbmUsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqoznrKzkuInmlrnlubPlj7DmjojmnYPnmbvlvZXlm57osIPvvIzpnIDlhYjosIPnlKggc2lnbkluV2l0aE9BdXRoIOeUn+aIkOesrOS4ieaWueW5s+WPsOaOiOadgyBVcmnvvIzorr/pl67or6UgVXJpIOWQju+8jOS8mui3s+i9rOWIsOesrOS4ieaWueW5s+WPsOaOiOadg+mhtemdou+8jOaOiOadg+WujOaIkOWQjuWbnuiwg+WbnuadpeWGjeiwg+eUqOivpeaWueazle+8jOS4jeS8oOWPguaVsOWImeS7jiB1cmwgcXVlcnkg5ZKMIHNlc3Npb25TdG9yYWdlIOS4reiOt+WPllxuICAgKiAvLyAxLiDojrflj5bnrKzkuInmlrnlubPlj7DmjojmnYPpobXlnLDlnYBcbiAgICBjb25zdCB7IGRhdGEgfSA9IGFwcC5hdXRoLnNpZ25JbldpdGhPQXV0aCh7XG4gICAgICBwcm92aWRlcjogJ3N0cmluZydcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcmVkaXJlY3RUbzogJ2h0dHBzOi8vZXhhbXBsZS5jb20vY2FsbGJhY2snXG4gICAgICAgIHN0YXRlOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyAyLiDorr/pl651cmkg77yI5aaCIGxvY2F0aW9uLmhyZWYgPSB1cmnvvIlcblxuICAgIC8vIDMuIOagoemqjOesrOS4ieaWueW5s+WPsOaOiOadg+Wbnuiwg1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgudmVyaWZ5T0F1dGgoKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5T0F1dGgocGFyYW1zPzogVmVyaWZ5T0F1dGhSZXEpOiBQcm9taXNlPFNpZ25JblJlcyB8IExpbmtJZGVudGl0eVJlcz4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWbnuiwg+iHsyBwcm92aWRlcl9yZWRpcmVjdF91cmkg5Zyw5Z2A77yIdXJsIHF1ZXJ55Lit5pC65bimIOaOiOadg2NvZGXvvIxzdGF0ZeetieWPguaVsO+8ie+8jOatpOaXtuajgOafpSBzdGF0ZSDmmK/lkKbnrKblkIjpooTmnJ/vvIjlpoIg6Ieq5bex6K6+572u55qEIHd4X29wZW4pXG4gICAgICBjb25zdCBjb2RlID0gcGFyYW1zPy5jb2RlIHx8IHV0aWxzLmdldFF1ZXJ5KCdjb2RlJylcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zPy5zdGF0ZSB8fCB1dGlscy5nZXRRdWVyeSgnc3RhdGUnKVxuXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpjb2Rl5ZKMc3RhdGXlv4XloatcbiAgICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQ29kZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdTdGF0ZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSBnZXRCcm93c2VyU2Vzc2lvbihzdGF0ZSlcbiAgICAgIGRhdGEudHlwZSA9IGNhY2hlRGF0YT8udHlwZVxuXG4gICAgICBjb25zdCBwcm92aWRlciA9IHBhcmFtcz8ucHJvdmlkZXIgfHwgY2FjaGVEYXRhPy5wcm92aWRlciB8fCB1dGlscy5nZXRRdWVyeSgncHJvdmlkZXInKVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9KSB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXRl56ym5ZCI6aKE5pyf77yM5YiZ6I635Y+W6K+l5LiJ5pa55bmz5Y+wdG9rZW5cbiAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW46IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSwgLy8g5oyH5a6a5LiJ5pa55bmz5Y+w6Lez5Zue55qEIHVybCDlnLDlnYBcbiAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSwgLy8g56ys5LiJ5pa55bmz5Y+w6Lez6L2s5Zue6aG16Z2i5pe277yMdXJsIHBhcmFtIOS4reaQuuW4pueahCBjb2RlIOWPguaVsFxuICAgICAgfSlcblxuICAgICAgbGV0IHJlczogU2lnbkluUmVzIHwgTGlua0lkZW50aXR5UmVzXG5cbiAgICAgIGlmIChjYWNoZURhdGEudHlwZSA9PT0gT0FVVEhfVFlQRS5CSU5EX0lERU5USVRZKSB7XG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnRvQmluZElkZW50aXR5KHsgcHJvdmlkZXJfdG9rZW46IHRva2VuLCBwcm92aWRlciwgZmlyZUV2ZW50OiB0cnVlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDpgJrov4cgcHJvdmlkZXJfdG9rZW4g5LuF55m75b2V5oiW55m75b2V5bm25rOo5YaM77yI5LiO5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8jy3ouqvku73mupDnmbvlvZXmqKHlvI/phY3nva7mnInlhbPvvIlcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5zaWduSW5XaXRoSWRUb2tlbih7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5kYXRhID0geyAuLi5kYXRhLCAuLi5yZXMuZGF0YSB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2FsU2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbj8uc2VhcmNoKVxuICAgICAgbG9jYWxTZWFyY2guZGVsZXRlKCdjb2RlJylcbiAgICAgIGxvY2FsU2VhcmNoLmRlbGV0ZSgnc3RhdGUnKVxuICAgICAgYWRkVXJsU2VhcmNoKFxuICAgICAgICBjYWNoZURhdGE/LnNlYXJjaCA9PT0gdW5kZWZpbmVkID8gYD8ke2xvY2FsU2VhcmNoLnRvU3RyaW5nKCl9YCA6IGNhY2hlRGF0YT8uc2VhcmNoLFxuICAgICAgICBjYWNoZURhdGE/Lmhhc2ggfHwgbG9jYXRpb24uaGFzaCxcbiAgICAgIClcbiAgICAgIHJlbW92ZUJyb3dzZXJTZXNzaW9uKHN0YXRlKVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRob2F1dGhcbiAgICog55Sf5oiQ56ys5LiJ5pa55bmz5Y+w5o6I5p2DIFVyaSDvvIjlpoLlvq7kv6Hkuoznu7TnoIHmiavnoIHmjojmnYPnvZHpobXvvIlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25Jbk9BdXRoUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE9BdXRoKHBhcmFtczogU2lnbkluV2l0aE9BdXRoUmVxKTogUHJvbWlzZTxTaWduSW5PQXV0aFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGhyZWYgPSBwYXJhbXMub3B0aW9ucz8ucmVkaXJlY3RUbyB8fCBsb2NhdGlvbi5ocmVmXG5cbiAgICAgIGNvbnN0IHVybE9iamVjdCA9IG5ldyBVUkwoaHJlZilcblxuICAgICAgY29uc3QgcHJvdmlkZXJfcmVkaXJlY3RfdXJpID0gdXJsT2JqZWN0Lm9yaWdpbiArIHVybE9iamVjdC5wYXRobmFtZVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IHBhcmFtcy5vcHRpb25zPy5zdGF0ZSB8fCBgcHJkLSR7cGFyYW1zLnByb3ZpZGVyfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG4gICAgICAgIC5zbGljZSgyKX1gXG5cbiAgICAgIGNvbnN0IHsgdXJpIH0gPSBhd2FpdCB0aGlzLmdlblByb3ZpZGVyUmVkaXJlY3RVcmkoe1xuICAgICAgICBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBwcm92aWRlcl9yZWRpcmVjdF91cmksXG4gICAgICAgIHN0YXRlLFxuICAgICAgfSlcblxuICAgICAgLy8g5a+5IFVSTCDov5vooYzop6PnoIFcbiAgICAgIGNvbnN0IGRlY29kZWRVcmkgPSBkZWNvZGVVUklDb21wb25lbnQodXJpKVxuXG4gICAgICAvLyDlkIjlubbpop3lpJbnmoTmn6Xor6Llj4LmlbBcbiAgICAgIGxldCBmaW5hbFVyaSA9IGRlY29kZWRVcmlcblxuICAgICAgaWYgKHBhcmFtcy5vcHRpb25zPy5xdWVyeVBhcmFtcykge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlY29kZWRVcmkpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcy5vcHRpb25zLnF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBmaW5hbFVyaSA9IHVybC50b1N0cmluZygpXG4gICAgICB9XG5cbiAgICAgIHNhdmVUb0Jyb3dzZXJTZXNzaW9uKHN0YXRlLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIHNlYXJjaDogdXJsT2JqZWN0LnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgICAgIHR5cGU6IHBhcmFtcy5vcHRpb25zPy50eXBlIHx8IE9BVVRIX1RZUEUuU0lHTl9JTixcbiAgICAgIH0pXG5cbiAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhcGFyYW1zLm9wdGlvbnM/LnNraXBCcm93c2VyUmVkaXJlY3QpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihmaW5hbFVyaSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1cmw6IGZpbmFsVXJpLCBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhzc29cbiAgYXN5bmMgc2lnbkluV2l0aFNTTygpIHtcbiAgICAvL1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGh3ZWIzXG4gIGFzeW5jIHNpZ25JbldpdGhXZWIzKCkge1xuICAgIC8vXG4gIH1cblxuICAvLyBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0Y2xhaW1zXG4gIGFzeW5jIGdldENsYWltcygpOiBQcm9taXNlPEdldENsYWltc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuIH0gPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgIGNvbnN0IHBhcnNlZFRva2VuID0gd2VhcHBKd3REZWNvZGVBbGwoYWNjZXNzVG9rZW4pXG4gICAgICByZXR1cm4geyBkYXRhOiBwYXJzZWRUb2tlbiwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlc2V0cGFzc3dvcmRmb3JlbWFpbFxuICAgKiDpgJrov4cgZW1haWwg5oiW5omL5py65Y+36YeN572u5a+G56CBXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVzZXRQYXNzd29yZEZvckVtYWlsKFwieHh4QHh4LmNvbVwiKTtcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZXNldFBhc3N3b3JkRm9yRW1haWwoXCIxMzgwMDEzODAwMFwiKTtcblxuICAgICBhd2FpdCBkYXRhLnVwZGF0ZVVzZXIoY29kZSwgbmV3UGFzc1dvcmQpO1xuICAgKlxuICAgKiBAcGFyYW0gZW1haWxPclBob25lIOmCrueuseaIluaJi+acuuWPt1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JFbWFpbChcbiAgICBlbWFpbE9yUGhvbmU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZWRpcmVjdFRvPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZEZvckVtYWlsUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWlsT3JQaG9uZeW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgeyBlbWFpbE9yUGhvbmUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVtYWlsT3JQaG9uZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0VtYWlsIG9yIHBob25lIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHJlZGlyZWN0VG8gfSA9IG9wdGlvbnMgfHwge31cblxuICAgICAgLy8g5Yik5pat5piv6YKu566x6L+Y5piv5omL5py65Y+3XG4gICAgICBjb25zdCBpc0VtYWlsID0gZW1haWxPclBob25lLmluY2x1ZGVzKCdAJylcbiAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG5cbiAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IGVtYWlsT3JQaG9uZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKGVtYWlsT3JQaG9uZSlcbiAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g56ys5LiJ5q2l77ya5b6F55So5oi36L6T5YWl5a6M6aqM6K+B56CB5LmL5ZCO77yM6aqM6K+B6aqM6K+B56CBXG4gICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmU6ICFpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5ld19wYXNzd29yZDogYXR0cmlidXRlcy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlBBU1NXT1JEX1JFQ09WRVJZIH0pXG5cbiAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5zaWduSW5XaXRoUGFzc3dvcmQoe1xuICAgICAgICAgICAgICAgIGVtYWlsOiBpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIHBob25lOiAhaXNFbWFpbCA/IGVtYWlsT3JQaG9uZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogYXR0cmlidXRlcy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICBpZiAocmVkaXJlY3RUbyAmJiBpc0Jyb3dzZXIoKSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24ocmVkaXJlY3RUbylcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiByZXNcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6L+H5pen5a+G56CB6YeN572u5a+G56CBXG4gICAqIEBwYXJhbSBuZXdfcGFzc3dvcmRcbiAgICogQHBhcmFtIG9sZF9wYXNzd29yZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgcmVzZXRQYXNzd29yZEZvck9sZChwYXJhbXM6IFJlc2V0UGFzc3dvcmRGb3JPbGRSZXEpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkudXBkYXRlUGFzc3dvcmRCeU9sZCh7XG4gICAgICAgIG9sZF9wYXNzd29yZDogcGFyYW1zLm9sZF9wYXNzd29yZCxcbiAgICAgICAgbmV3X3Bhc3N3b3JkOiBwYXJhbXMubmV3X3Bhc3N3b3JkLFxuICAgICAgfSlcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdmVyaWZ5b3RwXG4gICAqIExvZyBpbiBhIHVzZXIgZ2l2ZW4gYSBVc2VyIHN1cHBsaWVkIE9UUCBhbmQgdmVyaWZpY2F0aW9uSWQgcmVjZWl2ZWQgdGhyb3VnaCBtb2JpbGUgb3IgZW1haWwuXG4gICAqIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCBhcHAuYXV0aC5nZXRWZXJpZmljYXRpb24oe1xuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgYXBwLmF1dGgudmVyaWZ5T3RwKHtcbiAgICAgIHR5cGU6IFwic21zXCIsXG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICAgIHRva2VuOiBcInh4eHh4eFwiLFxuICAgICAgdmVyaWZpY2F0aW9uSW5mbyxcbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5T3RwKHBhcmFtczogVmVyaWZ5T3RwUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyB0eXBlIH0gPSBwYXJhbXNcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mnRva2Vu5ZKMdmVyaWZpY2F0aW9uSW5mb+W/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgdG9rZW46IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdUb2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgICAgbWVzc2FnZUlkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnbWVzc2FnZUlkIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgfSlcblxuICAgICAgaWYgKFsncGhvbmVfY2hhbmdlJywgJ2VtYWlsX2NoYW5nZSddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICB2ZXJpZmljYXRpb25faWQ6IHBhcmFtcy5tZXNzYWdlSWQsXG4gICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHBhcmFtcy50b2tlbixcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2lnbkluV2l0aFVzZXJuYW1lKHtcbiAgICAgICAgICB2ZXJpZmljYXRpb25JbmZvOiB7IHZlcmlmaWNhdGlvbl9pZDogcGFyYW1zLm1lc3NhZ2VJZCwgaXNfdXNlcjogdHJ1ZSB9LFxuICAgICAgICAgIHZlcmlmaWNhdGlvbkNvZGU6IHBhcmFtcy50b2tlbixcbiAgICAgICAgICB1c2VybmFtZTogcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSB8fCAnJyxcbiAgICAgICAgICBsb2dpblR5cGU6IHBhcmFtcy5lbWFpbCA/ICdlbWFpbCcgOiAncGhvbmUnLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXRTZXNzaW9uXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24sIHJlZnJlc2hpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICAgKiBUaGUgc2Vzc2lvbiByZXR1cm5lZCBjYW4gYmUgbnVsbCBpZiB0aGUgc2Vzc2lvbiBpcyBub3QgZGV0ZWN0ZWQgd2hpY2ggY2FuIGhhcHBlbiBpbiB0aGUgZXZlbnQgYSB1c2VyIGlzIG5vdCBzaWduZWQtaW4gb3IgaGFzIGxvZ2dlZCBvdXQuXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGguZ2V0U2Vzc2lvbigpXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgZ2V0U2Vzc2lvbigpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LmdldENyZWRlbnRpYWxzKClcblxuICAgICAgaWYgKCFjcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5zY29wZSA9PT0gJ2FjY2Vzc0tleScpIHtcbiAgICAgICAgcmV0dXJuIHsgZGF0YTogeyBzZXNzaW9uOiBudWxsIH0sIGVycm9yOiBudWxsIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHVzZXIgfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHNlc3Npb246IHsgLi4uY3JlZGVudGlhbHMsIHVzZXIgfSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtcmVmcmVzaHNlc3Npb25cbiAgICog5peg6K666L+H5pyf54q25oCB5aaC5L2V77yM6YO96L+U5Zue5LiA5Liq5paw55qE5Lya6K+d44CC5o6l5Y+X5LiA5Liq5Y+v6YCJ55qEcmVmcmVzaF90b2tlbuOAguWmguaenOacquS8oOWFpeW9k+WJjeS8muivne+8jOWImXJlZnJlc2hTZXNzaW9uKCnlsIblsJ3or5Xku45nZXRTZXNzaW9uKCnkuK3mo4DntKLlroPjgILlpoLmnpzlvZPliY3kvJror53nmoTliLfmlrDku6TniYzml6DmlYjvvIzliJnkvJrmipvlh7rkuIDkuKrplJnor6/jgIJcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZWZyZXNoU2Vzc2lvbigpXG4gICAqIEBwYXJhbSByZWZyZXNoX3Rva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaFNlc3Npb24ocmVmcmVzaF90b2tlbj86IHN0cmluZyk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gICAgICBjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuID0gcmVmcmVzaF90b2tlbiB8fCBjcmVkZW50aWFscy5yZWZyZXNoX3Rva2VuXG4gICAgICBjb25zdCBuZXdUb2tlbnMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2Uub2F1dGgyY2xpZW50LnJlZnJlc2hUb2tlbihjcmVkZW50aWFscylcbiAgICAgIGNvbnN0IHsgZGF0YTogeyB1c2VyIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyLCBzZXNzaW9uOiB7IC4uLm5ld1Rva2VucywgdXNlciB9IH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1nZXR1c2VyXG4gICAqIOWmguaenOWtmOWcqOeOsOacieS8muivne+8jOWImeiOt+WPluW9k+WJjeeUqOaIt+ivpue7huS/oeaBr+OAguatpOaWueazleS8muWQkeacjeWKoeWZqOWPkei1t+e9kee7nOivt+axgu+8jOWboOatpOi/lOWbnueahOWAvOaYr+ecn+WunueahO+8jOWPr+eUqOS6juWItuWumuaOiOadg+inhOWImeOAglxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmdldFVzZXIoKVxuICAgKiBAcmV0dXJucyBQcm9taXNlPEdldFVzZXJSZXM+XG4gICAqL1xuICBhc3luYyBnZXRVc2VyKCk6IFByb21pc2U8R2V0VXNlclJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyID0gdGhpcy5jb252ZXJ0VG9Vc2VyKGF3YWl0IHRoaXMuZ2V0VXNlckluZm8oKSlcbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDliLfmlrDnlKjmiLfkv6Hmga9cbiAgICogQHJldHVybnMgUHJvbWlzZTxDb21tb25SZXM+XG4gICAqL1xuICBhc3luYyByZWZyZXNoVXNlcigpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmN1cnJlbnRVc2VyLnJlZnJlc2goKVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtdXBkYXRldXNlclxuICAgKiDmm7TmlrDnlKjmiLfkv6Hmga9cbiAgICogLSDkuI3mlK/mjIHmm7TmlrDlr4bnoIHvvIzmm7TmlrDlr4bnoIHor7fkvb/nlKggcmVzZXRQYXNzd29yZEZvckVtYWlsIOaIliByZWF1dGhlbnRpY2F0ZVxuICAgKiAtIOWmguaenOabtOaWsCBlbWFpbCDmiJYgcGhvbmXvvIzpnIDopoHlhYjlj5HpgIHpqozor4HnoIHvvIznhLblkI7osIPnlKjov5Tlm57nmoQgdmVyaWZ5T3RwIOWbnuiwg+i/m+ihjOmqjOivgVxuICAgKlxuICAgKiAvLyDmm7TmlrDkuI3pnIDopoHpqozor4HnmoTlrZfmrrVcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC51cGRhdGVVc2VyKHtcbiAgICAgIHVzZXJuYW1lOiBcInh4eFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwieHh4XCIsXG4gICAgICBhdmF0YXJfdXJsOiBcInh4eFwiLFxuICAgICAgbmlja25hbWU6IFwieHh4XCIsXG4gICAgICBnZW5kZXI6ICdNQUxFJ1xuICAgIH0pXG4gICAqXG4gICAqIC8vIOabtOaWsCBlbWFpbCDmiJYgcGhvbmXvvIjpnIDopoHpqozor4HvvIlcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC51cGRhdGVVc2VyKHtcbiAgICAgIGVtYWlsOiBcIm5ld0BleGFtcGxlLmNvbVwiXG4gICAgfSlcbiAgICogLy8g6LCD55SoIHZlcmlmeU90cCDlm57osIPpqozor4FcbiAgICogYXdhaXQgZGF0YS52ZXJpZnlPdHAoeyBlbWFpbDogXCJuZXdAZXhhbXBsZS5jb21cIiwgdG9rZW46IFwiMTIzNDU2XCIgfSlcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPEdldFVzZXJSZXMgfCBVcGRhdGVVc2VyV2l0aFZlcmlmaWNhdGlvblJlcz5cbiAgICovXG4gIGFzeW5jIHVwZGF0ZVVzZXIocGFyYW1zOiBVcGRhdGVVc2VyUmVxKTogUHJvbWlzZTxHZXRVc2VyUmVzIHwgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77ya6Iez5bCR5pyJ5LiA5Liq5pu05paw5a2X5q616KKr5o+Q5L6bXG4gICAgICBjb25zdCBoYXNWYWx1ZSA9IE9iamVjdC5rZXlzKHBhcmFtcykuc29tZShrZXkgPT4gcGFyYW1zW2tleV0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXNba2V5XSAhPT0gbnVsbCAmJiBwYXJhbXNba2V5XSAhPT0gJycsKVxuICAgICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ0F0IGxlYXN0IG9uZSBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkIGZvciB1cGRhdGUnIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgZW1haWwsIHBob25lLCAuLi5yZXN0UGFyYW1zIH0gPSBwYXJhbXNcblxuICAgICAgLy8g5qOA5p+l5piv5ZCm6ZyA6KaB5pu05pawIGVtYWlsIOaIliBwaG9uZVxuICAgICAgY29uc3QgbmVlZHNFbWFpbFZlcmlmaWNhdGlvbiA9IGVtYWlsICE9PSB1bmRlZmluZWRcbiAgICAgIGNvbnN0IG5lZWRzUGhvbmVWZXJpZmljYXRpb24gPSBwaG9uZSAhPT0gdW5kZWZpbmVkXG5cbiAgICAgIGxldCBleHRyYVJlcyA9IHt9XG5cbiAgICAgIGlmIChuZWVkc0VtYWlsVmVyaWZpY2F0aW9uIHx8IG5lZWRzUGhvbmVWZXJpZmljYXRpb24pIHtcbiAgICAgICAgLy8g6ZyA6KaB5Y+R6YCB6aqM6K+B56CBXG4gICAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG4gICAgICAgIGxldCB2ZXJpZmljYXRpb25UeXBlOiAnZW1haWxfY2hhbmdlJyB8ICdwaG9uZV9jaGFuZ2UnXG5cbiAgICAgICAgaWYgKG5lZWRzRW1haWxWZXJpZmljYXRpb24pIHtcbiAgICAgICAgICB2ZXJpZmljYXRpb25QYXJhbXMgPSB7IGVtYWlsOiBwYXJhbXMuZW1haWwgfVxuICAgICAgICAgIHZlcmlmaWNhdGlvblR5cGUgPSAnZW1haWxfY2hhbmdlJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIOato+inhOWMluaJi+acuuWPt1xuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFBob25lID0gdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpXG4gICAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlID0gJ3Bob25lX2NoYW5nZSdcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOWPkemAgemqjOivgeeggVxuICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24odmVyaWZpY2F0aW9uUGFyYW1zKVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlc3RQYXJhbXMpLmxlbmd0aCA+IDAgJiYgYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHJlc3RQYXJhbXMpXG5cbiAgICAgICAgZXh0cmFSZXMgPSB7XG4gICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICB2ZXJpZnlPdHA6IGFzeW5jICh2ZXJpZnlQYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lPzogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0pOiBQcm9taXNlPEdldFVzZXJSZXM+ID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICh2ZXJpZnlQYXJhbXMuZW1haWwgJiYgcGFyYW1zLmVtYWlsID09PSB2ZXJpZnlQYXJhbXMuZW1haWwpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZW1haWxfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IGVtYWlsOiBwYXJhbXMuZW1haWwgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2ZXJpZnlQYXJhbXMucGhvbmUgJiYgcGFyYW1zLnBob25lID09PSB2ZXJpZnlQYXJhbXMucGhvbmUpIHtcbiAgICAgICAgICAgICAgICAvLyDpqozor4HnoIHpqozor4FcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAncGhvbmVfY2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHBob25lOiBwYXJhbXMucGhvbmUsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyh7IHBob25lOiB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSkgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnZlcmlmeU90cCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB2ZXJpZmljYXRpb25UeXBlLFxuICAgICAgICAgICAgICAgICAgZW1haWw6IG5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMuZW1haWwgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogIW5lZWRzRW1haWxWZXJpZmljYXRpb24gPyBwYXJhbXMucGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UGFyYW1zLnRva2VuLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZUlkOiB2ZXJpZmljYXRpb25JbmZvLnZlcmlmaWNhdGlvbl9pZCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC8vIOmqjOivgeaIkOWKn+WQjuabtOaWsOeUqOaIt+S/oeaBr1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyhwYXJhbXMpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgZGF0YTogeyB1c2VyIH0sXG4gICAgICAgICAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuICAgICAgICAgICAgICBldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlVTRVJfVVBEQVRFRCB9KVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDkuI3pnIDopoHpqozor4HvvIznm7TmjqXmm7TmlrBcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VyQmFzaWNJbmZvKHBhcmFtcylcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyB1c2VyIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKClcbiAgICAgIGV2ZW50QnVzLmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgLi4uZXh0cmFSZXMgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldHVzZXJpZGVudGl0aWVzXG4gICAqIOiOt+WPluaJgOaciei6q+S7vea6kFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmdldFVzZXJJZGVudGl0aWVzKClcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0aWVzKCk6IFByb21pc2U8R2V0VXNlcklkZW50aXRpZXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyBpZGVudGl0aWVzOiBwcm92aWRlcnM/LmRhdGE/LmZpbHRlcih2ID0+ICEhdi5iaW5kKSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtbGlua2lkZW50aXR5XG4gICAqIOe7keWumui6q+S7vea6kOWIsOW9k+WJjeeUqOaIt++8jOWmguaenOW3suacieeUqOaIt+e7keWumuivpei6q+S7vea6kO+8jOS8muaKm+WHuumUmeivr1xuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmxpbmtJZGVudGl0eSh7XG4gICAgICBwcm92aWRlcjogJ3N0cmluZydcbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8TGlua0lkZW50aXR5UmVzPlxuICAgKi9cbiAgYXN5bmMgbGlua0lkZW50aXR5KHBhcmFtczogTGlua0lkZW50aXR5UmVxKTogUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhPQXV0aCh7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFksXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVubGlua2lkZW50aXR5XG4gICAqIOino+e7kei6q+S7vea6kFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnVubGlua0lkZW50aXR5KHtcbiAgICAgIHByb3ZpZGVyOiBcInh4eFwiXG4gICAgfSlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPENvbW1vblJlcz5cbiAgICovXG4gIGFzeW5jIHVubGlua0lkZW50aXR5KHBhcmFtczogVW5saW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVuYmluZFByb3ZpZGVyKHsgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlciB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlYXV0aGVudGljYXRpb25cbiAgICog6YeN5paw6K6k6K+B44CC6YCa6L+H5Y+R6YCB6aqM6K+B56CB5p2l6YeN5paw6K6k6K+B55So5oi36Lqr5Lu977yM5pSv5oyB5pu05paw5a+G56CBXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVhdXRoZW50aWNhdGUoKVxuXG4gICAgIGF3YWl0IGRhdGEudXBkYXRlVXNlcihjb2RlLCBuZXdQYXNzV29yZClcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz5cbiAgICovXG4gIGFzeW5jIHJlYXV0aGVudGljYXRlKCk6IFByb21pc2U8UmVhdXRoZW50aWNhdGVSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZSh1c2VyLCBbWydlbWFpbCcsICdwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG4gICAgICBjb25zdCB1c2VySW5mbyA9IHVzZXIuZW1haWwgPyB7IGVtYWlsOiB1c2VyLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZSh1c2VyLnBob25lKSB9XG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24odXNlckluZm8pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICAvLyDnrKzkuInmraXvvJrlvoXnlKjmiLfovpPlhaXlrozpqozor4HnoIHkuYvlkI7vvIzpqozor4Hpqozor4HnoIFcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy8g56ys5Zub5q2l77ya6I635Y+WIHN1ZG9fdG9rZW5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWRvUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc3Vkbyh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0UGFzc3dvcmQoe1xuICAgICAgICAgICAgICAgICAgbmV3X3Bhc3N3b3JkOiBhdHRyaWJ1dGVzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgc3Vkb190b2tlbjogc3Vkb1Jlcy5zdWRvX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uSW5mbyxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgICAgICAuLi51c2VySW5mbyxcbiAgICAgICAgICAgICAgICAgIGxvZ2luVHlwZTogdXNlckluZm8uZW1haWwgPyAnZW1haWwnIDogJ3Bob25lJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlc2VuZFxuICAgKiDph43mlrDlj5HpgIHpqozor4HnoIFcbiAgICogLSDlkJHnlKjmiLfph43mlrDlj5HpgIHpgq7nrrHjgIHmiYvmnLrlj7fms6jlhozmiJbnmbvlvZXnmoTpqozor4HnoIHjgIJcbiAgICogLSDlj6/ku6XpgJrov4flho3mrKHosIPnlKggc2lnbkluV2l0aE90cCgpIOaWueazleadpemHjeaWsOWPkemAgemqjOivgeeggeeZu+W9leOAglxuICAgKiAtIOWPr+S7pemAmui/h+WGjeasoeiwg+eUqCBzaWduVXAoKSDmlrnms5XmnaXph43mlrDlj5HpgIHpqozor4HnoIHms6jlhozjgIJcbiAgICogLSDmraTmlrnms5Xku4XlnKjosIPnlKggc2lnbkluV2l0aE90cCgpIOaIliBzaWduVXAoKSDlkI7vvIzph43mlrDlj5HpgIHpqozor4HnoIHvvIzmlLbliLDpqozor4HnoIHlkI7lho3nu6fnu63osIPnlKggc2lnbkluV2l0aE90cCgpIOaIliBzaWduVXAoKSDnmoRjYWxsYmFja+WPguaVsO+8jOWwhm1lc3NhZ2VJZOS8oOWFpWNhbGxiYWNr44CCXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcC5hdXRoLnNpZ25JbldpdGhPdHAoeyBwaG9uZTogXCJ4eHhcIiB9KTtcblxuICAgIGxldCBzaWduUmVzb2x2ZSA9IHJlc3VsdC5kYXRhLnZlcmlmeVxuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZXNlbmQoe1xuICAgICAgdHlwZTogXCJzaWdudXBcIixcbiAgICAgIHBob25lOiBcInh4eFwiLFxuICAgIH0pXG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduUmVzb2x2ZShjb2RlLCBkYXRhLm1lc3NhZ2VJZCk7XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZXNlbmRSZXM+XG4gICAqL1xuICBhc3luYyByZXNlbmQocGFyYW1zOiBSZXNlbmRSZXEpOiBQcm9taXNlPFJlc2VuZFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJplbWFpbOaIlnBob25l5b+F5aGr5YW25LiAXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShwYXJhbXMsIFtbJ2VtYWlsJ10sIFsncGhvbmUnXV0sICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhbiBlbWFpbCBvciBwaG9uZSBudW1iZXInKVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXJhbXMudHlwZSA9PT0gJ3NpZ251cCcgPyAnQU5ZJyA6ICdVU0VSJ1xuICAgICAgY29uc3QgZGF0YTogeyBlbWFpbD86IHN0cmluZzsgcGhvbmVfbnVtYmVyPzogc3RyaW5nOyB0YXJnZXQ6ICdVU0VSJyB8ICdBTlknIH0gPSB7IHRhcmdldCB9XG4gICAgICBpZiAoJ2VtYWlsJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgZGF0YS5lbWFpbCA9IHBhcmFtcy5lbWFpbFxuICAgICAgfVxuXG4gICAgICBpZiAoJ3Bob25lJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgZGF0YS5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSlcbiAgICAgIH1cblxuICAgICAgLy8g6YeN5paw5Y+R6YCB6aqM6K+B56CBXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSWQgfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFZlcmlmaWNhdGlvbihkYXRhKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSWQgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNldHNlc3Npb25cbiAgICog5L2/55SoYWNjZXNzX3Rva2Vu5ZKMcmVmcmVzaF90b2tlbuadpeiuvue9ruS8muivnVxuICAgKiDlpoLmnpzmiJDlip/vvIzliJnkvJrop6blj5HkuIDkuKpTSUdORURfSU7kuovku7ZcbiAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgYXBwLmF1dGguc2V0U2Vzc2lvbih7XG4gICAgICBhY2Nlc3NfdG9rZW4sXG4gICAgICByZWZyZXNoX3Rva2VuXG4gICAgfSlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNldFNlc3Npb24ocGFyYW1zOiBTZXRTZXNzaW9uUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgYWNjZXNzX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnQWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICByZWZyZXNoX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKHBhcmFtcywgeyB0aHJvd09uRXJyb3I6IHRydWUgfSlcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICBldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9JTiB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1leGNoYW5nZWNvZGVmb3JzZXNzaW9uXG4gIGFzeW5jIGV4Y2hhbmdlQ29kZUZvclNlc3Npb24oKSB7XG4gICAgLy9cbiAgfVxuXG4gIC8qKlxuICAgKiDliKDpmaTlvZPliY3nlKjmiLdcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgZGVsZXRlVXNlcihwYXJhbXM6IERlbGV0ZU1lUmVxKTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcGFzc3dvcmQ6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQYXNzd29yZCBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IHsgc3Vkb190b2tlbiB9ID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc3VkbyhwYXJhbXMpXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmRlbGV0ZU1lKHsgc3Vkb190b2tlbiB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Lez6L2s57O757uf6buY6K6k55m75b2V6aG1XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGF1dGhNb2RlbHMuVG9EZWZhdWx0TG9naW5QYWdlPn1cbiAgICogQG1lbWJlcm9mIEF1dGhcbiAgICovXG4gIGFzeW5jIHRvRGVmYXVsdExvZ2luUGFnZShwYXJhbXM6IGF1dGhNb2RlbHMuVG9EZWZhdWx0TG9naW5QYWdlID0ge30pOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWdWZXJzaW9uID0gcGFyYW1zLmNvbmZpZ192ZXJzaW9uIHx8ICdlbnYnXG4gICAgICBjb25zdCBxdWVyeSA9IE9iamVjdC5rZXlzKHBhcmFtcy5xdWVyeSB8fCB7fSlcbiAgICAgICAgLm1hcChrZXkgPT4gYCR7a2V5fT0ke3BhcmFtcy5xdWVyeVtrZXldfWApXG4gICAgICAgIC5qb2luKCcmJylcblxuICAgICAgaWYgKGFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgICB3eC5uYXZpZ2F0ZVRvKHsgdXJsOiBgL3BhY2thZ2VzLyR3ZF9zeXN0ZW0vcGFnZXMvbG9naW4vaW5kZXgke3F1ZXJ5ID8gYD8ke3F1ZXJ5fWAgOiAnJ31gIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZWRpcmVjdFVyaSA9IHBhcmFtcy5yZWRpcmVjdF91cmkgfHwgd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTChyZWRpcmVjdFVyaSlcbiAgICAgICAgY29uc3QgbG9naW5QYWdlID0gYCR7dXJsT2JqLm9yaWdpbn0vX19hdXRoLz9hcHBfaWQ9JHtwYXJhbXMuYXBwX2lkIHx8ICcnfSZlbnZfaWQ9JHt0aGlzLmNvbmZpZy5lbnZ9JmNsaWVudF9pZD0ke1xuICAgICAgICAgIHRoaXMuY29uZmlnLmNsaWVudElkIHx8IHRoaXMuY29uZmlnLmVudlxuICAgICAgICB9JmNvbmZpZ192ZXJzaW9uPSR7Y29uZmlnVmVyc2lvbn0mcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHJlZGlyZWN0VXJpKX0ke3F1ZXJ5ID8gYCYke3F1ZXJ5fWAgOiAnJ31gXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gbG9naW5QYWdlXG4gICAgICB9XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6Ieq5a6a5LmJ55m75b2VXG4gICAqIEBwYXJhbSBnZXRUaWNrRm4gKCkgPT4gUHJvbWlzZTxzdHJpbmc+LCDojrflj5boh6rlrprkuYnnmbvlvZUgdGlja2V0IOeahOWHveaVsFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aEN1c3RvbVRpY2tldChnZXRUaWNrRm4/OiBhdXRoTW9kZWxzLkdldEN1c3RvbVNpZ25UaWNrZXRGbik6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgaWYgKGdldFRpY2tGbikge1xuICAgICAgdGhpcy5zZXRDdXN0b21TaWduRnVuYyhnZXRUaWNrRm4pXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhDdXN0b21UaWNrZXQoKVxuICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlsI/nqIvluo9vcGVuSWTpnZnpu5jnmbvlvZVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPcGVuSWQoeyB1c2VXeENsb3VkID0gdHJ1ZSB9ID0ge30pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmICghYWRhcHRlckZvcld4TXAuaXNNYXRjaCgpKSB7XG4gICAgICB0aHJvdyBFcnJvcignd3ggYXBpIHVuZGVmaW5lZCcpXG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG5cbiAgICBjb25zdCBtYWluRnVuYyA9IGFzeW5jIChjb2RlKSA9PiB7XG4gICAgICBsZXQgcmVzdWx0OiBhdXRoTW9kZWxzLkdyYW50UHJvdmlkZXJUb2tlblJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICAgICBsZXQgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbihcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlcl9pZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIHByb3ZpZGVyX2NvZGU6IGNvZGUsXG4gICAgICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAnb3Blbl9pZCcsXG4gICAgICAgICAgICAgIGFwcGlkOiB3eEluZm8/LmFwcElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKHJlc3VsdCBhcyBhbnkpPy5lcnJvcl9jb2RlIHx8ICFyZXN1bHQucHJvdmlkZXJfdG9rZW4pIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHRcbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKFxuICAgICAgICAgIHsgcHJvdmlkZXJfdG9rZW46IHJlc3VsdC5wcm92aWRlcl90b2tlbiB9LFxuICAgICAgICAgIHVzZVd4Q2xvdWQsXG4gICAgICAgIClcblxuICAgICAgICBpZiAoKGNyZWRlbnRpYWxzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgICB0aHJvdyBjcmVkZW50aWFsc1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5zZXRDcmVkZW50aWFscyhjcmVkZW50aWFscyBhcyBDcmVkZW50aWFscylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB3eC5sb2dpbih7XG4gICAgICAgICAgc3VjY2VzczogYXN5bmMgKHJlczogeyBjb2RlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgbWFpbkZ1bmMocmVzLmNvZGUpXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSlcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGZhaWw6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IocmVzPy5lcnJNc2cpXG4gICAgICAgICAgICA7KGVycm9yIGFzIGFueSkuY29kZSA9IHJlcz8uZXJybm9cbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDlsI/nqIvluo/miYvmnLrlj7fmjojmnYPnmbvlvZXvvIznm67liY3lj6rmlK/mjIHlhajmiZjnrqHmiYvmnLrlj7fmjojmnYPnmbvlvZVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhQaG9uZUF1dGgoeyBwaG9uZUNvZGUgPSAnJyB9KTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ3d4IGFwaSB1bmRlZmluZWQnIH0pIH1cbiAgICB9XG4gICAgY29uc3Qgd3hJbmZvID0gd3guZ2V0QWNjb3VudEluZm9TeW5jKCkubWluaVByb2dyYW1cbiAgICBjb25zdCBwcm92aWRlckluZm8gPSB7XG4gICAgICBwcm92aWRlcl9wYXJhbXM6IHsgcHJvdmlkZXJfY29kZV90eXBlOiAncGhvbmUnIH0sXG4gICAgICBwcm92aWRlcl9pZDogd3hJbmZvLmFwcElkLFxuICAgIH1cblxuICAgIGNvbnN0IHsgY29kZSB9ID0gYXdhaXQgd3gubG9naW4oKVxuICAgIDsocHJvdmlkZXJJbmZvIGFzIGFueSkucHJvdmlkZXJfY29kZSA9IGNvZGVcblxuICAgIHRyeSB7XG4gICAgICBsZXQgcHJvdmlkZXJUb2tlbiA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdyYW50UHJvdmlkZXJUb2tlbihwcm92aWRlckluZm8pXG4gICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgICAgIH1cblxuICAgICAgcHJvdmlkZXJUb2tlbiA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnBhdGNoUHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwcm92aWRlclRva2VuLnByb3ZpZGVyX3Rva2VuLFxuICAgICAgICBwcm92aWRlcl9pZDogd3hJbmZvLmFwcElkLFxuICAgICAgICBwcm92aWRlcl9wYXJhbXM6IHtcbiAgICAgICAgICBjb2RlOiBwaG9uZUNvZGUsXG4gICAgICAgICAgcHJvdmlkZXJfY29kZV90eXBlOiAncGhvbmUnLFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIGlmIChwcm92aWRlclRva2VuLmVycm9yX2NvZGUpIHtcbiAgICAgICAgdGhyb3cgcHJvdmlkZXJUb2tlblxuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduSW5SZXMgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoUHJvdmlkZXIoe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbi5wcm92aWRlcl90b2tlbixcbiAgICAgIH0pXG5cbiAgICAgIGlmICgoc2lnbkluUmVzIGFzIGFueSk/LmVycm9yX2NvZGUpIHtcbiAgICAgICAgdGhyb3cgc2lnbkluUmVzXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cblxuICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRQaG9uZShwaG9uZTogc3RyaW5nKSB7XG4gICAgaWYgKCEvXFxzKy8udGVzdChwaG9uZSkgJiYgL15cXCtcXGR7MSwzfVxcZCsvLnRlc3QocGhvbmUpKSB7XG4gICAgICByZXR1cm4gcGhvbmUucmVwbGFjZSgvXihcXCtcXGR7MSwyfSkoXFxkKykkLywgJyQxICQyJylcbiAgICB9XG4gICAgcmV0dXJuIC9eXFwrXFxkezEsM31cXHMrLy50ZXN0KHBob25lKSA/IHBob25lIDogYCs4NiAke3Bob25lfWBcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5TGlzdGVuZXJzKGV2ZW50LCBzZXNzaW9uLCBpbmZvKTogT25BdXRoU3RhdGVDaGFuZ2VDYWxsYmFjayB7XG4gICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgoY2FsbGJhY2tzKSA9PiB7XG4gICAgICBjYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjYWxsYmFjayhldmVudCwgc2Vzc2lvbiwgaW5mbylcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBhdXRoIHN0YXRlIGNoYW5nZSBjYWxsYmFjazonLCBlcnJvcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICAgIHJldHVyblxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0KCk6IFByb21pc2U8eyBlcnJvcjogRXJyb3IgfCBudWxsIH0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLm9hdXRoMmNsaWVudC5sb2NhbENyZWRlbnRpYWxzLmdldENyZWRlbnRpYWxzKClcbiAgICAgIGlmIChjcmVkZW50aWFscykge1xuICAgICAgICBldmVudEJ1cy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLklOSVRJQUxfU0VTU0lPTiB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZ25vcmUgZXJyb3JzIHdoZW4gY2hlY2tpbmcgZm9yIGV4aXN0aW5nIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgcmV0dXJuIHsgZXJyb3I6IG51bGwgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cExpc3RlbmVycygpIHtcbiAgICBldmVudEJ1cy5vbihFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHBhcmFtcz8uZGF0YT8uZXZlbnRcbiAgICAgIGNvbnN0IGluZm8gPSBwYXJhbXM/LmRhdGE/LmluZm9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyBzZXNzaW9uIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVXNlcih1c2VySW5mbzogYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHtcbiAgICBpZiAoIXVzZXJJbmZvKSByZXR1cm4gbnVsbFxuXG4gICAgLy8g5LyY5YWI5L2/55SoIHVzZXJJbmZvIOS4reeahOaVsOaNru+8iFYzIEFQSe+8iVxuICAgIGNvbnN0IGVtYWlsID0gdXNlckluZm8/LmVtYWlsIHx8IHVzZXJJbmZvPy51c2VybmFtZVxuICAgIGNvbnN0IHBob25lID0gdXNlckluZm8/LnBob25lX251bWJlclxuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXJJbmZvPy5zdWIgfHwgdXNlckluZm8/LnVpZCB8fCAnJ1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB1c2VySWQsXG4gICAgICBhdWQ6ICdhdXRoZW50aWNhdGVkJyxcbiAgICAgIHJvbGU6IHVzZXJJbmZvLmdyb3VwcyxcbiAgICAgIGVtYWlsOiBlbWFpbCB8fCAnJyxcbiAgICAgIGVtYWlsX2NvbmZpcm1lZF9hdDogdXNlckluZm8/LmVtYWlsX3ZlcmlmaWVkID8gdXNlckluZm8uY3JlYXRlZF9hdCA6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBwaG9uZSxcbiAgICAgIHBob25lX2NvbmZpcm1lZF9hdDogcGhvbmUgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlybWVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgbGFzdF9zaWduX2luX2F0OiB1c2VySW5mby5sYXN0X3NpZ25faW5fYXQsXG4gICAgICBhcHBfbWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IHVzZXJJbmZvLmxvZ2luVHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnY2xvdWRiYXNlJyxcbiAgICAgICAgcHJvdmlkZXJzOiBbdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnXSxcbiAgICAgIH0sXG4gICAgICB1c2VyX21ldGFkYXRhOiB7XG4gICAgICAgIC8vIFYzIEFQSSDnlKjmiLfkv6Hmga9cbiAgICAgICAgbmFtZTogdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIHBpY3R1cmU6IHVzZXJJbmZvPy5waWN0dXJlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8/LnVzZXJuYW1lLCAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgICAgICBnZW5kZXI6IHVzZXJJbmZvPy5nZW5kZXIsXG4gICAgICAgIGxvY2FsZTogdXNlckluZm8/LmxvY2FsZSxcbiAgICAgICAgLy8gVjIgQVBJIOWFvOWuue+8iOS9v+eUqCBhbnkg6YG/5YWN57G75Z6L6ZSZ6K+v77yJXG4gICAgICAgIHVpZDogdXNlckluZm8udWlkLFxuICAgICAgICBuaWNrTmFtZTogdXNlckluZm8ubmlja05hbWUsXG4gICAgICAgIGF2YXRhclVybDogdXNlckluZm8uYXZhdGFyVXJsIHx8IHVzZXJJbmZvLnBpY3R1cmUsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIGlkZW50aXRpZXM6XG4gICAgICAgIHVzZXJJbmZvPy5wcm92aWRlcnM/Lm1hcChwID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgaWRlbnRpdHlfaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgICAgICAgIGlkZW50aXR5X2RhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXJfdXNlcl9pZDogcC5wcm92aWRlcl91c2VyX2lkLFxuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHAuaWQgfHwgJ2Nsb3VkYmFzZScsXG4gICAgICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICB1cGRhdGVkX2F0OiB1c2VySW5mby51cGRhdGVkX2F0LFxuICAgICAgICAgIGxhc3Rfc2lnbl9pbl9hdDogdXNlckluZm8ubGFzdF9zaWduX2luX2F0LFxuICAgICAgICB9KSkgfHwgW10sXG4gICAgICBjcmVhdGVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgIGlzX2Fub255bW91czogdXNlckluZm8ubmFtZSA9PT0gJ2Fub255bW91cycsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPguaVsOagoemqjOi+heWKqeaWueazlVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IGFueSwgcnVsZXM6IHsgW2tleTogc3RyaW5nXTogeyByZXF1aXJlZD86IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9IH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJ1bGVdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bGVzKSkge1xuICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgKHBhcmFtcz8uW2tleV0gPT09IHVuZGVmaW5lZCB8fCBwYXJhbXM/LltrZXldID09PSBudWxsIHx8IHBhcmFtcz8uW2tleV0gPT09ICcnKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogcnVsZS5tZXNzYWdlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOW/heWhq+WPguaVsOe7hO+8iOiHs+WwkeacieS4gOS4quWPguaVsOW/hemhu+acieWAvO+8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zOiBhbnksIGZpZWxkR3JvdXBzOiBzdHJpbmdbXVtdLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IGZpZWxkR3JvdXBzLnNvbWUoZ3JvdXAgPT4gZ3JvdXAuc29tZShmaWVsZCA9PiBwYXJhbXM/LltmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXM/LltmaWVsZF0gIT09IG51bGwgJiYgcGFyYW1zPy5bZmllbGRdICE9PSAnJyksKVxuXG4gICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2UgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==
1525
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Jhc2VBcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2Jhc2VBcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsTUFBTSxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLHdCQUF3QixHQUN6QixNQUFNLGtCQUFrQixDQUFBO0FBaUN6QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3JHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQzVDLE1BQU0sQ0FBQyxJQUFNLFNBQVMsR0FBRyxjQUFNLE9BQUEsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBaEUsQ0FBZ0UsQ0FBQTtBQUkvRjtJQU9FLGtCQUFZLE1BQXlEO1FBSDdELGNBQVMsR0FBZ0QsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUNsRSxxQkFBZ0IsR0FBRyxLQUFLLENBQUE7UUFHOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFBO1FBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDYixDQUFDO0lBS0Qsc0JBQUksaUNBQVc7YUFBZjtZQUNFLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUV2QyxJQUFJLFVBQVUsRUFBRTtnQkFDZCxPQUFPLFVBQVUsQ0FBQyxJ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QTthQUMvQztTQUNGO0lBQ0gsQ0FBQztJQUtPLHFDQUFrQixHQUExQixVQUEyQixNQUFXLEVBQUUsV0FBdUIsRUFBRSxPQUFlO1FBQzlFLElBQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUcsS0FBSyxDQUFDLE1BQUssU0FBUyxJQUFJLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFHLEtBQUssQ0FBQyxNQUFLLElBQUksSUFBSSxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRyxLQUFLLENBQUMsTUFBSyxFQUFFLEVBQW5GLENBQW1GLENBQUMsRUFBeEcsQ0FBd0csQ0FBRSxDQUFBO1FBRXJKLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQyxDQUFBO1NBQ2pDO0lBQ0gsQ0FBQztJQUNILGVBQUM7QUFBRCxDQUFDLEFBejZDRCxJQXk2Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElDbG91ZGJhc2VBdXRoQ29uZmlnIH0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9hdXRoJ1xuaW1wb3J0IHR5cGUgeyBhdXRoTW9kZWxzLCBDbG91ZGJhc2VPQXV0aCwgQ3JlZGVudGlhbHMgfSBmcm9tICdAY2xvdWRiYXNlL29hdXRoJ1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRiYXNlQ2FjaGUgfSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL2NhY2hlJ1xuaW1wb3J0IHtcbiAgd2VhcHBKd3REZWNvZGVBbGwsXG4gIEVWRU5UUyxcbiAgQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUsXG4gIEF1dGhFcnJvcixcbiAgT0FVVEhfVFlQRSxcbiAgTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLFxufSBmcm9tICdAY2xvdWRiYXNlL29hdXRoJ1xuaW1wb3J0IHtcbiAgQ29tbW9uUmVzLFxuICBEZWxldGVNZVJlcSxcbiAgR2V0Q2xhaW1zUmVzLFxuICBHZXRVc2VySWRlbnRpdGllc1JlcyxcbiAgR2V0VXNlclJlcyxcbiAgTGlua0lkZW50aXR5UmVxLFxuICBMaW5rSWRlbnRpdHlSZXMsXG4gIE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2ssXG4gIFJlYXV0aGVudGljYXRlUmVzLFxuICBSZXNlbmRSZXEsXG4gIFJlc2VuZFJlcyxcbiAgUmVzZXRQYXNzd29yZEZvckVtYWlsUmVzLFxuICBSZXNldFBhc3N3b3JkRm9yT2xkUmVxLFxuICBTZXRTZXNzaW9uUmVxLFxuICBTaWduSW5Bbm9ueW1vdXNseVJlcSxcbiAgU2lnbkluT0F1dGhSZXMsXG4gIFNpZ25JblJlcyxcbiAgU2lnbkluV2l0aElkVG9rZW5SZXEsXG4gIFNpZ25JbldpdGhPQXV0aFJlcSxcbiAgU2lnbkluV2l0aE90cFJlcSxcbiAgU2lnbkluV2l0aE90cFJlcyxcbiAgU2lnbkluV2l0aFBhc3N3b3JkUmVxLFxuICBTaWduVXBSZXMsXG4gIFVubGlua0lkZW50aXR5UmVxLFxuICBVcGRhdGVVc2VyQXR0cmlidXRlcyxcbiAgVXBkYXRlVXNlclJlcSxcbiAgVXBkYXRlVXNlcldpdGhWZXJpZmljYXRpb25SZXMsXG4gIFZlcmlmeU9BdXRoUmVxLFxuICBWZXJpZnlPdHBSZXEsXG59IGZyb20gJy4vdHlwZSdcbmltcG9ydCB7IExvZ2luU3RhdGUsIFVzZXIgfSBmcm9tICcuJ1xuaW1wb3J0IHsgc2F2ZVRvQnJvd3NlclNlc3Npb24sIGdldEJyb3dzZXJTZXNzaW9uLCByZW1vdmVCcm93c2VyU2Vzc2lvbiwgYWRkVXJsU2VhcmNoIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IHV0aWxzIH0gZnJvbSAnQGNsb3VkYmFzZS91dGlsaXRpZXMnXG5pbXBvcnQgeyBhZGFwdGVyRm9yV3hNcCB9IGZyb20gJy4vdXRpbGl0aWVzJ1xuZXhwb3J0IGNvbnN0IGlzQnJvd3NlciA9ICgpID0+IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCdcblxuZGVjbGFyZSBjb25zdCB3eDogYW55XG5cbmV4cG9ydCBjbGFzcyBTYmFzZUFwaSB7XG4gIHJlYWRvbmx5IGNvbmZpZzogSUNsb3VkYmFzZUF1dGhDb25maWdcbiAgb2F1dGhJbnN0YW5jZTogQ2xvdWRiYXNlT0F1dGhcbiAgcmVhZG9ubHkgY2FjaGU6IElDbG91ZGJhc2VDYWNoZVxuICBwcml2YXRlIGxpc3RlbmVyczogTWFwPHN0cmluZywgU2V0PE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2s+PiA9IG5ldyBNYXAoKVxuICBwcml2YXRlIGhhc0xpc3RlbmVyU2V0VXAgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogSUNsb3VkYmFzZUF1dGhDb25maWcgJiB7IGNhY2hlOiBJQ2xvdWRiYXNlQ2FjaGUgfSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnXG4gICAgdGhpcy5vYXV0aEluc3RhbmNlID0gY29uZmlnLm9hdXRoSW5zdGFuY2VcbiAgICB0aGlzLmNhY2hlID0gY29uZmlnLmNhY2hlXG4gICAgdGhpcy5pbml0KClcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5blvZPliY3nmbvlvZXnmoTnlKjmiLfkv6Hmga8t5ZCM5q2lXG4gICAqL1xuICBnZXQgY3VycmVudFVzZXIoKSB7XG4gICAgY29uc3QgbG9naW5TdGF0ZSA9IHRoaXMuaGFzTG9naW5TdGF0ZSgpXG5cbiAgICBpZiAobG9naW5TdGF0ZSkge1xuICAgICAgcmV0dXJuIGxvZ2luU3RhdGUudXNlciB8fCBudWxsXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBoYXNMb2dpblN0YXRlKCk6IExvZ2luU3RhdGUgfCBudWxsIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguaGFzTG9naW5TdGF0ZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBzZXRBY2Nlc3NLZXkoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLnNldEFjY2Vzc0tleSgpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBzaWduSW4oX3BhcmFtczogYXV0aE1vZGVscy5TaWduSW5SZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLnNpZ25JbigpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBzaWduSW5XaXRoUHJvdmlkZXIoX3BhcmFtczogYXV0aE1vZGVscy5TaWduSW5XaXRoUHJvdmlkZXJSZXF1ZXN0KTogUHJvbWlzZTxMb2dpblN0YXRlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLnNpZ25JbldpdGhQcm92aWRlcigpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBnZW5Qcm92aWRlclJlZGlyZWN0VXJpKF9wYXJhbXM6IGF1dGhNb2RlbHMuR2VuUHJvdmlkZXJSZWRpcmVjdFVyaVJlcXVlc3QsKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdlblByb3ZpZGVyUmVkaXJlY3RVcmlSZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5nZW5Qcm92aWRlclJlZGlyZWN0VXJpKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8e1xuICAgIGFjY2Vzc1Rva2VuOiBhbnlcbiAgICBlbnY6IHN0cmluZ1xuICB9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLmdldEFjY2Vzc1Rva2VuKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJJbmZvKCk6IFByb21pc2U8KGF1dGhNb2RlbHMuVXNlckluZm8gJiBQYXJ0aWFsPFVzZXI+KSB8IG51bGw+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguZ2V0VXNlckluZm8oKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlVXNlckJhc2ljSW5mbyhfcGFyYW1zOiBhdXRoTW9kZWxzLk1vZGlmeVVzZXJCYXNpY0luZm9SZXF1ZXN0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLnVwZGF0ZVVzZXJCYXNpY0luZm8oKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgc2V0Q3VzdG9tU2lnbkZ1bmMoX2dldFRpY2tGbjogYXV0aE1vZGVscy5HZXRDdXN0b21TaWduVGlja2V0Rm4pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguc2V0Q3VzdG9tU2lnbkZ1bmMoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgZ3JhbnRQcm92aWRlclRva2VuKF9wYXJhbXM6IGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVxdWVzdCwpOiBQcm9taXNlPGF1dGhNb2RlbHMuR3JhbnRQcm92aWRlclRva2VuUmVzcG9uc2U+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGguZ3JhbnRQcm92aWRlclRva2VuKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIGJpbmRXaXRoUHJvdmlkZXIoX3BhcmFtczogYXV0aE1vZGVscy5CaW5kV2l0aFByb3ZpZGVyUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5iaW5kV2l0aFByb3ZpZGVyKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIHNpZ25JbldpdGhVc2VybmFtZShfcGFyYW1zOiB7XG4gICAgdmVyaWZpY2F0aW9uSW5mbz86IHsgdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7IGlzX3VzZXI6IGJvb2xlYW4gfVxuICAgIHZlcmlmaWNhdGlvbkNvZGU/OiBzdHJpbmdcbiAgICB1c2VybmFtZT86IHN0cmluZyAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgIGJpbmRJbmZvPzogYW55XG4gICAgbG9naW5UeXBlPzogc3RyaW5nXG4gICAgYXV0b1NpZ25VcD86IGJvb2xlYW5cbiAgfSk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5zaWduSW5XaXRoVXNlcm5hbWUoKSBpcyBub3QgaW1wbGVtZW50ZWQnKVxuICB9XG5cbiAgYXN5bmMgZ2V0VmVyaWZpY2F0aW9uKFxuICAgIF9wYXJhbXM6IGF1dGhNb2RlbHMuR2V0VmVyaWZpY2F0aW9uUmVxdWVzdCxcbiAgICBfb3B0aW9ucz86IHsgd2l0aENhcHRjaGE6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxhdXRoTW9kZWxzLkdldFZlcmlmaWNhdGlvblJlc3BvbnNlPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBdXRoLmdldFZlcmlmaWNhdGlvbigpIGlzIG5vdCBpbXBsZW1lbnRlZCcpXG4gIH1cblxuICBhc3luYyBjcmVhdGVMb2dpblN0YXRlKFxuICAgIF9wYXJhbXM/OiB7IHZlcnNpb24/OiBzdHJpbmc7IHF1ZXJ5PzogYW55IH0sXG4gICAgX29wdGlvbnM/OiB7IGFzeW5jUmVmcmVzaFVzZXI/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8TG9naW5TdGF0ZT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQXV0aC5jcmVhdGVMb2dpblN0YXRlKCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIGFzeW5jIHZlcmlmeShfcGFyYW1zOiBhdXRoTW9kZWxzLlZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPGF1dGhNb2RlbHMuVmVyaWZ5UmVzcG9uc2U+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0F1dGgudmVyaWZ5KCkgaXMgbm90IGltcGxlbWVudGVkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmluYW5vbnltb3VzbHlcbiAgICogU2lnbiBpbiBhIHVzZXIgYW5vbnltb3VzbHkuXG4gICAqIGNvbnN0IHsgZGF0YSwgZXJyb3IgfSA9IGF3YWl0IGF1dGguc2lnbkluQW5vbnltb3VzbHkoKTtcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyAgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5Bbm9ueW1vdXNseShwYXJhbXM6IFNpZ25JbkFub255bW91c2x5UmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluQW5vbnltb3VzbHkocGFyYW1zKVxuICAgICAgY29uc3QgbG9naW5TdGF0ZSA9IGF3YWl0IHRoaXMuY3JlYXRlTG9naW5TdGF0ZSgpXG5cbiAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgLy8gbG9naW5TdGF0Zei/lOWbnuaYr+S4uuS6huWFvOWuuXYy54mI5pysXG4gICAgICByZXR1cm4geyAuLi4obG9naW5TdGF0ZSBhcyBhbnkpLCBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbnVwXG4gICAqIFNpZ24gdXAgYSBuZXcgdXNlciB3aXRoIGVtYWlsIG9yIHBob25lIHVzaW5nIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkuIElmIHRoZSBhY2NvdW50IG5vdCBleGlzdCwgYSBuZXcgYWNjb3VudCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqIGxldCBzaWduVXBSZXNvbHZlID0gbnVsbDtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBhcHAuYXV0aC5zaWduVXAoe1xuICAgICAgcGhvbmU6IFwieHh4eHh4XCIsXG4gICAgfSk7XG5cbiAgICBzaWduVXBSZXNvbHZlID0gcmVzLmRhdGEudmVyaWZ5XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduVXBSZXNvbHZlKGNvZGUpO1xuXG4gICAgLy8gcmVzLmRhdGEuY2FsbGJhY2vmlK/mjIEgbWVzc2FnZUlkIOWPguaVsOeUqOS6jumHjeaWsOWPkemAgemqjOivgeeggei/m+ihjOmqjOivge+8jG1lc3NhZ2VJZCDlj6/ku6Xku44gcmVzZW5kKCkg5pa55rOV5Lit6I635Y+WXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZXNlbmQoe1xuICAgICAgdHlwZTogXCJzaWdudXBcIixcbiAgICAgIHBob25lOiBcInh4eHh4eFwiLFxuICAgIH0pXG4gICAgY29uc3QgcmVzID0gYXdhaXQgc2lnblVwUmVzb2x2ZShjb2RlLCBkYXRhLm1lc3NhZ2VJZCk7XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduVXBSZXM+XG4gICAqL1xuICBhc3luYyBzaWduVXAocGFyYW1zOiBhdXRoTW9kZWxzLlNpZ25VcFJlcXVlc3QpOiBQcm9taXNlPFNpZ25VcFJlcz4ge1xuICAgIGlmIChwYXJhbXMucGhvbmVfbnVtYmVyIHx8IHBhcmFtcy52ZXJpZmljYXRpb25fY29kZSB8fCBwYXJhbXMudmVyaWZpY2F0aW9uX3Rva2VuIHx8IHBhcmFtcy5wcm92aWRlcl90b2tlbikge1xuICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnblVwKHBhcmFtcylcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKSBhcyBhbnlcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0sKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgLy8g56ys5LqM5q2l77ya562J5b6F55So5oi36L6T5YWl6aqM6K+B56CB77yI6YCa6L+HIFByb21pc2Ug5YyF6KOF55So5oi36L6T5YWl5LqL5Lu277yJXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAoeyB0b2tlbiwgbWVzc2FnZUlkID0gdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQgfSk6IFByb21pc2U8U2lnbkluUmVzPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAvLyDnrKzkuInmraXvvJrlvoXnlKjmiLfovpPlhaXlrozpqozor4HnoIHkuYvlkI7vvIzpqozor4Hnn63kv6Hpqozor4HnoIFcbiAgICAgICAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uVG9rZW5SZXMgPSBhd2FpdCB0aGlzLnZlcmlmeSh7XG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2lkOiBtZXNzYWdlSWQgfHwgdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgIC8vIOesrOWbm+atpe+8muazqOWGjOW5tueZu+W9leaIluebtOaOpeeZu+W9lVxuICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLflt7Lnu4/lrZjlnKjvvIznm7TmjqXnmbvlvZVcbiAgICAgICAgICAgICAgaWYgKHZlcmlmaWNhdGlvbkluZm8uaXNfdXNlcikge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2lnbkluKHtcbiAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOiBwYXJhbXMuZW1haWwgfHwgdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX3Rva2VuOiB2ZXJpZmljYXRpb25Ub2tlblJlcy52ZXJpZmljYXRpb25fdG9rZW4sXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzms6jlhoznlKjmiLdcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJhbXMpKVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLmVtYWlsXG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGEucGhvbmVcblxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25VcCh7XG4gICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgLi4uKHBhcmFtcy5lbWFpbCA/IHsgZW1haWw6IHBhcmFtcy5lbWFpbCB9IDogeyBwaG9uZV9udW1iZXI6IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSB9KSxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl90b2tlbjogdmVyaWZpY2F0aW9uVG9rZW5SZXMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IHRva2VuLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWdub3V0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGF1dGguc2lnbk91dCgpO1xuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBzaWduT3V0KHBhcmFtcz86IGF1dGhNb2RlbHMuU2lnbm91dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQgfCBhdXRoTW9kZWxzLlNpZ25vdXRSZXBvbnNlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgdXNlckluZm9LZXkgfSA9IHRoaXMuY2FjaGUua2V5c1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbk91dChwYXJhbXMpXG4gICAgICBhd2FpdCB0aGlzLmNhY2hlLnJlbW92ZVN0b3JlQXN5bmModXNlckluZm9LZXkpXG4gICAgICB0aGlzLnNldEFjY2Vzc0tleSgpXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5MT0dJTl9TVEFURV9DSEFOR0VELCB7IGV2ZW50VHlwZTogTE9HSU5fU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05fT1VUIH0pXG5cbiAgICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5maXJlKEVWRU5UUy5BVVRIX1NUQVRFX0NIQU5HRUQsIHsgZXZlbnQ6IEFVVEhfU1RBVEVfQ0hBTkdFRF9UWVBFLlNJR05FRF9PVVQgfSlcblxuICAgICAgLy8gcmVz6L+U5Zue5piv5Li65LqG5YW85a65djLniYjmnKxcbiAgICAgIHJldHVybiB7IC4uLnJlcywgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1vbmF1dGhzdGF0ZWNoYW5nZVxuICAgKiBSZWNlaXZlIGEgbm90aWZpY2F0aW9uIGV2ZXJ5IHRpbWUgYW4gYXV0aCBldmVudCBoYXBwZW5zLiBTYWZlIHRvIHVzZSB3aXRob3V0IGFuIGFzeW5jIGZ1bmN0aW9uIGFzIGNhbGxiYWNrLlxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGFwcC5hdXRoLm9uQXV0aFN0YXRlQ2hhbmdlKChldmVudCwgc2Vzc2lvbikgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXZlbnQsIHNlc3Npb24pO1xuICAgICAgaWYgKGV2ZW50ID09PSBcIklOSVRJQUxfU0VTU0lPTlwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBpbml0aWFsIHNlc3Npb25cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiU0lHTkVEX0lOXCIpIHtcbiAgICAgICAgLy8gaGFuZGxlIHNpZ24gaW4gZXZlbnRcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IFwiU0lHTkVEX09VVFwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBzaWduIG91dCBldmVudFxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJQQVNTV09SRF9SRUNPVkVSWVwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSBwYXNzd29yZCByZWNvdmVyeSBldmVudFxuICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gXCJUT0tFTl9SRUZSRVNIRURcIikge1xuICAgICAgICAvLyBoYW5kbGUgdG9rZW4gcmVmcmVzaGVkIGV2ZW50XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSBcIlVTRVJfVVBEQVRFRFwiKSB7XG4gICAgICAgIC8vIGhhbmRsZSB1c2VyIHVwZGF0ZWQgZXZlbnRcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBjYWxsIHVuc3Vic2NyaWJlIHRvIHJlbW92ZSB0aGUgY2FsbGJhY2tcbiAgICBkYXRhLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHJldHVybnMgUHJvbWlzZTx7IGRhdGE6IHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfSwgZXJyb3I6IEVycm9yIHwgbnVsbCB9PlxuICAgKi9cbiAgb25BdXRoU3RhdGVDaGFuZ2UoY2FsbGJhY2s6IE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuaGFzTGlzdGVuZXJTZXRVcCkge1xuICAgICAgdGhpcy5zZXR1cExpc3RlbmVycygpXG4gICAgICB0aGlzLmhhc0xpc3RlbmVyU2V0VXAgPSB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KVxuXG4gICAgaWYgKCF0aGlzLmxpc3RlbmVycy5oYXMoaWQpKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoaWQsIG5ldyBTZXQoKSlcbiAgICB9XG5cbiAgICB0aGlzLmxpc3RlbmVycy5nZXQoaWQpIS5hZGQoY2FsbGJhY2spXG5cbiAgICAvLyDov5Tlm54gU3Vic2NyaXB0aW9uIOWvueixoVxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgIGlkLFxuICAgICAgY2FsbGJhY2ssXG4gICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWxsYmFja3MgPSB0aGlzLmxpc3RlbmVycy5nZXQoaWQpXG4gICAgICAgIGlmIChjYWxsYmFja3MpIHtcbiAgICAgICAgICBjYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuICAgICAgICAgIGlmIChjYWxsYmFja3Muc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGlkKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogeyBzdWJzY3JpcHRpb24gfSxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhwYXNzd29yZFxuICAgKiBMb2cgaW4gYW4gZXhpc3RpbmcgdXNlciB3aXRoIGFuIGVtYWlsIGFuZCBwYXNzd29yZCBvciBwaG9uZSBhbmQgcGFzc3dvcmQgb3IgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLlxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnNpZ25JbldpdGhQYXNzd29yZCh7XG4gICAgICB1c2VybmFtZTogXCJ4eHhcIixcbiAgICAgIHBhc3N3b3JkOiBcInh4eFwiLFxuICAgIH0pXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGFzc3dvcmQocGFyYW1zOiBTaWduSW5XaXRoUGFzc3dvcmRSZXEpOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJp1c2VybmFtZS9lbWFpbC9waG9uZeS4iemAieS4gO+8jHBhc3N3b3Jk5b+F5aGrXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBbWyd1c2VybmFtZSddLCBbJ2VtYWlsJ10sIFsncGhvbmUnXV0sXG4gICAgICAgICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciB1c2VybmFtZSwgZW1haWwsIG9yIHBob25lJyxcbiAgICAgIClcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25Jbih7XG4gICAgICAgIHVzZXJuYW1lOiBwYXJhbXMudXNlcm5hbWUgfHwgcGFyYW1zLmVtYWlsIHx8IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy5wYXNzd29yZCxcbiAgICAgICAgLi4uKHBhcmFtcy5pc19lbmNyeXB0ID8geyBpc0VuY3J5cHQ6IHRydWUsIHZlcnNpb246ICd2MicgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRoaWR0b2tlblxuICAgKiDnrKzkuInmlrnlubPlj7DnmbvlvZXjgILlpoLmnpznlKjmiLfkuI3lrZjlnKjvvIzkvJrmoLnmja7kupHlvIDlj5HlubPlj7At55m75b2V5pa55byP5Lit5a+55bqU6Lqr5Lu95rqQ55qE55m75b2V5qih5byP6YWN572u77yM5Yik5pat5piv5ZCm6Ieq5Yqo5rOo5YaMXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoSWRUb2tlbihwYXJhbXM6IFNpZ25JbldpdGhJZFRva2VuUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yadG9rZW7lv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHRva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnVG9rZW4gaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhQcm92aWRlcih7XG4gICAgICAgIHByb3ZpZGVyX3Rva2VuOiBwYXJhbXMudG9rZW4sXG4gICAgICB9KVxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHVzZXI6IHNlc3Npb24udXNlciwgc2Vzc2lvbiB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtc2lnbmlud2l0aG90cFxuICAgKiBMb2cgaW4gYSB1c2VyIHVzaW5nIGEgb25lLXRpbWUgcGFzc3dvcmQgKE9UUCkuXG4gICAqIGxldCBzaWduUmVzb2x2ZSA9IG51bGw7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgYXBwLmF1dGguc2lnbkluV2l0aE90cCh7XG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICB9KTtcblxuICAgIHNpZ25SZXNvbHZlID0gcmVzLmRhdGEudmVyaWZ5XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduUmVzb2x2ZShjb2RlKTtcblxuICAgIC8vIHJlcy5kYXRhLmNhbGxiYWNr5pSv5oyBIG1lc3NhZ2VJZCDlj4LmlbDnlKjkuo7ph43mlrDlj5HpgIHpqozor4HnoIHov5vooYzpqozor4HvvIxtZXNzYWdlSWQg5Y+v5Lul5LuOIHJlc2VuZCgpIOaWueazleS4reiOt+WPllxuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVzZW5kKHtcbiAgICAgIHR5cGU6IFwic2lnbnVwXCIsXG4gICAgICBwaG9uZTogXCJ4eHh4eHhcIixcbiAgICB9KVxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNpZ25VcFJlc29sdmUoY29kZSwgZGF0YS5tZXNzYWdlSWQpO1xuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluV2l0aE90cFJlcz5cbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhPdHAocGFyYW1zOiBTaWduSW5XaXRoT3RwUmVxKTogUHJvbWlzZTxTaWduSW5XaXRoT3RwUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWls5oiWcGhvbmXlv4XloavlhbbkuIBcbiAgICAgIHRoaXMudmFsaWRhdGVBdExlYXN0T25lKHBhcmFtcywgW1snZW1haWwnXSwgWydwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24ocGFyYW1zLmVtYWlsID8geyBlbWFpbDogcGFyYW1zLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0sKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdXNlcjogbnVsbCxcbiAgICAgICAgICBzZXNzaW9uOiBudWxsLFxuICAgICAgICAgIC8vIOesrOS6jOatpe+8muetieW+heeUqOaIt+i+k+WFpemqjOivgeegge+8iOmAmui/hyBQcm9taXNlIOWMheijheeUqOaIt+i+k+WFpeS6i+S7tu+8iVxuICAgICAgICAgIHZlcmlmeU90cDogYXN5bmMgKHsgdG9rZW4sIG1lc3NhZ2VJZCA9IHZlcmlmaWNhdGlvbkluZm8udmVyaWZpY2F0aW9uX2lkIH0pOiBQcm9taXNlPFNpZ25JblJlcz4gPT4gdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgZW1haWw6IHBhcmFtcy5lbWFpbCxcbiAgICAgICAgICAgIHBob25lOiBwYXJhbXMucGhvbmUsXG4gICAgICAgICAgICB0b2tlbixcbiAgICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDmoKHpqoznrKzkuInmlrnlubPlj7DmjojmnYPnmbvlvZXlm57osIPvvIzpnIDlhYjosIPnlKggc2lnbkluV2l0aE9BdXRoIOeUn+aIkOesrOS4ieaWueW5s+WPsOaOiOadgyBVcmnvvIzorr/pl67or6UgVXJpIOWQju+8jOS8mui3s+i9rOWIsOesrOS4ieaWueW5s+WPsOaOiOadg+mhtemdou+8jOaOiOadg+WujOaIkOWQjuWbnuiwg+WbnuadpeWGjeiwg+eUqOivpeaWueazle+8jOS4jeS8oOWPguaVsOWImeS7jiB1cmwgcXVlcnkg5ZKMIHNlc3Npb25TdG9yYWdlIOS4reiOt+WPllxuICAgKiAvLyAxLiDojrflj5bnrKzkuInmlrnlubPlj7DmjojmnYPpobXlnLDlnYBcbiAgICBjb25zdCB7IGRhdGEgfSA9IGFwcC5hdXRoLnNpZ25JbldpdGhPQXV0aCh7XG4gICAgICBwcm92aWRlcjogJ3N0cmluZydcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcmVkaXJlY3RUbzogJ2h0dHBzOi8vZXhhbXBsZS5jb20vY2FsbGJhY2snXG4gICAgICAgIHN0YXRlOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyAyLiDorr/pl651cmkg77yI5aaCIGxvY2F0aW9uLmhyZWYgPSB1cmnvvIlcblxuICAgIC8vIDMuIOagoemqjOesrOS4ieaWueW5s+WPsOaOiOadg+Wbnuiwg1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgudmVyaWZ5T0F1dGgoKVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbkluUmVzPlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5T0F1dGgocGFyYW1zPzogVmVyaWZ5T0F1dGhSZXEpOiBQcm9taXNlPFNpZ25JblJlcyB8IExpbmtJZGVudGl0eVJlcz4ge1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWbnuiwg+iHsyBwcm92aWRlcl9yZWRpcmVjdF91cmkg5Zyw5Z2A77yIdXJsIHF1ZXJ55Lit5pC65bimIOaOiOadg2NvZGXvvIxzdGF0ZeetieWPguaVsO+8ie+8jOatpOaXtuajgOafpSBzdGF0ZSDmmK/lkKbnrKblkIjpooTmnJ/vvIjlpoIg6Ieq5bex6K6+572u55qEIHd4X29wZW4pXG4gICAgICBjb25zdCBjb2RlID0gcGFyYW1zPy5jb2RlIHx8IHV0aWxzLmdldFF1ZXJ5KCdjb2RlJylcbiAgICAgIGNvbnN0IHN0YXRlID0gcGFyYW1zPy5zdGF0ZSB8fCB1dGlscy5nZXRRdWVyeSgnc3RhdGUnKVxuXG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpjb2Rl5ZKMc3RhdGXlv4XloatcbiAgICAgIGlmICghY29kZSkge1xuICAgICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoeyBtZXNzYWdlOiAnQ29kZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICdTdGF0ZSBpcyByZXF1aXJlZCcgfSkgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBjYWNoZURhdGEgPSBnZXRCcm93c2VyU2Vzc2lvbihzdGF0ZSlcbiAgICAgIGRhdGEudHlwZSA9IGNhY2hlRGF0YT8udHlwZVxuXG4gICAgICBjb25zdCBwcm92aWRlciA9IHBhcmFtcz8ucHJvdmlkZXIgfHwgY2FjaGVEYXRhPy5wcm92aWRlciB8fCB1dGlscy5nZXRRdWVyeSgncHJvdmlkZXInKVxuXG4gICAgICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogJ1Byb3ZpZGVyIGlzIHJlcXVpcmVkJyB9KSB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN0YXRl56ym5ZCI6aKE5pyf77yM5YiZ6I635Y+W6K+l5LiJ5pa55bmz5Y+wdG9rZW5cbiAgICAgIGNvbnN0IHsgcHJvdmlkZXJfdG9rZW46IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdyYW50UHJvdmlkZXJUb2tlbih7XG4gICAgICAgIHByb3ZpZGVyX2lkOiBwcm92aWRlcixcbiAgICAgICAgcHJvdmlkZXJfcmVkaXJlY3RfdXJpOiBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSwgLy8g5oyH5a6a5LiJ5pa55bmz5Y+w6Lez5Zue55qEIHVybCDlnLDlnYBcbiAgICAgICAgcHJvdmlkZXJfY29kZTogY29kZSwgLy8g56ys5LiJ5pa55bmz5Y+w6Lez6L2s5Zue6aG16Z2i5pe277yMdXJsIHBhcmFtIOS4reaQuuW4pueahCBjb2RlIOWPguaVsFxuICAgICAgfSlcblxuICAgICAgbGV0IHJlczogU2lnbkluUmVzIHwgTGlua0lkZW50aXR5UmVzXG5cbiAgICAgIGlmIChjYWNoZURhdGEudHlwZSA9PT0gT0FVVEhfVFlQRS5CSU5EX0lERU5USVRZKSB7XG4gICAgICAgIHJlcyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnRvQmluZElkZW50aXR5KHsgcHJvdmlkZXJfdG9rZW46IHRva2VuLCBwcm92aWRlciwgZmlyZUV2ZW50OiB0cnVlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDpgJrov4cgcHJvdmlkZXJfdG9rZW4g5LuF55m75b2V5oiW55m75b2V5bm25rOo5YaM77yI5LiO5LqR5byA5Y+R5bmz5Y+wLeeZu+W9leaWueW8jy3ouqvku73mupDnmbvlvZXmqKHlvI/phY3nva7mnInlhbPvvIlcbiAgICAgICAgcmVzID0gYXdhaXQgdGhpcy5zaWduSW5XaXRoSWRUb2tlbih7XG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgIH0pXG4gICAgICAgIHJlcy5kYXRhID0geyAuLi5kYXRhLCAuLi5yZXMuZGF0YSB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2FsU2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbj8uc2VhcmNoKVxuICAgICAgbG9jYWxTZWFyY2guZGVsZXRlKCdjb2RlJylcbiAgICAgIGxvY2FsU2VhcmNoLmRlbGV0ZSgnc3RhdGUnKVxuICAgICAgYWRkVXJsU2VhcmNoKFxuICAgICAgICBjYWNoZURhdGE/LnNlYXJjaCA9PT0gdW5kZWZpbmVkID8gYD8ke2xvY2FsU2VhcmNoLnRvU3RyaW5nKCl9YCA6IGNhY2hlRGF0YT8uc2VhcmNoLFxuICAgICAgICBjYWNoZURhdGE/Lmhhc2ggfHwgbG9jYXRpb24uaGFzaCxcbiAgICAgIClcbiAgICAgIHJlbW92ZUJyb3dzZXJTZXNzaW9uKHN0YXRlKVxuXG4gICAgICByZXR1cm4gcmVzXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGEsIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGh0dHBzOi8vc3VwYWJhc2UuY29tL2RvY3MvcmVmZXJlbmNlL2phdmFzY3JpcHQvYXV0aC1zaWduaW53aXRob2F1dGhcbiAgICog55Sf5oiQ56ys5LiJ5pa55bmz5Y+w5o6I5p2DIFVyaSDvvIjlpoLlvq7kv6Hkuoznu7TnoIHmiavnoIHmjojmnYPnvZHpobXvvIlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25Jbk9BdXRoUmVzPlxuICAgKi9cbiAgYXN5bmMgc2lnbkluV2l0aE9BdXRoKHBhcmFtczogU2lnbkluV2l0aE9BdXRoUmVxKTogUHJvbWlzZTxTaWduSW5PQXV0aFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGhyZWYgPSBwYXJhbXMub3B0aW9ucz8ucmVkaXJlY3RUbyB8fCBsb2NhdGlvbi5ocmVmXG5cbiAgICAgIGNvbnN0IHVybE9iamVjdCA9IG5ldyBVUkwoaHJlZilcblxuICAgICAgY29uc3QgcHJvdmlkZXJfcmVkaXJlY3RfdXJpID0gdXJsT2JqZWN0Lm9yaWdpbiArIHVybE9iamVjdC5wYXRobmFtZVxuXG4gICAgICBjb25zdCBzdGF0ZSA9IHBhcmFtcy5vcHRpb25zPy5zdGF0ZSB8fCBgcHJkLSR7cGFyYW1zLnByb3ZpZGVyfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpXG4gICAgICAgIC5zbGljZSgyKX1gXG5cbiAgICAgIGNvbnN0IHsgdXJpIH0gPSBhd2FpdCB0aGlzLmdlblByb3ZpZGVyUmVkaXJlY3RVcmkoe1xuICAgICAgICBwcm92aWRlcl9pZDogcGFyYW1zLnByb3ZpZGVyLFxuICAgICAgICBwcm92aWRlcl9yZWRpcmVjdF91cmksXG4gICAgICAgIHN0YXRlLFxuICAgICAgfSlcblxuICAgICAgLy8g5a+5IFVSTCDov5vooYzop6PnoIFcbiAgICAgIGNvbnN0IGRlY29kZWRVcmkgPSBkZWNvZGVVUklDb21wb25lbnQodXJpKVxuXG4gICAgICAvLyDlkIjlubbpop3lpJbnmoTmn6Xor6Llj4LmlbBcbiAgICAgIGxldCBmaW5hbFVyaSA9IGRlY29kZWRVcmlcblxuICAgICAgaWYgKHBhcmFtcy5vcHRpb25zPy5xdWVyeVBhcmFtcykge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRlY29kZWRVcmkpXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcmFtcy5vcHRpb25zLnF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKVxuICAgICAgICB9KVxuICAgICAgICBmaW5hbFVyaSA9IHVybC50b1N0cmluZygpXG4gICAgICB9XG5cbiAgICAgIHNhdmVUb0Jyb3dzZXJTZXNzaW9uKHN0YXRlLCB7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIHNlYXJjaDogdXJsT2JqZWN0LnNlYXJjaCxcbiAgICAgICAgaGFzaDogdXJsT2JqZWN0Lmhhc2gsXG4gICAgICAgIHR5cGU6IHBhcmFtcy5vcHRpb25zPy50eXBlIHx8IE9BVVRIX1RZUEUuU0lHTl9JTixcbiAgICAgIH0pXG5cbiAgICAgIGlmIChpc0Jyb3dzZXIoKSAmJiAhcGFyYW1zLm9wdGlvbnM/LnNraXBCcm93c2VyUmVkaXJlY3QpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihmaW5hbFVyaSlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1cmw6IGZpbmFsVXJpLCBwcm92aWRlcjogcGFyYW1zLnByb3ZpZGVyIH0sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGhzc29cbiAgYXN5bmMgc2lnbkluV2l0aFNTTygpIHtcbiAgICAvL1xuICB9XG5cbiAgLy8gaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNpZ25pbndpdGh3ZWIzXG4gIGFzeW5jIHNpZ25JbldpdGhXZWIzKCkge1xuICAgIC8vXG4gIH1cblxuICAvLyBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZ2V0Y2xhaW1zXG4gIGFzeW5jIGdldENsYWltcygpOiBQcm9taXNlPEdldENsYWltc1Jlcz4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFjY2Vzc1Rva2VuIH0gPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1Rva2VuKClcbiAgICAgIGNvbnN0IHBhcnNlZFRva2VuID0gd2VhcHBKd3REZWNvZGVBbGwoYWNjZXNzVG9rZW4pXG4gICAgICByZXR1cm4geyBkYXRhOiBwYXJzZWRUb2tlbiwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlc2V0cGFzc3dvcmRmb3JlbWFpbFxuICAgKiDpgJrov4cgZW1haWwg5oiW5omL5py65Y+36YeN572u5a+G56CBXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVzZXRQYXNzd29yZEZvckVtYWlsKFwieHh4QHh4LmNvbVwiKTtcbiAgICogY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZXNldFBhc3N3b3JkRm9yRW1haWwoXCIxMzgwMDEzODAwMFwiKTtcblxuICAgICBhd2FpdCBkYXRhLnVwZGF0ZVVzZXIoY29kZSwgbmV3UGFzc1dvcmQpO1xuICAgKlxuICAgKiBAcGFyYW0gZW1haWxPclBob25lIOmCrueuseaIluaJi+acuuWPt1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFJlc2V0UGFzc3dvcmRGb3JFbWFpbFJlcz5cbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRGb3JFbWFpbChcbiAgICBlbWFpbE9yUGhvbmU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyByZWRpcmVjdFRvPzogc3RyaW5nIH0sXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZEZvckVtYWlsUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIOWPguaVsOagoemqjO+8mmVtYWlsT3JQaG9uZeW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhcbiAgICAgICAgeyBlbWFpbE9yUGhvbmUgfSxcbiAgICAgICAge1xuICAgICAgICAgIGVtYWlsT3JQaG9uZTogeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ0VtYWlsIG9yIHBob25lIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCB7IHJlZGlyZWN0VG8gfSA9IG9wdGlvbnMgfHwge31cblxuICAgICAgLy8g5Yik5pat5piv6YKu566x6L+Y5piv5omL5py65Y+3XG4gICAgICBjb25zdCBpc0VtYWlsID0gZW1haWxPclBob25lLmluY2x1ZGVzKCdAJylcbiAgICAgIGxldCB2ZXJpZmljYXRpb25QYXJhbXM6IHsgZW1haWw/OiBzdHJpbmc7IHBob25lX251bWJlcj86IHN0cmluZyB9XG5cbiAgICAgIGlmIChpc0VtYWlsKSB7XG4gICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgZW1haWw6IGVtYWlsT3JQaG9uZSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkUGhvbmUgPSB0aGlzLmZvcm1hdFBob25lKGVtYWlsT3JQaG9uZSlcbiAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBwaG9uZV9udW1iZXI6IGZvcm1hdHRlZFBob25lIH1cbiAgICAgIH1cblxuICAgICAgLy8g56ys5LiA5q2l77ya5Y+R6YCB6aqM6K+B56CB5bm25a2Y5YKoIHZlcmlmaWNhdGlvbkluZm9cbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbkluZm8gPSBhd2FpdCB0aGlzLmdldFZlcmlmaWNhdGlvbih2ZXJpZmljYXRpb25QYXJhbXMpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgLy8g56ys5LiJ5q2l77ya5b6F55So5oi36L6T5YWl5a6M6aqM6K+B56CB5LmL5ZCO77yM6aqM6K+B6aqM6K+B56CBXG4gICAgICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvblRva2VuUmVzID0gYXdhaXQgdGhpcy52ZXJpZnkoe1xuICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uX2NvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkucmVzZXRQYXNzd29yZCh7XG4gICAgICAgICAgICAgICAgZW1haWw6IGlzRW1haWwgPyBlbWFpbE9yUGhvbmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgcGhvbmU6ICFpc0VtYWlsID8gZW1haWxPclBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG5ld19wYXNzd29yZDogYXR0cmlidXRlcy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5QQVNTV09SRF9SRUNPVkVSWSB9KVxuXG4gICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuc2lnbkluV2l0aFBhc3N3b3JkKHtcbiAgICAgICAgICAgICAgICBlbWFpbDogaXNFbWFpbCA/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/OiBzdHJpbmcgfVxuICAgICAgICBsZXQgdmVyaWZpY2F0aW9uVHlwZTogJ2VtYWlsX2NoYW5nZScgfCAncGhvbmVfY2hhbmdlJ1xuXG4gICAgICAgIGlmIChuZWVkc0VtYWlsVmVyaWZpY2F0aW9uKSB7XG4gICAgICAgICAgdmVyaWZpY2F0aW9uUGFyYW1zID0geyBlbWFpbDogcGFyYW1zLmVtYWlsIH1cbiAgICAgICAgICB2ZXJpZmljYXRpb25UeXBlID0gJ2VtYWlsX2NoYW5nZSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyDmraPop4TljJbmiYvmnLrlj7dcbiAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQaG9uZSA9IHRoaXMuZm9ybWF0UGhvbmUocGFyYW1zLnBob25lKVxuICAgICAgICAgIHZlcmlmaWNhdGlvblBhcmFtcyA9IHsgcGhvbmVfbnVtYmVyOiBmb3JtYXR0ZWRQaG9uZSB9XG4gICAgICAgICAgdmVyaWZpY2F0aW9uVHlwZSA9ICdwaG9uZV9jaGFuZ2UnXG4gICAgICAgIH1cblxuICAgICAgICAvLyDlj5HpgIHpqozor4HnoIFcbiAgICAgICAgY29uc3QgdmVyaWZpY2F0aW9uSW5mbyA9IGF3YWl0IHRoaXMuZ2V0VmVyaWZpY2F0aW9uKHZlcmlmaWNhdGlvblBhcmFtcylcblxuICAgICAgICBPYmplY3Qua2V5cyhyZXN0UGFyYW1zKS5sZW5ndGggPiAwICYmIGF3YWl0IHRoaXMudXBkYXRlVXNlckJhc2ljSW5mbyhyZXN0UGFyYW1zKVxuXG4gICAgICAgIGV4dHJhUmVzID0ge1xuICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgdmVyaWZ5T3RwOiBhc3luYyAodmVyaWZ5UGFyYW1zOiB7IGVtYWlsPzogc3RyaW5nOyBwaG9uZT86IHN0cmluZzsgdG9rZW46IHN0cmluZyB9KTogUHJvbWlzZTxHZXRVc2VyUmVzPiA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAodmVyaWZ5UGFyYW1zLmVtYWlsICYmIHBhcmFtcy5lbWFpbCA9PT0gdmVyaWZ5UGFyYW1zLmVtYWlsKSB7XG4gICAgICAgICAgICAgICAgLy8g6aqM6K+B56CB6aqM6K+BXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ2VtYWlsX2NoYW5nZScsXG4gICAgICAgICAgICAgICAgICBlbWFpbDogcGFyYW1zLmVtYWlsLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8oeyBlbWFpbDogcGFyYW1zLmVtYWlsIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVyaWZ5UGFyYW1zLnBob25lICYmIHBhcmFtcy5waG9uZSA9PT0gdmVyaWZ5UGFyYW1zLnBob25lKSB7XG4gICAgICAgICAgICAgICAgLy8g6aqM6K+B56CB6aqM6K+BXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3Bob25lX2NoYW5nZScsXG4gICAgICAgICAgICAgICAgICBwaG9uZTogcGFyYW1zLnBob25lLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8oeyBwaG9uZTogdGhpcy5mb3JtYXRQaG9uZShwYXJhbXMucGhvbmUpIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy52ZXJpZnlPdHAoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogdmVyaWZpY2F0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICAgIGVtYWlsOiBuZWVkc0VtYWlsVmVyaWZpY2F0aW9uID8gcGFyYW1zLmVtYWlsIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgcGhvbmU6ICFuZWVkc0VtYWlsVmVyaWZpY2F0aW9uID8gcGFyYW1zLnBob25lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgdG9rZW46IHZlcmlmeVBhcmFtcy50b2tlbixcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAvLyDpqozor4HmiJDlip/lkI7mm7TmlrDnlKjmiLfkv6Hmga9cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIGRhdGE6IHsgdXNlciB9LFxuICAgICAgICAgICAgICB9ID0gYXdhaXQgdGhpcy5nZXRVc2VyKClcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOS4jemcgOimgemqjOivge+8jOebtOaOpeabtOaWsFxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJCYXNpY0luZm8ocGFyYW1zKVxuICAgICAgfVxuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuVVNFUl9VUERBVEVEIH0pXG5cbiAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlciwgLi4uZXh0cmFSZXMgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLWdldHVzZXJpZGVudGl0aWVzXG4gICAqIOiOt+WPluaJgOaciei6q+S7vea6kFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmdldFVzZXJJZGVudGl0aWVzKClcbiAgICogQHJldHVybnMgUHJvbWlzZTxHZXRVc2VySWRlbnRpdGllc1Jlcz5cbiAgICovXG4gIGFzeW5jIGdldFVzZXJJZGVudGl0aWVzKCk6IFByb21pc2U8R2V0VXNlcklkZW50aXRpZXNSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuZ2V0UHJvdmlkZXJzKClcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyBpZGVudGl0aWVzOiBwcm92aWRlcnM/LmRhdGE/LmZpbHRlcih2ID0+ICEhdi5iaW5kKSB9LCBlcnJvcjogbnVsbCB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtbGlua2lkZW50aXR5XG4gICAqIOe7keWumui6q+S7vea6kOWIsOW9k+WJjeeUqOaIt++8jOWmguaenOW3suacieeUqOaIt+e7keWumuivpei6q+S7vea6kO+8jOS8muaKm+WHuumUmeivr1xuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLmxpbmtJZGVudGl0eSh7XG4gICAgICBwcm92aWRlcjogJ3N0cmluZydcbiAgICB9KVxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEByZXR1cm5zIFByb21pc2U8TGlua0lkZW50aXR5UmVzPlxuICAgKi9cbiAgYXN5bmMgbGlua0lkZW50aXR5KHBhcmFtczogTGlua0lkZW50aXR5UmVxKTogUHJvbWlzZTxMaW5rSWRlbnRpdHlSZXM+IHtcbiAgICB0cnkge1xuICAgICAgLy8g5Y+C5pWw5qCh6aqM77yacHJvdmlkZXLlv4XloatcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHByb3ZpZGVyOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUHJvdmlkZXIgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBhd2FpdCB0aGlzLnNpZ25JbldpdGhPQXV0aCh7XG4gICAgICAgIHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiBPQVVUSF9UWVBFLkJJTkRfSURFTlRJVFksXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7IHByb3ZpZGVyOiBwYXJhbXMucHJvdmlkZXIgfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXVubGlua2lkZW50aXR5XG4gICAqIOino+e7kei6q+S7vea6kFxuICAgKiBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IGFwcC5hdXRoLnVubGlua0lkZW50aXR5KHtcbiAgICAgIHByb3ZpZGVyOiBcInh4eFwiXG4gICAgfSlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPENvbW1vblJlcz5cbiAgICovXG4gIGFzeW5jIHVubGlua0lkZW50aXR5KHBhcmFtczogVW5saW5rSWRlbnRpdHlSZXEpOiBQcm9taXNlPENvbW1vblJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJpwcm92aWRlcuW/heWhq1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgcHJvdmlkZXI6IHsgcmVxdWlyZWQ6IHRydWUsIG1lc3NhZ2U6ICdQcm92aWRlciBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnVuYmluZFByb3ZpZGVyKHsgcHJvdmlkZXJfaWQ6IHBhcmFtcy5wcm92aWRlciB9KVxuXG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlYXV0aGVudGljYXRpb25cbiAgICog6YeN5paw6K6k6K+B44CC6YCa6L+H5Y+R6YCB6aqM6K+B56CB5p2l6YeN5paw6K6k6K+B55So5oi36Lqr5Lu977yM5pSv5oyB5pu05paw5a+G56CBXG4gICAqIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgYXBwLmF1dGgucmVhdXRoZW50aWNhdGUoKVxuXG4gICAgIGF3YWl0IGRhdGEudXBkYXRlVXNlcihjb2RlLCBuZXdQYXNzV29yZClcbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZWF1dGhlbnRpY2F0ZVJlcz5cbiAgICovXG4gIGFzeW5jIHJlYXV0aGVudGljYXRlKCk6IFByb21pc2U8UmVhdXRoZW50aWNhdGVSZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBkYXRhOiB7IHVzZXIgfSxcbiAgICAgIH0gPSBhd2FpdCB0aGlzLmdldFVzZXIoKVxuXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZSh1c2VyLCBbWydlbWFpbCcsICdwaG9uZSddXSwgJ1lvdSBtdXN0IHByb3ZpZGUgZWl0aGVyIGFuIGVtYWlsIG9yIHBob25lIG51bWJlcicpXG4gICAgICBjb25zdCB1c2VySW5mbyA9IHVzZXIuZW1haWwgPyB7IGVtYWlsOiB1c2VyLmVtYWlsIH0gOiB7IHBob25lX251bWJlcjogdGhpcy5mb3JtYXRQaG9uZSh1c2VyLnBob25lKSB9XG5cbiAgICAgIC8vIOesrOS4gOatpe+8muWPkemAgemqjOivgeeggeW5tuWtmOWCqCB2ZXJpZmljYXRpb25JbmZvXG4gICAgICBjb25zdCB2ZXJpZmljYXRpb25JbmZvID0gYXdhaXQgdGhpcy5nZXRWZXJpZmljYXRpb24odXNlckluZm8pXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAvLyDnrKzkuozmraXvvJrnrYnlvoXnlKjmiLfovpPlhaXpqozor4HnoIHvvIjpgJrov4cgUHJvbWlzZSDljIXoo4XnlKjmiLfovpPlhaXkuovku7bvvIlcbiAgICAgICAgICB1cGRhdGVVc2VyOiBhc3luYyAoYXR0cmlidXRlczogVXBkYXRlVXNlckF0dHJpYnV0ZXMpOiBQcm9taXNlPFNpZ25JblJlcz4gPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhhdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgICAgIG5vbmNlOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnTm9uY2UgaXMgcmVxdWlyZWQnIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMucGFzc3dvcmQpIHtcbiAgICAgICAgICAgICAgICAvLyDnrKzkuInmraXvvJrlvoXnlKjmiLfovpPlhaXlrozpqozor4HnoIHkuYvlkI7vvIzpqozor4Hpqozor4HnoIFcbiAgICAgICAgICAgICAgICBjb25zdCB2ZXJpZmljYXRpb25Ub2tlblJlcyA9IGF3YWl0IHRoaXMudmVyaWZ5KHtcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSW5mby52ZXJpZmljYXRpb25faWQsXG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fY29kZTogYXR0cmlidXRlcy5ub25jZSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy8g56ys5Zub5q2l77ya6I635Y+WIHN1ZG9fdG9rZW5cbiAgICAgICAgICAgICAgICBjb25zdCBzdWRvUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc3Vkbyh7XG4gICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25fdG9rZW46IHZlcmlmaWNhdGlvblRva2VuUmVzLnZlcmlmaWNhdGlvbl90b2tlbixcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2V0UGFzc3dvcmQoe1xuICAgICAgICAgICAgICAgICAgbmV3X3Bhc3N3b3JkOiBhdHRyaWJ1dGVzLnBhc3N3b3JkLFxuICAgICAgICAgICAgICAgICAgc3Vkb190b2tlbjogc3Vkb1Jlcy5zdWRvX3Rva2VuLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zaWduSW5XaXRoVXNlcm5hbWUoe1xuICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uSW5mbyxcbiAgICAgICAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvZGU6IGF0dHJpYnV0ZXMubm9uY2UsXG4gICAgICAgICAgICAgICAgICAuLi51c2VySW5mbyxcbiAgICAgICAgICAgICAgICAgIGxvZ2luVHlwZTogdXNlckluZm8uZW1haWwgPyAnZW1haWwnIDogJ3Bob25lJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcihlcnJvcikgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXJlc2VuZFxuICAgKiDph43mlrDlj5HpgIHpqozor4HnoIFcbiAgICogLSDlkJHnlKjmiLfph43mlrDlj5HpgIHpgq7nrrHjgIHmiYvmnLrlj7fms6jlhozmiJbnmbvlvZXnmoTpqozor4HnoIHjgIJcbiAgICogLSDlj6/ku6XpgJrov4flho3mrKHosIPnlKggc2lnbkluV2l0aE90cCgpIOaWueazleadpemHjeaWsOWPkemAgemqjOivgeeggeeZu+W9leOAglxuICAgKiAtIOWPr+S7pemAmui/h+WGjeasoeiwg+eUqCBzaWduVXAoKSDmlrnms5XmnaXph43mlrDlj5HpgIHpqozor4HnoIHms6jlhozjgIJcbiAgICogLSDmraTmlrnms5Xku4XlnKjosIPnlKggc2lnbkluV2l0aE90cCgpIOaIliBzaWduVXAoKSDlkI7vvIzph43mlrDlj5HpgIHpqozor4HnoIHvvIzmlLbliLDpqozor4HnoIHlkI7lho3nu6fnu63osIPnlKggc2lnbkluV2l0aE90cCgpIOaIliBzaWduVXAoKSDnmoRjYWxsYmFja+WPguaVsO+8jOWwhm1lc3NhZ2VJZOS8oOWFpWNhbGxiYWNr44CCXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcC5hdXRoLnNpZ25JbldpdGhPdHAoeyBwaG9uZTogXCJ4eHhcIiB9KTtcblxuICAgIGxldCBzaWduUmVzb2x2ZSA9IHJlc3VsdC5kYXRhLnZlcmlmeVxuXG4gICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCBhcHAuYXV0aC5yZXNlbmQoe1xuICAgICAgdHlwZTogXCJzaWdudXBcIixcbiAgICAgIHBob25lOiBcInh4eFwiLFxuICAgIH0pXG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBzaWduUmVzb2x2ZShjb2RlLCBkYXRhLm1lc3NhZ2VJZCk7XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxSZXNlbmRSZXM+XG4gICAqL1xuICBhc3luYyByZXNlbmQocGFyYW1zOiBSZXNlbmRSZXEpOiBQcm9taXNlPFJlc2VuZFJlcz4ge1xuICAgIHRyeSB7XG4gICAgICAvLyDlj4LmlbDmoKHpqozvvJplbWFpbOaIlnBob25l5b+F5aGr5YW25LiAXG4gICAgICB0aGlzLnZhbGlkYXRlQXRMZWFzdE9uZShwYXJhbXMsIFtbJ2VtYWlsJ10sIFsncGhvbmUnXV0sICdZb3UgbXVzdCBwcm92aWRlIGVpdGhlciBhbiBlbWFpbCBvciBwaG9uZSBudW1iZXInKVxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXJhbXMudHlwZSA9PT0gJ3NpZ251cCcgPyAnQU5ZJyA6ICdVU0VSJ1xuICAgICAgY29uc3QgZGF0YTogeyBlbWFpbD86IHN0cmluZzsgcGhvbmVfbnVtYmVyPzogc3RyaW5nOyB0YXJnZXQ6ICdVU0VSJyB8ICdBTlknIH0gPSB7IHRhcmdldCB9XG4gICAgICBpZiAoJ2VtYWlsJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgZGF0YS5lbWFpbCA9IHBhcmFtcy5lbWFpbFxuICAgICAgfVxuXG4gICAgICBpZiAoJ3Bob25lJyBpbiBwYXJhbXMpIHtcbiAgICAgICAgZGF0YS5waG9uZV9udW1iZXIgPSB0aGlzLmZvcm1hdFBob25lKHBhcmFtcy5waG9uZSlcbiAgICAgIH1cblxuICAgICAgLy8g6YeN5paw5Y+R6YCB6aqM6K+B56CBXG4gICAgICBjb25zdCB7IHZlcmlmaWNhdGlvbl9pZDogdmVyaWZpY2F0aW9uSWQgfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLmdldFZlcmlmaWNhdGlvbihkYXRhKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiB7IG1lc3NhZ2VJZDogdmVyaWZpY2F0aW9uSWQgfSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YToge30sXG4gICAgICAgIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogaHR0cHM6Ly9zdXBhYmFzZS5jb20vZG9jcy9yZWZlcmVuY2UvamF2YXNjcmlwdC9hdXRoLXNldHNlc3Npb25cbiAgICog5L2/55SoYWNjZXNzX3Rva2Vu5ZKMcmVmcmVzaF90b2tlbuadpeiuvue9ruS8muivnVxuICAgKiDlpoLmnpzmiJDlip/vvIzliJnkvJrop6blj5HkuIDkuKpTSUdORURfSU7kuovku7ZcbiAgICogY29uc3QgeyBkYXRhLCBlcnJvciB9ID0gYXdhaXQgYXBwLmF1dGguc2V0U2Vzc2lvbih7XG4gICAgICBhY2Nlc3NfdG9rZW4sXG4gICAgICByZWZyZXNoX3Rva2VuXG4gICAgfSlcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25JblJlcz5cbiAgICovXG4gIGFzeW5jIHNldFNlc3Npb24ocGFyYW1zOiBTZXRTZXNzaW9uUmVxKTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIHtcbiAgICAgICAgYWNjZXNzX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnQWNjZXNzIHRva2VuIGlzIHJlcXVpcmVkJyB9LFxuICAgICAgICByZWZyZXNoX3Rva2VuOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUmVmcmVzaCB0b2tlbiBpcyByZXF1aXJlZCcgfSxcbiAgICAgIH0pXG5cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQucmVmcmVzaFRva2VuKHBhcmFtcywgeyB0aHJvd09uRXJyb3I6IHRydWUgfSlcblxuICAgICAgY29uc3QgeyBkYXRhOiB7IHNlc3Npb24gfSA9IHt9IH0gPSBhd2FpdCB0aGlzLmdldFNlc3Npb24oKVxuXG4gICAgICB0aGlzLmNvbmZpZy5ldmVudEJ1cz8uZmlyZShFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCB7IGV2ZW50OiBBVVRIX1NUQVRFX0NIQU5HRURfVFlQRS5TSUdORURfSU4gfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvLyBodHRwczovL3N1cGFiYXNlLmNvbS9kb2NzL3JlZmVyZW5jZS9qYXZhc2NyaXB0L2F1dGgtZXhjaGFuZ2Vjb2RlZm9yc2Vzc2lvblxuICBhc3luYyBleGNoYW5nZUNvZGVGb3JTZXNzaW9uKCkge1xuICAgIC8vXG4gIH1cblxuICAvKipcbiAgICog5Yig6Zmk5b2T5YmN55So5oi3XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZVVzZXIocGFyYW1zOiBEZWxldGVNZVJlcSk6IFByb21pc2U8Q29tbW9uUmVzPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmFsaWRhdGVQYXJhbXMocGFyYW1zLCB7XG4gICAgICAgIHBhc3N3b3JkOiB7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAnUGFzc3dvcmQgaXMgcmVxdWlyZWQnIH0sXG4gICAgICB9KVxuXG4gICAgICBjb25zdCB7IHN1ZG9fdG9rZW4gfSA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnN1ZG8ocGFyYW1zKVxuXG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5kZWxldGVNZSh7IHN1ZG9fdG9rZW4gfSlcblxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOi3s+i9rOezu+e7n+m7mOiupOeZu+W9lemhtVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZT59XG4gICAqIEBtZW1iZXJvZiBBdXRoXG4gICAqL1xuICBhc3luYyB0b0RlZmF1bHRMb2dpblBhZ2UocGFyYW1zOiBhdXRoTW9kZWxzLlRvRGVmYXVsdExvZ2luUGFnZSA9IHt9KTogUHJvbWlzZTxDb21tb25SZXM+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29uZmlnVmVyc2lvbiA9IHBhcmFtcy5jb25maWdfdmVyc2lvbiB8fCAnZW52J1xuICAgICAgY29uc3QgcXVlcnkgPSBPYmplY3Qua2V5cyhwYXJhbXMucXVlcnkgfHwge30pXG4gICAgICAgIC5tYXAoa2V5ID0+IGAke2tleX09JHtwYXJhbXMucXVlcnlba2V5XX1gKVxuICAgICAgICAuam9pbignJicpXG5cbiAgICAgIGlmIChhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgICAgd3gubmF2aWdhdGVUbyh7IHVybDogYC9wYWNrYWdlcy8kd2Rfc3lzdGVtL3BhZ2VzL2xvZ2luL2luZGV4JHtxdWVyeSA/IGA/JHtxdWVyeX1gIDogJyd9YCB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RVcmkgPSBwYXJhbXMucmVkaXJlY3RfdXJpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwocmVkaXJlY3RVcmkpXG4gICAgICAgIGNvbnN0IGxvZ2luUGFnZSA9IGAke3VybE9iai5vcmlnaW59L19fYXV0aC8/YXBwX2lkPSR7cGFyYW1zLmFwcF9pZCB8fCAnJ30mZW52X2lkPSR7dGhpcy5jb25maWcuZW52fSZjbGllbnRfaWQ9JHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5jbGllbnRJZCB8fCB0aGlzLmNvbmZpZy5lbnZcbiAgICAgICAgfSZjb25maWdfdmVyc2lvbj0ke2NvbmZpZ1ZlcnNpb259JnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChyZWRpcmVjdFVyaSl9JHtxdWVyeSA/IGAmJHtxdWVyeX1gIDogJyd9YFxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGxvZ2luUGFnZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBudWxsIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHsgZGF0YToge30sIGVycm9yOiBuZXcgQXV0aEVycm9yKGVycm9yKSB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOiHquWumuS5ieeZu+W9lVxuICAgKiBAcGFyYW0gZ2V0VGlja0ZuICgpID0+IFByb21pc2U8c3RyaW5nPiwg6I635Y+W6Ieq5a6a5LmJ55m75b2VIHRpY2tldCDnmoTlh73mlbBcbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHNpZ25JbldpdGhDdXN0b21UaWNrZXQoZ2V0VGlja0ZuPzogYXV0aE1vZGVscy5HZXRDdXN0b21TaWduVGlja2V0Rm4pOiBQcm9taXNlPFNpZ25JblJlcz4ge1xuICAgIGlmIChnZXRUaWNrRm4pIHtcbiAgICAgIHRoaXMuc2V0Q3VzdG9tU2lnbkZ1bmMoZ2V0VGlja0ZuKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5zaWduSW5XaXRoQ3VzdG9tVGlja2V0KClcbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIC8vIGxvZ2luU3RhdGXov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqPb3Blbklk6Z2Z6buY55m75b2VXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoT3BlbklkKHsgdXNlV3hDbG91ZCA9IHRydWUgfSA9IHt9KTogUHJvbWlzZTxTaWduSW5SZXM+IHtcbiAgICBpZiAoIWFkYXB0ZXJGb3JXeE1wLmlzTWF0Y2goKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ3d4IGFwaSB1bmRlZmluZWQnKVxuICAgIH1cbiAgICBjb25zdCB3eEluZm8gPSB3eC5nZXRBY2NvdW50SW5mb1N5bmMoKS5taW5pUHJvZ3JhbVxuXG4gICAgY29uc3QgbWFpbkZ1bmMgPSBhc3luYyAoY29kZSkgPT4ge1xuICAgICAgbGV0IHJlc3VsdDogYXV0aE1vZGVscy5HcmFudFByb3ZpZGVyVG9rZW5SZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4oXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mbz8uYXBwSWQsXG4gICAgICAgICAgICBwcm92aWRlcl9jb2RlOiBjb2RlLFxuICAgICAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ29wZW5faWQnLFxuICAgICAgICAgICAgICBhcHBpZDogd3hJbmZvPy5hcHBJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChyZXN1bHQgYXMgYW55KT8uZXJyb3JfY29kZSB8fCAhcmVzdWx0LnByb3ZpZGVyX3Rva2VuKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0XG4gICAgICAgIH1cblxuICAgICAgICBjcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5hdXRoQXBpLnNpZ25JbldpdGhQcm92aWRlcihcbiAgICAgICAgICB7IHByb3ZpZGVyX3Rva2VuOiByZXN1bHQucHJvdmlkZXJfdG9rZW4gfSxcbiAgICAgICAgICB1c2VXeENsb3VkLFxuICAgICAgICApXG5cbiAgICAgICAgaWYgKChjcmVkZW50aWFscyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgICAgdGhyb3cgY3JlZGVudGlhbHNcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQuc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHMgYXMgQ3JlZGVudGlhbHMpXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3gubG9naW4oe1xuICAgICAgICAgIHN1Y2Nlc3M6IGFzeW5jIChyZXM6IHsgY29kZTogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IG1haW5GdW5jKHJlcy5jb2RlKVxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHJlcz8uZXJyTXNnKVxuICAgICAgICAgICAgOyhlcnJvciBhcyBhbnkpLmNvZGUgPSByZXM/LmVycm5vXG4gICAgICAgICAgICByZWplY3QoZXJyb3IpXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGxvZ2luU3RhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZUxvZ2luU3RhdGUoKVxuXG4gICAgICBjb25zdCB7IGRhdGE6IHsgc2Vzc2lvbiB9ID0ge30gfSA9IGF3YWl0IHRoaXMuZ2V0U2Vzc2lvbigpXG5cbiAgICAgIC8vIGxvZ2luU3RhdGXov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgICAgcmV0dXJuIHsgLi4uKGxvZ2luU3RhdGUgYXMgYW55KSwgZGF0YTogeyB1c2VyOiBzZXNzaW9uLnVzZXIsIHNlc3Npb24gfSwgZXJyb3I6IG51bGwgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5bCP56iL5bqP5omL5py65Y+35o6I5p2D55m75b2V77yM55uu5YmN5Y+q5pSv5oyB5YWo5omY566h5omL5py65Y+35o6I5p2D55m75b2VXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogQHJldHVybnMgUHJvbWlzZTxTaWduSW5SZXM+XG4gICAqL1xuICBhc3luYyBzaWduSW5XaXRoUGhvbmVBdXRoKHsgcGhvbmVDb2RlID0gJycgfSk6IFByb21pc2U8U2lnbkluUmVzPiB7XG4gICAgaWYgKCFhZGFwdGVyRm9yV3hNcC5pc01hdGNoKCkpIHtcbiAgICAgIHJldHVybiB7IGRhdGE6IHt9LCBlcnJvcjogbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2U6ICd3eCBhcGkgdW5kZWZpbmVkJyB9KSB9XG4gICAgfVxuICAgIGNvbnN0IHd4SW5mbyA9IHd4LmdldEFjY291bnRJbmZvU3luYygpLm1pbmlQcm9ncmFtXG4gICAgY29uc3QgcHJvdmlkZXJJbmZvID0ge1xuICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7IHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyB9LFxuICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvZGUgfSA9IGF3YWl0IHd4LmxvZ2luKClcbiAgICA7KHByb3ZpZGVySW5mbyBhcyBhbnkpLnByb3ZpZGVyX2NvZGUgPSBjb2RlXG5cbiAgICB0cnkge1xuICAgICAgbGV0IHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5ncmFudFByb3ZpZGVyVG9rZW4ocHJvdmlkZXJJbmZvKVxuICAgICAgaWYgKHByb3ZpZGVyVG9rZW4uZXJyb3JfY29kZSkge1xuICAgICAgICB0aHJvdyBwcm92aWRlclRva2VuXG4gICAgICB9XG5cbiAgICAgIHByb3ZpZGVyVG9rZW4gPSBhd2FpdCB0aGlzLm9hdXRoSW5zdGFuY2UuYXV0aEFwaS5wYXRjaFByb3ZpZGVyVG9rZW4oe1xuICAgICAgICBwcm92aWRlcl90b2tlbjogcHJvdmlkZXJUb2tlbi5wcm92aWRlcl90b2tlbixcbiAgICAgICAgcHJvdmlkZXJfaWQ6IHd4SW5mby5hcHBJZCxcbiAgICAgICAgcHJvdmlkZXJfcGFyYW1zOiB7XG4gICAgICAgICAgY29kZTogcGhvbmVDb2RlLFxuICAgICAgICAgIHByb3ZpZGVyX2NvZGVfdHlwZTogJ3Bob25lJyxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICBpZiAocHJvdmlkZXJUb2tlbi5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHByb3ZpZGVyVG9rZW5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2lnbkluUmVzID0gYXdhaXQgdGhpcy5vYXV0aEluc3RhbmNlLmF1dGhBcGkuc2lnbkluV2l0aFByb3ZpZGVyKHtcbiAgICAgICAgcHJvdmlkZXJfdG9rZW46IHByb3ZpZGVyVG9rZW4ucHJvdmlkZXJfdG9rZW4sXG4gICAgICB9KVxuXG4gICAgICBpZiAoKHNpZ25JblJlcyBhcyBhbnkpPy5lcnJvcl9jb2RlKSB7XG4gICAgICAgIHRocm93IHNpZ25JblJlc1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4geyBkYXRhOiB7fSwgZXJyb3I6IG5ldyBBdXRoRXJyb3IoZXJyb3IpIH1cbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblN0YXRlID0gYXdhaXQgdGhpcy5jcmVhdGVMb2dpblN0YXRlKClcblxuICAgIGNvbnN0IHsgZGF0YTogeyBzZXNzaW9uIH0gPSB7fSB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgIC8vIGxvZ2luU3RhdGXov5Tlm57mmK/kuLrkuoblhbzlrrl2MueJiOacrFxuICAgIHJldHVybiB7IC4uLihsb2dpblN0YXRlIGFzIGFueSksIGRhdGE6IHsgdXNlcjogc2Vzc2lvbi51c2VyLCBzZXNzaW9uIH0sIGVycm9yOiBudWxsIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UGhvbmUocGhvbmU6IHN0cmluZykge1xuICAgIGlmICghL1xccysvLnRlc3QocGhvbmUpICYmIC9eXFwrXFxkezEsM31cXGQrLy50ZXN0KHBob25lKSkge1xuICAgICAgcmV0dXJuIHBob25lLnJlcGxhY2UoL14oXFwrXFxkezEsMn0pKFxcZCspJC8sICckMSAkMicpXG4gICAgfVxuICAgIHJldHVybiAvXlxcK1xcZHsxLDN9XFxzKy8udGVzdChwaG9uZSkgPyBwaG9uZSA6IGArODYgJHtwaG9uZX1gXG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUxpc3RlbmVycyhldmVudCwgc2Vzc2lvbiwgaW5mbyk6IE9uQXV0aFN0YXRlQ2hhbmdlQ2FsbGJhY2sge1xuICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGNhbGxiYWNrcykgPT4ge1xuICAgICAgY2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbGJhY2soZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gYXV0aCBzdGF0ZSBjaGFuZ2UgY2FsbGJhY2s6JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHsgZXJyb3I6IEVycm9yIHwgbnVsbCB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFscyA9IGF3YWl0IHRoaXMub2F1dGhJbnN0YW5jZS5vYXV0aDJjbGllbnQubG9jYWxDcmVkZW50aWFscy5nZXRDcmVkZW50aWFscygpXG4gICAgICBpZiAoY3JlZGVudGlhbHMpIHtcbiAgICAgICAgdGhpcy5jb25maWcuZXZlbnRCdXM/LmZpcmUoRVZFTlRTLkFVVEhfU1RBVEVfQ0hBTkdFRCwgeyBldmVudDogQVVUSF9TVEFURV9DSEFOR0VEX1RZUEUuSU5JVElBTF9TRVNTSU9OIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIElnbm9yZSBlcnJvcnMgd2hlbiBjaGVja2luZyBmb3IgZXhpc3RpbmcgY3JlZGVudGlhbHNcbiAgICB9XG5cbiAgICByZXR1cm4geyBlcnJvcjogbnVsbCB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuY29uZmlnLmV2ZW50QnVzPy5vbihFVkVOVFMuQVVUSF9TVEFURV9DSEFOR0VELCBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBldmVudCA9IHBhcmFtcz8uZGF0YT8uZXZlbnRcbiAgICAgIGNvbnN0IGluZm8gPSBwYXJhbXM/LmRhdGE/LmluZm9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogeyBzZXNzaW9uIH0sXG4gICAgICB9ID0gYXdhaXQgdGhpcy5nZXRTZXNzaW9uKClcblxuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoZXZlbnQsIHNlc3Npb24sIGluZm8pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVXNlcih1c2VySW5mbzogYXV0aE1vZGVscy5Vc2VySW5mbyAmIFBhcnRpYWw8VXNlcj4pIHtcbiAgICBpZiAoIXVzZXJJbmZvKSByZXR1cm4gbnVsbFxuXG4gICAgLy8g5LyY5YWI5L2/55SoIHVzZXJJbmZvIOS4reeahOaVsOaNru+8iFYzIEFQSe+8iVxuICAgIGNvbnN0IGVtYWlsID0gdXNlckluZm8/LmVtYWlsIHx8IHVzZXJJbmZvPy51c2VybmFtZVxuICAgIGNvbnN0IHBob25lID0gdXNlckluZm8/LnBob25lX251bWJlclxuICAgIGNvbnN0IHVzZXJJZCA9IHVzZXJJbmZvPy5zdWIgfHwgdXNlckluZm8/LnVpZCB8fCAnJ1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB1c2VySWQsXG4gICAgICBhdWQ6ICdhdXRoZW50aWNhdGVkJyxcbiAgICAgIHJvbGU6IHVzZXJJbmZvLmdyb3VwcyxcbiAgICAgIGVtYWlsOiBlbWFpbCB8fCAnJyxcbiAgICAgIGVtYWlsX2NvbmZpcm1lZF9hdDogdXNlckluZm8/LmVtYWlsX3ZlcmlmaWVkID8gdXNlckluZm8uY3JlYXRlZF9hdCA6IHVzZXJJbmZvLmNyZWF0ZWRfYXQsXG4gICAgICBwaG9uZSxcbiAgICAgIHBob25lX2NvbmZpcm1lZF9hdDogcGhvbmUgPyB1c2VySW5mby5jcmVhdGVkX2F0IDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlybWVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgbGFzdF9zaWduX2luX2F0OiB1c2VySW5mby5sYXN0X3NpZ25faW5fYXQsXG4gICAgICBhcHBfbWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6IHVzZXJJbmZvLmxvZ2luVHlwZT8udG9Mb3dlckNhc2UoKSB8fCAnY2xvdWRiYXNlJyxcbiAgICAgICAgcHJvdmlkZXJzOiBbdXNlckluZm8ubG9naW5UeXBlPy50b0xvd2VyQ2FzZSgpIHx8ICdjbG91ZGJhc2UnXSxcbiAgICAgIH0sXG4gICAgICB1c2VyX21ldGFkYXRhOiB7XG4gICAgICAgIC8vIFYzIEFQSSDnlKjmiLfkv6Hmga9cbiAgICAgICAgbmFtZTogdXNlckluZm8/Lm5hbWUsXG4gICAgICAgIHBpY3R1cmU6IHVzZXJJbmZvPy5waWN0dXJlLFxuICAgICAgICB1c2VybmFtZTogdXNlckluZm8/LnVzZXJuYW1lLCAvLyDnlKjmiLflkI3np7DvvIzplb/luqYgNS0yNCDkvY3vvIzmlK/mjIHlrZfnrKbkuK3oi7HmlofjgIHmlbDlrZfjgIHnibnmrorlrZfnrKbvvIjku4XmlK/mjIFfLe+8ie+8jOS4jeaUr+aMgeS4reaWh1xuICAgICAgICBnZW5kZXI6IHVzZXJJbmZvPy5nZW5kZXIsXG4gICAgICAgIGxvY2FsZTogdXNlckluZm8/LmxvY2FsZSxcbiAgICAgICAgLy8gVjIgQVBJIOWFvOWuue+8iOS9v+eUqCBhbnkg6YG/5YWN57G75Z6L6ZSZ6K+v77yJXG4gICAgICAgIHVpZDogdXNlckluZm8udWlkLFxuICAgICAgICBuaWNrTmFtZTogdXNlckluZm8ubmlja05hbWUsXG4gICAgICAgIGF2YXRhclVybDogdXNlckluZm8uYXZhdGFyVXJsIHx8IHVzZXJJbmZvLnBpY3R1cmUsXG4gICAgICAgIGxvY2F0aW9uOiB1c2VySW5mby5sb2NhdGlvbixcbiAgICAgICAgaGFzUGFzc3dvcmQ6IHVzZXJJbmZvLmhhc1Bhc3N3b3JkLFxuICAgICAgfSxcbiAgICAgIGlkZW50aXRpZXM6XG4gICAgICAgIHVzZXJJbmZvPy5wcm92aWRlcnM/Lm1hcChwID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgaWRlbnRpdHlfaWQ6IHAuaWQgfHwgJycsXG4gICAgICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgICAgICAgIGlkZW50aXR5X2RhdGE6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyX2lkOiBwLmlkLFxuICAgICAgICAgICAgcHJvdmlkZXJfdXNlcl9pZDogcC5wcm92aWRlcl91c2VyX2lkLFxuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHAuaWQgfHwgJ2Nsb3VkYmFzZScsXG4gICAgICAgICAgY3JlYXRlZF9hdDogdXNlckluZm8uY3JlYXRlZF9hdCxcbiAgICAgICAgICB1cGRhdGVkX2F0OiB1c2VySW5mby51cGRhdGVkX2F0LFxuICAgICAgICAgIGxhc3Rfc2lnbl9pbl9hdDogdXNlckluZm8ubGFzdF9zaWduX2luX2F0LFxuICAgICAgICB9KSkgfHwgW10sXG4gICAgICBjcmVhdGVkX2F0OiB1c2VySW5mby5jcmVhdGVkX2F0LFxuICAgICAgdXBkYXRlZF9hdDogdXNlckluZm8udXBkYXRlZF9hdCxcbiAgICAgIGlzX2Fub255bW91czogdXNlckluZm8ubmFtZSA9PT0gJ2Fub255bW91cycsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWPguaVsOagoemqjOi+heWKqeaWueazlVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcmFtcyhwYXJhbXM6IGFueSwgcnVsZXM6IHsgW2tleTogc3RyaW5nXTogeyByZXF1aXJlZD86IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9IH0pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHJ1bGVdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bGVzKSkge1xuICAgICAgaWYgKHJ1bGUucmVxdWlyZWQgJiYgKHBhcmFtcz8uW2tleV0gPT09IHVuZGVmaW5lZCB8fCBwYXJhbXM/LltrZXldID09PSBudWxsIHx8IHBhcmFtcz8uW2tleV0gPT09ICcnKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKHsgbWVzc2FnZTogcnVsZS5tZXNzYWdlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOagoemqjOW/heWhq+WPguaVsOe7hO+8iOiHs+WwkeacieS4gOS4quWPguaVsOW/hemhu+acieWAvO+8iVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUF0TGVhc3RPbmUocGFyYW1zOiBhbnksIGZpZWxkR3JvdXBzOiBzdHJpbmdbXVtdLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNWYWx1ZSA9IGZpZWxkR3JvdXBzLnNvbWUoZ3JvdXAgPT4gZ3JvdXAuc29tZShmaWVsZCA9PiBwYXJhbXM/LltmaWVsZF0gIT09IHVuZGVmaW5lZCAmJiBwYXJhbXM/LltmaWVsZF0gIT09IG51bGwgJiYgcGFyYW1zPy5bZmllbGRdICE9PSAnJyksKVxuXG4gICAgaWYgKCFoYXNWYWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcih7IG1lc3NhZ2UgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==