@sunbird-cb/toc 0.0.8 → 0.0.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.
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +40 -4
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +210 -63
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +34 -1
- package/esm2022/lib/services/app-toc-v2.service.mjs +105 -16
- package/esm2022/lib/services/app-toc.service.mjs +303 -43
- package/esm2022/lib/services/viewer-util.service.mjs +30 -21
- package/esm2022/public-api.mjs +3 -1
- package/fesm2022/sunbird-cb-toc.mjs +795 -223
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +2 -0
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +27 -7
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +6 -0
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
- package/lib/services/app-toc-v2.service.d.ts +2 -0
- package/lib/services/app-toc-v2.service.d.ts.map +1 -1
- package/lib/services/app-toc.service.d.ts +64 -1
- package/lib/services/app-toc.service.d.ts.map +1 -1
- package/lib/services/viewer-util.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -0
- package/public-api.d.ts.map +1 -1
|
@@ -53,6 +53,17 @@ const API_END_POINTS = {
|
|
|
53
53
|
NOTIFY_ASSIGNMENT_SUBMISSION: `apis/proxies/v8/v1/notifyAssignment/submit`,
|
|
54
54
|
};
|
|
55
55
|
export class AppTocService {
|
|
56
|
+
/**
|
|
57
|
+
* Helper function to ensure completionStatus is always a number
|
|
58
|
+
* Converts string values to 0 and ensures valid number range (0, 1, 2)
|
|
59
|
+
*/
|
|
60
|
+
safeCompletionStatus(value) {
|
|
61
|
+
const numValue = Number(value);
|
|
62
|
+
if (isNaN(numValue) || typeof value === 'string') {
|
|
63
|
+
return 0;
|
|
64
|
+
}
|
|
65
|
+
return numValue;
|
|
66
|
+
}
|
|
56
67
|
constructor(http, contentLangSvc, configSvc, widgetSvc) {
|
|
57
68
|
this.http = http;
|
|
58
69
|
this.contentLangSvc = contentLangSvc;
|
|
@@ -149,7 +160,7 @@ export class AppTocService {
|
|
|
149
160
|
const foundContent = resumeDataPass.find((el) => el.contentId === sd.sessionId);
|
|
150
161
|
if (foundContent) {
|
|
151
162
|
sd.completionPercentage = foundContent.completionPercentage;
|
|
152
|
-
sd.completionStatus = foundContent.status;
|
|
163
|
+
sd.completionStatus = this.safeCompletionStatus(foundContent.status);
|
|
153
164
|
sd.lastCompletedTime = foundContent.lastCompletedTime;
|
|
154
165
|
}
|
|
155
166
|
});
|
|
@@ -219,7 +230,7 @@ export class AppTocService {
|
|
|
219
230
|
const foundContent = dataResult.find((el) => el.contentId === child.identifier);
|
|
220
231
|
if (foundContent) {
|
|
221
232
|
child.completionPercentage = foundContent.completionPercentage || foundContent.progress;
|
|
222
|
-
child.completionStatus = foundContent.status;
|
|
233
|
+
child.completionStatus = this.safeCompletionStatus(foundContent.status);
|
|
223
234
|
}
|
|
224
235
|
else {
|
|
225
236
|
this.mapCompletionPercentage(child, dataResult);
|
|
@@ -431,6 +442,15 @@ export class AppTocService {
|
|
|
431
442
|
this.analyticsReplaySubject.unsubscribe();
|
|
432
443
|
}
|
|
433
444
|
}
|
|
445
|
+
/**
|
|
446
|
+
* Reset hashmap and related content data
|
|
447
|
+
* Call this when navigating away from content to prevent stale data
|
|
448
|
+
*/
|
|
449
|
+
resetContentData() {
|
|
450
|
+
this.hashmap = {};
|
|
451
|
+
this.hashmapUpdated.next(null);
|
|
452
|
+
console.log('Content data cleared - hashmap reset');
|
|
453
|
+
}
|
|
434
454
|
fetchContentParents(contentId) {
|
|
435
455
|
// return this.http.get<NsContent.IContentMinimal[]>(
|
|
436
456
|
// `${API_END_POINTS.CONTENT_PARENTS}/${contentId}`,
|
|
@@ -752,11 +772,13 @@ export class AppTocService {
|
|
|
752
772
|
});
|
|
753
773
|
}
|
|
754
774
|
}
|
|
755
|
-
createHirarchyProgressHashmap(hierarchyData, rootCourseCategory) {
|
|
775
|
+
createHirarchyProgressHashmap(hierarchyData, rootCourseCategory, parentId) {
|
|
756
776
|
if (hierarchyData && hierarchyData.children) {
|
|
757
777
|
hierarchyData.children.forEach((child) => {
|
|
778
|
+
// IMPORTANT: Pass the current hierarchyData's identifier as the parent for children
|
|
779
|
+
// This ensures correct parent-child relationships in the hashmap
|
|
758
780
|
if (child && child.children) {
|
|
759
|
-
this.createHirarchyProgressHashmap(child, rootCourseCategory);
|
|
781
|
+
this.createHirarchyProgressHashmap(child, rootCourseCategory, hierarchyData.identifier);
|
|
760
782
|
}
|
|
761
783
|
const primaryCat = child.primaryCategory;
|
|
762
784
|
const courseCat = (child.courseCategory || child.primaryCategory || '');
|
|
@@ -770,14 +792,17 @@ export class AppTocService {
|
|
|
770
792
|
const isLearningPathway = rootCourseCategory === 'Learning Pathway';
|
|
771
793
|
// Check if content is mandatory (isMandatory flag or mandatory property)
|
|
772
794
|
const isMandatory = child.isMandatory === true || child.mandatory === true;
|
|
795
|
+
// Use passed parentId (from iteration context) or fallback to child?.parent (from API)
|
|
796
|
+
// This ensures nested children (e.g., assessments inside courses) have correct parent references
|
|
797
|
+
const correctParentId = hierarchyData.identifier || child?.parent;
|
|
773
798
|
let localMap = {
|
|
774
|
-
parent:
|
|
799
|
+
parent: correctParentId,
|
|
775
800
|
identifier: child.identifier,
|
|
776
801
|
leafNodesCount: child.leafNodesCount || null,
|
|
777
802
|
leafNodes: child.leafNodes || [],
|
|
778
803
|
completionPercentage: child.completionPercentage || child.progress || 0,
|
|
779
|
-
completionStatus: child.completionStatus || child.status
|
|
780
|
-
status: child.status || child.completionStatus
|
|
804
|
+
completionStatus: this.safeCompletionStatus(child.completionStatus || child.status),
|
|
805
|
+
status: this.safeCompletionStatus(child.status || child.completionStatus),
|
|
781
806
|
progress: child.progress,
|
|
782
807
|
primaryCategory: child.primaryCategory,
|
|
783
808
|
courseCategory: courseCat,
|
|
@@ -806,6 +831,21 @@ export class AppTocService {
|
|
|
806
831
|
if (isMilestone) {
|
|
807
832
|
// Progress tracked for milestone
|
|
808
833
|
}
|
|
834
|
+
// Debug logging for assessment parent-child relationships
|
|
835
|
+
// Note: FINAL_ASSESSMENT maps to 'Course Assessment' in the enum, not 'Final Assessment'
|
|
836
|
+
const isAssessment = child.primaryCategory === 'Course Assessment' ||
|
|
837
|
+
child.primaryCategory === 'Standalone Assessment' ||
|
|
838
|
+
child.mimeType === 'application/vnd.sunbird.questionset';
|
|
839
|
+
if (isAssessment) {
|
|
840
|
+
console.log(`📋 Adding assessment to hashmap: "${child.name}"`, {
|
|
841
|
+
identifier: child.identifier,
|
|
842
|
+
primaryCategory: child.primaryCategory,
|
|
843
|
+
parent: correctParentId,
|
|
844
|
+
originalParent: child?.parent,
|
|
845
|
+
parentName: hierarchyData.name,
|
|
846
|
+
parentCategory: hierarchyData.primaryCategory
|
|
847
|
+
});
|
|
848
|
+
}
|
|
809
849
|
this.hashmap[child.identifier] = localMap;
|
|
810
850
|
});
|
|
811
851
|
}
|
|
@@ -823,8 +863,8 @@ export class AppTocService {
|
|
|
823
863
|
leafNodesCount: child.leafNodesCount || null,
|
|
824
864
|
leafNodes: child.leafNodes || [],
|
|
825
865
|
completionPercentage: child.completionPercentage || child.progress,
|
|
826
|
-
completionStatus: child.completionStatus,
|
|
827
|
-
status: child.status || child.completionStatus
|
|
866
|
+
completionStatus: this.safeCompletionStatus(child.completionStatus),
|
|
867
|
+
status: this.safeCompletionStatus(child.status || child.completionStatus),
|
|
828
868
|
progress: child.progress,
|
|
829
869
|
primaryCategory: child.primaryCategory,
|
|
830
870
|
courseCategory: child.courseCategory || child.primaryCategory || '',
|
|
@@ -847,7 +887,7 @@ export class AppTocService {
|
|
|
847
887
|
leafNodesCount: hierarchyData.leafNodesCount || null,
|
|
848
888
|
leafNodes: hierarchyData.leafNodes || [],
|
|
849
889
|
completionPercentage: hierarchyData.completionPercentage || hierarchyData.progress || 0,
|
|
850
|
-
completionStatus: hierarchyData.completionStatus
|
|
890
|
+
completionStatus: this.safeCompletionStatus(hierarchyData.completionStatus),
|
|
851
891
|
progress: hierarchyData.progress,
|
|
852
892
|
primaryCategory: hierarchyData.primaryCategory,
|
|
853
893
|
courseCategory: rootCourseCategory,
|
|
@@ -891,22 +931,63 @@ export class AppTocService {
|
|
|
891
931
|
* - All mandatory learning items in Milestone N-1 are completed
|
|
892
932
|
* - The assessment of Milestone N-1 is completed
|
|
893
933
|
*/
|
|
934
|
+
/**
|
|
935
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
936
|
+
* LEARNING PATHWAY MILESTONE LOCKING SYSTEM - SINGLE SOURCE OF TRUTH
|
|
937
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
938
|
+
*
|
|
939
|
+
* This method is the SINGLE SOURCE OF TRUTH for all milestone and assessment locking.
|
|
940
|
+
* All locking logic is computed here and stored in the hashmap.
|
|
941
|
+
* Components READ ONLY from the hashmap - they do NOT compute locks themselves.
|
|
942
|
+
*
|
|
943
|
+
* LOCKING RULES:
|
|
944
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
945
|
+
* 1. DEFAULT STATE: All milestones are LOCKED by default
|
|
946
|
+
*
|
|
947
|
+
* 2. MILESTONE 1 UNLOCKING:
|
|
948
|
+
* - Unlocks when: Pre-assessment is 100% complete
|
|
949
|
+
* - Lock message: "Complete the preliminary assessment to unlock this milestone"
|
|
950
|
+
*
|
|
951
|
+
* 3. MILESTONE N (N >= 2) UNLOCKING:
|
|
952
|
+
* - Unlocks when: Previous milestone is 100% complete
|
|
953
|
+
* - Previous milestone is complete when:
|
|
954
|
+
* a) All MANDATORY courses are 100% complete
|
|
955
|
+
* b) Milestone assessment is 100% complete
|
|
956
|
+
* - Lock message: "Complete all mandatory content and assessment in Milestone N-1"
|
|
957
|
+
*
|
|
958
|
+
* 4. ASSESSMENT LOCKING (within unlocked milestones):
|
|
959
|
+
* - Assessment locked until: All MANDATORY courses in SAME milestone complete
|
|
960
|
+
* - Optional courses do NOT affect assessment locking
|
|
961
|
+
* - Assessment lock message: "Complete all mandatory items to unlock the assessment"
|
|
962
|
+
* - Once assessment is completed, it stays unlocked
|
|
963
|
+
*
|
|
964
|
+
* 5. PARENT MILESTONE LOCKING:
|
|
965
|
+
* - All content inside locked milestone gets isParentMilestoneLocked = true
|
|
966
|
+
* - This includes courses, assessments, nested resources
|
|
967
|
+
*
|
|
968
|
+
* 6. MANDATORY vs OPTIONAL:
|
|
969
|
+
* - By default, ALL courses are mandatory (unless isMandatory: false)
|
|
970
|
+
* - Optional courses do NOT block progression
|
|
971
|
+
*
|
|
972
|
+
* ═══════════════════════════════════════════════════════════════════════════
|
|
973
|
+
*/
|
|
894
974
|
computeMilestoneLockingStatus(isEnrolled = true) {
|
|
895
975
|
if (!this.hashmap || Object.keys(this.hashmap).length === 0) {
|
|
976
|
+
console.warn('⚠️ Hashmap is empty - cannot compute milestone locking');
|
|
896
977
|
return;
|
|
897
978
|
}
|
|
898
|
-
console.log('
|
|
979
|
+
console.log('\n═══════════════════════════════════════════════════════════');
|
|
980
|
+
console.log('🔒 MILESTONE LOCKING COMPUTATION START');
|
|
981
|
+
console.log('═══════════════════════════════════════════════════════════');
|
|
899
982
|
console.log('User enrolled:', isEnrolled);
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
// Get all milestone entries from hashmap sorted by their index or number
|
|
983
|
+
console.log('Hashmap size:', Object.keys(this.hashmap).length);
|
|
984
|
+
// STEP 1: Find all milestones and sort by index
|
|
903
985
|
const milestoneEntries = Object.keys(this.hashmap)
|
|
904
986
|
.filter(key => {
|
|
905
987
|
const item = this.hashmap[key];
|
|
906
988
|
return item.isMilestone || item.primaryCategory === 'Milestone' || item.courseCategory === 'Milestone';
|
|
907
989
|
})
|
|
908
990
|
.sort((a, b) => {
|
|
909
|
-
// Sort by milestoneIndex if available, otherwise by number in ID
|
|
910
991
|
const itemA = this.hashmap[a];
|
|
911
992
|
const itemB = this.hashmap[b];
|
|
912
993
|
if (itemA.milestoneIndex !== undefined && itemB.milestoneIndex !== undefined) {
|
|
@@ -916,65 +997,110 @@ export class AppTocService {
|
|
|
916
997
|
const numB = parseInt(b.replace(/\D/g, '')) || 0;
|
|
917
998
|
return numA - numB;
|
|
918
999
|
});
|
|
919
|
-
|
|
1000
|
+
if (milestoneEntries.length === 0) {
|
|
1001
|
+
console.log('ℹ️ No milestones found - skipping milestone locking');
|
|
1002
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
1003
|
+
return;
|
|
1004
|
+
}
|
|
1005
|
+
console.log(`\n📍 Found ${milestoneEntries.length} milestones:`);
|
|
1006
|
+
milestoneEntries.forEach((id, i) => {
|
|
1007
|
+
console.log(` M${i + 1}: ${this.hashmap[id].name || id}`);
|
|
1008
|
+
});
|
|
1009
|
+
// STEP 2: If user NOT enrolled, lock ALL milestones and children
|
|
920
1010
|
if (!isEnrolled) {
|
|
921
|
-
console.log('User
|
|
1011
|
+
console.log('\n⚠️ User NOT enrolled - locking ALL milestones and children');
|
|
922
1012
|
milestoneEntries.forEach(milestoneId => {
|
|
923
1013
|
this.hashmap[milestoneId].computedIsLocked = true;
|
|
1014
|
+
this.hashmap[milestoneId].unlockMessage = 'Enroll in this course to access milestones';
|
|
924
1015
|
});
|
|
925
|
-
//
|
|
1016
|
+
// Lock all children
|
|
926
1017
|
Object.keys(this.hashmap).forEach(key => {
|
|
927
|
-
|
|
928
|
-
if (!item.isMilestone) {
|
|
1018
|
+
if (!this.hashmap[key].isMilestone) {
|
|
929
1019
|
this.hashmap[key].isParentMilestoneLocked = true;
|
|
930
1020
|
}
|
|
931
1021
|
});
|
|
932
1022
|
this.hashmap = { ...this.hashmap };
|
|
933
1023
|
this.hashmapUpdated.next({ timestamp: Date.now(), hashmap: this.hashmap });
|
|
1024
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
934
1025
|
return;
|
|
935
1026
|
}
|
|
936
|
-
// Check
|
|
1027
|
+
// STEP 3: Check pre-assessment completion
|
|
937
1028
|
const isPreAssessmentCompleted = this.checkPreAssessmentCompletion();
|
|
1029
|
+
console.log(`\n📝 Pre-assessment: ${isPreAssessmentCompleted ? '✅ COMPLETE' : '❌ INCOMPLETE'}`);
|
|
1030
|
+
// STEP 4: Compute locking for each milestone
|
|
1031
|
+
console.log('\n🔐 Computing milestone locks:');
|
|
1032
|
+
console.log('─────────────────────────────────────────────────────────────');
|
|
938
1033
|
milestoneEntries.forEach((milestoneId, index) => {
|
|
939
1034
|
const milestone = this.hashmap[milestoneId];
|
|
940
1035
|
if (!milestone)
|
|
941
1036
|
return;
|
|
942
|
-
|
|
1037
|
+
const milestoneNum = index + 1;
|
|
1038
|
+
console.log(`\n📌 Milestone ${milestoneNum} (${milestone.name || milestoneId}):`);
|
|
1039
|
+
// MILESTONE 1: Unlocks when pre-assessment complete
|
|
943
1040
|
if (index === 0) {
|
|
944
|
-
|
|
1041
|
+
const isLocked = !isPreAssessmentCompleted;
|
|
1042
|
+
this.hashmap[milestoneId].computedIsLocked = isLocked;
|
|
1043
|
+
this.hashmap[milestoneId].unlockMessage = isLocked ?
|
|
1044
|
+
'Complete the preliminary assessment to unlock this milestone' : '';
|
|
1045
|
+
console.log(` ${isLocked ? '🔒 LOCKED' : '🔓 UNLOCKED'}`);
|
|
1046
|
+
console.log(` Reason: Pre-assessment ${isPreAssessmentCompleted ? 'complete' : 'incomplete'}`);
|
|
1047
|
+
// For unlocked M1, check assessment locking
|
|
1048
|
+
if (!isLocked) {
|
|
1049
|
+
console.log(` ✓ Checking assessment lock...`);
|
|
1050
|
+
this.computeAssessmentLockingInMilestone(milestoneId);
|
|
1051
|
+
}
|
|
1052
|
+
else {
|
|
1053
|
+
console.log(` ⨯ Milestone locked - marking all children as parent-locked`);
|
|
1054
|
+
this.markMilestoneChildrenAsParentLocked(milestoneId, true);
|
|
1055
|
+
}
|
|
945
1056
|
return;
|
|
946
1057
|
}
|
|
947
|
-
//
|
|
1058
|
+
// MILESTONE N (N > 1): Unlocks when previous milestone complete
|
|
948
1059
|
const previousMilestoneId = milestoneEntries[index - 1];
|
|
949
1060
|
const previousMilestone = this.hashmap[previousMilestoneId];
|
|
950
1061
|
if (previousMilestone) {
|
|
951
|
-
//
|
|
952
|
-
// This uses the aggregated completion percentage which is already calculated
|
|
953
|
-
// Use Number() to ensure proper numeric comparison
|
|
1062
|
+
// Check completion via multiple strategies
|
|
954
1063
|
const prevCompletionPct = Number(previousMilestone.completionPercentage) || 0;
|
|
955
1064
|
const prevCompletionStatus = Number(previousMilestone.completionStatus) || 0;
|
|
956
1065
|
const prevStatus = Number(previousMilestone.status) || 0;
|
|
957
1066
|
const prevCompletedLeafNodes = Number(previousMilestone.completedLeafNodesCount) || 0;
|
|
958
1067
|
const prevLeafNodesCount = Number(previousMilestone.leafNodesCount) || 0;
|
|
959
|
-
|
|
1068
|
+
let previousMilestoneComplete = prevCompletionPct >= 100 ||
|
|
960
1069
|
prevCompletionStatus === 2 ||
|
|
961
1070
|
prevStatus === 2 ||
|
|
962
1071
|
(prevLeafNodesCount > 0 && prevCompletedLeafNodes >= prevLeafNodesCount);
|
|
963
|
-
//
|
|
964
|
-
|
|
965
|
-
if (!canUnlock) {
|
|
966
|
-
// Fallback: Check individual items
|
|
1072
|
+
// Fallback: Check individual items
|
|
1073
|
+
if (!previousMilestoneComplete) {
|
|
967
1074
|
const isPreviousMilestoneAssessmentComplete = this.checkMilestoneAssessmentComplete(previousMilestoneId);
|
|
968
1075
|
const isPreviousMilestoneMandatoryComplete = this.checkMilestoneMandatoryContentComplete(previousMilestoneId);
|
|
969
|
-
|
|
1076
|
+
previousMilestoneComplete = isPreviousMilestoneAssessmentComplete && isPreviousMilestoneMandatoryComplete;
|
|
1077
|
+
console.log(` Fallback check: mandatory=${isPreviousMilestoneMandatoryComplete}, assessment=${isPreviousMilestoneAssessmentComplete}`);
|
|
1078
|
+
}
|
|
1079
|
+
const isLocked = !previousMilestoneComplete;
|
|
1080
|
+
this.hashmap[milestoneId].computedIsLocked = isLocked;
|
|
1081
|
+
this.hashmap[milestoneId].unlockMessage = isLocked ?
|
|
1082
|
+
`Complete all mandatory content and assessment in Milestone ${index} to unlock this milestone` : '';
|
|
1083
|
+
console.log(` ${isLocked ? '🔒 LOCKED' : '🔓 UNLOCKED'}`);
|
|
1084
|
+
console.log(` Reason: Previous milestone ${previousMilestoneComplete ? 'complete' : 'incomplete'}`);
|
|
1085
|
+
console.log(` Previous M${index} progress: ${prevCompletionPct}%`);
|
|
1086
|
+
// For unlocked milestones, check assessment locking
|
|
1087
|
+
if (!isLocked) {
|
|
1088
|
+
console.log(` ✓ Checking assessment lock...`);
|
|
1089
|
+
this.computeAssessmentLockingInMilestone(milestoneId);
|
|
1090
|
+
}
|
|
1091
|
+
else {
|
|
1092
|
+
console.log(` ⨯ Milestone locked - marking all children as parent-locked`);
|
|
1093
|
+
this.markMilestoneChildrenAsParentLocked(milestoneId, true);
|
|
970
1094
|
}
|
|
971
|
-
this.hashmap[milestoneId].computedIsLocked = !canUnlock;
|
|
972
1095
|
}
|
|
973
1096
|
else {
|
|
974
1097
|
this.hashmap[milestoneId].computedIsLocked = true;
|
|
1098
|
+
this.hashmap[milestoneId].unlockMessage = 'Previous milestone not found';
|
|
1099
|
+
console.log(` 🔒 LOCKED (previous milestone not found)`);
|
|
975
1100
|
}
|
|
976
1101
|
});
|
|
977
|
-
//
|
|
1102
|
+
// STEP 5: Compute parent milestone lock status for ALL children
|
|
1103
|
+
console.log('\n🔗 Computing parent milestone locks for all children...');
|
|
978
1104
|
Object.keys(this.hashmap).forEach(key => {
|
|
979
1105
|
const item = this.hashmap[key];
|
|
980
1106
|
if (item.isMilestone)
|
|
@@ -983,11 +1109,13 @@ export class AppTocService {
|
|
|
983
1109
|
let currentParentId = item.parent;
|
|
984
1110
|
let depth = 0;
|
|
985
1111
|
const maxDepth = 5;
|
|
1112
|
+
let foundLockedParent = false;
|
|
986
1113
|
while (currentParentId && depth < maxDepth) {
|
|
987
1114
|
const parentData = this.hashmap[currentParentId];
|
|
988
1115
|
if (parentData) {
|
|
989
1116
|
if (parentData.isMilestone && parentData.computedIsLocked) {
|
|
990
1117
|
this.hashmap[key].isParentMilestoneLocked = true;
|
|
1118
|
+
foundLockedParent = true;
|
|
991
1119
|
break;
|
|
992
1120
|
}
|
|
993
1121
|
currentParentId = parentData.parent;
|
|
@@ -997,17 +1125,16 @@ export class AppTocService {
|
|
|
997
1125
|
}
|
|
998
1126
|
depth++;
|
|
999
1127
|
}
|
|
1000
|
-
if (!
|
|
1128
|
+
if (!foundLockedParent) {
|
|
1001
1129
|
this.hashmap[key].isParentMilestoneLocked = false;
|
|
1002
1130
|
}
|
|
1003
1131
|
});
|
|
1004
|
-
//
|
|
1132
|
+
// STEP 6: Trigger hashmap update
|
|
1133
|
+
console.log('\n─────────────────────────────────────────────────────────────');
|
|
1134
|
+
console.log('✅ Milestone locking computation COMPLETE');
|
|
1135
|
+
console.log('═══════════════════════════════════════════════════════════\n');
|
|
1005
1136
|
this.hashmap = { ...this.hashmap };
|
|
1006
|
-
|
|
1007
|
-
const finalHashmapSnapshot = JSON.stringify(this.hashmap);
|
|
1008
|
-
if (initialHashmapSnapshot !== finalHashmapSnapshot) {
|
|
1009
|
-
this.hashmapUpdated.next({ timestamp: Date.now(), hashmap: this.hashmap });
|
|
1010
|
-
}
|
|
1137
|
+
this.hashmapUpdated.next({ timestamp: Date.now(), hashmap: this.hashmap });
|
|
1011
1138
|
}
|
|
1012
1139
|
/**
|
|
1013
1140
|
* Trigger milestone lock update when hashmap progress is updated externally
|
|
@@ -1188,6 +1315,139 @@ export class AppTocService {
|
|
|
1188
1315
|
}
|
|
1189
1316
|
return false;
|
|
1190
1317
|
}
|
|
1318
|
+
/**
|
|
1319
|
+
* Compute assessment locking within an unlocked milestone
|
|
1320
|
+
* Assessment locks until all mandatory courses in the milestone are completed
|
|
1321
|
+
*/
|
|
1322
|
+
computeAssessmentLockingInMilestone(milestoneId) {
|
|
1323
|
+
const milestone = this.hashmap[milestoneId];
|
|
1324
|
+
if (!milestone)
|
|
1325
|
+
return;
|
|
1326
|
+
console.log(`Computing assessment locking for milestone: ${milestoneId}`);
|
|
1327
|
+
// Find assessment in this milestone
|
|
1328
|
+
let assessmentId = null;
|
|
1329
|
+
let assessment = null;
|
|
1330
|
+
for (const key of Object.keys(this.hashmap)) {
|
|
1331
|
+
const item = this.hashmap[key];
|
|
1332
|
+
// Check if this is an assessment that belongs to this milestone
|
|
1333
|
+
// Must have BOTH: correct category/mimeType AND parent is milestone
|
|
1334
|
+
const isAssessment = (item.primaryCategory === 'Course Assessment' ||
|
|
1335
|
+
item.primaryCategory === 'Final Assessment' ||
|
|
1336
|
+
item.primaryCategory === 'Standalone Assessment' ||
|
|
1337
|
+
item.mimeType === 'application/vnd.sunbird.questionset' ||
|
|
1338
|
+
item.mimeType === 'application/quiz') && item.parent === milestoneId; // MUST be direct child of milestone
|
|
1339
|
+
if (isAssessment) {
|
|
1340
|
+
assessmentId = key;
|
|
1341
|
+
assessment = item;
|
|
1342
|
+
console.log(`✅ Found milestone assessment: ${item.name} (${key})`);
|
|
1343
|
+
break;
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
if (!assessmentId || !assessment) {
|
|
1347
|
+
console.log(`No assessment found in milestone ${milestoneId}`);
|
|
1348
|
+
return;
|
|
1349
|
+
}
|
|
1350
|
+
// Check if assessment is already completed - re-read from hashmap to get latest data
|
|
1351
|
+
const latestAssessment = this.hashmap[assessmentId];
|
|
1352
|
+
const assessmentCompleted = latestAssessment.completionStatus === 2 ||
|
|
1353
|
+
latestAssessment.status === 2 ||
|
|
1354
|
+
latestAssessment.completionPercentage >= 100;
|
|
1355
|
+
if (assessmentCompleted) {
|
|
1356
|
+
this.hashmap[assessmentId].isAssessmentLocked = false;
|
|
1357
|
+
this.hashmap[assessmentId].milestoneAssessmentLocked = false;
|
|
1358
|
+
this.hashmap[assessmentId].assessmentLockMessage = '';
|
|
1359
|
+
console.log(`Assessment ${assessmentId} is completed - unlocking`);
|
|
1360
|
+
return;
|
|
1361
|
+
}
|
|
1362
|
+
// Count mandatory courses and check their completion
|
|
1363
|
+
let mandatoryCount = 0;
|
|
1364
|
+
let completedMandatoryCount = 0;
|
|
1365
|
+
for (const key of Object.keys(this.hashmap)) {
|
|
1366
|
+
const item = this.hashmap[key];
|
|
1367
|
+
// Skip the assessment itself
|
|
1368
|
+
if (key === assessmentId)
|
|
1369
|
+
continue;
|
|
1370
|
+
// Check if item belongs to this milestone
|
|
1371
|
+
let belongsToMilestone = false;
|
|
1372
|
+
if (item.parent === milestoneId) {
|
|
1373
|
+
belongsToMilestone = true;
|
|
1374
|
+
}
|
|
1375
|
+
else if (item.parent && this.hashmap[item.parent]) {
|
|
1376
|
+
const parentItem = this.hashmap[item.parent];
|
|
1377
|
+
if (parentItem.parent === milestoneId && parentItem.primaryCategory === 'Course') {
|
|
1378
|
+
belongsToMilestone = true;
|
|
1379
|
+
}
|
|
1380
|
+
}
|
|
1381
|
+
if (!belongsToMilestone)
|
|
1382
|
+
continue;
|
|
1383
|
+
// Check if this is an assessment (skip other assessments)
|
|
1384
|
+
const isItemAssessment = item.primaryCategory === 'Course Assessment' ||
|
|
1385
|
+
item.primaryCategory === 'Final Assessment' ||
|
|
1386
|
+
item.primaryCategory === 'Standalone Assessment' ||
|
|
1387
|
+
item.mimeType === 'application/vnd.sunbird.questionset' ||
|
|
1388
|
+
item.mimeType === 'application/quiz' ||
|
|
1389
|
+
(item.name && item.name.toLowerCase().includes('assessment'));
|
|
1390
|
+
if (isItemAssessment)
|
|
1391
|
+
continue;
|
|
1392
|
+
// Check if this is mandatory content
|
|
1393
|
+
// By default, courses are mandatory unless explicitly marked otherwise
|
|
1394
|
+
const isMandatory = item.isMandatory !== false &&
|
|
1395
|
+
(item.primaryCategory === 'Course' || item.isMandatory === true);
|
|
1396
|
+
if (isMandatory) {
|
|
1397
|
+
mandatoryCount++;
|
|
1398
|
+
const isCompleted = item.completionStatus === 2 ||
|
|
1399
|
+
item.status === 2 ||
|
|
1400
|
+
item.completionPercentage >= 100 ||
|
|
1401
|
+
item.progress >= 100;
|
|
1402
|
+
if (isCompleted) {
|
|
1403
|
+
completedMandatoryCount++;
|
|
1404
|
+
}
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
// Determine if assessment should be locked
|
|
1408
|
+
const allMandatoryComplete = mandatoryCount === 0 || completedMandatoryCount >= mandatoryCount;
|
|
1409
|
+
this.hashmap[assessmentId].isAssessmentLocked = !allMandatoryComplete;
|
|
1410
|
+
this.hashmap[assessmentId].milestoneAssessmentLocked = !allMandatoryComplete;
|
|
1411
|
+
this.hashmap[assessmentId].assessmentLockMessage = !allMandatoryComplete ?
|
|
1412
|
+
'This content is locked. Complete all mandatory items to unlock the assessment.' : '';
|
|
1413
|
+
console.log(`Assessment ${assessmentId} locking:`, {
|
|
1414
|
+
mandatoryCount,
|
|
1415
|
+
completedMandatoryCount,
|
|
1416
|
+
isLocked: !allMandatoryComplete,
|
|
1417
|
+
milestoneAssessmentLocked: !allMandatoryComplete
|
|
1418
|
+
});
|
|
1419
|
+
}
|
|
1420
|
+
/**
|
|
1421
|
+
* Mark all children of a milestone as parent-locked or unlocked
|
|
1422
|
+
*/
|
|
1423
|
+
markMilestoneChildrenAsParentLocked(milestoneId, isLocked) {
|
|
1424
|
+
for (const key of Object.keys(this.hashmap)) {
|
|
1425
|
+
const item = this.hashmap[key];
|
|
1426
|
+
// Direct children of milestone
|
|
1427
|
+
if (item.parent === milestoneId) {
|
|
1428
|
+
this.hashmap[key].isParentMilestoneLocked = isLocked;
|
|
1429
|
+
// Also mark nested children (e.g., resources inside courses)
|
|
1430
|
+
if (item.children) {
|
|
1431
|
+
this.markNestedChildrenAsParentLocked(key, isLocked);
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
}
|
|
1435
|
+
}
|
|
1436
|
+
/**
|
|
1437
|
+
* Recursively mark nested children as parent-locked
|
|
1438
|
+
*/
|
|
1439
|
+
markNestedChildrenAsParentLocked(parentId, isLocked) {
|
|
1440
|
+
for (const key of Object.keys(this.hashmap)) {
|
|
1441
|
+
const item = this.hashmap[key];
|
|
1442
|
+
if (item.parent === parentId) {
|
|
1443
|
+
this.hashmap[key].isParentMilestoneLocked = isLocked;
|
|
1444
|
+
// Recurse for deeper nesting
|
|
1445
|
+
if (item.children) {
|
|
1446
|
+
this.markNestedChildrenAsParentLocked(key, isLocked);
|
|
1447
|
+
}
|
|
1448
|
+
}
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1191
1451
|
getCalculationsFromChildren(item) {
|
|
1192
1452
|
item['duration'] = item.children.reduce((sum, child) => {
|
|
1193
1453
|
return sum + Number(child.duration || 0);
|
|
@@ -1384,4 +1644,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
1384
1644
|
providedIn: 'root'
|
|
1385
1645
|
}]
|
|
1386
1646
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ContentLanguageService }, { type: i3.ConfigurationsService }, { type: i4.WidgetContentService }]; } });
|
|
1387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQWMsS0FBSyxFQUFnQixlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7O0FBRWhELHVDQUF1QztBQUN2QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFBO0FBRXhDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVksRUFBRSxHQUFHLGFBQWEsaUNBQWlDO0lBQy9ELGVBQWUsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7SUFDdkQsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLGVBQWU7SUFDakQsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGNBQWMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLFlBQVksU0FBUyxTQUFTO0lBQ3pGLG1CQUFtQixFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDdkUsaURBQWlELFNBQVMs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S0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw0QkFBNEIsQ0FBQyxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsV0FBbUI7UUFDakcsTUFBTSxNQUFNLEdBQUcsa0RBQWtELENBQUE7UUFDakUsTUFBTSxPQUFPLEdBQUc7WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsTUFBTTtnQkFDTixRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsV0FBVzthQUNaO1NBQ0YsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7K0dBNytDVSxhQUFhO21IQUFiLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgRGF0YSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIEVNUFRZLCBTdWJzY3JpcHRpb24sIEJlaGF2aW9yU3ViamVjdCwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTnNDb250ZW50Q29uc3RhbnRzIH0gZnJvbSAnLi4vX2NvbnN0YW50cy93aWRnZXQtY29udGVudC5jb25zdGFudHMnXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTnNBcHBUb2MsIE5zQ29ob3J0cyB9IGZyb20gJy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuaW1wb3J0IHsgVEZldGNoU3RhdHVzLCBDb25maWd1cmF0aW9uc1NlcnZpY2UgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Midcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgQ29udGVudExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbi8vIFRPRE86IG1vdmUgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZVxuY29uc3QgUFJPVEVDVEVEX1NMQUdfVjggPSAnL2FwaXMvcHJvdGVjdGVkL3Y4J1xuY29uc3QgUFJPWFlfU0xBR19WOCA9ICcvYXBpcy9wcm94aWVzL3Y4J1xuXG5jb25zdCBBUElfRU5EX1BPSU5UUyA9IHtcbiAgQkFUQ0hfQ1JFQVRFOiBgJHtQUk9YWV9TTEFHX1Y4fS9sZWFybmVyL2NvdXJzZS92MS9iYXRjaC9jcmVhdGVgLFxuICBDT05URU5UX1BBUkVOVFM6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L3BhcmVudHNgLFxuICBDT05URU5UX05FWFQ6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L25leHRgLFxuICBDT05URU5UX0hJU1RPUllWMjogYC9hcGlzL3Byb3hpZXMvdjgvcmVhZC9jb250ZW50LXByb2dyZXNgLFxuICBDT05URU5UX1BBUkVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PiBgJHtQUk9URUNURURfU0xBR19WOH0vY29udGVudC8ke2NvbnRlbnRJZH0vcGFyZW50YCxcbiAgQ09OVEVOVF9BVVRIX1BBUkVOVDogKGNvbnRlbnRJZDogc3RyaW5nLCByb290T3JnOiBzdHJpbmcsIG9yZzogc3RyaW5nKSA9PlxuICAgIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L3BhcmVudC9oaWVyYXJjaHkvJHtjb250ZW50SWR9P3Jvb3RPcmc9JHtyb290T3JnfSZvcmc9JHtvcmd9YCxcbiAgQ09IT1JUUzogKGNvaG9ydFR5cGU6IE5zQ29ob3J0cy5FQ29ob3J0VHlwZXMsIGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzLyR7Y29ob3J0VHlwZX0vJHtjb250ZW50SWR9YCxcbiAgRVhURVJOQUxfQ09OVEVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L2V4dGVybmFsLWFjY2Vzcy8ke2NvbnRlbnRJZH1gLFxuICBDT0hPUlRTX0dST1VQX1VTRVI6IChncm91cElkOiBudW1iZXIpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzLyR7Z3JvdXBJZH1gLFxuICBSRUxBVEVEX1JFU09VUkNFOiAoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2todWIvZmV0Y2hSZWxhdGVkUmVzb3VyY2VzLyR7Y29udGVudElkfS8ke2NvbnRlbnRUeXBlfWAsXG4gIFBPU1RfQVNTRVNTTUVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS91c2VyL2V2YWx1YXRlL3Bvc3QtYXNzZXNzbWVudC8ke2NvbnRlbnRJZH1gLFxuICBHRVRfQ09OVEVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1hZX1NMQUdfVjh9L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YCxcbiAgQ0VSVF9ET1dOTE9BRDogKGNlcnRJZDogYW55KSA9PiBgJHtQUk9URUNURURfU0xBR19WOH0vY29ob3J0cy9jb3Vyc2UvYmF0Y2gvY2VydC9kb3dubG9hZC8ke2NlcnRJZH1gLFxuICBTRVJWRVJfREFURTogJ2FwaXMvcHVibGljL3Y4L3N5c3RlbURhdGUnLFxuICBTSEFSRV9DT05URU5UOiAnL2FwaXMvcHJveGllcy92OC91c2VyL3YxL2NvbnRlbnQvcmVjb21tZW5kJyxcbiAgR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEZvcm1CeUlkP2Zvcm1JZD0ke2Zvcm1JZH1gLFxuICAvLyBTVUJNSVRfRk9STTogYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjEvc2F2ZUZvcm1TdWJtaXRgLFxuICBTVUJNSVRfRk9STTogYGFwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9zYXZlRm9ybVN1Ym1pdGAsXG4gIEdFVF9GT1JNX0JZSURfUFVCTElDOiAoZm9ybUlkOiBzdHJpbmcpID0+IGBhcGlzL3B1YmxpYy92OC9wdWJsaWMvZm9ybXMvdjIvZ2V0Rm9ybUJ5SWQ/Zm9ybUlkPSR7Zm9ybUlkfWAsXG4gIFNVQk1JVF9GT1JNX1BVQkxJQzogYGFwaXMvcHVibGljL3Y4L3B1YmxpYy9mb3Jtcy92Mi9zYXZlRm9ybVN1Ym1pdGAsXG4gIC8vIGdldCBhbnN3ZXJzIGZvciBmb3JtXG4gIEdFVF9BUFBMSUNBVElPTlNfQllfSUQ6IChmb3JtSWQ6IHN0cmluZywgY29udGV4dElkOiBzdHJpbmcpID0+IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEFwcGxpY2F0aW9uc0J5SWQ/Zm9ybUlkPSR7Zm9ybUlkfSZjb250ZXh0SWQ9JHtjb250ZXh0SWR9YCxcbiAgQUlfUkVTT1VSQ0VfVlRUX0ZJTEU6IGAke1BST1hZX1NMQUdfVjh9L2NoYXRib3QvdjMvdHJhbnNjb2Rlci9zdGF0c2AsXG4gIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxuICBQUkVfRU5ST0xMTUVOVF9TVEFURV9SRUFEOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50L3YyL3N0YXRlL3JlYWRgLFxuICBDUkVBVEVfUkVTT1VSQ0U6IGBhcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvY3JlYXRlYCxcbiAgUkVBRF9SRVNPVVJDRTogYGFwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9gLFxuICBVUExPQURfRklMRTogYGFwaXMvcHJveGllcy92OC91cGxvYWQvYWN0aW9uL2NvbnRlbnQvdjMvYCxcbiAgVVBEQVRFX1JFU09VUkNFOiBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3VwZGF0ZWAsXG4gIFNFQVJDSDogYGFwaXMvcHJveGllcy92OC9hc3NpZ25tZW50L3YxL3NlYXJjaGAsXG4gIFNVQk1JVF9EUkFGVF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc3VibWl0RHJhZnRgLFxuICBTVUJNSVRfQVNTSUdOTUVOVDogYGFwaXMvcHJveGllcy92OC9hc3NpZ25tZW50L3YxL3N1Ym1pdGAsXG4gIEFTU0lHTk1FTlRfU1RBVFVTOiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3N1Ym1pc3Npb25zL3NlYXJjaGAsXG4gIFVQTE9BRF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L3N0b3JhZ2UvdjEvYnAvYXNzaWdubWVudC9hbnN3ZXJgLFxuICBSRUFEX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvc3RvcmFnZS92MS9icC9hc3NpZ25tZW50L2Fuc3dlci9yZWFkL2ZpbGVgLFxuICBOT1RJRllfQVNTSUdOTUVOVF9TVUJNSVNTSU9OOiBgYXBpcy9wcm94aWVzL3Y4L3YxL25vdGlmeUFzc2lnbm1lbnQvc3VibWl0YCxcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jU2VydmljZSB7XG4gIGFuYWx5dGljc1JlcGxheVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgYW5hbHl0aWNzRmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cyA9ICdub25lJ1xuICBiYXRjaFJlcGxheVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgc2V0QmF0Y2hEYXRhU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBnZXRTZWxlY3RlZEJhdGNoOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpXG4gIHNldFdGRGF0YVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgcmVzdW1lRGF0YTogU3ViamVjdDxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhIHwgbnVsbD4gPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgcHJpdmF0ZSBzaG93U3VidGl0bGVPbkJhbm5lcnMgPSBmYWxzZVxuICBwcml2YXRlIGNhblNob3dEZXNjcmlwdGlvbiA9IGZhbHNlXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHByaXZhdGUgdXBkYXRlUmV2aWV3cyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG4gIHVwZGF0ZVJldmlld3NPYnNlcnZhYmxlID0gdGhpcy51cGRhdGVSZXZpZXdzLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBzZXJ2ZXJEYXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJylcbiAgY3VycmVudFNlcnZlckRhdGUgPSB0aGlzLnNlcnZlckRhdGUuYXNPYnNlcnZhYmxlKClcbiAgcHVibGljIGNvbnRlbnRMb2FkZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKVxuICBjb250ZW50TG9hZGVyJCA9IHRoaXMuY29udGVudExvYWRlci5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgZ2V0UGFnZVNjcm9sbCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSlcbiAgdXBkYXRlUGFnZVNjcm9sbCA9IHRoaXMuZ2V0UGFnZVNjcm9sbC5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgaGFzaG1hcDogYW55ID0ge31cbiAgcHVibGljIGhhc2htYXBVcGRhdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpXG4gIGhhc2htYXBVcGRhdGVkJCA9IHRoaXMuaGFzaG1hcFVwZGF0ZWQuYXNPYnNlcnZhYmxlKClcbiAgcHJpdmF0ZSB0cmFuc3JpcHRpb25EYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTsgLy8gU3RhcnQgd2l0aCBudWxsXG4gIHRyYW5zY3JpcHRpb25EYXRhJCA9IHRoaXMudHJhbnNyaXB0aW9uRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QkID0gdGhpcy50cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25JZGVudGlmaWVyID0gbmV3IFN1YmplY3QoKTsgLy8gU3RhcnQgd2l0aCBudWxsXG4gIGNoYW5nZVRyYW5zY3JpcHRpb25MYW5ndWFnZUV2ZW50ID0gbmV3IFN1YmplY3QoKVxuICBwbGF5VHJhbnNjcmlwdGlvblZpZGVvID0gbmV3IFN1YmplY3QoKVxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgY29udGVudExhbmdTdmM6IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsIHByaXZhdGUgd2lkZ2V0U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSkge1xuICAgIC8vIHRoaXMgcmVzdW1lIGRhdGEgc3Vic2NyaXB0aW9uIGlzIGZvciBvbiBsb2FkXG4gICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5yZXN1bWVEYXRhLnN1YnNjcmliZShcbiAgICAgIChfZGF0YVJlc3VsdDogYW55KSA9PiB7XG4gICAgICB9KVxuICB9XG5cbiAgZ2V0IHN1YnRpdGxlT25CYW5uZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dTdWJ0aXRsZU9uQmFubmVyc1xuICB9XG4gIHNldCBzdWJ0aXRsZU9uQmFubmVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dTdWJ0aXRsZU9uQmFubmVycyA9IHZhbFxuICB9XG4gIGdldCBzaG93RGVzY3JpcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2hvd0Rlc2NyaXB0aW9uXG4gIH1cbiAgc2V0IHNob3dEZXNjcmlwdGlvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNhblNob3dEZXNjcmlwdGlvbiA9IHZhbFxuICB9XG5cbiAgdXBkYXRlQmF0Y2hEYXRhKCkge1xuICAgIHRoaXMuYmF0Y2hSZXBsYXlTdWJqZWN0Lm5leHQoKVxuICB9XG5cbiAgc2V0QmF0Y2hEYXRhKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpIHtcbiAgICB0aGlzLnNldEJhdGNoRGF0YVN1YmplY3QubmV4dChkYXRhKVxuICB9XG5cbiAgc2V0V0ZEYXRhKGRhdGE6IGFueSkge1xuICAgIHRoaXMuc2V0V0ZEYXRhU3ViamVjdC5uZXh0KGRhdGEpXG4gIH1cblxuICB1cGRhdGVSZXN1bWFEYXRhKGRhdGE6IGFueSkge1xuICAgIHRoaXMucmVzdW1lRGF0YS5uZXh0KGRhdGEpXG4gIH1cblxuICBjaGFuZ2VVcGRhdGVSZXZpZXdzKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVSZXZpZXdzLm5leHQoc3RhdGUpXG4gIH1cbiAgZ2V0U2VsZWN0ZWRCYXRjaERhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5nZXRTZWxlY3RlZEJhdGNoLm5leHQoZGF0YSlcbiAgfVxuXG4gIGNoYW5nZVNlcnZlckRhdGUoc3RhdGU6IGFueSkge1xuICAgIHRoaXMuc2VydmVyRGF0ZS5uZXh0KHN0YXRlKVxuICB9XG5cbiAgbWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YTogYW55LCByZXN1bWVEYXRhUGFzcz86IGFueSkge1xuICAgIGlmIChyZXN1bWVEYXRhUGFzcyAmJiByZXN1bWVEYXRhUGFzcy5sZW5ndGgpIHtcbiAgICAgIGlmIChyZXN1bWVEYXRhUGFzcyAmJiByZXN1bWVEYXRhUGFzcy5sZW5ndGggJiYgYmF0Y2hEYXRhLmNvbnRlbnQgJiYgYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YSwgcmVzdW1lRGF0YVBhc3MpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YVJlc3VsdCAmJiBkYXRhUmVzdWx0Lmxlbmd0aCAmJiBiYXRjaERhdGEuY29udGVudCAmJiBiYXRjaERhdGEuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YSwgZGF0YVJlc3VsdClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgfVxuICBzZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzOiBhbnkpIHtcbiAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoKSB7XG4gICAgICBpZiAoYmF0Y2hEYXRhICYmIGJhdGNoRGF0YS5jb250ZW50WzBdICYmXG4gICAgICAgIGJhdGNoRGF0YS5jb250ZW50WzBdLmJhdGNoQXR0cmlidXRlcyAmJlxuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjJcbiAgICAgICkge1xuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRDb250ZW50ID0gcmVzdW1lRGF0YVBhc3MuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBzZC5zZXNzaW9uSWQpXG4gICAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgc2QuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgIHNkLmNvbXBsZXRpb25TdGF0dXMgPSBmb3VuZENvbnRlbnQuc3RhdHVzXG4gICAgICAgICAgICBzZC5sYXN0Q29tcGxldGVkVGltZSA9IGZvdW5kQ29udGVudC5sYXN0Q29tcGxldGVkVGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvd1N0YXJ0QnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiB7IHNob3c6IGJvb2xlYW47IG1zZzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgbXNnOiAnJyxcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5hcnRpZmFjdFVybCAmJiBjb250ZW50LmFydGlmYWN0VXJsLm1hdGNoKC95b3V0dSguKT9iZS9naSkgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUuY291bnRyeSA9PT0gJ0NoaW5hJ1xuICAgICAgKSB7XG4gICAgICAgIHN0YXR1cy5zaG93ID0gZmFsc2VcbiAgICAgICAgc3RhdHVzLm1zZyA9ICd5b3V0dWJlRm9yYmlkZGVuJ1xuICAgICAgICByZXR1cm4gc3RhdHVzXG4gICAgICB9XG4gICAgICBpZiAoY29udGVudC5yZXNvdXJjZVR5cGUgIT09ICdDZXJ0aWZpY2F0aW9uJykge1xuICAgICAgICBzdGF0dXMuc2hvdyA9IHRydWVcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpbml0RGF0YShkYXRhOiBEYXRhLCBuZWVkUmVzdW1lRGF0YTogYm9vbGVhbiA9IGZhbHNlKTogTnNBcHBUb2MuSVdzVG9jUmVzcG9uc2Uge1xuICAgIGxldCBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICAgIGxldCBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBpZiAoZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnRlbnQgPSBkYXRhLmNvbnRlbnQuZGF0YVxuICAgICAgaWYgKG5lZWRSZXN1bWVEYXRhKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFSZXN1bHQgJiYgZGF0YVJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhUmVzdWx0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gcmVzdW1lRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckNvZGUgPSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudCxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9XG4gIH1cblxuICBtYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBkYXRhUmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IGRhdGFSZXN1bHQuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBjaGlsZC5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgZm91bmRDb250ZW50LnByb2dyZXNzXG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9IGZvdW5kQ29udGVudC5zdGF0dXNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNoaWxkLCBkYXRhUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIG1hcE1vZHVsZUNvdW50KGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgMSA6IDFcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldE1pbWVUeXBlKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCwgaWRlbnRpZmllcjogc3RyaW5nKTogTnNDb250ZW50LkVNaW1lVHlwZXMge1xuICAgIGlmIChjb250ZW50LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgfVxuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBpZiAoY29udGVudC5jaGlsZHJlblswXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNvbnRlbnQubWltZVR5cGVcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBiaWcgYmx1bmRlciBpbiBkYXRhXG4gICAgICAgIC8vIHRoaXMubG9nZ2VyLmxvZyhjb250ZW50LmlkZW50aWZpZXIsICdXcm9uZyBtaW1ldHlwZXMgZm9yIHJlc3VtZScpXG4gICAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgICB9XG4gICAgICBjb25zdCBmbGF0TGlzdDogYW55W10gPSBbXVxuICAgICAgY29uc3QgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbjogYW55ID0gKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBmbGF0TGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4ubWFwKChpOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oaSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICBjb25zdCBjaGxkID0gXy5maXJzdChfLmZpbHRlcihmbGF0TGlzdCwgeyBpZGVudGlmaWVyIH0pKVxuICAgICAgcmV0dXJuIChjaGxkICYmIGNobGQubWltZVR5cGUpIHx8ICcnXG4gICAgfVxuICAgIC8vIHJldHVybiBjaGxkLm1pbWVUeXBlXG4gICAgcmV0dXJuIE5zQ29udGVudC5FTWltZVR5cGVzLlVOS05PV05cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZShcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlLFxuICApOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHtcbiAgICBpZiAoXG4gICAgICBjb250ZW50ICYmXG4gICAgICAhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICAvLyB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUKVxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTlxuICAgICAgKSkge1xuICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmNvdXJzZSArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlICs9IDFcbiAgICAgIH1cbiAgICAgIF8uZWFjaChjb250ZW50LmNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICB0b2NTdHJ1Y3R1cmUgPSB0aGlzLmdldFRvY1N0cnVjdHVyZShjaGlsZCwgdG9jU3RydWN0dXJlKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29udGVudCAmJlxuICAgICAgKFxuICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgLy8gfHwgY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0tub3dsZWRnZSBBcnRpZmFjdCdcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnQubWltZVR5cGUpIHtcbiAgICAgICAgLy8gY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5IQU5EU19PTjpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUuaGFuZHNPbiArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDM6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnBvZGNhc3QgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0OlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTg6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUudmlkZW8gKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSU5URVJBQ1RJT046XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLmludGVyYWN0aXZlVmlkZW8gKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUERGOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5wZGYgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSFRNTDpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5URVhUX1dFQjpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUud2ViUGFnZSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVk6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnN1cnZleSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5RVUlaOlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkFQUExJQ0FUSU9OX0pTT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUuYXNzZXNzbWVudCArPSAxXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRvY1N0cnVjdHVyZS5xdWl6ICs9IDFcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5PRkZMSU5FX1NFU1NJT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub2ZmbGluZVNlc3Npb24gKz0gMVxuICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUucXVpeiArPSAxXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUFJBQ1RJQ0VfUkVTT1VSQ0U6XG4gICAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLnByYWN0aWNlVGVzdCArPSAxXG4gICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLmZpbmFsVGVzdCArPSAxXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuV0VCX01PRFVMRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUud2ViTW9kdWxlICs9IDFcbiAgICAgICAgLy8gICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlpJUDI6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWklQOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5pbnRlcmFjdGl2ZWNvbnRlbnQgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUueW91dHViZSArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub3RoZXIgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICByZXR1cm4gdG9jU3RydWN0dXJlXG4gICAgfVxuICAgIHJldHVybiB0b2NTdHJ1Y3R1cmVcbiAgfVxuXG4gIGZpbHRlclRvYyhcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgZmlsdGVyQ2F0ZWdvcnk6IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTCxcbiAgKTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCB7XG4gICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgLy8gIHx8IGNvbnRlbnQuY29udGVudFR5cGUgPT09ICdLbm93bGVkZ2UgQXJ0aWZhY3QnXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJVbml0Q29udGVudChjb250ZW50LCBmaWx0ZXJDYXRlZ29yeSkgPyBjb250ZW50IDogbnVsbFxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuOiBOc0NvbnRlbnQuSUNvbnRlbnRbXSA9XG4gICAgICBfLm1hcChfLmdldChjb250ZW50LCAnY2hpbGRyZW4nKSwgY2hpbGRDb250ZW50ID0+XG4gICAgICAgIHRoaXMuZmlsdGVyVG9jKGNoaWxkQ29udGVudCwgZmlsdGVyQ2F0ZWdvcnkpKVxuICAgICAgICAuZmlsdGVyKHVuaXRDb250ZW50ID0+IEJvb2xlYW4odW5pdENvbnRlbnQpKSBhcyBOc0NvbnRlbnQuSUNvbnRlbnRbXVxuICAgIGlmIChmaWx0ZXJlZENoaWxkcmVuICYmIGZpbHRlcmVkQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICBjaGlsZHJlbjogZmlsdGVyZWRDaGlsZHJlbixcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZpbHRlclVuaXRDb250ZW50KFxuICAgIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCxcbiAgICBmaWx0ZXJDYXRlZ29yeTogTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeSA9IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQUxMLFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGZpbHRlckNhdGVnb3J5KSB7XG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuTEVBUk46XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIU5zQ29udGVudENvbnN0YW50cy5WQUxJRF9QUkFDVElDRV9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKSAmJlxuICAgICAgICAgICFOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgICApXG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0U6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfUFJBQ1RJQ0VfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgIGNhc2UgTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BU1NFU1M6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIGZldGNoQ29udGVudEFuYWx5dGljc0NsaWVudERhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2ZldGNoaW5nJyAmJiB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgIHRoaXMuZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgY29uc3QgdXJsID0gYCR7UFJPWFlfU0xBR19WOH0vTEEvYXBpL2xhL2NvbnRlbnRhbmFseXRpY3M/Y29udGVudF9pZD0ke2NvbnRlbnRJZH0mdHlwZT1jb3Vyc2VgXG4gICAgdGhpcy5odHRwLmdldCh1cmwpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KHJlc3VsdClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50QW5hbHl0aWNzRGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZmV0Y2hpbmcnICYmIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgIT09ICdkb25lJykge1xuICAgICAgdGhpcy5nZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IHVybCA9IGAke1BST1hZX1NMQUdfVjh9L0xBL0xBL2FwaS9Vc2Vycz9yZWZpbmVtZW50ZmlsdGVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgJ1wic291cmNlXCI6W1wiaUdvdFwiLFwiTGVhcm5pbmcgSHViXCJdJyxcbiAgICApfSQke2VuY29kZVVSSUNvbXBvbmVudChgXCJjb3Vyc2VDb2RlXCI6IFtcIiR7Y29udGVudElkfVwiXWApfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQocmVzdWx0KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQobnVsbClcbiAgICAgICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgfSxcbiAgICApXG4gIH1cblxuICBjbGVhckFuYWx5dGljc0RhdGEoKSB7XG4gICAgaWYgKHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdCkge1xuICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0LnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBmZXRjaENvbnRlbnRQYXJlbnRzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICAvLyByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgIC8vICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9QQVJFTlRTfS8ke2NvbnRlbnRJZH1gLFxuICAgIC8vIClcbiAgICBpZiAoY29udGVudElkKSB7IH1cbiAgICByZXR1cm4gRU1QVFlcbiAgfVxuICBmZXRjaENvbnRlbnRXaGF0c05leHQoXG4gICAgY29udGVudElkOiBzdHJpbmcsXG4gICAgY29udGVudFR5cGU/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT9jb250ZW50VHlwZT0ke2NvbnRlbnRUeXBlfWAsXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFR9LyR7Y29udGVudElkfT90cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hNb3JlTGlrZVRoaXNQYWlkKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUXG4gICAgICB9LyR7Y29udGVudElkfT9leGNsdXNpdmVDb250ZW50PXRydWUmdHM9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLFxuICAgIClcbiAgfVxuXG4gIGZldGNoTW9yZUxpa2VUaGlzRnJlZShjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVFxuICAgICAgfS8ke2NvbnRlbnRJZH0/ZXhjbHVzaXZlQ29udGVudD1mYWxzZSZ0cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50Q29ob3J0cyhcbiAgICBjb2hvcnRUeXBlOiBOc0NvaG9ydHMuRUNvaG9ydFR5cGVzLFxuICAgIGNvbnRlbnRJZDogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29ob3J0cy5JQ29ob3J0c0NvbnRlbnRbXT4oQVBJX0VORF9QT0lOVFMuQ09IT1JUUyhjb2hvcnRUeXBlLCBjb250ZW50SWQpLCB7XG4gICAgICBoZWFkZXJzOiB7IHJvb3RPcmc6IHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsIG9yZzogdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycgfSxcbiAgICB9KVxuICB9XG4gIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx7IGhhc0FjY2VzczogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyBoYXNBY2Nlc3M6IGJvb2xlYW4gfT4oQVBJX0VORF9QT0lOVFMuRVhURVJOQUxfQ09OVEVOVChjb250ZW50SWQpKVxuICB9XG4gIGZldGNoQ29ob3J0R3JvdXBVc2Vycyhncm91cElkOiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvaG9ydHMuSUNvaG9ydHNHcm91cFVzZXJzW10+KEFQSV9FTkRfUE9JTlRTLkNPSE9SVFNfR1JPVVBfVVNFUihncm91cElkKSlcbiAgfVxuICBmZXRjaE1vcmVMaWtlVGhpcyhjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50W10+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUkVMQVRFRF9SRVNPVVJDRShjb250ZW50SWQsIGNvbnRlbnRUeXBlKSxcbiAgICApXG4gIH1cblxuICBmZXRjaFBvc3RBc3Nlc3NtZW50U3RhdHVzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudFtdIH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuUE9TVF9BU1NFU1NNRU5UKGNvbnRlbnRJZCksXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hHZXRDb250ZW50RGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGxldCB1cmwgPSAnJ1xuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KFxuICAgICAgICBBUElfRU5EX1BPSU5UUy5HRVRfQ09OVEVOVChjb250ZW50SWQpLFxuICAgICAgKVxuICAgIH1cbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnX3JjJykpIHtcbiAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH0gZWxzZSB7XG4gICAgICB1cmwgPSBgL2FwaS9jb250ZW50L3YxL3JlYWQvJHtjb250ZW50SWR9YFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KHVybClcblxuICB9XG5cbiAgZmV0Y2hDb250ZW50UGFyZW50KGNvbnRlbnRJZDogc3RyaW5nLCBkYXRhOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlcSwgZm9yUHJldmlldyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVzcG9uc2U+KFxuICAgICAgZm9yUHJldmlld1xuICAgICAgICA/IEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfQVVUSF9QQVJFTlQoXG4gICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJycsXG4gICAgICAgICAgdGhpcy5jb25maWdTdmMub3JnID8gdGhpcy5jb25maWdTdmMub3JnWzBdIDogJycsXG4gICAgICAgIClcbiAgICAgICAgOiBBUElfRU5EX1BPSU5UUy5DT05URU5UX1BBUkVOVChjb250ZW50SWQpLFxuICAgICAgZGF0YSxcbiAgICApXG4gIH1cblxuICBjcmVhdGVCYXRjaChiYXRjaERhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChcbiAgICAgIEFQSV9FTkRfUE9JTlRTLkJBVENIX0NSRUFURSxcbiAgICAgIHsgcmVxdWVzdDogYmF0Y2hEYXRhIH0sXG4gICAgKVxuICB9XG5cbiAgYXN5bmMgbWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIGVucm9sbWVudExpc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBsZXQgdG90YWxDb3VudCA9IDBcbiAgICBsZXQgbGVhZm5vZGVDb3VudCA9IDBcbiAgICBsZXQgY29tcGxldGVkTGVhZk5vZGVzOiBhbnkgPSBbXVxuICAgIGxldCBmaXJzdFVuY29tcGxldGVDb3Vyc2U6IGFueSA9ICcnXG4gICAgbGV0IGlucHJvZ3Jlc3NEYXRhQ2hlY2s6IGFueSA9IFtdXG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgbGVhZm5vZGVDb3VudCA9IGNvbnRlbnQubGVhZk5vZGVzQ291bnRcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgaWYgKGZvdW5kUGFyZW50Q29udGVudCAmJiBmb3VuZFBhcmVudENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvbnRlbnQpXG4gICAgICAgIHRvdGFsQ291bnQgPSBjb250ZW50LmxlYWZOb2Rlc0NvdW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaChhc3luYyAocGFyZW50Q2hpbGQsaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENoaWxkID0gY29udGVudC5jaGlsZHJlbltpXVxuICAgICAgICAgICAgaWYgKHBhcmVudENoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3QsIHBhcmVudENoaWxkPy5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAvLyB0b3RhbENvdW50ID0gZm91bmRDb250ZW50ICYmIGZvdW5kQ29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA/IHRvdGFsQ291bnQgKyBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgOiB0b3RhbENvdW50ICsgMFxuICAgICAgICAgICAgICAvLyBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gTWF0aC5yb3VuZCh0b3RhbENvdW50IC8gbGVhZm5vZGVDb3VudClcbiAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudCAmJiBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgdG90YWxDb3VudCA9IHRvdGFsQ291bnQgKz0gcGFyZW50Q2hpbGQubGVhZk5vZGVzQ291bnRcbiAgICAgICAgICAgICAgICBjb21wbGV0ZWRMZWFmTm9kZXMgPSBbLi4uY29tcGxldGVkTGVhZk5vZGVzLCAuLi5wYXJlbnRDaGlsZC5sZWFmTm9kZXNdXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGZvdW5kQ29udGVudC5pc3N1ZWRDZXJ0aWZpY2F0ZXMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgICAgICAgICAgY29uc3QgY2VydElkOiBhbnkgPSBjZXJ0aWZpY2F0ZVswXS5pZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZC5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgICAgLy8gY29uc3QgY2VydERhdGE6IGFueSA9IGF3YWl0IHRoaXMuZG93b25sb2FkQ2VydGlmaWNhdGUoY2VydElkKS50b1Byb21pc2UoKS5jYXRjaChfZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgICAgIC8vIH0pXG4gICAgICAgICAgICAgICAgICAvLyBpZiAoY2VydERhdGEgJiYgY2VydERhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHBhcmVudENoaWxkLmlzc3VlZENlcnRpZmljYXRlc1NWRyA9IGNlcnREYXRhLnJlc3VsdC5wcmludFVyaVxuICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMTAwXG4gICAgICAgICAgICAgICAgcGFyZW50Q2hpbGQuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hJZDogZm91bmRDb250ZW50LmJhdGNoLmJhdGNoSWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBmb3VuZENvbnRlbnQudXNlcklkLFxuICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBmaXJzdFVuY29tcGxldGVDb3Vyc2UgPSAocGFyZW50Q2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDAgfHwgIXBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZmlyc3RVbmNvbXBsZXRlQ291cnNlID8gcGFyZW50Q2hpbGQgOiBmaXJzdFVuY29tcGxldGVDb3Vyc2VcbiAgICAgICAgICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YT8ucmVzdWx0Py5jb250ZW50TGlzdD8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRlZExlYWZub2Rlcyhjb21wbGV0ZWRMZWFmTm9kZXMsIGNvbXBsZXRlZENvdW50KVxuICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVjayA/IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgOiAgZGF0YS5yZXN1bHQuY29udGVudExpc3RcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKHBhcmVudENoaWxkLCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gIGVsc2Uge1xuICAgICAgICAgICAgLy8gICBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgZm91bmRDb250ZW50ID0gZW5yb2xtZW50TGlzdCAmJiBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgLy8gICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgIC8vICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgLy8gICAgICAgICAgIGJhdGNoSWQ6IGZvdW5kQ29udGVudC5iYXRjaC5iYXRjaElkLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHVzZXJJZDogZm91bmRDb250ZW50LnVzZXJJZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRDb250ZW50LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIF0sXG4gICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvbnN0IGRhdGE6IGFueSAgPSBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDb3VudCA9IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0LmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5wcm9ncmVzcyA9PT0gMTAwKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0b3RhbENvdW50ID0gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrID8gaW5wcm9ncmVzc0RhdGFDaGVjayA6ICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAvLyAgICAgICAgIHJldHVybiBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIC8vICAgICAgIH0pXG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgLy8gICB9XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gICAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVFxuICAgICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgICAvLyB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICBjb25zdCBmb3VuZFBhcmVudENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBjb2xsZWN0aW9uSWQgfHwgY29udGVudD8uaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNvbnRlbnQpXG4gICAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICBiYXRjaElkOiBmb3VuZFBhcmVudENvbnRlbnQ/LmJhdGNoPy5iYXRjaElkLFxuICAgICAgICAgICAgICB1c2VySWQ6IGZvdW5kUGFyZW50Q29udGVudD8udXNlcklkLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogZm91bmRQYXJlbnRDb250ZW50Py5jb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5ndWFnZSxcbiAgICAgICAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICdwcm9ncmVzc2RldGFpbHMnLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS50b1Byb21pc2UoKS50aGVuKChwcm9ncmVzc2RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgICAgdG90YWxDb3VudCA9IGNvbXBsZXRlZExlYWZOb2Rlcy5sZW5ndGhcbiAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IFsuLi5pbnByb2dyZXNzRGF0YUNoZWNrLCAuLi5kYXRhLnJlc3VsdC5jb250ZW50TGlzdF1cbiAgICAgICAgICAgICAgLy8gaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPyBpbnByb2dyZXNzRGF0YUNoZWNrIDogIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnByb2dyZXNzRGF0YUNoZWNrICYmIGlucHJvZ3Jlc3NEYXRhQ2hlY2subGVuZ3RoID09PSAwICYmIGZpcnN0VW5jb21wbGV0ZUNvdXJzZSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGZpcnN0VW5jb21wbGV0ZUNvdXJzZSlcbiAgICAgICAgICBjb25zdCBjaGlsZEVucm9sbG1lbnREYXRhID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PlxuICAgICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBmaXJzdFVuY29tcGxldGVDb3Vyc2UuaWRlbnRpZmllcilcbiAgICAgICAgICBjb25zdCByZXN1bWVEYXRhID0gW3tcbiAgICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICAgIGJhdGNoSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5iYXRjaElkLFxuICAgICAgICAgICAgY29tcGxldGVkQ291bnQ6IDEsXG4gICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMC4wLFxuICAgICAgICAgICAgcHJvZ3Jlc3M6IDAsXG4gICAgICAgICAgICB2aWV3Q291bnQ6IDEsXG4gICAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgICAgY29sbGVjdGlvbklkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgICBzdGF0dXM6IDEsXG4gICAgICAgICAgfV1cbiAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gcmVzdW1lRGF0YVxuICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBjb25zdCBwYXJlbnRDb250ZW50ID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIC8vIGlmICghcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSkge1xuICAgICAgY29uc3QgY2FsY3VsYXRlZFBjdCA9IE1hdGguZmxvb3IoKHRvdGFsQ291bnQgLyBsZWFmbm9kZUNvdW50KSAqIDEwMClcbiAgICAgIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBpc05hTihjYWxjdWxhdGVkUGN0KSA/IDAgOiBjYWxjdWxhdGVkUGN0XG4gICAgICBjb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCA/IDIgOiAoY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMClcbiAgICAgIGlmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgJiYgaW5wcm9ncmVzc0RhdGFDaGVjayAmJiBpbnByb2dyZXNzRGF0YUNoZWNrLmxlbmd0aCA9PT0gMCAmJiAhZmlyc3RVbmNvbXBsZXRlQ291cnNlKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0Q2hpbGREYXRhID0gdGhpcy53aWRnZXRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KGNvbnRlbnQpXG4gICAgICAgIGNvbnN0IGNoaWxkRW5yb2xsbWVudERhdGEgPSBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+XG4gICAgICAgICAgZWwuY29sbGVjdGlvbklkID09PSBjb250ZW50LmNoaWxkcmVuWzBdLmlkZW50aWZpZXIpXG4gICAgICAgIGNvbnN0IHJlc3VtZURhdGEgPSBbe1xuICAgICAgICAgIGNvbnRlbnRJZDogZmlyc3RDaGlsZERhdGEuaWRlbnRpZmllcixcbiAgICAgICAgICBiYXRjaElkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuYmF0Y2hJZCxcbiAgICAgICAgICBjb21wbGV0ZWRDb3VudDogMSxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogMTAwLFxuICAgICAgICAgIHByb2dyZXNzOiAyLFxuICAgICAgICAgIHZpZXdDb3VudDogMSxcbiAgICAgICAgICBjb3Vyc2VJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgIHN0YXR1czogMixcbiAgICAgICAgfV1cbiAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IHJlc3VtZURhdGFcbiAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICB9XG4gICAgICAvLyAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gcGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgLy8gLy8gfVxuICAgICAgLy8gfSlcbiAgICAgIC8vIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhjb250ZW50LCBjb250ZW50KVxuICAgICAgdGhpcy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY29udGVudClcbiAgICAgIHRoaXMuY2hlY2tNb2R1bGVXaXNlRGF0YShjb250ZW50KVxuICAgICAgLy8gQ29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBBRlRFUiBwcm9ncmVzcyBkYXRhIGlzIHBvcHVsYXRlZFxuICAgICAgaWYgKGNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgICB0aGlzLmNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzKClcbiAgICAgICAgLy8gRW5zdXJlIGhhc2htYXAgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH1cbiAgfVxuICBjaGVja0NvbXBsZXRlZExlYWZub2RlcyhsZWFmTm9kZXM6IGFueSwgY29tcGxldGVkQ291bnQ6IGFueSkge1xuICAgIGlmIChjb21wbGV0ZWRDb3VudC5sZW5ndGggPiAwKSB7XG4gICAgICBjb21wbGV0ZWRDb3VudC5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWxlYWZOb2Rlcy5pbmNsdWRlcyhlbGUuY29udGVudElkKSkge1xuICAgICAgICAgIGxlYWZOb2Rlcy5wdXNoKGVsZS5jb250ZW50SWQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgZ2V0UHJvZ3Jlc3NGb3JDaGlsZENvdXJzZShyZXF1ZXN0OiBhbnksIGNvbnRlbnQ6IGFueSkge1xuICAvLyAgY29uc3QgZGF0YTogYW55ID0gICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXF1ZXN0KS50b1Byb21pc2UoKS5jYXRjaChfZXJyb3IgPT4ge30pXG4gIC8vICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgLy8gICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gIC8vIH1cbiAgLy8gfVxuXG4gIGZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0OiBhbnksIGlkZW50aWZpZXI6IHN0cmluZykge1xuICAgIHJldHVybiBlbnJvbG1lbnRMaXN0ICYmIGVucm9sbWVudExpc3Q/Lmxlbmd0aCAmJiBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsPy5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIpXG4gIH1cblxuICBhc3luYyBtYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShjb3Vyc2U6IGFueSkge1xuICAgIGlmIChjb3Vyc2UgJiYgY291cnNlLmNoaWxkcmVuKSB7XG4gICAgICBhd2FpdCBjb3Vyc2UuY2hpbGRyZW4ubWFwKGFzeW5jIChjb3Vyc2VDaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmICgoY291cnNlQ2hpbGQgJiYgY291cnNlQ2hpbGQuY2hpbGRyZW4pIHx8IGNvdXJzZUNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShjb3Vyc2VDaGlsZClcbiAgICAgICAgICBjb3Vyc2VbJ21vZHVsZUNvdW50J10gPSBjb3Vyc2VbJ21vZHVsZUNvdW50J10gPyBjb3Vyc2VbJ21vZHVsZUNvdW50J10gKyAxIDogMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvdXJzZUNoaWxkWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gMTAwXG4gICAgICAgICAgY291cnNlQ2hpbGRbJ2NvbXBsZXRpb25TdGF0dXMnXSA9IDJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBwYXJlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAvLyBjb250ZW50LmNoaWxkcmVuLm1hcCgoaXRlbTogTnNDb250ZW50LklDb250ZW50KT0+IHtcbiAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLmdldENhbGN1bGF0aW9uc0Zyb21DaGlsZHJlbihjb250ZW50KVxuICAgICAgICAvLyB9KVxuICAgICAgfVxuXG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcCgoaXRlbTogTnNDb250ZW50LklDb250ZW50KSA9PiB7XG4gICAgICAgIC8vIGlmIChpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgIC8vICAgdGhpcy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGl0ZW0sIHBhcmVudClcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoaXRlbSwgcGFyZW50KVxuICAgICAgICAvLyB9XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoaXRlbSwgcGFyZW50KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQsIHJvb3RDb3Vyc2VDYXRlZ29yeT86IHN0cmluZykge1xuICAgIGlmIChoaWVyYXJjaHlEYXRhICYmIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQuY2hpbGRyZW4pIHtcbiAgICAgICAgICB0aGlzLmNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGNoaWxkLCByb290Q291cnNlQ2F0ZWdvcnkpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpbWFyeUNhdCA9IGNoaWxkLnByaW1hcnlDYXRlZ29yeSBhcyBzdHJpbmdcbiAgICAgICAgY29uc3QgY291cnNlQ2F0ID0gKGNoaWxkLmNvdXJzZUNhdGVnb3J5IHx8IGNoaWxkLnByaW1hcnlDYXRlZ29yeSB8fCAnJykgYXMgc3RyaW5nXG4gICAgICAgIGNvbnN0IGlzTWlsZXN0b25lID0gcHJpbWFyeUNhdCA9PT0gJ01pbGVzdG9uZScgfHwgY291cnNlQ2F0ID09PSAnTWlsZXN0b25lJ1xuICAgICAgICBjb25zdCBpc0NvbGxlY3Rpb24gPSBjaGlsZC5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTlxuICAgICAgICBjb25zdCBpc01vZHVsZSA9IGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFXG4gICAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFIHx8XG4gICAgICAgICAgY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSB8fFxuICAgICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UXG4gICAgICAgIGNvbnN0IGlzTGVhcm5pbmdQYXRod2F5ID0gcm9vdENvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcblxuICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50IGlzIG1hbmRhdG9yeSAoaXNNYW5kYXRvcnkgZmxhZyBvciBtYW5kYXRvcnkgcHJvcGVydHkpXG4gICAgICAgIGNvbnN0IGlzTWFuZGF0b3J5ID0gY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgKGNoaWxkIGFzIGFueSkubWFuZGF0b3J5ID09PSB0cnVlXG5cbiAgICAgICAgbGV0IGxvY2FsTWFwOiBhbnkgPSB7XG4gICAgICAgICAgcGFyZW50OiBjaGlsZD8ucGFyZW50LFxuICAgICAgICAgIGlkZW50aWZpZXI6IGNoaWxkLmlkZW50aWZpZXIsXG4gICAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgICAgbGVhZk5vZGVzOiBjaGlsZC5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNoaWxkLnByb2dyZXNzIHx8IDAsXG4gICAgICAgICAgY29tcGxldGlvblN0YXR1czogY2hpbGQuY29tcGxldGlvblN0YXR1cyB8fCBjaGlsZC5zdGF0dXMgfHwgMCxcbiAgICAgICAgICBzdGF0dXM6IGNoaWxkLnN0YXR1cyB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzIHx8IDAsXG4gICAgICAgICAgcHJvZ3Jlc3M6IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIHByaW1hcnlDYXRlZ29yeTogY2hpbGQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIGNvdXJzZUNhdGVnb3J5OiBjb3Vyc2VDYXQsXG4gICAgICAgICAgZHVyYXRpb246IGNoaWxkLmR1cmF0aW9uIHx8IDAsXG4gICAgICAgICAgZXhwZWN0ZWREdXJhdGlvbjogY2hpbGQuZXhwZWN0ZWREdXJhdGlvbiB8fCAwLFxuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgICAgICAgIG1pbWVUeXBlOiBjaGlsZC5taW1lVHlwZSxcbiAgICAgICAgICBpc0xvY2tlZDogY2hpbGQuaXNMb2NrZWQgfHwgZmFsc2UsXG4gICAgICAgICAgYXJ0aWZhY3RVcmw6IGNoaWxkLmFydGlmYWN0VXJsIHx8IG51bGwsXG4gICAgICAgICAgbmFtZTogY2hpbGQubmFtZSB8fCAnJyxcbiAgICAgICAgICBjb250ZW50VHlwZTogY2hpbGQuY29udGVudFR5cGUgfHwgJycsXG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBMZWFybmluZyBQYXRod2F5XG4gICAgICAgICAgaXNNaWxlc3RvbmU6IGlzTWlsZXN0b25lLFxuICAgICAgICAgIGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uLFxuICAgICAgICAgIGlzTW9kdWxlOiBpc01vZHVsZSxcbiAgICAgICAgICBpc1Jlc291cmNlOiBpc1Jlc291cmNlLFxuICAgICAgICAgIGlzTGVhcm5pbmdQYXRod2F5OiBpc0xlYXJuaW5nUGF0aHdheSxcbiAgICAgICAgICBpc01hbmRhdG9yeTogaXNNYW5kYXRvcnksXG4gICAgICAgICAgLy8gTWlsZXN0b25lIHNwZWNpZmljIGRhdGFcbiAgICAgICAgICBtaWxlc3RvbmVJbmRleDogKGNoaWxkIGFzIGFueSkubWlsZXN0b25lSW5kZXgsXG4gICAgICAgICAgY29tcGxldGVkTGVhZk5vZGVzQ291bnQ6IChjaGlsZCBhcyBhbnkpLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50IHx8IDAsXG4gICAgICAgICAgLy8gUHJlLWFzc2Vzc21lbnQgZmxhZyAoZm9yIG1pbGVzdG9uZSBnYXRpbmcpXG4gICAgICAgICAgaXNQcmVBc3Nlc3NtZW50OiAoY2hpbGQgYXMgYW55KS5pc1ByZUFzc2Vzc21lbnQgfHwgZmFsc2UsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1ZyBsb2dnaW5nIGZvciBtaWxlc3RvbmVzXG4gICAgICAgIGlmIChpc01pbGVzdG9uZSkge1xuICAgICAgICAgIC8vIFByb2dyZXNzIHRyYWNrZWQgZm9yIG1pbGVzdG9uZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdID0gbG9jYWxNYXBcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZVByZUFzc2Vzc21lbnRIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQpIHtcbiAgICBpZiAoaGllcmFyY2h5RGF0YSAmJiBoaWVyYXJjaHlEYXRhLnByZUVucm9sbWVudFJlc291cmNlcykge1xuICAgICAgaGllcmFyY2h5RGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXMuZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQucHJlRW5yb2xtZW50UmVzb3VyY2VzKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVQcmVBc3Nlc3NtZW50SGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY2hpbGQpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsTWFwID0ge31cbiAgICAgICAgbG9jYWxNYXAgPSB7XG4gICAgICAgICAgcGFyZW50OiBjaGlsZD8ucGFyZW50LFxuICAgICAgICAgIGlkZW50aWZpZXI6IGNoaWxkLmlkZW50aWZpZXIsXG4gICAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgICAgbGVhZk5vZGVzOiBjaGlsZC5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMsXG4gICAgICAgICAgc3RhdHVzOiBjaGlsZC5zdGF0dXMgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyB8fCAwLFxuICAgICAgICAgIHByb2dyZXNzOiBjaGlsZC5wcm9ncmVzcyxcbiAgICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGNoaWxkLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICBjb3Vyc2VDYXRlZ29yeTogY2hpbGQuY291cnNlQ2F0ZWdvcnkgfHwgY2hpbGQucHJpbWFyeUNhdGVnb3J5IHx8ICcnLFxuICAgICAgICAgIGR1cmF0aW9uOiBjaGlsZC5kdXJhdGlvbiB8fCAwLFxuICAgICAgICAgIGV4cGVjdGVkRHVyYXRpb246IGNoaWxkLmV4cGVjdGVkRHVyYXRpb24gfHwgMCxcbiAgICAgICAgICAvLyBNYXJrIGFzIHByZS1hc3Nlc3NtZW50IE9OTFkgaWYgZXhwbGljaXRseSBzZXQgLSBkbyBOT1QgZGVmYXVsdCB0byB0cnVlXG4gICAgICAgICAgaXNQcmVBc3Nlc3NtZW50OiBjaGlsZC5pc1ByZUFzc2Vzc21lbnQgfHwgZmFsc2UsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdID0gbG9jYWxNYXBcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsKSB7XG4gICAgaWYgKGhpZXJhcmNoeURhdGEpIHtcbiAgICAgIGNvbnN0IHJvb3RDb3Vyc2VDYXRlZ29yeSA9IGhpZXJhcmNoeURhdGEuY291cnNlQ2F0ZWdvcnkgfHwgaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgfHwgJydcbiAgICAgIGNvbnN0IGlzTGVhcm5pbmdQYXRod2F5ID0gcm9vdENvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcblxuICAgICAgdGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgIHBhcmVudDogaGllcmFyY2h5RGF0YS5wYXJlbnQsXG4gICAgICAgIGlkZW50aWZpZXI6IGhpZXJhcmNoeURhdGEuaWRlbnRpZmllcixcbiAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGhpZXJhcmNoeURhdGEubGVhZk5vZGVzQ291bnQgfHwgbnVsbCxcbiAgICAgICAgbGVhZk5vZGVzOiBoaWVyYXJjaHlEYXRhLmxlYWZOb2RlcyB8fCBbXSxcbiAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGhpZXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgaGllcmFyY2h5RGF0YS5wcm9ncmVzcyB8fCAwLFxuICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgfHwgMCxcbiAgICAgICAgcHJvZ3Jlc3M6IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGNvdXJzZUNhdGVnb3J5OiByb290Q291cnNlQ2F0ZWdvcnksXG4gICAgICAgIGV4cGVjdGVkRHVyYXRpb246IGhpZXJhcmNoeURhdGEuZXhwZWN0ZWREdXJhdGlvbiB8fCAwLFxuICAgICAgICAvLyBBZGRpdGlvbmFsIG1ldGFkYXRhXG4gICAgICAgIG1pbWVUeXBlOiBoaWVyYXJjaHlEYXRhLm1pbWVUeXBlLFxuICAgICAgICBpc0xvY2tlZDogaGllcmFyY2h5RGF0YS5pc0xvY2tlZCB8fCBmYWxzZSxcbiAgICAgICAgYXJ0aWZhY3RVcmw6IGhpZXJhcmNoeURhdGEuYXJ0aWZhY3RVcmwgfHwgbnVsbCxcbiAgICAgICAgbmFtZTogaGllcmFyY2h5RGF0YS5uYW1lIHx8ICcnLFxuICAgICAgICBjb250ZW50VHlwZTogaGllcmFyY2h5RGF0YS5jb250ZW50VHlwZSB8fCAnJyxcbiAgICAgICAgaXNNaWxlc3RvbmU6IGZhbHNlLFxuICAgICAgICBpc0NvbGxlY3Rpb246IGhpZXJhcmNoeURhdGEubWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLkNPTExFQ1RJT04sXG4gICAgICAgIGlzTW9kdWxlOiBoaWVyYXJjaHlEYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFLFxuICAgICAgICBpc1Jlc291cmNlOiBmYWxzZSxcbiAgICAgICAgaXNMZWFybmluZ1BhdGh3YXk6IGlzTGVhcm5pbmdQYXRod2F5LFxuICAgICAgfVxuICAgICAgaWYgKGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiZcbiAgICAgICAgaGllcmFyY2h5RGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwgPj0gNSAmJiBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSAmJlxuICAgICAgICBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSA9PT0gTnNDb250ZW50LkVDb250ZXh0TG9ja2luZ1R5cGUuQ09VUlNFX0FTU0VTU01FTlRfT05MWSkge1xuICAgICAgICB0aGlzLmhhc2htYXBbaGllcmFyY2h5RGF0YS5pZGVudGlmaWVyXSA9IHtcbiAgICAgICAgICAuLi50aGlzLmhhc2htYXBbaGllcmFyY2h5RGF0YS5pZGVudGlmaWVyXSxcbiAgICAgICAgICBjb250ZXh0TG9ja2luZ1R5cGU6IGhpZXJhcmNoeURhdGEuY29udGV4dExvY2tpbmdUeXBlLFxuICAgICAgICAgIGNvbXBhdGliaWxpdHlMZXZlbDogaGllcmFyY2h5RGF0YS5jb21wYXRpYmlsaXR5TGV2ZWwsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY3JlYXRlSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YSwgcm9vdENvdXJzZUNhdGVnb3J5KVxuICAgICAgLy8gTk9URTogY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMgaXMgY2FsbGVkIEFGVEVSIHByb2dyZXNzIGRhdGEgaXMgcG9wdWxhdGVkXG4gICAgICAvLyBpbiBtYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0sIG5vdCBoZXJlIHdoZXJlIGNvbXBsZXRpb24gZGF0YSBpcyBzdGlsbCAwXG4gICAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZS1jb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyBmb3IgYWxsIG1pbGVzdG9uZXMgaW4gTGVhcm5pbmcgUGF0aHdheVxuICAgKiBUaGlzIGF2b2lkcyBleHBlbnNpdmUgY2FsY3VsYXRpb25zIGluIGNvbXBvbmVudCBnZXR0ZXJzXG4gICAqIFxuICAgKiBMb2NraW5nIFJ1bGVzOlxuICAgKiAwLiBJZiB1c2VyIGlzIG5vdCBlbnJvbGxlZCwgQUxMIG1pbGVzdG9uZXMgYXJlIGxvY2tlZFxuICAgKiAxLiBBbGwgbWlsZXN0b25lcyBhcmUgbG9ja2VkIGJ5IGRlZmF1bHRcbiAgICogMi4gTWlsZXN0b25lIDEgKE0xKSB1bmxvY2tzIHdoZW4gcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkXG4gICAqIDMuIE1pbGVzdG9uZSBOIChOID4gMSkgdW5sb2NrcyB3aGVuOlxuICAgKiAgICAtIEFsbCBtYW5kYXRvcnkgbGVhcm5pbmcgaXRlbXMgaW4gTWlsZXN0b25lIE4tMSBhcmUgY29tcGxldGVkXG4gICAqICAgIC0gVGhlIGFzc2Vzc21lbnQgb2YgTWlsZXN0b25lIE4tMSBpcyBjb21wbGV0ZWRcbiAgICovXG4gIHB1YmxpYyBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyhpc0Vucm9sbGVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5oYXNobWFwIHx8IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coJz09PSBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyA9PT0nKVxuICAgIGNvbnNvbGUubG9nKCdVc2VyIGVucm9sbGVkOicsIGlzRW5yb2xsZWQpXG4gICAgXG4gICAgLy8gQ2FwdHVyZSBpbml0aWFsIHN0YXRlIHRvIGRldGVjdCBjaGFuZ2VzXG4gICAgY29uc3QgaW5pdGlhbEhhc2htYXBTbmFwc2hvdCA9IEpTT04uc3RyaW5naWZ5KHRoaXMuaGFzaG1hcClcbiAgICBcbiAgICAvLyBHZXQgYWxsIG1pbGVzdG9uZSBlbnRyaWVzIGZyb20gaGFzaG1hcCBzb3J0ZWQgYnkgdGhlaXIgaW5kZXggb3IgbnVtYmVyXG4gICAgY29uc3QgbWlsZXN0b25lRW50cmllcyA9IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcClcbiAgICAgIC5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICAgIHJldHVybiBpdGVtLmlzTWlsZXN0b25lIHx8IGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJyB8fCBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJ1xuICAgICAgfSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIC8vIFNvcnQgYnkgbWlsZXN0b25lSW5kZXggaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgYnkgbnVtYmVyIGluIElEXG4gICAgICAgIGNvbnN0IGl0ZW1BID0gdGhpcy5oYXNobWFwW2FdXG4gICAgICAgIGNvbnN0IGl0ZW1CID0gdGhpcy5oYXNobWFwW2JdXG4gICAgICAgIGlmIChpdGVtQS5taWxlc3RvbmVJbmRleCAhPT0gdW5kZWZpbmVkICYmIGl0ZW1CLm1pbGVzdG9uZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaXRlbUEubWlsZXN0b25lSW5kZXggLSBpdGVtQi5taWxlc3RvbmVJbmRleFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG51bUEgPSBwYXJzZUludChhLnJlcGxhY2UoL1xcRC9nLCAnJykpIHx8IDBcbiAgICAgICAgY29uc3QgbnVtQiA9IHBhcnNlSW50KGIucmVwbGFjZSgvXFxEL2csICcnKSkgfHwgMFxuICAgICAgICByZXR1cm4gbnVtQSAtIG51bUJcbiAgICAgIH0pXG5cbiAgICAvLyBJZiB1c2VyIGlzIE5PVCBlbnJvbGxlZCwgbG9jayBBTEwgbWlsZXN0b25lc1xuICAgIGlmICghaXNFbnJvbGxlZCkge1xuICAgICAgY29uc29sZS5sb2coJ1VzZXIgbm90IGVucm9sbGVkIC0gbG9ja2luZyBBTEwgbWlsZXN0b25lcycpXG4gICAgICBtaWxlc3RvbmVFbnRyaWVzLmZvckVhY2gobWlsZXN0b25lSWQgPT4ge1xuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLmNvbXB1dGVkSXNMb2NrZWQgPSB0cnVlXG4gICAgICB9KVxuICAgICAgLy8gQWxzbyBsb2NrIGFsbCBjaGlsZHJlblxuICAgICAgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuICAgICAgICBpZiAoIWl0ZW0uaXNNaWxlc3RvbmUpIHtcbiAgICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICAgIHRoaXMuaGFzaG1hcFVwZGF0ZWQubmV4dCh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgaGFzaG1hcDogdGhpcy5oYXNobWFwIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBwcmUtYXNzZXNzbWVudCBpcyBjb21wbGV0ZWQgKHJlcXVpcmVkIHRvIHVubG9jayBNMSlcbiAgICBjb25zdCBpc1ByZUFzc2Vzc21lbnRDb21wbGV0ZWQgPSB0aGlzLmNoZWNrUHJlQXNzZXNzbWVudENvbXBsZXRpb24oKVxuXG4gICAgbWlsZXN0b25lRW50cmllcy5mb3JFYWNoKChtaWxlc3RvbmVJZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1pbGVzdG9uZSA9IHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF1cbiAgICAgIGlmICghbWlsZXN0b25lKSByZXR1cm5cblxuICAgICAgLy8gRmlyc3QgbWlsZXN0b25lIChNMSkgLSB1bmxvY2tzIHdoZW4gcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkXG4gICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS5jb21wdXRlZElzTG9ja2VkID0gIWlzUHJlQXNzZXNzbWVudENvbXBsZXRlZFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gRm9yIHN1YnNlcXVlbnQgbWlsZXN0b25lcyAoTTIsIE0zLCBldGMuKSwgY2hlY2sgaWYgcHJldmlvdXMgbWlsZXN0b25lIGlzIGZ1bGx5IGNvbXBsZXRlZFxuICAgICAgY29uc3QgcHJldmlvdXNNaWxlc3RvbmVJZCA9IG1pbGVzdG9uZUVudHJpZXNbaW5kZXggLSAxXVxuICAgICAgY29uc3QgcHJldmlvdXNNaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbcHJldmlvdXNNaWxlc3RvbmVJZF1cblxuICAgICAgaWYgKHByZXZpb3VzTWlsZXN0b25lKSB7XG4gICAgICAgIC8vIFNJTVBMSUZJRUQgQVBQUk9BQ0g6IENoZWNrIGlmIHByZXZpb3VzIG1pbGVzdG9uZSBpcyAxMDAlIGNvbXBsZXRlXG4gICAgICAgIC8vIFRoaXMgdXNlcyB0aGUgYWdncmVnYXRlZCBjb21wbGV0aW9uIHBlcmNlbnRhZ2Ugd2hpY2ggaXMgYWxyZWFkeSBjYWxjdWxhdGVkXG4gICAgICAgIC8vIFVzZSBOdW1iZXIoKSB0byBlbnN1cmUgcHJvcGVyIG51bWVyaWMgY29tcGFyaXNvblxuICAgICAgICBjb25zdCBwcmV2Q29tcGxldGlvblBjdCA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSkgfHwgMFxuICAgICAgICBjb25zdCBwcmV2Q29tcGxldGlvblN0YXR1cyA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5jb21wbGV0aW9uU3RhdHVzKSB8fCAwXG4gICAgICAgIGNvbnN0IHByZXZTdGF0dXMgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuc3RhdHVzKSB8fCAwXG4gICAgICAgIGNvbnN0IHByZXZDb21wbGV0ZWRMZWFmTm9kZXMgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuY29tcGxldGVkTGVhZk5vZGVzQ291bnQpIHx8IDBcbiAgICAgICAgY29uc3QgcHJldkxlYWZOb2Rlc0NvdW50ID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLmxlYWZOb2Rlc0NvdW50KSB8fCAwXG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZSA9XG4gICAgICAgICAgcHJldkNvbXBsZXRpb25QY3QgPj0gMTAwIHx8XG4gICAgICAgICAgcHJldkNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHxcbiAgICAgICAgICBwcmV2U3RhdHVzID09PSAyIHx8XG4gICAgICAgICAgKHByZXZMZWFmTm9kZXNDb3VudCA+IDAgJiYgcHJldkNvbXBsZXRlZExlYWZOb2RlcyA+PSBwcmV2TGVhZk5vZGVzQ291bnQpXG5cbiAgICAgICAgLy8gSWYgc2ltcGxlIGNoZWNrIGRvZXNuJ3Qgc2hvdyBjb21wbGV0ZSwgZmFsbCBiYWNrIHRvIGRldGFpbGVkIGNoZWNrXG4gICAgICAgIGxldCBjYW5VbmxvY2sgPSBwcmV2aW91c01pbGVzdG9uZUNvbXBsZXRlXG5cbiAgICAgICAgaWYgKCFjYW5VbmxvY2spIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogQ2hlY2sgaW5kaXZpZHVhbCBpdGVtc1xuICAgICAgICAgIGNvbnN0IGlzUHJldmlvdXNNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUgPSB0aGlzLmNoZWNrTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRlKHByZXZpb3VzTWlsZXN0b25lSWQpXG4gICAgICAgICAgY29uc3QgaXNQcmV2aW91c01pbGVzdG9uZU1hbmRhdG9yeUNvbXBsZXRlID0gdGhpcy5jaGVja01pbGVzdG9uZU1hbmRhdG9yeUNvbnRlbnRDb21wbGV0ZShwcmV2aW91c01pbGVzdG9uZUlkKVxuICAgICAgICAgIGNhblVubG9jayA9IGlzUHJldmlvdXNNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUgJiYgaXNQcmV2aW91c01pbGVzdG9uZU1hbmRhdG9yeUNvbXBsZXRlXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLmNvbXB1dGVkSXNMb2NrZWQgPSAhY2FuVW5sb2NrXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLmNvbXB1dGVkSXNMb2NrZWQgPSB0cnVlXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIE5vdyBjb21wdXRlIHBhcmVudCBtaWxlc3RvbmUgbG9jayBzdGF0dXMgZm9yIGFsbCBjaGlsZHJlblxuICAgIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc01pbGVzdG9uZSkgcmV0dXJuIC8vIFNraXAgbWlsZXN0b25lcyB0aGVtc2VsdmVzXG5cbiAgICAgIC8vIFRyYXZlcnNlIHVwIHRvIGZpbmQgaWYgYW55IGFuY2VzdG9yIG1pbGVzdG9uZSBpcyBsb2NrZWRcbiAgICAgIGxldCBjdXJyZW50UGFyZW50SWQgPSBpdGVtLnBhcmVudFxuICAgICAgbGV0IGRlcHRoID0gMFxuICAgICAgY29uc3QgbWF4RGVwdGggPSA1XG5cbiAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50SWQgJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oYXNobWFwW2N1cnJlbnRQYXJlbnRJZF1cbiAgICAgICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgICBpZiAocGFyZW50RGF0YS5pc01pbGVzdG9uZSAmJiBwYXJlbnREYXRhLmNvbXB1dGVkSXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzaG1hcFtrZXldLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gdHJ1ZVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudFBhcmVudElkID0gcGFyZW50RGF0YS5wYXJlbnRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICAgIGRlcHRoKytcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5oYXNobWFwW2tleV0uaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQpIHtcbiAgICAgICAgdGhpcy5oYXNobWFwW2tleV0uaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgPSBmYWxzZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBDcmVhdGUgbmV3IGhhc2htYXAgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgdGhpcy5oYXNobWFwID0geyAuLi50aGlzLmhhc2htYXAgfVxuICAgIFxuICAgIC8vIEVtaXQgdXBkYXRlIGV2ZW50IGlmIGhhc2htYXAgY2hhbmdlZCAobWlsZXN0b25lIGxvY2sgc3RhdHVzIHVwZGF0ZWQpXG4gICAgY29uc3QgZmluYWxIYXNobWFwU25hcHNob3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmhhc2htYXApXG4gICAgaWYgKGluaXRpYWxIYXNobWFwU25hcHNob3QgIT09IGZpbmFsSGFzaG1hcFNuYXBzaG90KSB7XG4gICAgICB0aGlzLmhhc2htYXBVcGRhdGVkLm5leHQoeyB0aW1lc3RhbXA6IERhdGUubm93KCksIGhhc2htYXA6IHRoaXMuaGFzaG1hcCB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIG1pbGVzdG9uZSBsb2NrIHVwZGF0ZSB3aGVuIGhhc2htYXAgcHJvZ3Jlc3MgaXMgdXBkYXRlZCBleHRlcm5hbGx5XG4gICAqIENhbGxlZCBmcm9tIHZpZXdlci11dGlsLnNlcnZpY2UudHMgYWZ0ZXIgcHJvZ3Jlc3MgdXBkYXRlc1xuICAgKi9cbiAgcHVibGljIHRyaWdnZXJNaWxlc3RvbmVMb2NrVXBkYXRlKCkge1xuICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBMZWFybmluZyBQYXRod2F5IGluIHRoZSBoYXNobWFwXG4gICAgY29uc3QgaGFzTGVhcm5pbmdQYXRod2F5ID0gT2JqZWN0LmtleXModGhpcy5oYXNobWFwKS5zb21lKGtleSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIHJldHVybiBpdGVtLmlzTGVhcm5pbmdQYXRod2F5ICYmIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5J1xuICAgIH0pXG4gICAgXG4gICAgaWYgKGhhc0xlYXJuaW5nUGF0aHdheSkge1xuICAgICAgY29uc29sZS5sb2coJ/CflIQgVHJpZ2dlcmluZyBtaWxlc3RvbmUgbG9jayByZWNvbXB1dGF0aW9uIGFmdGVyIHByb2dyZXNzIHVwZGF0ZScpXG4gICAgICAvLyBBc3N1bWUgZW5yb2xsZWQgc2luY2UgcHJvZ3Jlc3Mgd2FzIGp1c3QgdXBkYXRlZFxuICAgICAgdGhpcy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyh0cnVlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwcmUtYXNzZXNzbWVudCAocHJlbGltaW5hcnkgYXNzZXNzbWVudCkgaXMgY29tcGxldGVkXG4gICAqIFByZS1hc3Nlc3NtZW50IGlzIHR5cGljYWxseSBhIENvdXJzZSBBc3Nlc3NtZW50IGF0IHRoZSByb290IGxldmVsIG9mIExlYXJuaW5nIFBhdGh3YXkgKGJlZm9yZSBtaWxlc3RvbmVzKVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1ByZUFzc2Vzc21lbnRDb21wbGV0aW9uKCk6IGJvb2xlYW4ge1xuICAgIC8vIEZpbmQgdGhlIExlYXJuaW5nIFBhdGh3YXkgcm9vdFxuICAgIGxldCBsZWFybmluZ1BhdGh3YXlJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIGlmIChpdGVtLmlzTGVhcm5pbmdQYXRod2F5ICYmIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xuICAgICAgICBsZWFybmluZ1BhdGh3YXlJZCA9IGtleVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdDaGVja2luZyBwcmUtYXNzZXNzbWVudCBjb21wbGV0aW9uLiBMZWFybmluZyBQYXRod2F5IElEOicsIGxlYXJuaW5nUGF0aHdheUlkKVxuXG4gICAgLy8gUFJJT1JJVFkgMTogTG9vayBmb3IgaXRlbXMgZXhwbGljaXRseSBtYXJrZWQgYXMgcHJlLWFzc2Vzc21lbnRcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIGlmIChpdGVtLmlzUHJlQXNzZXNzbWVudCA9PT0gdHJ1ZSkge1xuICAgICAgICAvLyBNdXN0IGNoZWNrIGZvciBhY3R1YWwgY29tcGxldGlvbiAtIG5vdCBqdXN0IGFueSB2YWx1ZVxuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IChpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IHVuZGVmaW5lZCAmJiBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0ucHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCAmJiBpdGVtLnByb2dyZXNzID49IDEwMCkpXG4gICAgICAgIGNvbnNvbGUubG9nKGDinIUgUHJlLWFzc2Vzc21lbnQgZm91bmQgKGlzUHJlQXNzZXNzbWVudCBmbGFnKTogJHtrZXl9YCwge1xuICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBpdGVtLmNvbXBsZXRpb25TdGF0dXMsXG4gICAgICAgICAgc3RhdHVzOiBpdGVtLnN0YXR1cyxcbiAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSxcbiAgICAgICAgICBwcm9ncmVzczogaXRlbS5wcm9ncmVzcyxcbiAgICAgICAgICBpc0NvbXBsZXRlZCxcbiAgICAgICAgICAvLyBTaG93IEFMTCBmaWVsZHMgdG8gZGVidWcgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgICAgIGFsbERhdGE6IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXG4gICAgICAgIH0pXG4gICAgICAgIC8vIFByZS1hc3Nlc3NtZW50IGV4aXN0cyAtIHJldHVybiBpdHMgY29tcGxldGlvbiBzdGF0dXMgKHRydWUvZmFsc2UpXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXRlZFxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBSSU9SSVRZIDI6IEZpbmQgcHJlLWFzc2Vzc21lbnQgaW4gaGFzaG1hcCAtIGRpcmVjdCBjaGlsZCBvZiBMZWFybmluZyBQYXRod2F5IHRoYXQgaXMgTk9UIGEgbWlsZXN0b25lXG4gICAgLy8gQ2hlY2sgZm9yIGZpcnN0IG5vbi1taWxlc3RvbmUgY2hpbGQgb2YgTGVhcm5pbmcgUGF0aHdheVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBMZWFybmluZyBQYXRod2F5XG4gICAgICBpZiAoaXRlbS5wYXJlbnQgIT09IGxlYXJuaW5nUGF0aHdheUlkKSBjb250aW51ZVxuXG4gICAgICAvLyBTa2lwIG1pbGVzdG9uZXNcbiAgICAgIGlmIChpdGVtLmlzTWlsZXN0b25lKSBjb250aW51ZVxuXG4gICAgICAvLyBUaGlzIGlzIGEgbm9uLW1pbGVzdG9uZSBkaXJlY3QgY2hpbGQgLSBpdCdzIHRoZSBwcmUtYXNzZXNzbWVudFxuICAgICAgLy8gTXVzdCBjaGVjayBmb3IgYWN0dWFsIGNvbXBsZXRpb24gLSBub3QganVzdCBhbnkgdmFsdWVcbiAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gKGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgIT09IHVuZGVmaW5lZCAmJiBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLnByb2dyZXNzICE9PSB1bmRlZmluZWQgJiYgaXRlbS5wcm9ncmVzcyA+PSAxMDApKVxuICAgICAgY29uc29sZS5sb2coYOKchSBQcmUtYXNzZXNzbWVudCBmb3VuZCAoZmlyc3Qgbm9uLW1pbGVzdG9uZSBjaGlsZCk6ICR7a2V5fWAsIHtcbiAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxuICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBpdGVtLmNvbXBsZXRpb25TdGF0dXMsXG4gICAgICAgIHN0YXR1czogaXRlbS5zdGF0dXMsXG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlLFxuICAgICAgICBwcm9ncmVzczogaXRlbS5wcm9ncmVzcyxcbiAgICAgICAgaXNDb21wbGV0ZWQsXG4gICAgICAgIC8vIFNob3cgQUxMIGZpZWxkcyB0byBkZWJ1ZyB3aGF0J3MgYXZhaWxhYmxlXG4gICAgICAgIGFsbERhdGE6IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXG4gICAgICB9KVxuICAgICAgLy8gUHJlLWFzc2Vzc21lbnQgZXhpc3RzIC0gcmV0dXJuIGl0cyBjb21wbGV0aW9uIHN0YXR1cyAodHJ1ZS9mYWxzZSlcbiAgICAgIHJldHVybiBpc0NvbXBsZXRlZFxuICAgIH1cblxuICAgIC8vIENSSVRJQ0FMOiBJZiB3ZSByZWFjaCBoZXJlLCBubyBwcmUtYXNzZXNzbWVudCB3YXMgZm91bmQgaW4gdGhlIGhhc2htYXBcbiAgICAvLyBUaGlzIGNvdWxkIG1lYW4gZWl0aGVyOlxuICAgIC8vIDEuIFRoZXJlIElTIG5vIHByZS1hc3Nlc3NtZW50ICh1bmxvY2sgTTEgYnkgZGVmYXVsdClcbiAgICAvLyAyLiBUaGUgaGFzaG1hcCBoYXNuJ3QgYmVlbiBwb3B1bGF0ZWQgeWV0IChzaG91bGQgbG9jayBNMSB1bnRpbCBkYXRhIGlzIHJlYWR5KVxuICAgIFxuICAgIC8vIFRvIGJlIHNhZmUsIGNoZWNrIGlmIEFOWSBjaGlsZHJlbiBleGlzdCBhdCBhbGxcbiAgICBjb25zdCBoYXNBbnlDaGlsZHJlbiA9IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkuc29tZShrZXkgPT4gXG4gICAgICB0aGlzLmhhc2htYXBba2V5XS5wYXJlbnQgPT09IGxlYXJuaW5nUGF0aHdheUlkXG4gICAgKVxuICAgIFxuICAgIGlmICghaGFzQW55Q2hpbGRyZW4pIHtcbiAgICAgIC8vIEhhc2htYXAgbm90IHBvcHVsYXRlZCB5ZXQgLSBsb2NrIE0xIHVudGlsIGRhdGEgaXMgcmVhZHlcbiAgICAgIGNvbnNvbGUubG9nKCfimqDvuI8gTm8gY2hpbGRyZW4gZm91bmQgaW4gaGFzaG1hcCB5ZXQgLSBsb2NraW5nIE0xIHVudGlsIGRhdGEgaXMgcmVhZHknKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIFxuICAgIC8vIEhhc2htYXAgaXMgcG9wdWxhdGVkIGJ1dCBubyBwcmUtYXNzZXNzbWVudCBmb3VuZCAtIGFsbG93IE0xIHRvIHVubG9ja1xuICAgIGNvbnNvbGUubG9nKCdObyBwcmUtYXNzZXNzbWVudCBmb3VuZCBpbiBmdWxseSBwb3B1bGF0ZWQgaGFzaG1hcCAtIGFsbG93aW5nIE0xIHRvIGJlIHVubG9ja2VkIGJ5IGRlZmF1bHQnKVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtaWxlc3RvbmUncyBhc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgKiBTZWFyY2hlcyBmb3IgYW55IGFzc2Vzc21lbnQgdHlwZSAoQ291cnNlIEFzc2Vzc21lbnQsIEZpbmFsIEFzc2Vzc21lbnQsIGV0Yy4pIHRoYXQgYmVsb25ncyB0byB0aGlzIG1pbGVzdG9uZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZShtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWlsZXN0b25lID0gdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXVxuXG4gICAgLy8gQ2hlY2sgYWxsIGl0ZW1zIGluIGhhc2htYXAgdGhhdCBhcmUgYXNzZXNzbWVudHMgYW5kIGJlbG9uZyB0byB0aGlzIG1pbGVzdG9uZVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGFuIGFzc2Vzc21lbnQgdHlwZVxuICAgICAgY29uc3QgaXNBc3Nlc3NtZW50VHlwZSA9XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdQcmFjdGljZSBRdWVzdGlvbiBTZXQnIHx8XG4gICAgICAgIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIChpdGVtLm5hbWUgJiYgaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Fzc2Vzc21lbnQnKSlcblxuICAgICAgaWYgKCFpc0Fzc2Vzc21lbnRUeXBlKSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGFzc2Vzc21lbnQgYmVsb25ncyB0byB0aGlzIG1pbGVzdG9uZVxuICAgICAgaWYgKHRoaXMuaXNDaGlsZE9mTWlsZXN0b25lKGtleSwgbWlsZXN0b25lSWQpKSB7XG4gICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBubyBhc3Nlc3NtZW50IGZvdW5kLCBjb25zaWRlciBpdCBhcyBjb21wbGV0ZWQgKG5vIGFzc2Vzc21lbnQgcmVxdWlyZW1lbnQpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50IGlzIGNvbXBsZXRlZFxuICAgKiBPbmx5IGNoZWNrcyBjb3Vyc2VzL2NvbnRlbnQgdGhhdCBhcmUgbWFya2VkIGFzIGlzTWFuZGF0b3J5XG4gICAqL1xuICBwcml2YXRlIGNoZWNrTWlsZXN0b25lTWFuZGF0b3J5Q29udGVudENvbXBsZXRlKG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBtaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdXG5cbiAgICBsZXQgbWFuZGF0b3J5Q291bnQgPSAwXG4gICAgbGV0IGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50ID0gMFxuXG4gICAgLy8gQ2hlY2sgYWxsIGl0ZW1zIGluIGhhc2htYXAgdGhhdCBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgbWlsZXN0b25lIChjb3Vyc2VzKVxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGl0ZW0gaXMgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIG1pbGVzdG9uZSAoY291cnNlIGxldmVsKVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ICE9PSBtaWxlc3RvbmVJZCkgY29udGludWVcblxuICAgICAgLy8gU2tpcCBpZiBub3QgYSBjb3Vyc2Ugb3IgY29sbGVjdGlvblxuICAgICAgaWYgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ICE9PSAnQ291cnNlJyAmJiAhaXRlbS5pc0NvbGxlY3Rpb24pIGNvbnRpbnVlXG5cbiAgICAgIC8vIFNraXAgYXNzZXNzbWVudHMgLSB0aGV5J3JlIGNoZWNrZWQgc2VwYXJhdGVseVxuICAgICAgY29uc3QgaXNBc3Nlc3NtZW50ID1cbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdGaW5hbCBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIChpdGVtLm5hbWUgJiYgaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Fzc2Vzc21lbnQnKSlcbiAgICAgIGlmIChpc0Fzc2Vzc21lbnQpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgY29udGVudCBpcyBtYW5kYXRvcnlcbiAgICAgIGlmIChpdGVtLmlzTWFuZGF0b3J5KSB7XG4gICAgICAgIG1hbmRhdG9yeUNvdW50KytcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgfHwgaXRlbS5wcm9ncmVzcyA+PSAxMDBcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVkTWFuZGF0b3J5Q291bnQrK1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYWxsQ29tcGxldGUgPSBtYW5kYXRvcnlDb3VudCA9PT0gMCB8fCBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA+PSBtYW5kYXRvcnlDb3VudFxuICAgIHJldHVybiBhbGxDb21wbGV0ZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29udGVudCBpdGVtIGlzIGEgY2hpbGQgKGRpcmVjdCBvciBuZXN0ZWQpIG9mIGEgbWlsZXN0b25lXG4gICAqL1xuICBwcml2YXRlIGlzQ2hpbGRPZk1pbGVzdG9uZShjb250ZW50SWQ6IHN0cmluZywgbWlsZXN0b25lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50SWQgPSBjb250ZW50SWRcbiAgICBsZXQgZGVwdGggPSAwXG4gICAgY29uc3QgbWF4RGVwdGggPSAxMFxuXG4gICAgd2hpbGUgKGN1cnJlbnRJZCAmJiBkZXB0aCA8IG1heERlcHRoKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2N1cnJlbnRJZF1cbiAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlXG4gICAgICBpZiAoaXRlbS5wYXJlbnQgPT09IG1pbGVzdG9uZUlkKSByZXR1cm4gdHJ1ZVxuICAgICAgY3VycmVudElkID0gaXRlbS5wYXJlbnRcbiAgICAgIGRlcHRoKytcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXRDYWxjdWxhdGlvbnNGcm9tQ2hpbGRyZW4oaXRlbTogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgaXRlbVsnZHVyYXRpb24nXSA9IGl0ZW0uY2hpbGRyZW4ucmVkdWNlKChzdW0sIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc3VtICsgTnVtYmVyKGNoaWxkLmR1cmF0aW9uIHx8IDApXG4gICAgfSwgMClcbiAgICBjb25zdCBjb21wbGV0ZWRJdGVtcyA9IF8uZmlsdGVyKGl0ZW0uY2hpbGRyZW4sIHIgPT4gci5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IHIuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMClcbiAgICBjb25zdCB0b3RhbENvdW50ID0gXy50b0ludGVnZXIoXy5nZXQoaXRlbSwgJ2xlYWZOb2Rlc0NvdW50JykpIHx8IDFcbiAgICBpdGVtWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gTnVtYmVyKCgoY29tcGxldGVkSXRlbXMubGVuZ3RoIC8gdG90YWxDb3VudCkgKiAxMDApLnRvRml4ZWQoKSlcbiAgICBpdGVtWydjb21wbGV0aW9uU3RhdHVzJ10gPSAoaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApID8gMiA6IDFcbiAgICByZXR1cm4gaXRlbVxuICB9XG5cbiAgZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YVJlcSk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YT4ge1xuICAgIHJlcS5yZXF1ZXN0LmZpZWxkcyA9IFsncHJvZ3Jlc3NkZXRhaWxzJ11cblxuICAgIGlmIChyZXEucmVxdWVzdC5jb3Vyc2VJZCkge1xuICAgICAgY29uc3QgcmVzbHV0OiBhbnkgPSB0aGlzLmh0dHAucG9zdDxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhPihcbiAgICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ISVNUT1JZVjJ9LyR7cmVxLnJlcXVlc3QuY291cnNlSWR9YCwgcmVxXG4gICAgICApXG4gICAgICAvLyBkYXRhLnN1YnNjcmliZSgoc3Vic2NyaWJlRGF0YTogYW55KSA9PiB7XG4gICAgICAvLyAgICAgICB0aGlzLnByb2dyYW1DaGlsZENvdXJzZVJlc3VtZURhdGEubmV4dCh7IHJlc3VtZURhdGE6IHN1YnNjcmliZURhdGEucmVzdWx0LmNvbnRlbnRMaXN0LCBjb3Vyc2VJZDogcmVxLnJlcXVlc3QuY291cnNlSWQgfSlcbiAgICAgIC8vICAgICB9KVxuICAgICAgcmV0dXJuIHJlc2x1dFxuICAgIH1cbiAgICByZXR1cm4gb2YoKVxuXG4gIH1cblxuICBkb3dvbmxvYWRDZXJ0aWZpY2F0ZShjZXJ0SWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IGFueSB9PihcbiAgICAgIEFQSV9FTkRfUE9JTlRTLkNFUlRfRE9XTkxPQUQoY2VydElkKSxcbiAgICApXG4gIH1cbiAgZ2V0U2VydmVyRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogTnNBcHBUb2MuSVBvc3RBc3Nlc3NtZW50W10gfT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5TRVJWRVJfREFURSlcbiAgfVxuXG4gIGdldEZvcm1CeUlkKGZvcm1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoQVBJX0VORF9QT0lOVFMuR0VUX0ZPUk1fQllJRChmb3JtSWQpKVxuICB9XG5cbiAgc3VibWl0Rm9ybShmb3JtRGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oQVBJX0VORF9QT0lOVFMuU1VCTUlUX0ZPUk0sIGZvcm1EYXRhKVxuICB9XG5cbiAgZ2V0Rm9ybUJ5SWRQdWJsaWMoZm9ybUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChBUElfRU5EX1BPSU5UUy5HRVRfRk9STV9CWUlEX1BVQkxJQyhmb3JtSWQpKVxuICB9XG5cbiAgc3VibWl0Rm9ybVB1YmxpYyhmb3JtRGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oQVBJX0VORF9QT0lOVFMuU1VCTUlUX0ZPUk1fUFVCTElDLCBmb3JtRGF0YSlcbiAgfVxuXG4gIGdldEFwbGxpY2F0aW9uc0J5SWQoZm9ybUlkOiBzdHJpbmcsIGNvbnRleHRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KEFQSV9FTkRfUE9JTlRTLkdFVF9BUFBMSUNBVElPTlNfQllfSUQoZm9ybUlkLCBjb250ZXh0SWQpKVxuICB9XG5cbiAgc2hhcmVDb250ZW50KHJlcUJvZHk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLlNIQVJFX0NPTlRFTlR9YCwgcmVxQm9keSlcbiAgfVxuICBjaGVja01vZHVsZVdpc2VEYXRhKGNvbnRlbnQ6IGFueSkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4uZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIGxldCBtb2R1bGVSZXNvdXJzZUNvdW50ID0gMFxuICAgICAgICAgIGxldCBvZmZsaW5lUmVzb3Vyc2VDb3VudCA9IDBcbiAgICAgICAgICBlbGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGRFbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNoaWxkRWxlLnByaW1hcnlDYXRlZ29yeSAhPT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICAgICAgICAgIG1vZHVsZVJlc291cnNlQ291bnQgPSBtb2R1bGVSZXNvdXJzZUNvdW50ICsgMVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgb2ZmbGluZVJlc291cnNlQ291bnQgPSBvZmZsaW5lUmVzb3Vyc2VDb3VudCArIDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGVsZVsnbW9kdWxlUmVzb3Vyc2VDb3VudCddID0gbW9kdWxlUmVzb3Vyc2VDb3VudFxuICAgICAgICAgIGVsZVsnb2ZmbGluZVJlc291cnNlQ291bnQnXSA9IG9mZmxpbmVSZXNvdXJzZUNvdW50XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGVsZS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja01vZHVsZVdpc2VEYXRhKGVsZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG4gIGFzeW5jIGZldGNoQ291cnNlSGVpcmFyY2h5KGNvbnRlbnREYXRhOiBhbnkpIHtcbiAgICBpZiAoY29udGVudERhdGEgJiYgY29udGVudERhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgZWxlIG9mIGNvbnRlbnREYXRhLmNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMud2lkZ2V0U3ZjLmZldGNoQ29udGVudChlbGUuaWRlbnRpZmllcikudG9Qcm9taXNlKCkudGhlbihhc3luYyAoc3ViRWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChzdWJFbGUucmVzdWx0ICYmIHN1YkVsZS5yZXN1bHQuY29udGVudFxuICAgICAgICAgICAgICAmJiBzdWJFbGUucmVzdWx0LmNvbnRlbnQuY2hpbGRyZW4gJiYgc3ViRWxlLnJlc3VsdC5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgICBlbGVbJ2NoaWxkcmVuJ10gPSBzdWJFbGUucmVzdWx0LmNvbnRlbnQuY2hpbGRyZW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0VHJhbnNjcmlwdGlvbkRhdGEoZGF0YTogYW55KSB7XG4gICAgLy8gIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgIHRoaXMudHJhbnNyaXB0aW9uRGF0YVN1YmplY3QubmV4dChkYXRhKTtcbiAgfVxuXG4gIHNldEFjdGl2ZVN1YnRpdGxlTGFuZ3VhZ2UoYWN0aXZlTGFuZzogYW55KSB7XG4gICAgdGhpcy50cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QubmV4dChhY3RpdmVMYW5nKVxuICB9XG5cblxuXG4gIGFpR2V0UmVzb3VyY2VWdHRGaWxlKHJlc291cmNlSUQ6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7QVBJX0VORF9QT0lOVFMuQUlfUkVTT1VSQ0VfVlRUX0ZJTEV9P3Jlc291cmNlX2lkPSR7cmVzb3VyY2VJRH1gKVxuICB9XG5cbiAgcmVhZFByZUVucm9sbG1lbnRSZXNvdXJjZXNTdGF0ZShyZXE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KGAke0FQSV9FTkRfUE9JTlRTLlBSRV9FTlJPTExNRU5UX1NUQVRFX1JFQUR9YCwgcmVxKVxuICB9XG5cbiAgY3JlYXRlQ29udGVudFYyKHJlcXVlc3RCb2R5OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChcbiAgICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ1JFQVRFX1JFU09VUkNFfWAsXG4gICAgICAgIHJlcXVlc3RCb2R5LFxuICAgICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmlkZW50aWZpZXJcbiAgICAgICAgfSksXG4gICAgICApXG4gIH1cblxuXG4gIHVwbG9hZEFzc2lnbm1lbnRBbnN3ZXIoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ6IHN0cmluZywgYXNzaWdubWVudElkOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSwgZmlsZS5uYW1lKVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHtBUElfRU5EX1BPSU5UUy5VUExPQURfQVNTSUdOTUVOVH0vJHtjb250ZW50SWR9LyR7YmF0Y2hJZH0vJHthc3NpZ25tZW50SWR9YCwgZm9ybURhdGEpO1xuICB9XG5cblxuICByZWFkQ29udGVudFYyKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5SRUFEX1JFU09VUkNFfXJlYWQvJHtpZH0/bW9kZT1lZGl0YCxcbiAgICApLnBpcGUoXG4gICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuY29udGVudFxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICB1cGxvYWQoXG4gICAgZGF0YTogRm9ybURhdGEsXG4gICAgY29udGVudERhdGE6IGFueSxcbiAgICBvcHRpb25zPzogYW55LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgY29uc3QgZmlsZSA9IGRhdGEuZ2V0KCdjb250ZW50JykgYXMgRmlsZVxuICAgIGxldCBmaWxlTmFtZSA9IGZpbGUubmFtZVxuICAgIGlmIChbJ2NoYW5uZWwuanNvbiddLmluZGV4T2YoZmlsZU5hbWUpIDwgMCkge1xuICAgICAgZmlsZU5hbWUgPSB0aGlzLmFwcGVuZFRvRmlsZW5hbWUoZmlsZU5hbWUpXG4gICAgfVxuICAgIGNvbnN0IG5ld0Zvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBuZXdGb3JtRGF0YS5hcHBlbmQoJ2RhdGEnLCBmaWxlLCBmaWxlTmFtZSlcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLlVQTE9BRF9GSUxFfXVwbG9hZC8ke2NvbnRlbnREYXRhLmNvbnRlbnRJZH1gLFxuICAgICAgbmV3Rm9ybURhdGEsXG4gICAgICBvcHRpb25zXG4gICAgKVxuICB9XG5cbiAgYXBwZW5kVG9GaWxlbmFtZShmaWxlbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgdGltZVN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICBjb25zdCBkb3RJbmRleCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCcuJylcbiAgICBpZiAoZG90SW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZmlsZW5hbWUgKyB0aW1lU3RhbXBcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVuYW1lLnN1YnN0cmluZygwLCBkb3RJbmRleCkgKyB0aW1lU3RhbXAgKyBmaWxlbmFtZS5zdWJzdHJpbmcoZG90SW5kZXgpXG4gIH1cblxuICB1cGRhdGVDb250ZW50V2l0aEZld0ZpZWxkcyhyZXF1ZXN0Qm9keTogYW55LCBpZGVudGlmaWVyOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8YW55PihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLlVQREFURV9SRVNPVVJDRX0vJHtpZGVudGlmaWVyfWAsXG4gICAgICByZXF1ZXN0Qm9keSxcbiAgICApXG4gIH1cblxuICBzZWFyY2hBc3NpZ25tZW50cyhyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChBUElfRU5EX1BPSU5UUy5TRUFSQ0gsIHJlcXVlc3QpXG4gIH1cblxuICBzdWJtaXREcmFmdEFzc2lnbm1lbnQocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dChBUElfRU5EX1BPSU5UUy5TVUJNSVRfRFJBRlRfQVNTSUdOTUVOVCwgcmVxdWVzdClcbiAgfVxuXG4gIHN1Ym1pdEFzc2lnbm1lbnQocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuU1VCTUlUX0FTU0lHTk1FTlQsIHJlcXVlc3QpXG4gIH1cblxuICBub3RpZnlBc3NpZ25tZW50U3VibWlzc2lvbihwYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChBUElfRU5EX1BPSU5UUy5OT1RJRllfQVNTSUdOTUVOVF9TVUJNSVNTSU9OLCBwYXlsb2FkKVxuICB9XG5cbiAgZ2V0QXNzaWdubWVudFN0YXR1cyhyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHtBUElfRU5EX1BPSU5UUy5BU1NJR05NRU5UX1NUQVRVU31gLCByZXF1ZXN0KVxuICB9XG5cbiAgcmVhZEFzc2lnbm1lbnRGaWxlKGNvbnRlbnRJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIGFzc2lnbm1lbnRJZDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyBQcm9wZXJseSBlbmNvZGUgdGhlIHBhcmFtZXRlcnMgdG8gYXZvaWQgbWFsZm9ybWVkIHJlcXVlc3QgZXJyb3JzXG4gICAgY29uc3QgZW5jb2RlZFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgY29udGVudElkOiBjb250ZW50SWQgfHwgJycsXG4gICAgICBiYXRjaElkOiBiYXRjaElkIHx8ICcnLFxuICAgICAgZm9ybUlkOiBhc3NpZ25tZW50SWQgfHwgJycsXG4gICAgICBmaWxlTmFtZTogZmlsZU5hbWUgfHwgJydcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGAke0FQSV9FTkRfUE9JTlRTLlJFQURfQVNTSUdOTUVOVH0/JHtlbmNvZGVkUGFyYW1zLnRvU3RyaW5nKCl9YCwge1xuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtLCBhcHBsaWNhdGlvbi9wZGYsIGFwcGxpY2F0aW9uL21zd29yZCwgYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnXG4gICAgICB9XG4gICAgfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyb3IpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIG1pbGVzdG9uZSBhY2hpZXZlbWVudFxuICAgKiBAcGFyYW0gdXNlcklkIFVzZXIgSURcbiAgICogQHBhcmFtIGNvdXJzZUlkIENvdXJzZSBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBiYXRjaElkIEJhdGNoIElEXG4gICAqIEBwYXJhbSBtaWxlc3RvbmVJZCBNaWxlc3RvbmUgaWRlbnRpZmllciAoZS5nLiwgJ20xJywgJ20yJylcbiAgICovXG4gIGdlbmVyYXRlTWlsZXN0b25lQWNoaWV2ZW1lbnQodXNlcklkOiBzdHJpbmcsIGNvdXJzZUlkOiBzdHJpbmcsIGJhdGNoSWQ6IHN0cmluZywgbWlsZXN0b25lSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgYXBpVXJsID0gJy9hcGlzL3Byb3hpZXMvdjgvYWNoaWV2ZW1lbnQvZHluYW1pYy92MS9nZW5lcmF0ZSdcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkLFxuICAgICAgICBiYXRjaElkLFxuICAgICAgICBtaWxlc3RvbmVJZFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpVXJsLCByZXF1ZXN0KVxuICB9XG5cbn1cbiJdfQ==
|
|
1647
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQWMsS0FBSyxFQUFnQixlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7O0FBRWhELHVDQUF1QztBQUN2QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFBO0FBRXhDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVksRUFBRSxHQUFHLGFBQWEsaUNBQWlDO0lBQy9ELGVBQWUsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7SUFDdkQsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLGVBQWU7SUFDakQsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGNBQWMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLFlBQVksU0FBUyxTQUFTO0lBQ3pGLG1CQUFtQixFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDdkUsaURBQWlELFNBQVMs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SSxFQUFFO1lBQzFCLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRTtZQUN0QixNQUFNLEVBQUUsWUFBWSxJQUFJLEVBQUU7WUFDMUIsUUFBUSxFQUFFLFFBQVEsSUFBSSxFQUFFO1NBQ3pCLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsZUFBZSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFO1lBQ3BGLFlBQVksRUFBRSxNQUFNO1lBQ3BCLE9BQU8sRUFBRTtnQkFDUCxRQUFRLEVBQUUsd0lBQXdJO2FBQ25KO1NBQ0YsQ0FBQyxDQUFDLElBQUksQ0FDTCxVQUFVLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUN4QixPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDRCQUE0QixDQUFDLE1BQWMsRUFBRSxRQUFnQixFQUFFLE9BQWUsRUFBRSxXQUFtQjtRQUNqRyxNQUFNLE1BQU0sR0FBRyxrREFBa0QsQ0FBQTtRQUNqRSxNQUFNLE9BQU8sR0FBRztZQUNkLE9BQU8sRUFBRTtnQkFDUCxNQUFNO2dCQUNOLFFBQVE7Z0JBQ1IsT0FBTztnQkFDUCxXQUFXO2FBQ1o7U0FDRixDQUFBO1FBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDeEMsQ0FBQzsrR0F4eERVLGFBQWE7bUhBQWIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBEYXRhIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgRU1QVFksIFN1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBOc0NvbnRlbnRDb25zdGFudHMgfSBmcm9tICcuLi9fY29uc3RhbnRzL3dpZGdldC1jb250ZW50LmNvbnN0YW50cydcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyBOc0FwcFRvYywgTnNDb2hvcnRzIH0gZnJvbSAnLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBURmV0Y2hTdGF0dXMsIENvbmZpZ3VyYXRpb25zU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXG5pbXBvcnQgeyBtYXAsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuLy8gVE9ETzogbW92ZSB0aGlzIGluIHNvbWUgY29tbW9uIHBsYWNlXG5jb25zdCBQUk9URUNURURfU0xBR19WOCA9ICcvYXBpcy9wcm90ZWN0ZWQvdjgnXG5jb25zdCBQUk9YWV9TTEFHX1Y4ID0gJy9hcGlzL3Byb3hpZXMvdjgnXG5cbmNvbnN0IEFQSV9FTkRfUE9JTlRTID0ge1xuICBCQVRDSF9DUkVBVEU6IGAke1BST1hZX1NMQUdfVjh9L2xlYXJuZXIvY291cnNlL3YxL2JhdGNoL2NyZWF0ZWAsXG4gIENPTlRFTlRfUEFSRU5UUzogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvcGFyZW50c2AsXG4gIENPTlRFTlRfTkVYVDogYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvbmV4dGAsXG4gIENPTlRFTlRfSElTVE9SWVYyOiBgL2FwaXMvcHJveGllcy92OC9yZWFkL2NvbnRlbnQtcHJvZ3Jlc2AsXG4gIENPTlRFTlRfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50LyR7Y29udGVudElkfS9wYXJlbnRgLFxuICBDT05URU5UX0FVVEhfUEFSRU5UOiAoY29udGVudElkOiBzdHJpbmcsIHJvb3RPcmc6IHN0cmluZywgb3JnOiBzdHJpbmcpID0+XG4gICAgYC9hcGlzL2F1dGhBcGkvYWN0aW9uL2NvbnRlbnQvcGFyZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3Jvb3RPcmd9Jm9yZz0ke29yZ31gLFxuICBDT0hPUlRTOiAoY29ob3J0VHlwZTogTnNDb2hvcnRzLkVDb2hvcnRUeXBlcywgY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtjb2hvcnRUeXBlfS8ke2NvbnRlbnRJZH1gLFxuICBFWFRFUk5BTF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvbnRlbnQvZXh0ZXJuYWwtYWNjZXNzLyR7Y29udGVudElkfWAsXG4gIENPSE9SVFNfR1JPVVBfVVNFUjogKGdyb3VwSWQ6IG51bWJlcikgPT4gYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2NvaG9ydHMvJHtncm91cElkfWAsXG4gIFJFTEFURURfUkVTT1VSQ0U6IChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFR5cGU6IHN0cmluZykgPT5cbiAgICBgJHtQUk9URUNURURfU0xBR19WOH0va2h1Yi9mZXRjaFJlbGF0ZWRSZXNvdXJjZXMvJHtjb250ZW50SWR9LyR7Y29udGVudFR5cGV9YCxcbiAgUE9TVF9BU1NFU1NNRU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L3VzZXIvZXZhbHVhdGUvcG9zdC1hc3Nlc3NtZW50LyR7Y29udGVudElkfWAsXG4gIEdFVF9DT05URU5UOiAoY29udGVudElkOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPWFlfU0xBR19WOH0vYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gLFxuICBDRVJUX0RPV05MT0FEOiAoY2VydElkOiBhbnkpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzL2NvdXJzZS9iYXRjaC9jZXJ0L2Rvd25sb2FkLyR7Y2VydElkfWAsXG4gIFNFUlZFUl9EQVRFOiAnYXBpcy9wdWJsaWMvdjgvc3lzdGVtRGF0ZScsXG4gIFNIQVJFX0NPTlRFTlQ6ICcvYXBpcy9wcm94aWVzL3Y4L3VzZXIvdjEvY29udGVudC9yZWNvbW1lbmQnLFxuICBHRVRfRk9STV9CWUlEOiAoZm9ybUlkOiBzdHJpbmcpID0+IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0Rm9ybUJ5SWQ/Zm9ybUlkPSR7Zm9ybUlkfWAsXG4gIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gIFNVQk1JVF9GT1JNOiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgR0VUX0ZPUk1fQllJRF9QVUJMSUM6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHVibGljL3Y4L3B1YmxpYy9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgU1VCTUlUX0ZPUk1fUFVCTElDOiBgYXBpcy9wdWJsaWMvdjgvcHVibGljL2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcbiAgLy8gZ2V0IGFuc3dlcnMgZm9yIGZvcm1cbiAgR0VUX0FQUExJQ0FUSU9OU19CWV9JRDogKGZvcm1JZDogc3RyaW5nLCBjb250ZXh0SWQ6IHN0cmluZykgPT4gYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvZ2V0QXBwbGljYXRpb25zQnlJZD9mb3JtSWQ9JHtmb3JtSWR9JmNvbnRleHRJZD0ke2NvbnRleHRJZH1gLFxuICBBSV9SRVNPVVJDRV9WVFRfRklMRTogYCR7UFJPWFlfU0xBR19WOH0vY2hhdGJvdC92My90cmFuc2NvZGVyL3N0YXRzYCxcbiAgLy8gR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL2dldEZvcm1CeUlkP2lkPSR7Zm9ybUlkfWAsXG4gIFBSRV9FTlJPTExNRU5UX1NUQVRFX1JFQUQ6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQvdjIvc3RhdGUvcmVhZGAsXG4gIENSRUFURV9SRVNPVVJDRTogYGFwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9jcmVhdGVgLFxuICBSRUFEX1JFU09VUkNFOiBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL2AsXG4gIFVQTE9BRF9GSUxFOiBgYXBpcy9wcm94aWVzL3Y4L3VwbG9hZC9hY3Rpb24vY29udGVudC92My9gLFxuICBVUERBVEVfUkVTT1VSQ0U6IGBhcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvdXBkYXRlYCxcbiAgU0VBUkNIOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc2VhcmNoYCxcbiAgU1VCTUlUX0RSQUZUX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvYXNzaWdubWVudC92MS9zdWJtaXREcmFmdGAsXG4gIFNVQk1JVF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc3VibWl0YCxcbiAgQVNTSUdOTUVOVF9TVEFUVVM6IGBhcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc3VibWlzc2lvbnMvc2VhcmNoYCxcbiAgVVBMT0FEX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvc3RvcmFnZS92MS9icC9hc3NpZ25tZW50L2Fuc3dlcmAsXG4gIFJFQURfQVNTSUdOTUVOVDogYGFwaXMvcHJveGllcy92OC9zdG9yYWdlL3YxL2JwL2Fzc2lnbm1lbnQvYW5zd2VyL3JlYWQvZmlsZWAsXG4gIE5PVElGWV9BU1NJR05NRU5UX1NVQk1JU1NJT046IGBhcGlzL3Byb3hpZXMvdjgvdjEvbm90aWZ5QXNzaWdubWVudC9zdWJtaXRgLFxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NTZXJ2aWNlIHtcbiAgYW5hbHl0aWNzUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBhbmFseXRpY3NGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ25vbmUnXG4gIGJhdGNoUmVwbGF5U3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBzZXRCYXRjaERhdGFTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpXG4gIGdldFNlbGVjdGVkQmF0Y2g6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGVuc3VyZSBjb21wbGV0aW9uU3RhdHVzIGlzIGFsd2F5cyBhIG51bWJlclxuICAgKiBDb252ZXJ0cyBzdHJpbmcgdmFsdWVzIHRvIDAgYW5kIGVuc3VyZXMgdmFsaWQgbnVtYmVyIHJhbmdlICgwLCAxLCAyKVxuICAgKi9cbiAgcHJpdmF0ZSBzYWZlQ29tcGxldGlvblN0YXR1cyh2YWx1ZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCBudW1WYWx1ZSA9IE51bWJlcih2YWx1ZSlcbiAgICBpZiAoaXNOYU4obnVtVmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuICAgIHJldHVybiBudW1WYWx1ZVxuICB9XG4gIHNldFdGRGF0YVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgcmVzdW1lRGF0YTogU3ViamVjdDxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhIHwgbnVsbD4gPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgcHJpdmF0ZSBzaG93U3VidGl0bGVPbkJhbm5lcnMgPSBmYWxzZVxuICBwcml2YXRlIGNhblNob3dEZXNjcmlwdGlvbiA9IGZhbHNlXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHByaXZhdGUgdXBkYXRlUmV2aWV3cyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG4gIHVwZGF0ZVJldmlld3NPYnNlcnZhYmxlID0gdGhpcy51cGRhdGVSZXZpZXdzLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBzZXJ2ZXJEYXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJylcbiAgY3VycmVudFNlcnZlckRhdGUgPSB0aGlzLnNlcnZlckRhdGUuYXNPYnNlcnZhYmxlKClcbiAgcHVibGljIGNvbnRlbnRMb2FkZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKVxuICBjb250ZW50TG9hZGVyJCA9IHRoaXMuY29udGVudExvYWRlci5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgZ2V0UGFnZVNjcm9sbCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSlcbiAgdXBkYXRlUGFnZVNjcm9sbCA9IHRoaXMuZ2V0UGFnZVNjcm9sbC5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgaGFzaG1hcDogYW55ID0ge31cbiAgcHVibGljIGhhc2htYXBVcGRhdGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpXG4gIGhhc2htYXBVcGRhdGVkJCA9IHRoaXMuaGFzaG1hcFVwZGF0ZWQuYXNPYnNlcnZhYmxlKClcbiAgcHJpdmF0ZSB0cmFuc3JpcHRpb25EYXRhU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTsgLy8gU3RhcnQgd2l0aCBudWxsXG4gIHRyYW5zY3JpcHRpb25EYXRhJCA9IHRoaXMudHJhbnNyaXB0aW9uRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QkID0gdGhpcy50cmFuc3JpcHRpb25BY3RpdmVMYW5ndWFnZURhdGFPYmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIHB1YmxpYyB0cmFuc3JpcHRpb25JZGVudGlmaWVyID0gbmV3IFN1YmplY3QoKTsgLy8gU3RhcnQgd2l0aCBudWxsXG4gIGNoYW5nZVRyYW5zY3JpcHRpb25MYW5ndWFnZUV2ZW50ID0gbmV3IFN1YmplY3QoKVxuICBwbGF5VHJhbnNjcmlwdGlvblZpZGVvID0gbmV3IFN1YmplY3QoKVxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHByaXZhdGUgY29udGVudExhbmdTdmM6IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsIHByaXZhdGUgd2lkZ2V0U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSkge1xuICAgIC8vIHRoaXMgcmVzdW1lIGRhdGEgc3Vic2NyaXB0aW9uIGlzIGZvciBvbiBsb2FkXG4gICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5yZXN1bWVEYXRhLnN1YnNjcmliZShcbiAgICAgIChfZGF0YVJlc3VsdDogYW55KSA9PiB7XG4gICAgICB9KVxuICB9XG5cbiAgZ2V0IHN1YnRpdGxlT25CYW5uZXJzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dTdWJ0aXRsZU9uQmFubmVyc1xuICB9XG4gIHNldCBzdWJ0aXRsZU9uQmFubmVycyh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dTdWJ0aXRsZU9uQmFubmVycyA9IHZhbFxuICB9XG4gIGdldCBzaG93RGVzY3JpcHRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2hvd0Rlc2NyaXB0aW9uXG4gIH1cbiAgc2V0IHNob3dEZXNjcmlwdGlvbih2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNhblNob3dEZXNjcmlwdGlvbiA9IHZhbFxuICB9XG5cbiAgdXBkYXRlQmF0Y2hEYXRhKCkge1xuICAgIHRoaXMuYmF0Y2hSZXBsYXlTdWJqZWN0Lm5leHQoKVxuICB9XG5cbiAgc2V0QmF0Y2hEYXRhKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpIHtcbiAgICB0aGlzLnNldEJhdGNoRGF0YVN1YmplY3QubmV4dChkYXRhKVxuICB9XG5cbiAgc2V0V0ZEYXRhKGRhdGE6IGFueSkge1xuICAgIHRoaXMuc2V0V0ZEYXRhU3ViamVjdC5uZXh0KGRhdGEpXG4gIH1cblxuICB1cGRhdGVSZXN1bWFEYXRhKGRhdGE6IGFueSkge1xuICAgIHRoaXMucmVzdW1lRGF0YS5uZXh0KGRhdGEpXG4gIH1cblxuICBjaGFuZ2VVcGRhdGVSZXZpZXdzKHN0YXRlOiBib29sZWFuKSB7XG4gICAgdGhpcy51cGRhdGVSZXZpZXdzLm5leHQoc3RhdGUpXG4gIH1cbiAgZ2V0U2VsZWN0ZWRCYXRjaERhdGEoZGF0YTogYW55KSB7XG4gICAgdGhpcy5nZXRTZWxlY3RlZEJhdGNoLm5leHQoZGF0YSlcbiAgfVxuXG4gIGNoYW5nZVNlcnZlckRhdGUoc3RhdGU6IGFueSkge1xuICAgIHRoaXMuc2VydmVyRGF0ZS5uZXh0KHN0YXRlKVxuICB9XG5cbiAgbWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YTogYW55LCByZXN1bWVEYXRhUGFzcz86IGFueSkge1xuICAgIGlmIChyZXN1bWVEYXRhUGFzcyAmJiByZXN1bWVEYXRhUGFzcy5sZW5ndGgpIHtcbiAgICAgIGlmIChyZXN1bWVEYXRhUGFzcyAmJiByZXN1bWVEYXRhUGFzcy5sZW5ndGggJiYgYmF0Y2hEYXRhLmNvbnRlbnQgJiYgYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YSwgcmVzdW1lRGF0YVBhc3MpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YVJlc3VsdCAmJiBkYXRhUmVzdWx0Lmxlbmd0aCAmJiBiYXRjaERhdGEuY29udGVudCAmJiBiYXRjaERhdGEuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YSwgZGF0YVJlc3VsdClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgfVxuICBzZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UoYmF0Y2hEYXRhOiBhbnksIHJlc3VtZURhdGFQYXNzOiBhbnkpIHtcbiAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoKSB7XG4gICAgICBpZiAoYmF0Y2hEYXRhICYmIGJhdGNoRGF0YS5jb250ZW50WzBdICYmXG4gICAgICAgIGJhdGNoRGF0YS5jb250ZW50WzBdLmJhdGNoQXR0cmlidXRlcyAmJlxuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjJcbiAgICAgICkge1xuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMuc2Vzc2lvbkRldGFpbHNfdjIubWFwKChzZDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgZm91bmRDb250ZW50ID0gcmVzdW1lRGF0YVBhc3MuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBzZC5zZXNzaW9uSWQpXG4gICAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgc2QuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICAgIHNkLmNvbXBsZXRpb25TdGF0dXMgPSB0aGlzLnNhZmVDb21wbGV0aW9uU3RhdHVzKGZvdW5kQ29udGVudC5zdGF0dXMpXG4gICAgICAgICAgICBzZC5sYXN0Q29tcGxldGVkVGltZSA9IGZvdW5kQ29udGVudC5sYXN0Q29tcGxldGVkVGltZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2hvd1N0YXJ0QnV0dG9uKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwpOiB7IHNob3c6IGJvb2xlYW47IG1zZzogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHN0YXR1cyA9IHtcbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgbXNnOiAnJyxcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY29udGVudC5hcnRpZmFjdFVybCAmJiBjb250ZW50LmFydGlmYWN0VXJsLm1hdGNoKC95b3V0dSguKT9iZS9naSkgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiZcbiAgICAgICAgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUuY291bnRyeSA9PT0gJ0NoaW5hJ1xuICAgICAgKSB7XG4gICAgICAgIHN0YXR1cy5zaG93ID0gZmFsc2VcbiAgICAgICAgc3RhdHVzLm1zZyA9ICd5b3V0dWJlRm9yYmlkZGVuJ1xuICAgICAgICByZXR1cm4gc3RhdHVzXG4gICAgICB9XG4gICAgICBpZiAoY29udGVudC5yZXNvdXJjZVR5cGUgIT09ICdDZXJ0aWZpY2F0aW9uJykge1xuICAgICAgICBzdGF0dXMuc2hvdyA9IHRydWVcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdHVzXG4gIH1cblxuICBpbml0RGF0YShkYXRhOiBEYXRhLCBuZWVkUmVzdW1lRGF0YTogYm9vbGVhbiA9IGZhbHNlKTogTnNBcHBUb2MuSVdzVG9jUmVzcG9uc2Uge1xuICAgIGxldCBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICAgIGxldCBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICBpZiAoZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnRlbnQgPSBkYXRhLmNvbnRlbnQuZGF0YVxuICAgICAgaWYgKG5lZWRSZXN1bWVEYXRhKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAgICAgKGRhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGRhdGFSZXN1bHQgJiYgZGF0YVJlc3VsdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhUmVzdWx0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gcmVzdW1lRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JDb2RlID0gTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckNvZGUgPSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQVxuICAgICAgfVxuICAgIH1cbiAgICAvLyB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudCxcbiAgICAgIGVycm9yQ29kZSxcbiAgICB9XG4gIH1cblxuICBtYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBkYXRhUmVzdWx0OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IGRhdGFSZXN1bHQuZmluZCgoZWw6IGFueSkgPT4gZWwuY29udGVudElkID09PSBjaGlsZC5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgZm91bmRDb250ZW50LnByb2dyZXNzXG4gICAgICAgICAgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9IHRoaXMuc2FmZUNvbXBsZXRpb25TdGF0dXMoZm91bmRDb250ZW50LnN0YXR1cylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNoaWxkLCBkYXRhUmVzdWx0KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIG1hcE1vZHVsZUNvdW50KGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgMSA6IDFcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KGNoaWxkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGdldE1pbWVUeXBlKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCwgaWRlbnRpZmllcjogc3RyaW5nKTogTnNDb250ZW50LkVNaW1lVHlwZXMge1xuICAgIGlmIChjb250ZW50LmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgfVxuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBpZiAoY29udGVudC5jaGlsZHJlblswXS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIGNvbnRlbnQubWltZVR5cGVcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBiaWcgYmx1bmRlciBpbiBkYXRhXG4gICAgICAgIC8vIHRoaXMubG9nZ2VyLmxvZyhjb250ZW50LmlkZW50aWZpZXIsICdXcm9uZyBtaW1ldHlwZXMgZm9yIHJlc3VtZScpXG4gICAgICAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgICB9XG4gICAgICBjb25zdCBmbGF0TGlzdDogYW55W10gPSBbXVxuICAgICAgY29uc3QgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbjogYW55ID0gKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBmbGF0TGlzdC5wdXNoKGl0ZW0pXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW0uY2hpbGRyZW4ubWFwKChpOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW4oaSkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICBjb25zdCBjaGxkID0gXy5maXJzdChfLmZpbHRlcihmbGF0TGlzdCwgeyBpZGVudGlmaWVyIH0pKVxuICAgICAgcmV0dXJuIChjaGxkICYmIGNobGQubWltZVR5cGUpIHx8ICcnXG4gICAgfVxuICAgIC8vIHJldHVybiBjaGxkLm1pbWVUeXBlXG4gICAgcmV0dXJuIE5zQ29udGVudC5FTWltZVR5cGVzLlVOS05PV05cbiAgfVxuXG4gIGdldFRvY1N0cnVjdHVyZShcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlLFxuICApOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHtcbiAgICBpZiAoXG4gICAgICBjb250ZW50ICYmXG4gICAgICAhKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICAvLyB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuS05PV0xFREdFX0FSVElGQUNUKVxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlRcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTlxuICAgICAgKSkge1xuICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmNvdXJzZSArPSAxXG4gICAgICB9IGVsc2UgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgdG9jU3RydWN0dXJlLmxlYXJuaW5nTW9kdWxlICs9IDFcbiAgICAgIH1cbiAgICAgIF8uZWFjaChjb250ZW50LmNoaWxkcmVuLCBjaGlsZCA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICB0b2NTdHJ1Y3R1cmUgPSB0aGlzLmdldFRvY1N0cnVjdHVyZShjaGlsZCwgdG9jU3RydWN0dXJlKVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY29udGVudCAmJlxuICAgICAgKFxuICAgICAgICBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgLy8gfHwgY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0tub3dsZWRnZSBBcnRpZmFjdCdcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGNvbnRlbnQubWltZVR5cGUpIHtcbiAgICAgICAgLy8gY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5IQU5EU19PTjpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUuaGFuZHNPbiArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NUDM6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnBvZGNhc3QgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0OlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTg6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUudmlkZW8gKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSU5URVJBQ1RJT046XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLmludGVyYWN0aXZlVmlkZW8gKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUERGOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5wZGYgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSFRNTDpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5URVhUX1dFQjpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUud2ViUGFnZSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVk6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnN1cnZleSArPSAxXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5RVUlaOlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkFQUExJQ0FUSU9OX0pTT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUuYXNzZXNzbWVudCArPSAxXG4gICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAvLyAgIHRvY1N0cnVjdHVyZS5xdWl6ICs9IDFcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5PRkZMSU5FX1NFU1NJT046XG4gICAgICAgICAgLy8gaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlID09PSAnQXNzZXNzbWVudCcpIHtcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub2ZmbGluZVNlc3Npb24gKz0gMVxuICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUucXVpeiArPSAxXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUFJBQ1RJQ0VfUkVTT1VSQ0U6XG4gICAgICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLnByYWN0aWNlVGVzdCArPSAxXG4gICAgICAgICAgfSBlbHNlIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCkge1xuICAgICAgICAgICAgdG9jU3RydWN0dXJlLmZpbmFsVGVzdCArPSAxXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuV0VCX01PRFVMRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUud2ViTW9kdWxlICs9IDFcbiAgICAgICAgLy8gICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlpJUDI6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWklQOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5pbnRlcmFjdGl2ZWNvbnRlbnQgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuWU9VVFVCRTpcbiAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUueW91dHViZSArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUub3RoZXIgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICByZXR1cm4gdG9jU3RydWN0dXJlXG4gICAgfVxuICAgIHJldHVybiB0b2NTdHJ1Y3R1cmVcbiAgfVxuXG4gIGZpbHRlclRvYyhcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgZmlsdGVyQ2F0ZWdvcnk6IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTCxcbiAgKTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCB7XG4gICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgLy8gIHx8IGNvbnRlbnQuY29udGVudFR5cGUgPT09ICdLbm93bGVkZ2UgQXJ0aWZhY3QnXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKSB7XG4gICAgICByZXR1cm4gdGhpcy5maWx0ZXJVbml0Q29udGVudChjb250ZW50LCBmaWx0ZXJDYXRlZ29yeSkgPyBjb250ZW50IDogbnVsbFxuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJlZENoaWxkcmVuOiBOc0NvbnRlbnQuSUNvbnRlbnRbXSA9XG4gICAgICBfLm1hcChfLmdldChjb250ZW50LCAnY2hpbGRyZW4nKSwgY2hpbGRDb250ZW50ID0+XG4gICAgICAgIHRoaXMuZmlsdGVyVG9jKGNoaWxkQ29udGVudCwgZmlsdGVyQ2F0ZWdvcnkpKVxuICAgICAgICAuZmlsdGVyKHVuaXRDb250ZW50ID0+IEJvb2xlYW4odW5pdENvbnRlbnQpKSBhcyBOc0NvbnRlbnQuSUNvbnRlbnRbXVxuICAgIGlmIChmaWx0ZXJlZENoaWxkcmVuICYmIGZpbHRlcmVkQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb250ZW50LFxuICAgICAgICBjaGlsZHJlbjogZmlsdGVyZWRDaGlsZHJlbixcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZpbHRlclVuaXRDb250ZW50KFxuICAgIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCxcbiAgICBmaWx0ZXJDYXRlZ29yeTogTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeSA9IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQUxMLFxuICApOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKGZpbHRlckNhdGVnb3J5KSB7XG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuTEVBUk46XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIU5zQ29udGVudENvbnN0YW50cy5WQUxJRF9QUkFDVElDRV9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKSAmJlxuICAgICAgICAgICFOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgICApXG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0U6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfUFJBQ1RJQ0VfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgIGNhc2UgTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BU1NFU1M6XG4gICAgICAgIHJldHVybiBOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfQVNTRVNTTUVOVF9SRVNPVVJDRVMuaGFzKGNvbnRlbnQucmVzb3VyY2VUeXBlKVxuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG4gIGZldGNoQ29udGVudEFuYWx5dGljc0NsaWVudERhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2ZldGNoaW5nJyAmJiB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgIHRoaXMuZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29udGVudEFuYWx5dGljc0NsaWVudChjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgY29uc3QgdXJsID0gYCR7UFJPWFlfU0xBR19WOH0vTEEvYXBpL2xhL2NvbnRlbnRhbmFseXRpY3M/Y29udGVudF9pZD0ke2NvbnRlbnRJZH0mdHlwZT1jb3Vyc2VgXG4gICAgdGhpcy5odHRwLmdldCh1cmwpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KHJlc3VsdClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hDb250ZW50QW5hbHl0aWNzRGF0YShjb250ZW50SWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZmV0Y2hpbmcnICYmIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgIT09ICdkb25lJykge1xuICAgICAgdGhpcy5nZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZClcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRDb250ZW50QW5hbHl0aWNzKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgIGNvbnN0IHVybCA9IGAke1BST1hZX1NMQUdfVjh9L0xBL0xBL2FwaS9Vc2Vycz9yZWZpbmVtZW50ZmlsdGVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgJ1wic291cmNlXCI6W1wiaUdvdFwiLFwiTGVhcm5pbmcgSHViXCJdJyxcbiAgICApfSQke2VuY29kZVVSSUNvbXBvbmVudChgXCJjb3Vyc2VDb2RlXCI6IFtcIiR7Y29udGVudElkfVwiXWApfWBcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQocmVzdWx0KVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0Lm5leHQobnVsbClcbiAgICAgICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgfSxcbiAgICApXG4gIH1cblxuICBjbGVhckFuYWx5dGljc0RhdGEoKSB7XG4gICAgaWYgKHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdCkge1xuICAgICAgdGhpcy5hbmFseXRpY3NSZXBsYXlTdWJqZWN0LnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgaGFzaG1hcCBhbmQgcmVsYXRlZCBjb250ZW50IGRhdGFcbiAgICogQ2FsbCB0aGlzIHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY29udGVudCB0byBwcmV2ZW50IHN0YWxlIGRhdGFcbiAgICovXG4gIHJlc2V0Q29udGVudERhdGEoKSB7XG4gICAgdGhpcy5oYXNobWFwID0ge31cbiAgICB0aGlzLmhhc2htYXBVcGRhdGVkLm5leHQobnVsbClcbiAgICBjb25zb2xlLmxvZygnQ29udGVudCBkYXRhIGNsZWFyZWQgLSBoYXNobWFwIHJlc2V0JylcbiAgfVxuXG4gIGZldGNoQ29udGVudFBhcmVudHMoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4ge1xuICAgIC8vIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgLy8gICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX1BBUkVOVFN9LyR7Y29udGVudElkfWAsXG4gICAgLy8gKVxuICAgIGlmIChjb250ZW50SWQpIHsgfVxuICAgIHJldHVybiBFTVBUWVxuICB9XG4gIGZldGNoQ29udGVudFdoYXRzTmV4dChcbiAgICBjb250ZW50SWQ6IHN0cmluZyxcbiAgICBjb250ZW50VHlwZT86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVH0vJHtjb250ZW50SWR9P2NvbnRlbnRUeXBlPSR7Y29udGVudFR5cGV9YCxcbiAgICAgIClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVH0vJHtjb250ZW50SWR9P3RzPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCxcbiAgICApXG4gIH1cblxuICBmZXRjaE1vcmVMaWtlVGhpc1BhaWQoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFRcbiAgICAgIH0vJHtjb250ZW50SWR9P2V4Y2x1c2l2ZUNvbnRlbnQ9dHJ1ZSZ0cz0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hNb3JlTGlrZVRoaXNGcmVlKGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUXG4gICAgICB9LyR7Y29udGVudElkfT9leGNsdXNpdmVDb250ZW50PWZhbHNlJnRzPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCxcbiAgICApXG4gIH1cblxuICBmZXRjaENvbnRlbnRDb2hvcnRzKFxuICAgIGNvaG9ydFR5cGU6IE5zQ29ob3J0cy5FQ29ob3J0VHlwZXMsXG4gICAgY29udGVudElkOiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8TnNDb2hvcnRzLklDb2hvcnRzQ29udGVudFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb2hvcnRzLklDb2hvcnRzQ29udGVudFtdPihBUElfRU5EX1BPSU5UUy5DT0hPUlRTKGNvaG9ydFR5cGUsIGNvbnRlbnRJZCksIHtcbiAgICAgIGhlYWRlcnM6IHsgcm9vdE9yZzogdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJywgb3JnOiB0aGlzLmNvbmZpZ1N2Yy5vcmcgPyB0aGlzLmNvbmZpZ1N2Yy5vcmdbMF0gOiAnJyB9LFxuICAgIH0pXG4gIH1cbiAgZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHsgaGFzQWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IGhhc0FjY2VzczogYm9vbGVhbiB9PihBUElfRU5EX1BPSU5UUy5FWFRFUk5BTF9DT05URU5UKGNvbnRlbnRJZCkpXG4gIH1cbiAgZmV0Y2hDb2hvcnRHcm91cFVzZXJzKGdyb3VwSWQ6IG51bWJlcikge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29ob3J0cy5JQ29ob3J0c0dyb3VwVXNlcnNbXT4oQVBJX0VORF9QT0lOVFMuQ09IT1JUU19HUk9VUF9VU0VSKGdyb3VwSWQpKVxuICB9XG4gIGZldGNoTW9yZUxpa2VUaGlzKGNvbnRlbnRJZDogc3RyaW5nLCBjb250ZW50VHlwZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRbXT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5SRUxBVEVEX1JFU09VUkNFKGNvbnRlbnRJZCwgY29udGVudFR5cGUpLFxuICAgIClcbiAgfVxuXG4gIGZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXMoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogTnNBcHBUb2MuSVBvc3RBc3Nlc3NtZW50W10gfT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5QT1NUX0FTU0VTU01FTlQoY29udGVudElkKSxcbiAgICApXG4gIH1cblxuICBmZXRjaEdldENvbnRlbnREYXRhKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgbGV0IHVybCA9ICcnXG4gICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgICBpZiAoIWZvclByZXZpZXcpIHtcbiAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBhbnkgfT4oXG4gICAgICAgIEFQSV9FTkRfUE9JTlRTLkdFVF9DT05URU5UKGNvbnRlbnRJZCksXG4gICAgICApXG4gICAgfVxuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnZWRpdE1vZGU9dHJ1ZScpICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdfcmMnKSkge1xuICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgfSBlbHNlIHtcbiAgICAgIHVybCA9IGAvYXBpL2NvbnRlbnQvdjEvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBhbnkgfT4odXJsKVxuXG4gIH1cblxuICBmZXRjaENvbnRlbnRQYXJlbnQoY29udGVudElkOiBzdHJpbmcsIGRhdGE6IE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVxLCBmb3JQcmV2aWV3ID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8TnNBcHBUb2MuSUNvbnRlbnRQYXJlbnRSZXNwb25zZT4oXG4gICAgICBmb3JQcmV2aWV3XG4gICAgICAgID8gQVBJX0VORF9QT0lOVFMuQ09OVEVOVF9BVVRIX1BBUkVOVChcbiAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJyxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1N2Yy5vcmcgPyB0aGlzLmNvbmZpZ1N2Yy5vcmdbMF0gOiAnJyxcbiAgICAgICAgKVxuICAgICAgICA6IEFQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUEFSRU5UKGNvbnRlbnRJZCksXG4gICAgICBkYXRhLFxuICAgIClcbiAgfVxuXG4gIGNyZWF0ZUJhdGNoKGJhdGNoRGF0YTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KFxuICAgICAgQVBJX0VORF9QT0lOVFMuQkFUQ0hfQ1JFQVRFLFxuICAgICAgeyByZXF1ZXN0OiBiYXRjaERhdGEgfSxcbiAgICApXG4gIH1cblxuICBhc3luYyBtYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0oY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCwgZW5yb2xtZW50TGlzdDogYW55LCBjb2xsZWN0aW9uSWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIGxldCB0b3RhbENvdW50ID0gMFxuICAgIGxldCBsZWFmbm9kZUNvdW50ID0gMFxuICAgIGxldCBjb21wbGV0ZWRMZWFmTm9kZXM6IGFueSA9IFtdXG4gICAgbGV0IGZpcnN0VW5jb21wbGV0ZUNvdXJzZTogYW55ID0gJydcbiAgICBsZXQgaW5wcm9ncmVzc0RhdGFDaGVjazogYW55ID0gW11cbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBsZWFmbm9kZUNvdW50ID0gY29udGVudC5sZWFmTm9kZXNDb3VudFxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgIGNvbnN0IGZvdW5kUGFyZW50Q29udGVudCA9IHRoaXMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3QsIGNvbGxlY3Rpb25JZCB8fCBjb250ZW50LmlkZW50aWZpZXIpXG4gICAgICBpZiAoZm91bmRQYXJlbnRDb250ZW50ICYmIGZvdW5kUGFyZW50Q29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY29udGVudClcbiAgICAgICAgdG90YWxDb3VudCA9IGNvbnRlbnQubGVhZk5vZGVzQ291bnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5jaGlsZHJlbi5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgLy8gY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKGFzeW5jIChwYXJlbnRDaGlsZCxpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50Q2hpbGQgPSBjb250ZW50LmNoaWxkcmVuW2ldXG4gICAgICAgICAgICBpZiAocGFyZW50Q2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgICAgY29uc3QgZm91bmRDb250ZW50ID0gdGhpcy5maW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQoZW5yb2xtZW50TGlzdCwgcGFyZW50Q2hpbGQ/LmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgIC8vIHRvdGFsQ291bnQgPSBmb3VuZENvbnRlbnQgJiYgZm91bmRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID8gdG90YWxDb3VudCArIGZvdW5kQ29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA6IHRvdGFsQ291bnQgKyAwXG4gICAgICAgICAgICAgIC8vIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBNYXRoLnJvdW5kKHRvdGFsQ291bnQgLyBsZWFmbm9kZUNvdW50KVxuICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50ICYmIGZvdW5kQ29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50ID0gdG90YWxDb3VudCArPSBwYXJlbnRDaGlsZC5sZWFmTm9kZXNDb3VudFxuICAgICAgICAgICAgICAgIGNvbXBsZXRlZExlYWZOb2RlcyA9IFsuLi5jb21wbGV0ZWRMZWFmTm9kZXMsIC4uLnBhcmVudENoaWxkLmxlYWZOb2Rlc11cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50Lmlzc3VlZENlcnRpZmljYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZTogYW55ID0gZm91bmRDb250ZW50Lmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0SWQ6IGFueSA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgIHBhcmVudENoaWxkLmlzc3VlZENlcnRpZmljYXRlc0lkID0gY2VydElkXG4gICAgICAgICAgICAgICAgICAvLyBjb25zdCBjZXJ0RGF0YTogYW55ID0gYXdhaXQgdGhpcy5kb3dvbmxvYWRDZXJ0aWZpY2F0ZShjZXJ0SWQpLnRvUHJvbWlzZSgpLmNhdGNoKF9lcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICAgICAgLy8gfSlcbiAgICAgICAgICAgICAgICAgIC8vIGlmIChjZXJ0RGF0YSAmJiBjZXJ0RGF0YS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgIC8vICAgcGFyZW50Q2hpbGQuaXNzdWVkQ2VydGlmaWNhdGVzU1ZHID0gY2VydERhdGEucmVzdWx0LnByaW50VXJpXG4gICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcGFyZW50Q2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZC5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0ocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgICBiYXRjaElkOiBmb3VuZENvbnRlbnQuYmF0Y2guYmF0Y2hJZCxcbiAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGZvdW5kQ29udGVudC51c2VySWQsXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgICAgICAgICAgICAgICAgICAgIGNvdXJzZUlkOiBmb3VuZENvbnRlbnQuY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGZpcnN0VW5jb21wbGV0ZUNvdXJzZSA9IChwYXJlbnRDaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMCB8fCAhcGFyZW50Q2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UpICYmXG4gICAgICAgICAgICAgICAgICAgICFmaXJzdFVuY29tcGxldGVDb3Vyc2UgPyBwYXJlbnRDaGlsZCA6IGZpcnN0VW5jb21wbGV0ZUNvdXJzZVxuICAgICAgICAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2tcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkudG9Qcm9taXNlKCkudGhlbigocHJvZ3Jlc3NkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YTogYW55ID0gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnJlc3VsdCAmJiBkYXRhPy5yZXN1bHQ/LmNvbnRlbnRMaXN0Py5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkQ291bnQgPSBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUucHJvZ3Jlc3MgPT09IDEwMClcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGNvbXBsZXRlZExlYWZOb2RlcywgY29tcGxldGVkQ291bnQpXG4gICAgICAgICAgICAgICAgICAgICAgdG90YWxDb3VudCA9IGNvbXBsZXRlZExlYWZOb2Rlcy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gWy4uLmlucHJvZ3Jlc3NEYXRhQ2hlY2ssIC4uLmRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrID8gaW5wcm9ncmVzc0RhdGFDaGVjayA6ICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UocGFyZW50Q2hpbGQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQocGFyZW50Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBNb2R1bGVDb3VudChwYXJlbnRDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgZWxzZSB7XG4gICAgICAgICAgICAvLyAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSBlbnJvbG1lbnRMaXN0ICYmIGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSBjb250ZW50LmlkZW50aWZpZXIpXG4gICAgICAgICAgICAvLyAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgICAgLy8gICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgYmF0Y2hJZDogZm91bmRDb250ZW50LmJhdGNoLmJhdGNoSWQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdXNlcklkOiBmb3VuZENvbnRlbnQudXNlcklkLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGNvdXJzZUlkOiBmb3VuZENvbnRlbnQuY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICAgICAgLy8gICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgJ3Byb2dyZXNzZGV0YWlscycsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgXSxcbiAgICAgICAgICAgIC8vICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkudG9Qcm9taXNlKCkudGhlbigocHJvZ3Jlc3NkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3QgZGF0YTogYW55ICA9IHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gZGF0YS5yZXN1bHQuY29udGVudExpc3QuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnByb2dyZXNzID09PSAxMDApXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRlZExlYWZub2Rlcyhjb21wbGV0ZWRMZWFmTm9kZXMsIGNvbXBsZXRlZENvdW50KVxuICAgICAgICAgICAgLy8gICAgICAgICAgIHRvdGFsQ291bnQgPSBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPyBpbnByb2dyZXNzRGF0YUNoZWNrIDogIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XG4gICAgICAgICAgICAvLyAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgIC8vICAgICAgICAgcmV0dXJuIHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgLy8gICAgICAgfSlcbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVxuICAgICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0VcbiAgICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UXG4gICAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgICAgIC8vIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgdGhpcy5yZXN1bWVEYXRhKVxuICAgICAgICAgIGNvbnN0IGZvdW5kUGFyZW50Q29udGVudCA9IHRoaXMuZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3QsIGNvbGxlY3Rpb25JZCB8fCBjb250ZW50Py5pZGVudGlmaWVyKVxuICAgICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UoY29udGVudClcbiAgICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgIGJhdGNoSWQ6IGZvdW5kUGFyZW50Q29udGVudD8uYmF0Y2g/LmJhdGNoSWQsXG4gICAgICAgICAgICAgIHVzZXJJZDogZm91bmRQYXJlbnRDb250ZW50Py51c2VySWQsXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBmb3VuZFBhcmVudENvbnRlbnQ/LmNvbGxlY3Rpb25JZCxcbiAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmd1YWdlLFxuICAgICAgICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgJ3Byb2dyZXNzZGV0YWlscycsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnRvUHJvbWlzZSgpLnRoZW4oKHByb2dyZXNzZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgY29tcGxldGVkQ291bnQgPSBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUucHJvZ3Jlc3MgPT09IDEwMClcbiAgICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRlZExlYWZub2Rlcyhjb21wbGV0ZWRMZWFmTm9kZXMsIGNvbXBsZXRlZENvdW50KVxuICAgICAgICAgICAgICB0b3RhbENvdW50ID0gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gWy4uLmlucHJvZ3Jlc3NEYXRhQ2hlY2ssIC4uLmRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XVxuICAgICAgICAgICAgICAvLyBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVjayA/IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgOiAgZGF0YS5yZXN1bHQuY29udGVudExpc3RcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc2RhdGFcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlucHJvZ3Jlc3NEYXRhQ2hlY2sgJiYgaW5wcm9ncmVzc0RhdGFDaGVjay5sZW5ndGggPT09IDAgJiYgZmlyc3RVbmNvbXBsZXRlQ291cnNlKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RDaGlsZERhdGEgPSB0aGlzLndpZGdldFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkoZmlyc3RVbmNvbXBsZXRlQ291cnNlKVxuICAgICAgICAgIGNvbnN0IGNoaWxkRW5yb2xsbWVudERhdGEgPSBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+XG4gICAgICAgICAgICBlbC5jb2xsZWN0aW9uSWQgPT09IGZpcnN0VW5jb21wbGV0ZUNvdXJzZS5pZGVudGlmaWVyKVxuICAgICAgICAgIGNvbnN0IHJlc3VtZURhdGEgPSBbe1xuICAgICAgICAgICAgY29udGVudElkOiBmaXJzdENoaWxkRGF0YS5pZGVudGlmaWVyLFxuICAgICAgICAgICAgYmF0Y2hJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmJhdGNoSWQsXG4gICAgICAgICAgICBjb21wbGV0ZWRDb3VudDogMSxcbiAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiAwLjAsXG4gICAgICAgICAgICBwcm9ncmVzczogMCxcbiAgICAgICAgICAgIHZpZXdDb3VudDogMSxcbiAgICAgICAgICAgIGNvdXJzZUlkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5jb3Vyc2VJZCxcbiAgICAgICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgICB9XVxuICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSByZXN1bWVEYXRhXG4gICAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGNvbnN0IHBhcmVudENvbnRlbnQgPSBlbnJvbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gY29udGVudC5pZGVudGlmaWVyKVxuICAgICAgLy8gaWYgKCFwYXJlbnRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGN0ID0gTWF0aC5mbG9vcigodG90YWxDb3VudCAvIGxlYWZub2RlQ291bnQpICogMTAwKVxuICAgICAgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQY3QpID8gMCA6IGNhbGN1bGF0ZWRQY3RcbiAgICAgIGNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwID8gMiA6IChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxuICAgICAgaWYgKGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCAmJiBpbnByb2dyZXNzRGF0YUNoZWNrICYmIGlucHJvZ3Jlc3NEYXRhQ2hlY2subGVuZ3RoID09PSAwICYmICFmaXJzdFVuY29tcGxldGVDb3Vyc2UpIHtcbiAgICAgICAgY29uc3QgZmlyc3RDaGlsZERhdGEgPSB0aGlzLndpZGdldFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkoY29udGVudClcbiAgICAgICAgY29uc3QgY2hpbGRFbnJvbGxtZW50RGF0YSA9IGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT5cbiAgICAgICAgICBlbC5jb2xsZWN0aW9uSWQgPT09IGNvbnRlbnQuY2hpbGRyZW5bMF0uaWRlbnRpZmllcilcbiAgICAgICAgY29uc3QgcmVzdW1lRGF0YSA9IFt7XG4gICAgICAgICAgY29udGVudElkOiBmaXJzdENoaWxkRGF0YS5pZGVudGlmaWVyLFxuICAgICAgICAgIGJhdGNoSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5iYXRjaElkLFxuICAgICAgICAgIGNvbXBsZXRlZENvdW50OiAxLFxuICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiAxMDAsXG4gICAgICAgICAgcHJvZ3Jlc3M6IDIsXG4gICAgICAgICAgdmlld0NvdW50OiAxLFxuICAgICAgICAgIGNvdXJzZUlkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuY291cnNlSWQsXG4gICAgICAgICAgc3RhdHVzOiAyLFxuICAgICAgICB9XVxuICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gcmVzdW1lRGF0YVxuICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgIH1cbiAgICAgIC8vIC8vIH0gZWxzZSB7XG4gICAgICAvLyAgIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwYXJlbnRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAvLyAvLyB9XG4gICAgICAvLyB9KVxuICAgICAgLy8gdGhpcy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGNvbnRlbnQsIGNvbnRlbnQpXG4gICAgICB0aGlzLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjb250ZW50KVxuICAgICAgdGhpcy5jaGVja01vZHVsZVdpc2VEYXRhKGNvbnRlbnQpXG4gICAgICAvLyBDb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIEFGVEVSIHByb2dyZXNzIGRhdGEgaXMgcG9wdWxhdGVkXG4gICAgICBpZiAoY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICAgIHRoaXMuY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMoKVxuICAgICAgICAvLyBFbnN1cmUgaGFzaG1hcCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgZm9yIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgdGhpcy5oYXNobWFwID0geyAuLi50aGlzLmhhc2htYXAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgfVxuICB9XG4gIGNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGxlYWZOb2RlczogYW55LCBjb21wbGV0ZWRDb3VudDogYW55KSB7XG4gICAgaWYgKGNvbXBsZXRlZENvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbXBsZXRlZENvdW50LmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmICghbGVhZk5vZGVzLmluY2x1ZGVzKGVsZS5jb250ZW50SWQpKSB7XG4gICAgICAgICAgbGVhZk5vZGVzLnB1c2goZWxlLmNvbnRlbnRJZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyBnZXRQcm9ncmVzc0ZvckNoaWxkQ291cnNlKHJlcXVlc3Q6IGFueSwgY29udGVudDogYW55KSB7XG4gIC8vICBjb25zdCBkYXRhOiBhbnkgPSAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcXVlc3QpLnRvUHJvbWlzZSgpLmNhdGNoKF9lcnJvciA9PiB7fSlcbiAgLy8gICBpZiAoZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoID4gMCkge1xuICAvLyAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgLy8gfVxuICAvLyB9XG5cbiAgZmluZEVucm9sbWVudEJ5Q29sbGVjdGlvbklkKGVucm9sbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGVucm9sbWVudExpc3QgJiYgZW5yb2xtZW50TGlzdD8ubGVuZ3RoICYmIGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWw/LmNvbGxlY3Rpb25JZCA9PT0gaWRlbnRpZmllcilcbiAgfVxuXG4gIGFzeW5jIG1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZTogYW55KSB7XG4gICAgaWYgKGNvdXJzZSAmJiBjb3Vyc2UuY2hpbGRyZW4pIHtcbiAgICAgIGF3YWl0IGNvdXJzZS5jaGlsZHJlbi5tYXAoYXN5bmMgKGNvdXJzZUNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKChjb3Vyc2VDaGlsZCAmJiBjb3Vyc2VDaGlsZC5jaGlsZHJlbikgfHwgY291cnNlQ2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25DaGlsZFBlcmNlbnRhZ2VQcm9ncmFtKGNvdXJzZUNoaWxkKVxuICAgICAgICAgIGNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IGNvdXJzZVsnbW9kdWxlQ291bnQnXSA/IGNvdXJzZVsnbW9kdWxlQ291bnQnXSArIDEgOiAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291cnNlQ2hpbGRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSAxMDBcbiAgICAgICAgICBjb3Vyc2VDaGlsZFsnY29tcGxldGlvblN0YXR1cyddID0gMlxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwsIHBhcmVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCkge1xuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgIC8vIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpPT4ge1xuICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgY29udGVudCA9IHRoaXMuZ2V0Q2FsY3VsYXRpb25zRnJvbUNoaWxkcmVuKGNvbnRlbnQpXG4gICAgICAgIC8vIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgLy8gaWYgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgLy8gICB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoaXRlbSwgcGFyZW50KVxuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGE6IE5zQ29udGVudC5JQ29udGVudCwgcm9vdENvdXJzZUNhdGVnb3J5Pzogc3RyaW5nLCBwYXJlbnRJZD86IHN0cmluZykge1xuICAgIGlmIChoaWVyYXJjaHlEYXRhICYmIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4pIHtcbiAgICAgIGhpZXJhcmNoeURhdGEuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICAvLyBJTVBPUlRBTlQ6IFBhc3MgdGhlIGN1cnJlbnQgaGllcmFyY2h5RGF0YSdzIGlkZW50aWZpZXIgYXMgdGhlIHBhcmVudCBmb3IgY2hpbGRyZW5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGNvcnJlY3QgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcHMgaW4gdGhlIGhhc2htYXBcbiAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjaGlsZCwgcm9vdENvdXJzZUNhdGVnb3J5LCBoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXIpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJpbWFyeUNhdCA9IGNoaWxkLnByaW1hcnlDYXRlZ29yeSBhcyBzdHJpbmdcbiAgICAgICAgY29uc3QgY291cnNlQ2F0ID0gKGNoaWxkLmNvdXJzZUNhdGVnb3J5IHx8IGNoaWxkLnByaW1hcnlDYXRlZ29yeSB8fCAnJykgYXMgc3RyaW5nXG4gICAgICAgIGNvbnN0IGlzTWlsZXN0b25lID0gcHJpbWFyeUNhdCA9PT0gJ01pbGVzdG9uZScgfHwgY291cnNlQ2F0ID09PSAnTWlsZXN0b25lJ1xuICAgICAgICBjb25zdCBpc0NvbGxlY3Rpb24gPSBjaGlsZC5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTlxuICAgICAgICBjb25zdCBpc01vZHVsZSA9IGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFXG4gICAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFIHx8XG4gICAgICAgICAgY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRSB8fFxuICAgICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVCB8fFxuICAgICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09NUF9BU1NFU1NNRU5UXG4gICAgICAgIGNvbnN0IGlzTGVhcm5pbmdQYXRod2F5ID0gcm9vdENvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcblxuICAgICAgICAvLyBDaGVjayBpZiBjb250ZW50IGlzIG1hbmRhdG9yeSAoaXNNYW5kYXRvcnkgZmxhZyBvciBtYW5kYXRvcnkgcHJvcGVydHkpXG4gICAgICAgIGNvbnN0IGlzTWFuZGF0b3J5ID0gY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgKGNoaWxkIGFzIGFueSkubWFuZGF0b3J5ID09PSB0cnVlXG5cbiAgICAgICAgLy8gVXNlIHBhc3NlZCBwYXJlbnRJZCAoZnJvbSBpdGVyYXRpb24gY29udGV4dCkgb3IgZmFsbGJhY2sgdG8gY2hpbGQ/LnBhcmVudCAoZnJvbSBBUEkpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBuZXN0ZWQgY2hpbGRyZW4gKGUuZy4sIGFzc2Vzc21lbnRzIGluc2lkZSBjb3Vyc2VzKSBoYXZlIGNvcnJlY3QgcGFyZW50IHJlZmVyZW5jZXNcbiAgICAgICAgY29uc3QgY29ycmVjdFBhcmVudElkID0gaGllcmFyY2h5RGF0YS5pZGVudGlmaWVyIHx8IGNoaWxkPy5wYXJlbnRcblxuICAgICAgICBsZXQgbG9jYWxNYXA6IGFueSA9IHtcbiAgICAgICAgICBwYXJlbnQ6IGNvcnJlY3RQYXJlbnRJZCxcbiAgICAgICAgICBpZGVudGlmaWVyOiBjaGlsZC5pZGVudGlmaWVyLFxuICAgICAgICAgIGxlYWZOb2Rlc0NvdW50OiBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCBudWxsLFxuICAgICAgICAgIGxlYWZOb2RlczogY2hpbGQubGVhZk5vZGVzIHx8IFtdLFxuICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjaGlsZC5wcm9ncmVzcyB8fCAwLFxuICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IHRoaXMuc2FmZUNvbXBsZXRpb25TdGF0dXMoY2hpbGQuY29tcGxldGlvblN0YXR1cyB8fCBjaGlsZC5zdGF0dXMpLFxuICAgICAgICAgIHN0YXR1czogdGhpcy5zYWZlQ29tcGxldGlvblN0YXR1cyhjaGlsZC5zdGF0dXMgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyksXG4gICAgICAgICAgcHJvZ3Jlc3M6IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIHByaW1hcnlDYXRlZ29yeTogY2hpbGQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAgIGNvdXJzZUNhdGVnb3J5OiBjb3Vyc2VDYXQsXG4gICAgICAgICAgZHVyYXRpb246IGNoaWxkLmR1cmF0aW9uIHx8IDAsXG4gICAgICAgICAgZXhwZWN0ZWREdXJhdGlvbjogY2hpbGQuZXhwZWN0ZWREdXJhdGlvbiB8fCAwLFxuICAgICAgICAgIC8vIEFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgICAgICAgIG1pbWVUeXBlOiBjaGlsZC5taW1lVHlwZSxcbiAgICAgICAgICBpc0xvY2tlZDogY2hpbGQuaXNMb2NrZWQgfHwgZmFsc2UsXG4gICAgICAgICAgYXJ0aWZhY3RVcmw6IGNoaWxkLmFydGlmYWN0VXJsIHx8IG51bGwsXG4gICAgICAgICAgbmFtZTogY2hpbGQubmFtZSB8fCAnJyxcbiAgICAgICAgICBjb250ZW50VHlwZTogY2hpbGQuY29udGVudFR5cGUgfHwgJycsXG4gICAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBMZWFybmluZyBQYXRod2F5XG4gICAgICAgICAgaXNNaWxlc3RvbmU6IGlzTWlsZXN0b25lLFxuICAgICAgICAgIGlzQ29sbGVjdGlvbjogaXNDb2xsZWN0aW9uLFxuICAgICAgICAgIGlzTW9kdWxlOiBpc01vZHVsZSxcbiAgICAgICAgICBpc1Jlc291cmNlOiBpc1Jlc291cmNlLFxuICAgICAgICAgIGlzTGVhcm5pbmdQYXRod2F5OiBpc0xlYXJuaW5nUGF0aHdheSxcbiAgICAgICAgICBpc01hbmRhdG9yeTogaXNNYW5kYXRvcnksXG4gICAgICAgICAgLy8gTWlsZXN0b25lIHNwZWNpZmljIGRhdGFcbiAgICAgICAgICBtaWxlc3RvbmVJbmRleDogKGNoaWxkIGFzIGFueSkubWlsZXN0b25lSW5kZXgsXG4gICAgICAgICAgY29tcGxldGVkTGVhZk5vZGVzQ291bnQ6IChjaGlsZCBhcyBhbnkpLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50IHx8IDAsXG4gICAgICAgICAgLy8gUHJlLWFzc2Vzc21lbnQgZmxhZyAoZm9yIG1pbGVzdG9uZSBnYXRpbmcpXG4gICAgICAgICAgaXNQcmVBc3Nlc3NtZW50OiAoY2hpbGQgYXMgYW55KS5pc1ByZUFzc2Vzc21lbnQgfHwgZmFsc2UsXG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWJ1ZyBsb2dnaW5nIGZvciBtaWxlc3RvbmVzXG4gICAgICAgIGlmIChpc01pbGVzdG9uZSkge1xuICAgICAgICAgIC8vIFByb2dyZXNzIHRyYWNrZWQgZm9yIG1pbGVzdG9uZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVidWcgbG9nZ2luZyBmb3IgYXNzZXNzbWVudCBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwc1xuICAgICAgICAvLyBOb3RlOiBGSU5BTF9BU1NFU1NNRU5UIG1hcHMgdG8gJ0NvdXJzZSBBc3Nlc3NtZW50JyBpbiB0aGUgZW51bSwgbm90ICdGaW5hbCBBc3Nlc3NtZW50J1xuICAgICAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPSBcbiAgICAgICAgICBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgICBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdTdGFuZGFsb25lIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgICAgY2hpbGQubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCdcbiAgICAgICAgXG4gICAgICAgIGlmIChpc0Fzc2Vzc21lbnQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhg8J+TiyBBZGRpbmcgYXNzZXNzbWVudCB0byBoYXNobWFwOiBcIiR7Y2hpbGQubmFtZX1cImAsIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IGNoaWxkLmlkZW50aWZpZXIsXG4gICAgICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGNoaWxkLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICAgIHBhcmVudDogY29ycmVjdFBhcmVudElkLFxuICAgICAgICAgICAgb3JpZ2luYWxQYXJlbnQ6IGNoaWxkPy5wYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnROYW1lOiBoaWVyYXJjaHlEYXRhLm5hbWUsXG4gICAgICAgICAgICBwYXJlbnRDYXRlZ29yeTogaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYXNobWFwW2NoaWxkLmlkZW50aWZpZXJdID0gbG9jYWxNYXBcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNyZWF0ZVByZUFzc2Vzc21lbnRIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQpIHtcbiAgICBpZiAoaGllcmFyY2h5RGF0YSAmJiBoaWVyYXJjaHlEYXRhLnByZUVucm9sbWVudFJlc291cmNlcykge1xuICAgICAgaGllcmFyY2h5RGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXMuZm9yRWFjaCgoY2hpbGQ6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQgJiYgY2hpbGQucHJlRW5yb2xtZW50UmVzb3VyY2VzKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVQcmVBc3Nlc3NtZW50SGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoY2hpbGQpXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxvY2FsTWFwID0ge31cbiAgICAgICAgbG9jYWxNYXAgPSB7XG4gICAgICAgICAgcGFyZW50OiBjaGlsZD8ucGFyZW50LFxuICAgICAgICAgIGlkZW50aWZpZXI6IGNoaWxkLmlkZW50aWZpZXIsXG4gICAgICAgICAgbGVhZk5vZGVzQ291bnQ6IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgICAgbGVhZk5vZGVzOiBjaGlsZC5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNoaWxkLnByb2dyZXNzLFxuICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IHRoaXMuc2FmZUNvbXBsZXRpb25TdGF0dXMoY2hpbGQuY29tcGxldGlvblN0YXR1cyksXG4gICAgICAgICAgc3RhdHVzOiB0aGlzLnNhZmVDb21wbGV0aW9uU3RhdHVzKGNoaWxkLnN0YXR1cyB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzKSxcbiAgICAgICAgICBwcm9ncmVzczogY2hpbGQucHJvZ3Jlc3MsXG4gICAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgICAgY291cnNlQ2F0ZWdvcnk6IGNoaWxkLmNvdXJzZUNhdGVnb3J5IHx8IGNoaWxkLnByaW1hcnlDYXRlZ29yeSB8fCAnJyxcbiAgICAgICAgICBkdXJhdGlvbjogY2hpbGQuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBjaGlsZC5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgICAgLy8gTWFyayBhcyBwcmUtYXNzZXNzbWVudCBPTkxZIGlmIGV4cGxpY2l0bHkgc2V0IC0gZG8gTk9UIGRlZmF1bHQgdG8gdHJ1ZVxuICAgICAgICAgIGlzUHJlQXNzZXNzbWVudDogY2hpbGQuaXNQcmVBc3Nlc3NtZW50IHx8IGZhbHNlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzaG1hcFtjaGlsZC5pZGVudGlmaWVyXSA9IGxvY2FsTWFwXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCkge1xuICAgIGlmIChoaWVyYXJjaHlEYXRhKSB7XG4gICAgICBjb25zdCByb290Q291cnNlQ2F0ZWdvcnkgPSBoaWVyYXJjaHlEYXRhLmNvdXJzZUNhdGVnb3J5IHx8IGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5IHx8ICcnXG4gICAgICBjb25zdCBpc0xlYXJuaW5nUGF0aHdheSA9IHJvb3RDb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknXG5cbiAgICAgIHRoaXMuaGFzaG1hcFtoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXJdID0ge1xuICAgICAgICBwYXJlbnQ6IGhpZXJhcmNoeURhdGEucGFyZW50LFxuICAgICAgICBpZGVudGlmaWVyOiBoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXIsXG4gICAgICAgIGxlYWZOb2Rlc0NvdW50OiBoaWVyYXJjaHlEYXRhLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgIGxlYWZOb2RlczogaGllcmFyY2h5RGF0YS5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MgfHwgMCxcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogdGhpcy5zYWZlQ29tcGxldGlvblN0YXR1cyhoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMpLFxuICAgICAgICBwcm9ncmVzczogaGllcmFyY2h5RGF0YS5wcm9ncmVzcyxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBoaWVyYXJjaHlEYXRhLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgY291cnNlQ2F0ZWdvcnk6IHJvb3RDb3Vyc2VDYXRlZ29yeSxcbiAgICAgICAgZXhwZWN0ZWREdXJhdGlvbjogaGllcmFyY2h5RGF0YS5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgbWV0YWRhdGFcbiAgICAgICAgbWltZVR5cGU6IGhpZXJhcmNoeURhdGEubWltZVR5cGUsXG4gICAgICAgIGlzTG9ja2VkOiBoaWVyYXJjaHlEYXRhLmlzTG9ja2VkIHx8IGZhbHNlLFxuICAgICAgICBhcnRpZmFjdFVybDogaGllcmFyY2h5RGF0YS5hcnRpZmFjdFVybCB8fCBudWxsLFxuICAgICAgICBuYW1lOiBoaWVyYXJjaHlEYXRhLm5hbWUgfHwgJycsXG4gICAgICAgIGNvbnRlbnRUeXBlOiBoaWVyYXJjaHlEYXRhLmNvbnRlbnRUeXBlIHx8ICcnLFxuICAgICAgICBpc01pbGVzdG9uZTogZmFsc2UsXG4gICAgICAgIGlzQ29sbGVjdGlvbjogaGllcmFyY2h5RGF0YS5taW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuQ09MTEVDVElPTixcbiAgICAgICAgaXNNb2R1bGU6IGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUsXG4gICAgICAgIGlzUmVzb3VyY2U6IGZhbHNlLFxuICAgICAgICBpc0xlYXJuaW5nUGF0aHdheTogaXNMZWFybmluZ1BhdGh3YXksXG4gICAgICB9XG4gICAgICBpZiAoaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJlxuICAgICAgICBoaWVyYXJjaHlEYXRhLmNvbXBhdGliaWxpdHlMZXZlbCA+PSA1ICYmIGhpZXJhcmNoeURhdGEuY29udGV4dExvY2tpbmdUeXBlICYmXG4gICAgICAgIGhpZXJhcmNoeURhdGEuY29udGV4dExvY2tpbmdUeXBlID09PSBOc0NvbnRlbnQuRUNvbnRleHRMb2NraW5nVHlwZS5DT1VSU0VfQVNTRVNTTUVOVF9PTkxZKSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFtoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXJdID0ge1xuICAgICAgICAgIC4uLnRoaXMuaGFzaG1hcFtoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXJdLFxuICAgICAgICAgIGNvbnRleHRMb2NraW5nVHlwZTogaGllcmFyY2h5RGF0YS5jb250ZXh0TG9ja2luZ1R5cGUsXG4gICAgICAgICAgY29tcGF0aWJpbGl0eUxldmVsOiBoaWVyYXJjaHlEYXRhLmNvbXBhdGliaWxpdHlMZXZlbCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jcmVhdGVIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChoaWVyYXJjaHlEYXRhLCByb290Q291cnNlQ2F0ZWdvcnkpXG4gICAgICAvLyBOT1RFOiBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyBpcyBjYWxsZWQgQUZURVIgcHJvZ3Jlc3MgZGF0YSBpcyBwb3B1bGF0ZWRcbiAgICAgIC8vIGluIG1hcENvbXBsZXRpb25QZXJjZW50YWdlUHJvZ3JhbSwgbm90IGhlcmUgd2hlcmUgY29tcGxldGlvbiBkYXRhIGlzIHN0aWxsIDBcbiAgICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJlLWNvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgc3RhdHVzIGZvciBhbGwgbWlsZXN0b25lcyBpbiBMZWFybmluZyBQYXRod2F5XG4gICAqIFRoaXMgYXZvaWRzIGV4cGVuc2l2ZSBjYWxjdWxhdGlvbnMgaW4gY29tcG9uZW50IGdldHRlcnNcbiAgICogXG4gICAqIExvY2tpbmcgUnVsZXM6XG4gICAqIDAuIElmIHVzZXIgaXMgbm90IGVucm9sbGVkLCBBTEwgbWlsZXN0b25lcyBhcmUgbG9ja2VkXG4gICAqIDEuIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgKiAyLiBNaWxlc3RvbmUgMSAoTTEpIHVubG9ja3Mgd2hlbiBwcmUtYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcbiAgICogMy4gTWlsZXN0b25lIE4gKE4gPiAxKSB1bmxvY2tzIHdoZW46XG4gICAqICAgIC0gQWxsIG1hbmRhdG9yeSBsZWFybmluZyBpdGVtcyBpbiBNaWxlc3RvbmUgTi0xIGFyZSBjb21wbGV0ZWRcbiAgICogICAgLSBUaGUgYXNzZXNzbWVudCBvZiBNaWxlc3RvbmUgTi0xIGlzIGNvbXBsZXRlZFxuICAgKi9cbiAgLyoqXG4gICAqIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAgKiBMRUFSTklORyBQQVRIV0FZIE1JTEVTVE9ORSBMT0NLSU5HIFNZU1RFTSAtIFNJTkdMRSBTT1VSQ0UgT0YgVFJVVEhcbiAgICog4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgU0lOR0xFIFNPVVJDRSBPRiBUUlVUSCBmb3IgYWxsIG1pbGVzdG9uZSBhbmQgYXNzZXNzbWVudCBsb2NraW5nLlxuICAgKiBBbGwgbG9ja2luZyBsb2dpYyBpcyBjb21wdXRlZCBoZXJlIGFuZCBzdG9yZWQgaW4gdGhlIGhhc2htYXAuXG4gICAqIENvbXBvbmVudHMgUkVBRCBPTkxZIGZyb20gdGhlIGhhc2htYXAgLSB0aGV5IGRvIE5PVCBjb21wdXRlIGxvY2tzIHRoZW1zZWx2ZXMuXG4gICAqIFxuICAgKiBMT0NLSU5HIFJVTEVTOlxuICAgKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICogMS4gREVGQVVMVCBTVEFURTogQWxsIG1pbGVzdG9uZXMgYXJlIExPQ0tFRCBieSBkZWZhdWx0XG4gICAqIFxuICAgKiAyLiBNSUxFU1RPTkUgMSBVTkxPQ0tJTkc6XG4gICAqICAgIC0gVW5sb2NrcyB3aGVuOiBQcmUtYXNzZXNzbWVudCBpcyAxMDAlIGNvbXBsZXRlXG4gICAqICAgIC0gTG9jayBtZXNzYWdlOiBcIkNvbXBsZXRlIHRoZSBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IHRvIHVubG9jayB0aGlzIG1pbGVzdG9uZVwiXG4gICAqIFxuICAgKiAzLiBNSUxFU1RPTkUgTiAoTiA+PSAyKSBVTkxPQ0tJTkc6XG4gICAqICAgIC0gVW5sb2NrcyB3aGVuOiBQcmV2aW91cyBtaWxlc3RvbmUgaXMgMTAwJSBjb21wbGV0ZVxuICAgKiAgICAtIFByZXZpb3VzIG1pbGVzdG9uZSBpcyBjb21wbGV0ZSB3aGVuOlxuICAgKiAgICAgIGEpIEFsbCBNQU5EQVRPUlkgY291cnNlcyBhcmUgMTAwJSBjb21wbGV0ZVxuICAgKiAgICAgIGIpIE1pbGVzdG9uZSBhc3Nlc3NtZW50IGlzIDEwMCUgY29tcGxldGVcbiAgICogICAgLSBMb2NrIG1lc3NhZ2U6IFwiQ29tcGxldGUgYWxsIG1hbmRhdG9yeSBjb250ZW50IGFuZCBhc3Nlc3NtZW50IGluIE1pbGVzdG9uZSBOLTFcIlxuICAgKiBcbiAgICogNC4gQVNTRVNTTUVOVCBMT0NLSU5HICh3aXRoaW4gdW5sb2NrZWQgbWlsZXN0b25lcyk6XG4gICAqICAgIC0gQXNzZXNzbWVudCBsb2NrZWQgdW50aWw6IEFsbCBNQU5EQVRPUlkgY291cnNlcyBpbiBTQU1FIG1pbGVzdG9uZSBjb21wbGV0ZVxuICAgKiAgICAtIE9wdGlvbmFsIGNvdXJzZXMgZG8gTk9UIGFmZmVjdCBhc3Nlc3NtZW50IGxvY2tpbmdcbiAgICogICAgLSBBc3Nlc3NtZW50IGxvY2sgbWVzc2FnZTogXCJDb21wbGV0ZSBhbGwgbWFuZGF0b3J5IGl0ZW1zIHRvIHVubG9jayB0aGUgYXNzZXNzbWVudFwiXG4gICAqICAgIC0gT25jZSBhc3Nlc3NtZW50IGlzIGNvbXBsZXRlZCwgaXQgc3RheXMgdW5sb2NrZWRcbiAgICogXG4gICAqIDUuIFBBUkVOVCBNSUxFU1RPTkUgTE9DS0lORzpcbiAgICogICAgLSBBbGwgY29udGVudCBpbnNpZGUgbG9ja2VkIG1pbGVzdG9uZSBnZXRzIGlzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gdHJ1ZVxuICAgKiAgICAtIFRoaXMgaW5jbHVkZXMgY291cnNlcywgYXNzZXNzbWVudHMsIG5lc3RlZCByZXNvdXJjZXNcbiAgICogXG4gICAqIDYuIE1BTkRBVE9SWSB2cyBPUFRJT05BTDpcbiAgICogICAgLSBCeSBkZWZhdWx0LCBBTEwgY291cnNlcyBhcmUgbWFuZGF0b3J5ICh1bmxlc3MgaXNNYW5kYXRvcnk6IGZhbHNlKVxuICAgKiAgICAtIE9wdGlvbmFsIGNvdXJzZXMgZG8gTk9UIGJsb2NrIHByb2dyZXNzaW9uXG4gICAqIFxuICAgKiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgICovXG4gIHB1YmxpYyBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cyhpc0Vucm9sbGVkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5oYXNobWFwIHx8IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyAgSGFzaG1hcCBpcyBlbXB0eSAtIGNhbm5vdCBjb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nJylcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZygnXFxu4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJylcbiAgICBjb25zb2xlLmxvZygn8J+UkiBNSUxFU1RPTkUgTE9DS0lORyBDT01QVVRBVElPTiBTVEFSVCcpXG4gICAgY29uc29sZS5sb2coJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpXG4gICAgY29uc29sZS5sb2coJ1VzZXIgZW5yb2xsZWQ6JywgaXNFbnJvbGxlZClcbiAgICBjb25zb2xlLmxvZygnSGFzaG1hcCBzaXplOicsIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkubGVuZ3RoKVxuICAgIFxuICAgIC8vIFNURVAgMTogRmluZCBhbGwgbWlsZXN0b25lcyBhbmQgc29ydCBieSBpbmRleFxuICAgIGNvbnN0IG1pbGVzdG9uZUVudHJpZXMgPSBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApXG4gICAgICAuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuICAgICAgICByZXR1cm4gaXRlbS5pc01pbGVzdG9uZSB8fCBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZSdcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtQSA9IHRoaXMuaGFzaG1hcFthXVxuICAgICAgICBjb25zdCBpdGVtQiA9IHRoaXMuaGFzaG1hcFtiXVxuICAgICAgICBpZiAoaXRlbUEubWlsZXN0b25lSW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVtQi5taWxlc3RvbmVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1BLm1pbGVzdG9uZUluZGV4IC0gaXRlbUIubWlsZXN0b25lSW5kZXhcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1BID0gcGFyc2VJbnQoYS5yZXBsYWNlKC9cXEQvZywgJycpKSB8fCAwXG4gICAgICAgIGNvbnN0IG51bUIgPSBwYXJzZUludChiLnJlcGxhY2UoL1xcRC9nLCAnJykpIHx8IDBcbiAgICAgICAgcmV0dXJuIG51bUEgLSBudW1CXG4gICAgICB9KVxuXG4gICAgaWYgKG1pbGVzdG9uZUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZygn4oS577iPICBObyBtaWxlc3RvbmVzIGZvdW5kIC0gc2tpcHBpbmcgbWlsZXN0b25lIGxvY2tpbmcnKVxuICAgICAgY29uc29sZS5sb2coJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxcbicpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgXG4gICAgY29uc29sZS5sb2coYFxcbvCfk40gRm91bmQgJHttaWxlc3RvbmVFbnRyaWVzLmxlbmd0aH0gbWlsZXN0b25lczpgKVxuICAgIG1pbGVzdG9uZUVudHJpZXMuZm9yRWFjaCgoaWQsIGkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAgICBNJHtpICsgMX06ICR7dGhpcy5oYXNobWFwW2lkXS5uYW1lIHx8IGlkfWApXG4gICAgfSlcblxuICAgIC8vIFNURVAgMjogSWYgdXNlciBOT1QgZW5yb2xsZWQsIGxvY2sgQUxMIG1pbGVzdG9uZXMgYW5kIGNoaWxkcmVuXG4gICAgaWYgKCFpc0Vucm9sbGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnXFxu4pqg77iPICBVc2VyIE5PVCBlbnJvbGxlZCAtIGxvY2tpbmcgQUxMIG1pbGVzdG9uZXMgYW5kIGNoaWxkcmVuJylcbiAgICAgIG1pbGVzdG9uZUVudHJpZXMuZm9yRWFjaChtaWxlc3RvbmVJZCA9PiB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF0uY29tcHV0ZWRJc0xvY2tlZCA9IHRydWVcbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS51bmxvY2tNZXNzYWdlID0gJ0Vucm9sbCBpbiB0aGlzIGNvdXJzZSB0byBhY2Nlc3MgbWlsZXN0b25lcydcbiAgICAgIH0pXG4gICAgICAvLyBMb2NrIGFsbCBjaGlsZHJlblxuICAgICAgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5oYXNobWFwW2tleV0uaXNNaWxlc3RvbmUpIHtcbiAgICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICAgIHRoaXMuaGFzaG1hcFVwZGF0ZWQubmV4dCh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgaGFzaG1hcDogdGhpcy5oYXNobWFwIH0pXG4gICAgICBjb25zb2xlLmxvZygn4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXFxuJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNURVAgMzogQ2hlY2sgcHJlLWFzc2Vzc21lbnQgY29tcGxldGlvblxuICAgIGNvbnN0IGlzUHJlQXNzZXNzbWVudENvbXBsZXRlZCA9IHRoaXMuY2hlY2tQcmVBc3Nlc3NtZW50Q29tcGxldGlvbigpXG4gICAgY29uc29sZS5sb2coYFxcbvCfk50gUHJlLWFzc2Vzc21lbnQ6ICR7aXNQcmVBc3Nlc3NtZW50Q29tcGxldGVkID8gJ+KchSBDT01QTEVURScgOiAn4p2MIElOQ09NUExFVEUnfWApXG5cbiAgICAvLyBTVEVQIDQ6IENvbXB1dGUgbG9ja2luZyBmb3IgZWFjaCBtaWxlc3RvbmVcbiAgICBjb25zb2xlLmxvZygnXFxu8J+UkCBDb21wdXRpbmcgbWlsZXN0b25lIGxvY2tzOicpXG4gICAgY29uc29sZS5sb2coJ+KUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCcpXG4gICAgXG4gICAgbWlsZXN0b25lRW50cmllcy5mb3JFYWNoKChtaWxlc3RvbmVJZCwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG1pbGVzdG9uZSA9IHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF1cbiAgICAgIGlmICghbWlsZXN0b25lKSByZXR1cm5cblxuICAgICAgY29uc3QgbWlsZXN0b25lTnVtID0gaW5kZXggKyAxXG4gICAgICBjb25zb2xlLmxvZyhgXFxu8J+TjCBNaWxlc3RvbmUgJHttaWxlc3RvbmVOdW19ICgke21pbGVzdG9uZS5uYW1lIHx8IG1pbGVzdG9uZUlkfSk6YClcblxuICAgICAgLy8gTUlMRVNUT05FIDE6IFVubG9ja3Mgd2hlbiBwcmUtYXNzZXNzbWVudCBjb21wbGV0ZVxuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIGNvbnN0IGlzTG9ja2VkID0gIWlzUHJlQXNzZXNzbWVudENvbXBsZXRlZFxuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLmNvbXB1dGVkSXNMb2NrZWQgPSBpc0xvY2tlZFxuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLnVubG9ja01lc3NhZ2UgPSBpc0xvY2tlZCA/XG4gICAgICAgICAgJ0NvbXBsZXRlIHRoZSBwcmVsaW1pbmFyeSBhc3Nlc3NtZW50IHRvIHVubG9jayB0aGlzIG1pbGVzdG9uZScgOiAnJ1xuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coYCAgICR7aXNMb2NrZWQgPyAn8J+UkiBMT0NLRUQnIDogJ/CflJMgVU5MT0NLRUQnfWApXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICBSZWFzb246IFByZS1hc3Nlc3NtZW50ICR7aXNQcmVBc3Nlc3NtZW50Q29tcGxldGVkID8gJ2NvbXBsZXRlJyA6ICdpbmNvbXBsZXRlJ31gKVxuICAgICAgICBcbiAgICAgICAgLy8gRm9yIHVubG9ja2VkIE0xLCBjaGVjayBhc3Nlc3NtZW50IGxvY2tpbmdcbiAgICAgICAgaWYgKCFpc0xvY2tlZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDinJMgQ2hlY2tpbmcgYXNzZXNzbWVudCBsb2NrLi4uYClcbiAgICAgICAgICB0aGlzLmNvbXB1dGVBc3Nlc3NtZW50TG9ja2luZ0luTWlsZXN0b25lKG1pbGVzdG9uZUlkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDiqK8gTWlsZXN0b25lIGxvY2tlZCAtIG1hcmtpbmcgYWxsIGNoaWxkcmVuIGFzIHBhcmVudC1sb2NrZWRgKVxuICAgICAgICAgIHRoaXMubWFya01pbGVzdG9uZUNoaWxkcmVuQXNQYXJlbnRMb2NrZWQobWlsZXN0b25lSWQsIHRydWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIE1JTEVTVE9ORSBOIChOID4gMSk6IFVubG9ja3Mgd2hlbiBwcmV2aW91cyBtaWxlc3RvbmUgY29tcGxldGVcbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lSWQgPSBtaWxlc3RvbmVFbnRyaWVzW2luZGV4IC0gMV1cbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lID0gdGhpcy5oYXNobWFwW3ByZXZpb3VzTWlsZXN0b25lSWRdXG5cbiAgICAgIGlmIChwcmV2aW91c01pbGVzdG9uZSkge1xuICAgICAgICAvLyBDaGVjayBjb21wbGV0aW9uIHZpYSBtdWx0aXBsZSBzdHJhdGVnaWVzXG4gICAgICAgIGNvbnN0IHByZXZDb21wbGV0aW9uUGN0ID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlKSB8fCAwXG4gICAgICAgIGNvbnN0IHByZXZDb21wbGV0aW9uU3RhdHVzID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLmNvbXBsZXRpb25TdGF0dXMpIHx8IDBcbiAgICAgICAgY29uc3QgcHJldlN0YXR1cyA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5zdGF0dXMpIHx8IDBcbiAgICAgICAgY29uc3QgcHJldkNvbXBsZXRlZExlYWZOb2RlcyA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCkgfHwgMFxuICAgICAgICBjb25zdCBwcmV2TGVhZk5vZGVzQ291bnQgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUubGVhZk5vZGVzQ291bnQpIHx8IDBcblxuICAgICAgICBsZXQgcHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZSA9XG4gICAgICAgICAgcHJldkNvbXBsZXRpb25QY3QgPj0gMTAwIHx8XG4gICAgICAgICAgcHJldkNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHxcbiAgICAgICAgICBwcmV2U3RhdHVzID09PSAyIHx8XG4gICAgICAgICAgKHByZXZMZWFmTm9kZXNDb3VudCA+IDAgJiYgcHJldkNvbXBsZXRlZExlYWZOb2RlcyA+PSBwcmV2TGVhZk5vZGVzQ291bnQpXG5cbiAgICAgICAgLy8gRmFsbGJhY2s6IENoZWNrIGluZGl2aWR1YWwgaXRlbXNcbiAgICAgICAgaWYgKCFwcmV2aW91c01pbGVzdG9uZUNvbXBsZXRlKSB7XG4gICAgICAgICAgY29uc3QgaXNQcmV2aW91c01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZSA9IHRoaXMuY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUocHJldmlvdXNNaWxlc3RvbmVJZClcbiAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzTWlsZXN0b25lTWFuZGF0b3J5Q29tcGxldGUgPSB0aGlzLmNoZWNrTWlsZXN0b25lTWFuZGF0b3J5Q29udGVudENvbXBsZXRlKHByZXZpb3VzTWlsZXN0b25lSWQpXG4gICAgICAgICAgcHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZSA9IGlzUHJldmlvdXNNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUgJiYgaXNQcmV2aW91c01pbGVzdG9uZU1hbmRhdG9yeUNvbXBsZXRlXG4gICAgICAgICAgY29uc29sZS5sb2coYCAgIEZhbGxiYWNrIGNoZWNrOiBtYW5kYXRvcnk9JHtpc1ByZXZpb3VzTWlsZXN0b25lTWFuZGF0b3J5Q29tcGxldGV9LCBhc3Nlc3NtZW50PSR7aXNQcmV2aW91c01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZX1gKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNMb2NrZWQgPSAhcHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZVxuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLmNvbXB1dGVkSXNMb2NrZWQgPSBpc0xvY2tlZFxuICAgICAgICB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdLnVubG9ja01lc3NhZ2UgPSBpc0xvY2tlZCA/XG4gICAgICAgICAgYENvbXBsZXRlIGFsbCBtYW5kYXRvcnkgY29udGVudCBhbmQgYXNzZXNzbWVudCBpbiBNaWxlc3RvbmUgJHtpbmRleH0gdG8gdW5sb2NrIHRoaXMgbWlsZXN0b25lYCA6ICcnXG4gICAgICAgIFxuICAgICAgICBjb25zb2xlLmxvZyhgICAgJHtpc0xvY2tlZCA/ICfwn5SSIExPQ0tFRCcgOiAn8J+UkyBVTkxPQ0tFRCd9YClcbiAgICAgICAgY29uc29sZS5sb2coYCAgIFJlYXNvbjogUHJldmlvdXMgbWlsZXN0b25lICR7cHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZSA/ICdjb21wbGV0ZScgOiAnaW5jb21wbGV0ZSd9YClcbiAgICAgICAgY29uc29sZS5sb2coYCAgIFByZXZpb3VzIE0ke2luZGV4fSBwcm9ncmVzczogJHtwcmV2Q29tcGxldGlvblBjdH0lYClcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciB1bmxvY2tlZCBtaWxlc3RvbmVzLCBjaGVjayBhc3Nlc3NtZW50IGxvY2tpbmdcbiAgICAgICAgaWYgKCFpc0xvY2tlZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDinJMgQ2hlY2tpbmcgYXNzZXNzbWVudCBsb2NrLi4uYClcbiAgICAgICAgICB0aGlzLmNvbXB1dGVBc3Nlc3NtZW50TG9ja2luZ0luTWlsZXN0b25lKG1pbGVzdG9uZUlkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAgICDiqK8gTWlsZXN0b25lIGxvY2tlZCAtIG1hcmtpbmcgYWxsIGNoaWxkcmVuIGFzIHBhcmVudC1sb2NrZWRgKVxuICAgICAgICAgIHRoaXMubWFya01pbGVzdG9uZUNoaWxkcmVuQXNQYXJlbnRMb2NrZWQobWlsZXN0b25lSWQsIHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF0uY29tcHV0ZWRJc0xvY2tlZCA9IHRydWVcbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS51bmxvY2tNZXNzYWdlID0gJ1ByZXZpb3VzIG1pbGVzdG9uZSBub3QgZm91bmQnXG4gICAgICAgIGNvbnNvbGUubG9nKGAgICDwn5SSIExPQ0tFRCAocHJldmlvdXMgbWlsZXN0b25lIG5vdCBmb3VuZClgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBTVEVQIDU6IENvbXB1dGUgcGFyZW50IG1pbGVzdG9uZSBsb2NrIHN0YXR1cyBmb3IgQUxMIGNoaWxkcmVuXG4gICAgY29uc29sZS5sb2coJ1xcbvCflJcgQ29tcHV0aW5nIHBhcmVudCBtaWxlc3RvbmUgbG9ja3MgZm9yIGFsbCBjaGlsZHJlbi4uLicpXG4gICAgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIGlmIChpdGVtLmlzTWlsZXN0b25lKSByZXR1cm4gLy8gU2tpcCBtaWxlc3RvbmVzIHRoZW1zZWx2ZXNcblxuICAgICAgLy8gVHJhdmVyc2UgdXAgdG8gZmluZCBpZiBhbnkgYW5jZXN0b3IgbWlsZXN0b25lIGlzIGxvY2tlZFxuICAgICAgbGV0IGN1cnJlbnRQYXJlbnRJZCA9IGl0ZW0ucGFyZW50XG4gICAgICBsZXQgZGVwdGggPSAwXG4gICAgICBjb25zdCBtYXhEZXB0aCA9IDVcbiAgICAgIGxldCBmb3VuZExvY2tlZFBhcmVudCA9IGZhbHNlXG5cbiAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50SWQgJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgICBjb25zdCBwYXJlbnREYXRhID0gdGhpcy5oYXNobWFwW2N1cnJlbnRQYXJlbnRJZF1cbiAgICAgICAgaWYgKHBhcmVudERhdGEpIHtcbiAgICAgICAgICBpZiAocGFyZW50RGF0YS5pc01pbGVzdG9uZSAmJiBwYXJlbnREYXRhLmNvbXB1dGVkSXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzaG1hcFtrZXldLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gdHJ1ZVxuICAgICAgICAgICAgZm91bmRMb2NrZWRQYXJlbnQgPSB0cnVlXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50UGFyZW50SWQgPSBwYXJlbnREYXRhLnBhcmVudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgZGVwdGgrK1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAoIWZvdW5kTG9ja2VkUGFyZW50KSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFtrZXldLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gU1RFUCA2OiBUcmlnZ2VyIGhhc2htYXAgdXBkYXRlXG4gICAgY29uc29sZS5sb2coJ1xcbuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCcpXG4gICAgY29uc29sZS5sb2coJ+KchSBNaWxlc3RvbmUgbG9ja2luZyBjb21wdXRhdGlvbiBDT01QTEVURScpXG4gICAgY29uc29sZS5sb2coJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxcbicpXG4gICAgXG4gICAgdGhpcy5oYXNobWFwID0geyAuLi50aGlzLmhhc2htYXAgfVxuICAgIHRoaXMuaGFzaG1hcFVwZGF0ZWQubmV4dCh7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgaGFzaG1hcDogdGhpcy5oYXNobWFwIH0pXG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBtaWxlc3RvbmUgbG9jayB1cGRhdGUgd2hlbiBoYXNobWFwIHByb2dyZXNzIGlzIHVwZGF0ZWQgZXh0ZXJuYWxseVxuICAgKiBDYWxsZWQgZnJvbSB2aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIGFmdGVyIHByb2dyZXNzIHVwZGF0ZXNcbiAgICovXG4gIHB1YmxpYyB0cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgTGVhcm5pbmcgUGF0aHdheSBpbiB0aGUgaGFzaG1hcFxuICAgIGNvbnN0IGhhc0xlYXJuaW5nUGF0aHdheSA9IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkuc29tZShrZXkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICByZXR1cm4gaXRlbS5pc0xlYXJuaW5nUGF0aHdheSAmJiBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcbiAgICB9KVxuICAgIFxuICAgIGlmIChoYXNMZWFybmluZ1BhdGh3YXkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIFRyaWdnZXJpbmcgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBhZnRlciBwcm9ncmVzcyB1cGRhdGUnKVxuICAgICAgLy8gQXNzdW1lIGVucm9sbGVkIHNpbmNlIHByb2dyZXNzIHdhcyBqdXN0IHVwZGF0ZWRcbiAgICAgIHRoaXMuY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXModHJ1ZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcHJlLWFzc2Vzc21lbnQgKHByZWxpbWluYXJ5IGFzc2Vzc21lbnQpIGlzIGNvbXBsZXRlZFxuICAgKiBQcmUtYXNzZXNzbWVudCBpcyB0eXBpY2FsbHkgYSBDb3Vyc2UgQXNzZXNzbWVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiBMZWFybmluZyBQYXRod2F5IChiZWZvcmUgbWlsZXN0b25lcylcbiAgICovXG4gIHByaXZhdGUgY2hlY2tQcmVBc3Nlc3NtZW50Q29tcGxldGlvbigpOiBib29sZWFuIHtcbiAgICAvLyBGaW5kIHRoZSBMZWFybmluZyBQYXRod2F5IHJvb3RcbiAgICBsZXQgbGVhcm5pbmdQYXRod2F5SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc0xlYXJuaW5nUGF0aHdheSAmJiBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgICAgbGVhcm5pbmdQYXRod2F5SWQgPSBrZXlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnQ2hlY2tpbmcgcHJlLWFzc2Vzc21lbnQgY29tcGxldGlvbi4gTGVhcm5pbmcgUGF0aHdheSBJRDonLCBsZWFybmluZ1BhdGh3YXlJZClcblxuICAgIC8vIFBSSU9SSVRZIDE6IExvb2sgZm9yIGl0ZW1zIGV4cGxpY2l0bHkgbWFya2VkIGFzIHByZS1hc3Nlc3NtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc1ByZUFzc2Vzc21lbnQgPT09IHRydWUpIHtcbiAgICAgICAgLy8gTXVzdCBjaGVjayBmb3IgYWN0dWFsIGNvbXBsZXRpb24gLSBub3QganVzdCBhbnkgdmFsdWVcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSAoaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSB1bmRlZmluZWQgJiYgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLnByb2dyZXNzICE9PSB1bmRlZmluZWQgJiYgaXRlbS5wcm9ncmVzcyA+PSAxMDApKVxuICAgICAgICBjb25zb2xlLmxvZyhg4pyFIFByZS1hc3Nlc3NtZW50IGZvdW5kIChpc1ByZUFzc2Vzc21lbnQgZmxhZyk6ICR7a2V5fWAsIHtcbiAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgICAgY29tcGxldGlvblN0YXR1czogaXRlbS5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1czogaXRlbS5zdGF0dXMsXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAgICAgcHJvZ3Jlc3M6IGl0ZW0ucHJvZ3Jlc3MsXG4gICAgICAgICAgaXNDb21wbGV0ZWQsXG4gICAgICAgICAgLy8gU2hvdyBBTEwgZmllbGRzIHRvIGRlYnVnIHdoYXQncyBhdmFpbGFibGVcbiAgICAgICAgICBhbGxEYXRhOiBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgICB9KVxuICAgICAgICAvLyBQcmUtYXNzZXNzbWVudCBleGlzdHMgLSByZXR1cm4gaXRzIGNvbXBsZXRpb24gc3RhdHVzICh0cnVlL2ZhbHNlKVxuICAgICAgICByZXR1cm4gaXNDb21wbGV0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQUklPUklUWSAyOiBGaW5kIHByZS1hc3Nlc3NtZW50IGluIGhhc2htYXAgLSBkaXJlY3QgY2hpbGQgb2YgTGVhcm5pbmcgUGF0aHdheSB0aGF0IGlzIE5PVCBhIG1pbGVzdG9uZVxuICAgIC8vIENoZWNrIGZvciBmaXJzdCBub24tbWlsZXN0b25lIGNoaWxkIG9mIExlYXJuaW5nIFBhdGh3YXlcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgTGVhcm5pbmcgUGF0aHdheVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ICE9PSBsZWFybmluZ1BhdGh3YXlJZCkgY29udGludWVcblxuICAgICAgLy8gU2tpcCBtaWxlc3RvbmVzXG4gICAgICBpZiAoaXRlbS5pc01pbGVzdG9uZSkgY29udGludWVcblxuICAgICAgLy8gVGhpcyBpcyBhIG5vbi1taWxlc3RvbmUgZGlyZWN0IGNoaWxkIC0gaXQncyB0aGUgcHJlLWFzc2Vzc21lbnRcbiAgICAgIC8vIE11c3QgY2hlY2sgZm9yIGFjdHVhbCBjb21wbGV0aW9uIC0gbm90IGp1c3QgYW55IHZhbHVlXG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IChpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSB1bmRlZmluZWQgJiYgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwKSlcbiAgICAgIGNvbnNvbGUubG9nKGDinIUgUHJlLWFzc2Vzc21lbnQgZm91bmQgKGZpcnN0IG5vbi1taWxlc3RvbmUgY2hpbGQpOiAke2tleX1gLCB7XG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogaXRlbS5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICBzdGF0dXM6IGl0ZW0uc3RhdHVzLFxuICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSxcbiAgICAgICAgcHJvZ3Jlc3M6IGl0ZW0ucHJvZ3Jlc3MsXG4gICAgICAgIGlzQ29tcGxldGVkLFxuICAgICAgICAvLyBTaG93IEFMTCBmaWVsZHMgdG8gZGVidWcgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgICBhbGxEYXRhOiBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgfSlcbiAgICAgIC8vIFByZS1hc3Nlc3NtZW50IGV4aXN0cyAtIHJldHVybiBpdHMgY29tcGxldGlvbiBzdGF0dXMgKHRydWUvZmFsc2UpXG4gICAgICByZXR1cm4gaXNDb21wbGV0ZWRcbiAgICB9XG5cbiAgICAvLyBDUklUSUNBTDogSWYgd2UgcmVhY2ggaGVyZSwgbm8gcHJlLWFzc2Vzc21lbnQgd2FzIGZvdW5kIGluIHRoZSBoYXNobWFwXG4gICAgLy8gVGhpcyBjb3VsZCBtZWFuIGVpdGhlcjpcbiAgICAvLyAxLiBUaGVyZSBJUyBubyBwcmUtYXNzZXNzbWVudCAodW5sb2NrIE0xIGJ5IGRlZmF1bHQpXG4gICAgLy8gMi4gVGhlIGhhc2htYXAgaGFzbid0IGJlZW4gcG9wdWxhdGVkIHlldCAoc2hvdWxkIGxvY2sgTTEgdW50aWwgZGF0YSBpcyByZWFkeSlcbiAgICBcbiAgICAvLyBUbyBiZSBzYWZlLCBjaGVjayBpZiBBTlkgY2hpbGRyZW4gZXhpc3QgYXQgYWxsXG4gICAgY29uc3QgaGFzQW55Q2hpbGRyZW4gPSBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApLnNvbWUoa2V5ID0+IFxuICAgICAgdGhpcy5oYXNobWFwW2tleV0ucGFyZW50ID09PSBsZWFybmluZ1BhdGh3YXlJZFxuICAgIClcbiAgICBcbiAgICBpZiAoIWhhc0FueUNoaWxkcmVuKSB7XG4gICAgICAvLyBIYXNobWFwIG5vdCBwb3B1bGF0ZWQgeWV0IC0gbG9jayBNMSB1bnRpbCBkYXRhIGlzIHJlYWR5XG4gICAgICBjb25zb2xlLmxvZygn4pqg77iPIE5vIGNoaWxkcmVuIGZvdW5kIGluIGhhc2htYXAgeWV0IC0gbG9ja2luZyBNMSB1bnRpbCBkYXRhIGlzIHJlYWR5JylcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBcbiAgICAvLyBIYXNobWFwIGlzIHBvcHVsYXRlZCBidXQgbm8gcHJlLWFzc2Vzc21lbnQgZm91bmQgLSBhbGxvdyBNMSB0byB1bmxvY2tcbiAgICBjb25zb2xlLmxvZygnTm8gcHJlLWFzc2Vzc21lbnQgZm91bmQgaW4gZnVsbHkgcG9wdWxhdGVkIGhhc2htYXAgLSBhbGxvd2luZyBNMSB0byBiZSB1bmxvY2tlZCBieSBkZWZhdWx0JylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbWlsZXN0b25lJ3MgYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcbiAgICogU2VhcmNoZXMgZm9yIGFueSBhc3Nlc3NtZW50IHR5cGUgKENvdXJzZSBBc3Nlc3NtZW50LCBGaW5hbCBBc3Nlc3NtZW50LCBldGMuKSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUobWlsZXN0b25lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1pbGVzdG9uZSA9IHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF1cblxuICAgIC8vIENoZWNrIGFsbCBpdGVtcyBpbiBoYXNobWFwIHRoYXQgYXJlIGFzc2Vzc21lbnRzIGFuZCBiZWxvbmcgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc3Nlc3NtZW50IHR5cGVcbiAgICAgIGNvbnN0IGlzQXNzZXNzbWVudFR5cGUgPVxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnUHJhY3RpY2UgUXVlc3Rpb24gU2V0JyB8fFxuICAgICAgICBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdGaW5hbCBBc3Nlc3NtZW50JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG5cbiAgICAgIGlmICghaXNBc3Nlc3NtZW50VHlwZSkgY29udGludWVcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBhc3Nlc3NtZW50IGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICAgIGlmICh0aGlzLmlzQ2hpbGRPZk1pbGVzdG9uZShrZXksIG1pbGVzdG9uZUlkKSkge1xuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fCBpdGVtLnByb2dyZXNzID49IDEwMFxuICAgICAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gYXNzZXNzbWVudCBmb3VuZCwgY29uc2lkZXIgaXQgYXMgY29tcGxldGVkIChubyBhc3Nlc3NtZW50IHJlcXVpcmVtZW50KVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtaWxlc3RvbmUncyBtYW5kYXRvcnkgY29udGVudCBpcyBjb21wbGV0ZWRcbiAgICogT25seSBjaGVja3MgY291cnNlcy9jb250ZW50IHRoYXQgYXJlIG1hcmtlZCBhcyBpc01hbmRhdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZU1hbmRhdG9yeUNvbnRlbnRDb21wbGV0ZShtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWlsZXN0b25lID0gdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXVxuXG4gICAgbGV0IG1hbmRhdG9yeUNvdW50ID0gMFxuICAgIGxldCBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA9IDBcblxuICAgIC8vIENoZWNrIGFsbCBpdGVtcyBpbiBoYXNobWFwIHRoYXQgYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGlzIG1pbGVzdG9uZSAoY291cnNlcylcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBtaWxlc3RvbmUgKGNvdXJzZSBsZXZlbClcbiAgICAgIGlmIChpdGVtLnBhcmVudCAhPT0gbWlsZXN0b25lSWQpIGNvbnRpbnVlXG5cbiAgICAgIC8vIFNraXAgaWYgbm90IGEgY291cnNlIG9yIGNvbGxlY3Rpb25cbiAgICAgIGlmIChpdGVtLnByaW1hcnlDYXRlZ29yeSAhPT0gJ0NvdXJzZScgJiYgIWl0ZW0uaXNDb2xsZWN0aW9uKSBjb250aW51ZVxuXG4gICAgICAvLyBTa2lwIGFzc2Vzc21lbnRzIC0gdGhleSdyZSBjaGVja2VkIHNlcGFyYXRlbHlcbiAgICAgIGNvbnN0IGlzQXNzZXNzbWVudCA9XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG4gICAgICBpZiAoaXNBc3Nlc3NtZW50KSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNvbnRlbnQgaXMgbWFuZGF0b3J5XG4gICAgICBpZiAoaXRlbS5pc01hbmRhdG9yeSkge1xuICAgICAgICBtYW5kYXRvcnlDb3VudCsrXG4gICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50KytcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbENvbXBsZXRlID0gbWFuZGF0b3J5Q291bnQgPT09IDAgfHwgY29tcGxldGVkTWFuZGF0b3J5Q291bnQgPj0gbWFuZGF0b3J5Q291bnRcbiAgICByZXR1cm4gYWxsQ29tcGxldGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbnRlbnQgaXRlbSBpcyBhIGNoaWxkIChkaXJlY3Qgb3IgbmVzdGVkKSBvZiBhIG1pbGVzdG9uZVxuICAgKi9cbiAgcHJpdmF0ZSBpc0NoaWxkT2ZNaWxlc3RvbmUoY29udGVudElkOiBzdHJpbmcsIG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgY3VycmVudElkID0gY29udGVudElkXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIGNvbnN0IG1heERlcHRoID0gMTBcblxuICAgIHdoaWxlIChjdXJyZW50SWQgJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtjdXJyZW50SWRdXG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCkgcmV0dXJuIHRydWVcbiAgICAgIGN1cnJlbnRJZCA9IGl0ZW0ucGFyZW50XG4gICAgICBkZXB0aCsrXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgYXNzZXNzbWVudCBsb2NraW5nIHdpdGhpbiBhbiB1bmxvY2tlZCBtaWxlc3RvbmVcbiAgICogQXNzZXNzbWVudCBsb2NrcyB1bnRpbCBhbGwgbWFuZGF0b3J5IGNvdXJzZXMgaW4gdGhlIG1pbGVzdG9uZSBhcmUgY29tcGxldGVkXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVBc3Nlc3NtZW50TG9ja2luZ0luTWlsZXN0b25lKG1pbGVzdG9uZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdXG4gICAgaWYgKCFtaWxlc3RvbmUpIHJldHVyblxuXG4gICAgY29uc29sZS5sb2coYENvbXB1dGluZyBhc3Nlc3NtZW50IGxvY2tpbmcgZm9yIG1pbGVzdG9uZTogJHttaWxlc3RvbmVJZH1gKVxuXG4gICAgLy8gRmluZCBhc3Nlc3NtZW50IGluIHRoaXMgbWlsZXN0b25lXG4gICAgbGV0IGFzc2Vzc21lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgICBsZXQgYXNzZXNzbWVudDogYW55ID0gbnVsbFxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYXNzZXNzbWVudCB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICAgIC8vIE11c3QgaGF2ZSBCT1RIOiBjb3JyZWN0IGNhdGVnb3J5L21pbWVUeXBlIEFORCBwYXJlbnQgaXMgbWlsZXN0b25lXG4gICAgICBjb25zdCBpc0Fzc2Vzc21lbnQgPSAoXG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdTdGFuZGFsb25lIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldCcgfHxcbiAgICAgICAgaXRlbS5taW1lVHlwZSA9PT0gJ2FwcGxpY2F0aW9uL3F1aXonXG4gICAgICApICYmIGl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCAgLy8gTVVTVCBiZSBkaXJlY3QgY2hpbGQgb2YgbWlsZXN0b25lXG5cbiAgICAgIGlmIChpc0Fzc2Vzc21lbnQpIHtcbiAgICAgICAgYXNzZXNzbWVudElkID0ga2V5XG4gICAgICAgIGFzc2Vzc21lbnQgPSBpdGVtXG4gICAgICAgIGNvbnNvbGUubG9nKGDinIUgRm91bmQgbWlsZXN0b25lIGFzc2Vzc21lbnQ6ICR7aXRlbS5uYW1lfSAoJHtrZXl9KWApXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFhc3Nlc3NtZW50SWQgfHwgIWFzc2Vzc21lbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBObyBhc3Nlc3NtZW50IGZvdW5kIGluIG1pbGVzdG9uZSAke21pbGVzdG9uZUlkfWApXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhc3Nlc3NtZW50IGlzIGFscmVhZHkgY29tcGxldGVkIC0gcmUtcmVhZCBmcm9tIGhhc2htYXAgdG8gZ2V0IGxhdGVzdCBkYXRhXG4gICAgY29uc3QgbGF0ZXN0QXNzZXNzbWVudCA9IHRoaXMuaGFzaG1hcFthc3Nlc3NtZW50SWRdXG4gICAgY29uc3QgYXNzZXNzbWVudENvbXBsZXRlZCA9IFxuICAgICAgbGF0ZXN0QXNzZXNzbWVudC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IFxuICAgICAgbGF0ZXN0QXNzZXNzbWVudC5zdGF0dXMgPT09IDIgfHwgXG4gICAgICBsYXRlc3RBc3Nlc3NtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuXG4gICAgaWYgKGFzc2Vzc21lbnRDb21wbGV0ZWQpIHtcbiAgICAgIHRoaXMuaGFzaG1hcFthc3Nlc3NtZW50SWRdLmlzQXNzZXNzbWVudExvY2tlZCA9IGZhbHNlXG4gICAgICB0aGlzLmhhc2htYXBbYXNzZXNzbWVudElkXS5taWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkID0gZmFsc2VcbiAgICAgIHRoaXMuaGFzaG1hcFthc3Nlc3NtZW50SWRdLmFzc2Vzc21lbnRMb2NrTWVzc2FnZSA9ICcnXG4gICAgICBjb25zb2xlLmxvZyhgQXNzZXNzbWVudCAke2Fzc2Vzc21lbnRJZH0gaXMgY29tcGxldGVkIC0gdW5sb2NraW5nYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIENvdW50IG1hbmRhdG9yeSBjb3Vyc2VzIGFuZCBjaGVjayB0aGVpciBjb21wbGV0aW9uXG4gICAgbGV0IG1hbmRhdG9yeUNvdW50ID0gMFxuICAgIGxldCBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA9IDBcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuXG4gICAgICAvLyBTa2lwIHRoZSBhc3Nlc3NtZW50IGl0c2VsZlxuICAgICAgaWYgKGtleSA9PT0gYXNzZXNzbWVudElkKSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVjayBpZiBpdGVtIGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICAgIGxldCBiZWxvbmdzVG9NaWxlc3RvbmUgPSBmYWxzZVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCkge1xuICAgICAgICBiZWxvbmdzVG9NaWxlc3RvbmUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKGl0ZW0ucGFyZW50ICYmIHRoaXMuaGFzaG1hcFtpdGVtLnBhcmVudF0pIHtcbiAgICAgICAgY29uc3QgcGFyZW50SXRlbSA9IHRoaXMuaGFzaG1hcFtpdGVtLnBhcmVudF1cbiAgICAgICAgaWYgKHBhcmVudEl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCAmJiBwYXJlbnRJdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICBiZWxvbmdzVG9NaWxlc3RvbmUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFiZWxvbmdzVG9NaWxlc3RvbmUpIGNvbnRpbnVlXG5cbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYXNzZXNzbWVudCAoc2tpcCBvdGhlciBhc3Nlc3NtZW50cylcbiAgICAgIGNvbnN0IGlzSXRlbUFzc2Vzc21lbnQgPVxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnU3RhbmRhbG9uZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLm1pbWVUeXBlID09PSAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnIHx8XG4gICAgICAgIGl0ZW0ubWltZVR5cGUgPT09ICdhcHBsaWNhdGlvbi9xdWl6JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG4gICAgICBcbiAgICAgIGlmIChpc0l0ZW1Bc3Nlc3NtZW50KSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIG1hbmRhdG9yeSBjb250ZW50XG4gICAgICAvLyBCeSBkZWZhdWx0LCBjb3Vyc2VzIGFyZSBtYW5kYXRvcnkgdW5sZXNzIGV4cGxpY2l0bHkgbWFya2VkIG90aGVyd2lzZVxuICAgICAgY29uc3QgaXNNYW5kYXRvcnkgPSBpdGVtLmlzTWFuZGF0b3J5ICE9PSBmYWxzZSAmJiBcbiAgICAgICAgKGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJyB8fCBpdGVtLmlzTWFuZGF0b3J5ID09PSB0cnVlKVxuXG4gICAgICBpZiAoaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgbWFuZGF0b3J5Q291bnQrK1xuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IFxuICAgICAgICAgIGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgICBpdGVtLnN0YXR1cyA9PT0gMiB8fCBcbiAgICAgICAgICBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fFxuICAgICAgICAgIGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIFxuICAgICAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCsrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgYXNzZXNzbWVudCBzaG91bGQgYmUgbG9ja2VkXG4gICAgY29uc3QgYWxsTWFuZGF0b3J5Q29tcGxldGUgPSBtYW5kYXRvcnlDb3VudCA9PT0gMCB8fCBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA+PSBtYW5kYXRvcnlDb3VudFxuICAgIFxuICAgIHRoaXMuaGFzaG1hcFthc3Nlc3NtZW50SWRdLmlzQXNzZXNzbWVudExvY2tlZCA9ICFhbGxNYW5kYXRvcnlDb21wbGV0ZVxuICAgIHRoaXMuaGFzaG1hcFthc3Nlc3NtZW50SWRdLm1pbGVzdG9uZUFzc2Vzc21lbnRMb2NrZWQgPSAhYWxsTWFuZGF0b3J5Q29tcGxldGVcbiAgICB0aGlzLmhhc2htYXBbYXNzZXNzbWVudElkXS5hc3Nlc3NtZW50TG9ja01lc3NhZ2UgPSAhYWxsTWFuZGF0b3J5Q29tcGxldGUgP1xuICAgICAgJ1RoaXMgY29udGVudCBpcyBsb2NrZWQuIENvbXBsZXRlIGFsbCBtYW5kYXRvcnkgaXRlbXMgdG8gdW5sb2NrIHRoZSBhc3Nlc3NtZW50LicgOiAnJ1xuXG4gICAgY29uc29sZS5sb2coYEFzc2Vzc21lbnQgJHthc3Nlc3NtZW50SWR9IGxvY2tpbmc6YCwge1xuICAgICAgbWFuZGF0b3J5Q291bnQsXG4gICAgICBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCxcbiAgICAgIGlzTG9ja2VkOiAhYWxsTWFuZGF0b3J5Q29tcGxldGUsXG4gICAgICBtaWxlc3RvbmVBc3Nlc3NtZW50TG9ja2VkOiAhYWxsTWFuZGF0b3J5Q29tcGxldGVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgYWxsIGNoaWxkcmVuIG9mIGEgbWlsZXN0b25lIGFzIHBhcmVudC1sb2NrZWQgb3IgdW5sb2NrZWRcbiAgICovXG4gIHByaXZhdGUgbWFya01pbGVzdG9uZUNoaWxkcmVuQXNQYXJlbnRMb2NrZWQobWlsZXN0b25lSWQ6IHN0cmluZywgaXNMb2NrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIFxuICAgICAgLy8gRGlyZWN0IGNoaWxkcmVuIG9mIG1pbGVzdG9uZVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCkge1xuICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IGlzTG9ja2VkXG4gICAgICAgIFxuICAgICAgICAvLyBBbHNvIG1hcmsgbmVzdGVkIGNoaWxkcmVuIChlLmcuLCByZXNvdXJjZXMgaW5zaWRlIGNvdXJzZXMpXG4gICAgICAgIGlmIChpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5tYXJrTmVzdGVkQ2hpbGRyZW5Bc1BhcmVudExvY2tlZChrZXksIGlzTG9ja2VkKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IG1hcmsgbmVzdGVkIGNoaWxkcmVuIGFzIHBhcmVudC1sb2NrZWRcbiAgICovXG4gIHByaXZhdGUgbWFya05lc3RlZENoaWxkcmVuQXNQYXJlbnRMb2NrZWQocGFyZW50SWQ6IHN0cmluZywgaXNMb2NrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgIFxuICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBwYXJlbnRJZCkge1xuICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IGlzTG9ja2VkXG4gICAgICAgIFxuICAgICAgICAvLyBSZWN1cnNlIGZvciBkZWVwZXIgbmVzdGluZ1xuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHRoaXMubWFya05lc3RlZENoaWxkcmVuQXNQYXJlbnRMb2NrZWQoa2V5LCBpc0xvY2tlZClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENhbGN1bGF0aW9uc0Zyb21DaGlsZHJlbihpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpIHtcbiAgICBpdGVtWydkdXJhdGlvbiddID0gaXRlbS5jaGlsZHJlbi5yZWR1Y2UoKHN1bSwgY2hpbGQpID0+IHtcbiAgICAgIHJldHVybiBzdW0gKyBOdW1iZXIoY2hpbGQuZHVyYXRpb24gfHwgMClcbiAgICB9LCAwKVxuICAgIGNvbnN0IGNvbXBsZXRlZEl0ZW1zID0gXy5maWx0ZXIoaXRlbS5jaGlsZHJlbiwgciA9PiByLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgci5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVxuICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldChpdGVtLCAnbGVhZk5vZGVzQ291bnQnKSkgfHwgMVxuICAgIGl0ZW1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBOdW1iZXIoKChjb21wbGV0ZWRJdGVtcy5sZW5ndGggLyB0b3RhbENvdW50KSAqIDEwMCkudG9GaXhlZCgpKVxuICAgIGl0ZW1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkgPyAyIDogMVxuICAgIHJldHVybiBpdGVtXG4gIH1cblxuICBmZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhPiB7XG4gICAgcmVxLnJlcXVlc3QuZmllbGRzID0gWydwcm9ncmVzc2RldGFpbHMnXVxuXG4gICAgaWYgKHJlcS5yZXF1ZXN0LmNvdXJzZUlkKSB7XG4gICAgICBjb25zdCByZXNsdXQ6IGFueSA9IHRoaXMuaHR0cC5wb3N0PE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX0hJU1RPUllWMn0vJHtyZXEucmVxdWVzdC5jb3Vyc2VJZH1gLCByZXFcbiAgICAgIClcbiAgICAgIC8vIGRhdGEuc3Vic2NyaWJlKChzdWJzY3JpYmVEYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vICAgICAgIHRoaXMucHJvZ3JhbUNoaWxkQ291cnNlUmVzdW1lRGF0YS5uZXh0KHsgcmVzdW1lRGF0YTogc3Vic2NyaWJlRGF0YS5yZXN1bHQuY29udGVudExpc3QsIGNvdXJzZUlkOiByZXEucmVxdWVzdC5jb3Vyc2VJZCB9KVxuICAgICAgLy8gICAgIH0pXG4gICAgICByZXR1cm4gcmVzbHV0XG4gICAgfVxuICAgIHJldHVybiBvZigpXG5cbiAgfVxuXG4gIGRvd29ubG9hZENlcnRpZmljYXRlKGNlcnRJZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDx7IHJlc3VsdDogYW55IH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuQ0VSVF9ET1dOTE9BRChjZXJ0SWQpLFxuICAgIClcbiAgfVxuICBnZXRTZXJ2ZXJEYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnRbXSB9PihcbiAgICAgIEFQSV9FTkRfUE9JTlRTLlNFUlZFUl9EQVRFKVxuICB9XG5cbiAgZ2V0Rm9ybUJ5SWQoZm9ybUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChBUElfRU5EX1BPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5TVUJNSVRfRk9STSwgZm9ybURhdGEpXG4gIH1cblxuICBnZXRGb3JtQnlJZFB1YmxpYyhmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KEFQSV9FTkRfUE9JTlRTLkdFVF9GT1JNX0JZSURfUFVCTElDKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtUHVibGljKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihBUElfRU5EX1BPSU5UUy5TVUJNSVRfRk9STV9QVUJMSUMsIGZvcm1EYXRhKVxuICB9XG5cbiAgZ2V0QXBsbGljYXRpb25zQnlJZChmb3JtSWQ6IHN0cmluZywgY29udGV4dElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oQVBJX0VORF9QT0lOVFMuR0VUX0FQUExJQ0FUSU9OU19CWV9JRChmb3JtSWQsIGNvbnRleHRJZCkpXG4gIH1cblxuICBzaGFyZUNvbnRlbnQocmVxQm9keTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oYCR7QVBJX0VORF9QT0lOVFMuU0hBUkVfQ09OVEVOVH1gLCByZXFCb2R5KVxuICB9XG4gIGNoZWNrTW9kdWxlV2lzZURhdGEoY29udGVudDogYW55KSB7XG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgICAgbGV0IG1vZHVsZVJlc291cnNlQ291bnQgPSAwXG4gICAgICAgICAgbGV0IG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gMFxuICAgICAgICAgIGVsZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZEVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoY2hpbGRFbGUucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pIHtcbiAgICAgICAgICAgICAgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IG1vZHVsZVJlc291cnNlQ291bnQgKyAxXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBvZmZsaW5lUmVzb3Vyc2VDb3VudCA9IG9mZmxpbmVSZXNvdXJzZUNvdW50ICsgMVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgZWxlWydtb2R1bGVSZXNvdXJzZUNvdW50J10gPSBtb2R1bGVSZXNvdXJzZUNvdW50XG4gICAgICAgICAgZWxlWydvZmZsaW5lUmVzb3Vyc2VDb3VudCddID0gb2ZmbGluZVJlc291cnNlQ291bnRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrTW9kdWxlV2lzZURhdGEoZWxlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgYXN5bmMgZmV0Y2hDb3Vyc2VIZWlyYXJjaHkoY29udGVudERhdGE6IGFueSkge1xuICAgIGlmIChjb250ZW50RGF0YSAmJiBjb250ZW50RGF0YS5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBlbGUgb2YgY29udGVudERhdGEuY2hpbGRyZW4pIHtcbiAgICAgICAgaWYgKGVsZS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53aWRnZXRTdmMuZmV0Y2hDb250ZW50KGVsZS5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChzdWJFbGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHN1YkVsZS5yZXN1bHQgJiYgc3ViRWxlLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICAgICYmIHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlbiAmJiBzdWJFbGUucmVzdWx0LmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGVsZVsnY2hpbGRyZW4nXSA9IHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRUcmFuc2NyaXB0aW9uRGF0YShkYXRhOiBhbnkpIHtcbiAgICAvLyAgY29uc29sZS5sb2coJ2RhdGEtLScsIGRhdGEpXG4gICAgdGhpcy50cmFuc3JpcHRpb25EYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICB9XG5cbiAgc2V0QWN0aXZlU3VidGl0bGVMYW5ndWFnZShhY3RpdmVMYW5nOiBhbnkpIHtcbiAgICB0aGlzLnRyYW5zcmlwdGlvbkFjdGl2ZUxhbmd1YWdlRGF0YU9iamVjdC5uZXh0KGFjdGl2ZUxhbmcpXG4gIH1cblxuXG5cbiAgYWlHZXRSZXNvdXJjZVZ0dEZpbGUocmVzb3VyY2VJRDogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHtBUElfRU5EX1BPSU5UUy5BSV9SRVNPVVJDRV9WVFRfRklMRX0/cmVzb3VyY2VfaWQ9JHtyZXNvdXJjZUlEfWApXG4gIH1cblxuICByZWFkUHJlRW5yb2xsbWVudFJlc291cmNlc1N0YXRlKHJlcTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuUFJFX0VOUk9MTE1FTlRfU1RBVEVfUkVBRH1gLCByZXEpXG4gIH1cblxuICBjcmVhdGVDb250ZW50VjIocmVxdWVzdEJvZHk6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICBgJHtBUElfRU5EX1BPSU5UUy5DUkVBVEVfUkVTT1VSQ0V9YCxcbiAgICAgICAgcmVxdWVzdEJvZHksXG4gICAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHQuaWRlbnRpZmllclxuICAgICAgICB9KSxcbiAgICAgIClcbiAgfVxuXG5cbiAgdXBsb2FkQXNzaWdubWVudEFuc3dlcihjb250ZW50SWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCBhc3NpZ25tZW50SWQ6IHN0cmluZywgZmlsZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke0FQSV9FTkRfUE9JTlRTLlVQTE9BRF9BU1NJR05NRU5UfS8ke2NvbnRlbnRJZH0vJHtiYXRjaElkfS8ke2Fzc2lnbm1lbnRJZH1gLCBmb3JtRGF0YSk7XG4gIH1cblxuXG4gIHJlYWRDb250ZW50VjIoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLlJFQURfUkVTT1VSQ0V9cmVhZC8ke2lkfT9tb2RlPWVkaXRgLFxuICAgICkucGlwZShcbiAgICAgIG1hcCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBkYXRhLnJlc3VsdC5jb250ZW50XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHVwbG9hZChcbiAgICBkYXRhOiBGb3JtRGF0YSxcbiAgICBjb250ZW50RGF0YTogYW55LFxuICAgIG9wdGlvbnM/OiBhbnksXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBjb25zdCBmaWxlID0gZGF0YS5nZXQoJ2NvbnRlbnQnKSBhcyBGaWxlXG4gICAgbGV0IGZpbGVOYW1lID0gZmlsZS5uYW1lXG4gICAgaWYgKFsnY2hhbm5lbC5qc29uJ10uaW5kZXhPZihmaWxlTmFtZSkgPCAwKSB7XG4gICAgICBmaWxlTmFtZSA9IHRoaXMuYXBwZW5kVG9GaWxlbmFtZShmaWxlTmFtZSlcbiAgICB9XG4gICAgY29uc3QgbmV3Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIG5ld0Zvcm1EYXRhLmFwcGVuZCgnZGF0YScsIGZpbGUsIGZpbGVOYW1lKVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuVVBMT0FEX0ZJTEV9dXBsb2FkLyR7Y29udGVudERhdGEuY29udGVudElkfWAsXG4gICAgICBuZXdGb3JtRGF0YSxcbiAgICAgIG9wdGlvbnNcbiAgICApXG4gIH1cblxuICBhcHBlbmRUb0ZpbGVuYW1lKGZpbGVuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0aW1lU3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIGNvbnN0IGRvdEluZGV4ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy4nKVxuICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmaWxlbmFtZSArIHRpbWVTdGFtcFxuICAgIH1cbiAgICByZXR1cm4gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGRvdEluZGV4KSArIHRpbWVTdGFtcCArIGZpbGVuYW1lLnN1YnN0cmluZyhkb3RJbmRleClcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRXaXRoRmV3RmllbGRzKHJlcXVlc3RCb2R5OiBhbnksIGlkZW50aWZpZXI6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wYXRjaDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuVVBEQVRFX1JFU09VUkNFfS8ke2lkZW50aWZpZXJ9YCxcbiAgICAgIHJlcXVlc3RCb2R5LFxuICAgIClcbiAgfVxuXG4gIHNlYXJjaEFzc2lnbm1lbnRzKHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLlNFQVJDSCwgcmVxdWVzdClcbiAgfVxuXG4gIHN1Ym1pdERyYWZ0QXNzaWdubWVudChyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucHV0KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9EUkFGVF9BU1NJR05NRU5ULCByZXF1ZXN0KVxuICB9XG5cbiAgc3VibWl0QXNzaWdubWVudChyZXF1ZXN0OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChBUElfRU5EX1BPSU5UUy5TVUJNSVRfQVNTSUdOTUVOVCwgcmVxdWVzdClcbiAgfVxuXG4gIG5vdGlmeUFzc2lnbm1lbnRTdWJtaXNzaW9uKHBheWxvYWQ6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLk5PVElGWV9BU1NJR05NRU5UX1NVQk1JU1NJT04sIHBheWxvYWQpXG4gIH1cblxuICBnZXRBc3NpZ25tZW50U3RhdHVzKHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke0FQSV9FTkRfUE9JTlRTLkFTU0lHTk1FTlRfU1RBVFVTfWAsIHJlcXVlc3QpXG4gIH1cblxuICByZWFkQXNzaWdubWVudEZpbGUoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ6IHN0cmluZywgYXNzaWdubWVudElkOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIC8vIFByb3Blcmx5IGVuY29kZSB0aGUgcGFyYW1ldGVycyB0byBhdm9pZCBtYWxmb3JtZWQgcmVxdWVzdCBlcnJvcnNcbiAgICBjb25zdCBlbmNvZGVkUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBjb250ZW50SWQ6IGNvbnRlbnRJZCB8fCAnJyxcbiAgICAgIGJhdGNoSWQ6IGJhdGNoSWQgfHwgJycsXG4gICAgICBmb3JtSWQ6IGFzc2lnbm1lbnRJZCB8fCAnJyxcbiAgICAgIGZpbGVOYW1lOiBmaWxlTmFtZSB8fCAnJ1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7QVBJX0VORF9QT0lOVFMuUkVBRF9BU1NJR05NRU5UfT8ke2VuY29kZWRQYXJhbXMudG9TdHJpbmcoKX1gLCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ0FjY2VwdCc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0sIGFwcGxpY2F0aW9uL3BkZiwgYXBwbGljYXRpb24vbXN3b3JkLCBhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudCdcbiAgICAgIH1cbiAgICB9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgbWlsZXN0b25lIGFjaGlldmVtZW50XG4gICAqIEBwYXJhbSB1c2VySWQgVXNlciBJRFxuICAgKiBAcGFyYW0gY291cnNlSWQgQ291cnNlIGlkZW50aWZpZXJcbiAgICogQHBhcmFtIGJhdGNoSWQgQmF0Y2ggSURcbiAgICogQHBhcmFtIG1pbGVzdG9uZUlkIE1pbGVzdG9uZSBpZGVudGlmaWVyIChlLmcuLCAnbTEnLCAnbTInKVxuICAgKi9cbiAgZ2VuZXJhdGVNaWxlc3RvbmVBY2hpZXZlbWVudCh1c2VySWQ6IHN0cmluZywgY291cnNlSWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCBtaWxlc3RvbmVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBhcGlVcmwgPSAnL2FwaXMvcHJveGllcy92OC9hY2hpZXZlbWVudC9keW5hbWljL3YxL2dlbmVyYXRlJ1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgY291cnNlSWQsXG4gICAgICAgIGJhdGNoSWQsXG4gICAgICAgIG1pbGVzdG9uZUlkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlVcmwsIHJlcXVlc3QpXG4gIH1cblxufVxuIl19
|