@nlabs/metropolisjs 1.0.8 → 1.1.1
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/README.md +76 -40
- package/docs/ACTIONS.md +61 -1
- package/docs/assets/metropolisjs-logo.png +0 -0
- package/docs/assets/metropolisjs-mark.svg +7 -0
- package/examples/crud-usage.tsx +1 -1
- package/examples/factory-pattern-usage.ts +85 -78
- package/examples/signup-error-handling.ts +25 -24
- package/factoryPatternGuide.md +90 -174
- package/lib/actions/translationActions/translationActions.d.ts +2 -11
- package/lib/actions/translationActions/translationActions.js +2 -2
- package/lib/actions/userActions/userActions.d.ts +7 -5
- package/lib/actions/userActions/userActions.js +111 -64
- package/lib/index.d.ts +3 -8
- package/lib/index.js +4 -9
- package/lib/stores/tagStore.d.ts +1 -0
- package/lib/stores/tagStore.js +1 -1
- package/lib/stores/userStore.d.ts +1 -0
- package/lib/stores/userStore.js +2 -1
- package/lib/utils/actionFactory.d.ts +52 -6
- package/lib/utils/actionFactory.js +8 -6
- package/lib/utils/baseActionFactory.d.ts +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/session.d.ts +1 -1
- package/package.json +36 -18
- package/tsconfig.examples.json +23 -0
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
import { USER_CONSTANTS } from '../../stores/userStore.js';
|
|
6
6
|
import { appMutation, appQuery, publicMutation, publicQuery, refreshSession } from '../../utils/api.js';
|
|
7
7
|
import { createBaseActions } from '../../utils/baseActionFactory.js';
|
|
8
|
-
import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
|
|
9
8
|
import { getConfigFromFlux } from '../../utils/configUtils.js';
|
|
10
9
|
import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
|
|
10
|
+
import { clearPersistedSession, hydrateSessionFromStorage, isLoggedIn as isLoggedInWithStorage, normalizeSession, storeSession } from '../../utils/session.js';
|
|
11
11
|
import { syncPersonaTagsToSession } from '../personaActions/personaActions.js';
|
|
12
12
|
const DATA_TYPE = 'users';
|
|
13
13
|
const DEFAULT_USER_QUERY_FIELDS = [
|
|
@@ -23,7 +23,10 @@ const SENSITIVE_USER_FIELDS = new Set([
|
|
|
23
23
|
'verifiedSmsCode'
|
|
24
24
|
]);
|
|
25
25
|
const INVALID_FIELD_REGEX = /Cannot query field "([^"]+)"/g;
|
|
26
|
-
const hasSessionIdentity = (user)
|
|
26
|
+
const hasSessionIdentity = (user)=>{
|
|
27
|
+
const sessionUser = user;
|
|
28
|
+
return Boolean(sessionUser && (Reflect.get(sessionUser, '_id') || sessionUser.userId || sessionUser.username || sessionUser.email));
|
|
29
|
+
};
|
|
27
30
|
const sanitizeUpdateUserInput = (userInput = {}, currentSession = {})=>{
|
|
28
31
|
const nextUser = Object.entries(userInput).reduce((user, [field, value])=>{
|
|
29
32
|
if (value === undefined || value === null) {
|
|
@@ -106,9 +109,13 @@ const getInvalidFields = (error)=>{
|
|
|
106
109
|
};
|
|
107
110
|
const getPasswordResetIdentifier = (request)=>{
|
|
108
111
|
const identifier = typeof request === 'string' ? String(request || '').trim() : String(request.email || request.phone || request.username || '').trim();
|
|
112
|
+
let type = identifier.includes('@') ? 'email' : 'username';
|
|
113
|
+
if (typeof request !== 'string' && request.phone) {
|
|
114
|
+
type = 'phone';
|
|
115
|
+
}
|
|
109
116
|
return {
|
|
110
117
|
identifier,
|
|
111
|
-
type
|
|
118
|
+
type
|
|
112
119
|
};
|
|
113
120
|
};
|
|
114
121
|
const getPasswordResetType = (confirmation)=>confirmation.type || (confirmation.phone ? 'phone' : 'email');
|
|
@@ -188,7 +195,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
188
195
|
]);
|
|
189
196
|
try {
|
|
190
197
|
return await publicMutation(flux, 'addUser', DATA_TYPE, queryVariables, returnProps, {
|
|
191
|
-
onSuccess
|
|
198
|
+
onSuccess,
|
|
199
|
+
...requestOptions
|
|
192
200
|
});
|
|
193
201
|
} finally{
|
|
194
202
|
await clearUserRequestCaches();
|
|
@@ -226,7 +234,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
226
234
|
]);
|
|
227
235
|
try {
|
|
228
236
|
return await publicMutation(flux, 'signUp', DATA_TYPE, queryVariables, returnProps, {
|
|
229
|
-
onSuccess
|
|
237
|
+
onSuccess,
|
|
238
|
+
...requestOptions
|
|
230
239
|
});
|
|
231
240
|
} catch (error) {
|
|
232
241
|
flux.dispatch({
|
|
@@ -294,13 +303,14 @@ export const createUserActions = (flux, options)=>{
|
|
|
294
303
|
]);
|
|
295
304
|
try {
|
|
296
305
|
return await appMutation(flux, 'updateUser', DATA_TYPE, queryVariables, returnProps, {
|
|
297
|
-
onSuccess
|
|
306
|
+
onSuccess,
|
|
307
|
+
...requestOptions
|
|
298
308
|
});
|
|
299
309
|
} finally{
|
|
300
310
|
await clearUserRequestCaches(String(userId || ''));
|
|
301
311
|
}
|
|
302
312
|
};
|
|
303
|
-
const confirmCode = async (code, { type, value },
|
|
313
|
+
const confirmCode = async (code, { type, value }, _requestOptions = {})=>{
|
|
304
314
|
const queryVariables = {
|
|
305
315
|
code: {
|
|
306
316
|
type: 'Int!',
|
|
@@ -339,13 +349,14 @@ export const createUserActions = (flux, options)=>{
|
|
|
339
349
|
};
|
|
340
350
|
try {
|
|
341
351
|
return await appMutation(flux, 'remove', DATA_TYPE, queryVariables, [], {
|
|
342
|
-
onSuccess
|
|
352
|
+
onSuccess,
|
|
353
|
+
...requestOptions
|
|
343
354
|
});
|
|
344
355
|
} finally{
|
|
345
356
|
await clearUserRequestCaches(userId);
|
|
346
357
|
}
|
|
347
358
|
};
|
|
348
|
-
const session = async (userProps = [],
|
|
359
|
+
const session = async (userProps = [], _requestOptions = {})=>withInvalidFieldRetry(async (sessionProps)=>{
|
|
349
360
|
const data = await appQuery(flux, 'getUserBySession', DATA_TYPE, {}, sessionProps);
|
|
350
361
|
const sessionData = data?.users?.getUserBySession || {};
|
|
351
362
|
if (!hasSessionIdentity(sessionData)) {
|
|
@@ -434,21 +445,47 @@ export const createUserActions = (flux, options)=>{
|
|
|
434
445
|
value: normalizedValue
|
|
435
446
|
}, matchingUser, requestOptions);
|
|
436
447
|
};
|
|
437
|
-
const
|
|
438
|
-
const
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
448
|
+
const createBillingSetupSession = async (returnUrl, requestOptions = {})=>{
|
|
449
|
+
const normalizedReturnUrl = String(returnUrl || '').trim();
|
|
450
|
+
if (!normalizedReturnUrl) {
|
|
451
|
+
throw new Error('A returnUrl is required to create a billing setup session');
|
|
452
|
+
}
|
|
453
|
+
let checkoutUrl = '';
|
|
454
|
+
const onSuccess = (data = {})=>{
|
|
455
|
+
checkoutUrl = String(data?.users?.createBillingSetupSession || '');
|
|
456
|
+
return flux.dispatch({
|
|
457
|
+
checkoutUrl,
|
|
458
|
+
type: USER_CONSTANTS.BILLING_SETUP_SESSION_SUCCESS
|
|
459
|
+
});
|
|
443
460
|
};
|
|
461
|
+
await appMutation(flux, 'createBillingSetupSession', DATA_TYPE, {
|
|
462
|
+
returnUrl: {
|
|
463
|
+
type: 'String!',
|
|
464
|
+
value: normalizedReturnUrl
|
|
465
|
+
}
|
|
466
|
+
}, [], {
|
|
467
|
+
onSuccess,
|
|
468
|
+
...requestOptions
|
|
469
|
+
});
|
|
470
|
+
if (!checkoutUrl) {
|
|
471
|
+
throw new Error('Billing setup session did not return a checkout URL');
|
|
472
|
+
}
|
|
473
|
+
return checkoutUrl;
|
|
474
|
+
};
|
|
475
|
+
const completeBillingSetupSession = async (sessionId, userProps = [], requestOptions = {})=>{
|
|
476
|
+
const normalizedSessionId = String(sessionId || '').trim();
|
|
477
|
+
if (!normalizedSessionId) {
|
|
478
|
+
throw new Error('A sessionId is required to complete a billing setup session');
|
|
479
|
+
}
|
|
480
|
+
let updatedUser = {};
|
|
444
481
|
const onSuccess = (data = {})=>{
|
|
445
|
-
|
|
446
|
-
if (
|
|
447
|
-
syncStoredSession(flux,
|
|
482
|
+
updatedUser = data?.users?.completeBillingSetupSession || {};
|
|
483
|
+
if (updatedUser?.userId && updatedUser.userId === flux.getState('user.session.userId')) {
|
|
484
|
+
syncStoredSession(flux, updatedUser);
|
|
448
485
|
}
|
|
449
486
|
return flux.dispatch({
|
|
450
487
|
type: USER_CONSTANTS.UPDATE_ITEM_SUCCESS,
|
|
451
|
-
user
|
|
488
|
+
user: updatedUser
|
|
452
489
|
});
|
|
453
490
|
};
|
|
454
491
|
const returnProps = sanitizeUserProps([
|
|
@@ -462,9 +499,16 @@ export const createUserActions = (flux, options)=>{
|
|
|
462
499
|
]);
|
|
463
500
|
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
464
501
|
try {
|
|
465
|
-
|
|
466
|
-
|
|
502
|
+
await appMutation(flux, 'completeBillingSetupSession', DATA_TYPE, {
|
|
503
|
+
sessionId: {
|
|
504
|
+
type: 'ID!',
|
|
505
|
+
value: normalizedSessionId
|
|
506
|
+
}
|
|
507
|
+
}, returnProps, {
|
|
508
|
+
onSuccess,
|
|
509
|
+
...requestOptions
|
|
467
510
|
});
|
|
511
|
+
return updatedUser;
|
|
468
512
|
} finally{
|
|
469
513
|
await clearUserRequestCaches(sessionUserId);
|
|
470
514
|
}
|
|
@@ -492,7 +536,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
492
536
|
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
493
537
|
try {
|
|
494
538
|
return await appMutation(flux, 'deleteBillingCard', DATA_TYPE, {}, returnProps, {
|
|
495
|
-
onSuccess
|
|
539
|
+
onSuccess,
|
|
540
|
+
...requestOptions
|
|
496
541
|
});
|
|
497
542
|
} finally{
|
|
498
543
|
await clearUserRequestCaches(sessionUserId);
|
|
@@ -536,7 +581,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
536
581
|
const sessionUserId = String(flux.getState('user.session.userId') || '');
|
|
537
582
|
try {
|
|
538
583
|
return await appMutation(flux, 'updatePlan', DATA_TYPE, queryVariables, returnProps, {
|
|
539
|
-
onSuccess
|
|
584
|
+
onSuccess,
|
|
585
|
+
...requestOptions
|
|
540
586
|
});
|
|
541
587
|
} finally{
|
|
542
588
|
await clearUserRequestCaches(sessionUserId);
|
|
@@ -564,12 +610,13 @@ export const createUserActions = (flux, options)=>{
|
|
|
564
610
|
}, result, requestOptions);
|
|
565
611
|
};
|
|
566
612
|
const listByLatest = async (username = '', from = 0, to = 10, userProps = [], requestOptions = {})=>{
|
|
567
|
-
const
|
|
568
|
-
username,
|
|
613
|
+
const cacheKey = {
|
|
569
614
|
from,
|
|
570
615
|
to,
|
|
571
|
-
userProps
|
|
572
|
-
|
|
616
|
+
userProps,
|
|
617
|
+
username
|
|
618
|
+
};
|
|
619
|
+
const cachedResult = getCachedRequest(flux, 'user.listByLatest', cacheKey, requestOptions);
|
|
573
620
|
if (cachedResult !== undefined) {
|
|
574
621
|
return cachedResult;
|
|
575
622
|
}
|
|
@@ -597,23 +644,19 @@ export const createUserActions = (flux, options)=>{
|
|
|
597
644
|
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByLatest', DATA_TYPE, queryVariables, safeUserProps, {
|
|
598
645
|
onSuccess
|
|
599
646
|
}), userProps, DEFAULT_USER_QUERY_FIELDS);
|
|
600
|
-
return setCachedRequest(flux, 'user.listByLatest',
|
|
601
|
-
username,
|
|
602
|
-
from,
|
|
603
|
-
to,
|
|
604
|
-
userProps
|
|
605
|
-
}, result, requestOptions);
|
|
647
|
+
return setCachedRequest(flux, 'user.listByLatest', cacheKey, result, requestOptions);
|
|
606
648
|
};
|
|
607
|
-
const listByConnection = async (userId,
|
|
608
|
-
const listByReactions = async (username, reactionNames,
|
|
649
|
+
const listByConnection = async (userId, _from = 0, _to = 10, _userProps = [], _requestOptions = {})=>[];
|
|
650
|
+
const listByReactions = async (username, reactionNames, _from = 0, _to = 10, _personaProps = [], _requestOptions = {})=>[];
|
|
609
651
|
const listByTags = async (username, tagNames, from = 0, to = 10, personaProps = [], requestOptions = {})=>{
|
|
610
|
-
const
|
|
611
|
-
username,
|
|
612
|
-
tagNames,
|
|
652
|
+
const cacheKey = {
|
|
613
653
|
from,
|
|
654
|
+
personaProps,
|
|
655
|
+
tagNames,
|
|
614
656
|
to,
|
|
615
|
-
|
|
616
|
-
}
|
|
657
|
+
username
|
|
658
|
+
};
|
|
659
|
+
const cachedResult = getCachedRequest(flux, 'user.listByTags', cacheKey, requestOptions);
|
|
617
660
|
if (cachedResult !== undefined) {
|
|
618
661
|
return cachedResult;
|
|
619
662
|
}
|
|
@@ -645,13 +688,7 @@ export const createUserActions = (flux, options)=>{
|
|
|
645
688
|
const result = await withInvalidFieldRetry((safeUserProps)=>appQuery(flux, 'listByTags', DATA_TYPE, queryVariables, safeUserProps, {
|
|
646
689
|
onSuccess
|
|
647
690
|
}), personaProps, DEFAULT_USER_QUERY_FIELDS);
|
|
648
|
-
return setCachedRequest(flux, 'user.listByTags',
|
|
649
|
-
username,
|
|
650
|
-
tagNames,
|
|
651
|
-
from,
|
|
652
|
-
to,
|
|
653
|
-
personaProps
|
|
654
|
-
}, result, requestOptions);
|
|
691
|
+
return setCachedRequest(flux, 'user.listByTags', cacheKey, result, requestOptions);
|
|
655
692
|
};
|
|
656
693
|
const search = async (query, userProps = [], requestOptions = {})=>{
|
|
657
694
|
const cachedResult = getCachedRequest(flux, 'user.search', {
|
|
@@ -683,11 +720,11 @@ export const createUserActions = (flux, options)=>{
|
|
|
683
720
|
}, result, requestOptions);
|
|
684
721
|
};
|
|
685
722
|
const isLoggedIn = ()=>isLoggedInWithStorage(flux);
|
|
686
|
-
const currentAuthenticatedUser = async (
|
|
723
|
+
const currentAuthenticatedUser = async (_requestOptions = {})=>{
|
|
687
724
|
const session = await hydrateSessionFromStorage(flux);
|
|
688
725
|
return session || {};
|
|
689
726
|
};
|
|
690
|
-
const refreshSessionAction = async (token, expires,
|
|
727
|
+
const refreshSessionAction = async (token, expires, _requestOptions = {})=>{
|
|
691
728
|
const result = await refreshSession(flux, token, expires);
|
|
692
729
|
return result?.refreshSession || {};
|
|
693
730
|
};
|
|
@@ -728,10 +765,11 @@ export const createUserActions = (flux, options)=>{
|
|
|
728
765
|
const users = data?.users;
|
|
729
766
|
const sessionData = normalizeSession(users?.signIn || {});
|
|
730
767
|
const storedSession = await syncStoredSession(flux, sessionData);
|
|
731
|
-
|
|
768
|
+
const action = {
|
|
732
769
|
session: storedSession,
|
|
733
770
|
type: USER_CONSTANTS.SIGN_IN_SUCCESS
|
|
734
771
|
};
|
|
772
|
+
return action;
|
|
735
773
|
};
|
|
736
774
|
const performSignIn = async (queryVariables)=>{
|
|
737
775
|
const sessionResult = await publicMutation(flux, 'signIn', DATA_TYPE, queryVariables, [
|
|
@@ -752,7 +790,7 @@ export const createUserActions = (flux, options)=>{
|
|
|
752
790
|
'username'
|
|
753
791
|
], requestOptions);
|
|
754
792
|
await syncPersonaTagsToSession(flux, String(hydratedSession?.personaId || ''));
|
|
755
|
-
} catch
|
|
793
|
+
} catch {
|
|
756
794
|
const fallbackSession = await syncStoredSession(flux, baseSession);
|
|
757
795
|
await flux.dispatch({
|
|
758
796
|
session: fallbackSession,
|
|
@@ -779,7 +817,7 @@ export const createUserActions = (flux, options)=>{
|
|
|
779
817
|
await clearUserRequestCaches(String(user?.userId || ''));
|
|
780
818
|
}
|
|
781
819
|
};
|
|
782
|
-
const signOut = async (
|
|
820
|
+
const signOut = async (_requestOptions = {})=>{
|
|
783
821
|
await clearPersistedSession(flux);
|
|
784
822
|
await flux.dispatch({
|
|
785
823
|
session: {},
|
|
@@ -788,11 +826,16 @@ export const createUserActions = (flux, options)=>{
|
|
|
788
826
|
await clearUserRequestCaches();
|
|
789
827
|
return true;
|
|
790
828
|
};
|
|
791
|
-
const confirmSignUp = async (
|
|
829
|
+
const confirmSignUp = async (_code, _type, _requestOptions = {})=>true;
|
|
792
830
|
const requestPasswordReset = async (request, requestOptions = {})=>{
|
|
793
831
|
let forgotPasswordSucceeded = false;
|
|
794
832
|
const { identifier, type } = getPasswordResetIdentifier(request);
|
|
795
|
-
|
|
833
|
+
let attribute = 'username';
|
|
834
|
+
if (type === 'phone') {
|
|
835
|
+
attribute = 'phone';
|
|
836
|
+
} else if (type === 'email') {
|
|
837
|
+
attribute = 'email';
|
|
838
|
+
}
|
|
796
839
|
const queryVariables = {
|
|
797
840
|
user: {
|
|
798
841
|
type: 'UserInput!',
|
|
@@ -809,7 +852,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
809
852
|
});
|
|
810
853
|
};
|
|
811
854
|
await publicMutation(flux, 'forgotPassword', DATA_TYPE, queryVariables, [], {
|
|
812
|
-
onSuccess
|
|
855
|
+
onSuccess,
|
|
856
|
+
...requestOptions
|
|
813
857
|
});
|
|
814
858
|
if (!forgotPasswordSucceeded) {
|
|
815
859
|
throw new Error('forgot_password_failed');
|
|
@@ -842,7 +886,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
842
886
|
});
|
|
843
887
|
};
|
|
844
888
|
return publicMutation(flux, 'sendVerificationEmail', DATA_TYPE, queryVariables, [], {
|
|
845
|
-
onSuccess
|
|
889
|
+
onSuccess,
|
|
890
|
+
...requestOptions
|
|
846
891
|
}).then((data)=>{
|
|
847
892
|
const success = !!data?.users?.sendVerificationEmail;
|
|
848
893
|
if (!success) {
|
|
@@ -877,7 +922,8 @@ export const createUserActions = (flux, options)=>{
|
|
|
877
922
|
});
|
|
878
923
|
};
|
|
879
924
|
return publicMutation(flux, 'resetPassword', DATA_TYPE, queryVariables, [], {
|
|
880
|
-
onSuccess
|
|
925
|
+
onSuccess,
|
|
926
|
+
...requestOptions
|
|
881
927
|
}).then((data)=>{
|
|
882
928
|
const success = !!data?.users?.resetPassword;
|
|
883
929
|
if (!success) {
|
|
@@ -891,19 +937,21 @@ export const createUserActions = (flux, options)=>{
|
|
|
891
937
|
const type = getPasswordResetType(confirmation);
|
|
892
938
|
return resetPassword(username, confirmation.password, confirmation.code, type, requestOptions);
|
|
893
939
|
};
|
|
894
|
-
const updatePassword = async (
|
|
940
|
+
const updatePassword = async (_password, _newPassword, _requestOptions = {})=>true;
|
|
895
941
|
return {
|
|
896
942
|
addUser,
|
|
943
|
+
completeBillingSetupSession,
|
|
944
|
+
completePasswordReset,
|
|
897
945
|
confirmCode,
|
|
898
946
|
confirmSignUp,
|
|
899
|
-
|
|
947
|
+
createBillingSetupSession,
|
|
900
948
|
currentAuthenticatedUser,
|
|
901
949
|
deleteBillingCard,
|
|
902
|
-
list,
|
|
903
950
|
forgotPassword,
|
|
951
|
+
getUserByAttribute,
|
|
904
952
|
isLoggedIn,
|
|
905
953
|
itemById,
|
|
906
|
-
|
|
954
|
+
list,
|
|
907
955
|
listByConnection,
|
|
908
956
|
listByLatest,
|
|
909
957
|
listByReactions,
|
|
@@ -912,7 +960,6 @@ export const createUserActions = (flux, options)=>{
|
|
|
912
960
|
remove,
|
|
913
961
|
requestPasswordReset,
|
|
914
962
|
resetPassword,
|
|
915
|
-
saveBillingCard,
|
|
916
963
|
search,
|
|
917
964
|
sendVerificationEmail,
|
|
918
965
|
session,
|
|
@@ -920,11 +967,11 @@ export const createUserActions = (flux, options)=>{
|
|
|
920
967
|
signOut,
|
|
921
968
|
signUp,
|
|
922
969
|
updatePassword,
|
|
923
|
-
updateUser,
|
|
924
970
|
updatePlan,
|
|
971
|
+
updateUser,
|
|
925
972
|
updateUserAdapter: userBase.updateAdapter,
|
|
926
973
|
updateUserAdapterOptions: userBase.updateOptions
|
|
927
974
|
};
|
|
928
975
|
};
|
|
929
976
|
|
|
930
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHB1YmxpY1F1ZXJ5LCByZWZyZXNoU2Vzc2lvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7Y3JlYXRlQmFzZUFjdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VBY3Rpb25GYWN0b3J5LmpzJztcbmltcG9ydCB7XG4gIGNsZWFyUGVyc2lzdGVkU2Vzc2lvbixcbiAgaHlkcmF0ZVNlc3Npb25Gcm9tU3RvcmFnZSxcbiAgaXNMb2dnZWRJbiBhcyBpc0xvZ2dlZEluV2l0aFN0b3JhZ2UsXG4gIG5vcm1hbGl6ZVNlc3Npb24sXG4gIHN0b3JlU2Vzc2lvblxufSBmcm9tICcuLi8uLi91dGlscy9zZXNzaW9uLmpzJztcbmltcG9ydCB7Z2V0Q29uZmlnRnJvbUZsdXh9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZ1V0aWxzLmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuaW1wb3J0IHtzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb259IGZyb20gJy4uL3BlcnNvbmFBY3Rpb25zL3BlcnNvbmFBY3Rpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge0FwaVJlc3VsdHNUeXBlLCBTZXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB0eXBlIHtCYXNlQWRhcHRlck9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvckZhY3RvcnkuanMnO1xuaW1wb3J0IHR5cGUge0FjdGlvblJlcXVlc3RPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5jb25zdCBEQVRBX1RZUEUgPSAndXNlcnMnO1xuY29uc3QgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyA9IFsndXNlcklkJywgJ3VzZXJuYW1lJ107XG5jb25zdCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3NhbHQnLFxuICAndG9rZW4nLFxuICAncmVmcmVzaFRva2VuJyxcbiAgJ3ZlcmlmaWVkRW1haWxDb2RlJyxcbiAgJ3ZlcmlmaWVkU21zQ29kZSdcbl0pO1xuY29uc3QgSU5WQUxJRF9GSUVMRF9SRUdFWCA9IC9DYW5ub3QgcXVlcnkgZmllbGQgXCIoW15cIl0rKVwiL2c7XG5jb25zdCBoYXNTZXNzaW9uSWRlbnRpdHkgPSAodXNlcj86IFBhcnRpYWw8VXNlcj4gfCBudWxsKTogYm9vbGVhbiA9PlxuICAhISh1c2VyICYmICgodXNlciBhcyBhbnkpLl9pZCB8fCAodXNlciBhcyBhbnkpLnVzZXJJZCB8fCAodXNlciBhcyBhbnkpLnVzZXJuYW1lIHx8ICh1c2VyIGFzIGFueSkuZW1haWwpKTtcblxuY29uc3Qgc2FuaXRpemVVcGRhdGVVc2VySW5wdXQgPSAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+ID0ge30sIGN1cnJlbnRTZXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogUGFydGlhbDxVc2VyPiA9PiB7XG4gIGNvbnN0IG5leHRVc2VyID0gT2JqZWN0LmVudHJpZXModXNlcklucHV0KS5yZWR1Y2UoKHVzZXI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBbZmllbGQsIHZhbHVlXSkgPT4ge1xuICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmKGZpZWxkID09PSAncGFzc3dvcmQnKSB7XG4gICAgICBjb25zdCBwYXNzd29yZCA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuXG4gICAgICBpZihwYXNzd29yZCkge1xuICAgICAgICB1c2VyLnBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGlmKGZpZWxkID09PSAndXNlcklkJykge1xuICAgICAgdXNlci51c2VySWQgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB1c2VyO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRTZXNzaW9uW2ZpZWxkXTtcblxuICAgIGlmKFN0cmluZyh2YWx1ZSkgIT09IFN0cmluZyhjdXJyZW50VmFsdWUgPz8gJycpKSB7XG4gICAgICB1c2VyW2ZpZWxkXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIG5leHRVc2VyIGFzIFBhcnRpYWw8VXNlcj47XG59O1xuXG5jb25zdCBzeW5jU3RvcmVkU2Vzc2lvbiA9IGFzeW5jIChmbHV4OiBGbHV4RnJhbWV3b3JrLCBzZXNzaW9uUGF0Y2g6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBQcm9taXNlPFNlc3Npb25UeXBlPiA9PiB7XG4gIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIHt9KSB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiBzdG9yZVNlc3Npb24oZmx1eCwgey4uLmN1cnJlbnRTZXNzaW9uLCAuLi5zZXNzaW9uUGF0Y2h9KTtcbn07XG5cbmNvbnN0IGdldFNlc3Npb25QYXlsb2FkID0gKHBheWxvYWQ6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gIGlmKHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQgPT09ICdvYmplY3QnICYmICdzZXNzaW9uJyBpbiAocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICByZXR1cm4gKCgocGF5bG9hZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuc2Vzc2lvbikgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmV0dXJuIChwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyA/IHBheWxvYWQgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5jb25zdCBnZXRGaWVsZFJvb3QgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRyaW1tZWQgPSBmaWVsZC50cmltKCk7XG4gIGNvbnN0IG1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXltBLVphLXpfXVtBLVphLXowLTlfXSovKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMF0gOiAnJztcbn07XG5cbmNvbnN0IHNhbml0aXplVXNlclByb3BzID0gKHByb3BzOiBzdHJpbmdbXSA9IFtdLCBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFMpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc2FuaXRpemVkID0gcHJvcHMucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRGaWVsZFJvb3QoZmllbGQpO1xuXG4gICAgaWYoIXJvb3QgfHwgU0VOU0lUSVZFX1VTRVJfRklFTERTLmhhcyhyb290KSB8fCBzZWVuLmhhcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICBsaXN0LnB1c2goZmllbGQpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG5cbiAgaWYoc2FuaXRpemVkLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgcmV0dXJuIGZhbGxiYWNrUHJvcHMucmVkdWNlKChsaXN0OiBzdHJpbmdbXSwgZmllbGQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBnZXRGaWVsZFJvb3QoZmllbGQpO1xuXG4gICAgaWYoIXJvb3QgfHwgU0VOU0lUSVZFX1VTRVJfRklFTERTLmhhcyhyb290KSB8fCBzZWVuLmhhcyhmaWVsZCkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIHNlZW4uYWRkKGZpZWxkKTtcbiAgICBsaXN0LnB1c2goZmllbGQpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LCBbXSk7XG59O1xuXG5jb25zdCBnZXRJbnZhbGlkRmllbGRzID0gKGVycm9yOiB1bmtub3duKTogU2V0PHN0cmluZz4gPT4ge1xuICBjb25zdCBlcnJvcnMgPSAoZXJyb3IgYXMgYW55KT8uZXJyb3JzIHx8IChlcnJvciBhcyBhbnkpPy5zb3VyY2U/LmVycm9ycyB8fCBbXTtcbiAgY29uc3QgaW52YWxpZEZpZWxkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGVycm9ycy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGl0ZW0/Lm1lc3NhZ2UgfHwgJyc7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsID0gSU5WQUxJRF9GSUVMRF9SRUdFWC5leGVjKG1lc3NhZ2UpO1xuXG4gICAgd2hpbGUobWF0Y2gpIHtcbiAgICAgIGludmFsaWRGaWVsZHMuYWRkKG1hdGNoWzFdKTtcbiAgICAgIG1hdGNoID0gSU5WQUxJRF9GSUVMRF9SRUdFWC5leGVjKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIElOVkFMSURfRklFTERfUkVHRVgubGFzdEluZGV4ID0gMDtcbiAgfSk7XG5cbiAgcmV0dXJuIGludmFsaWRGaWVsZHM7XG59O1xuXG5jb25zdCBnZXRQYXNzd29yZFJlc2V0SWRlbnRpZmllciA9IChyZXF1ZXN0OiBzdHJpbmcgfCBQYXNzd29yZFJlc2V0UmVxdWVzdCk6IHtcbiAgcmVhZG9ubHkgaWRlbnRpZmllcjogc3RyaW5nO1xuICByZWFkb25seSB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyB8ICd1c2VybmFtZSc7XG59ID0+IHtcbiAgY29uc3QgaWRlbnRpZmllciA9IHR5cGVvZiByZXF1ZXN0ID09PSAnc3RyaW5nJ1xuICAgID8gU3RyaW5nKHJlcXVlc3QgfHwgJycpLnRyaW0oKVxuICAgIDogU3RyaW5nKHJlcXVlc3QuZW1haWwgfHwgcmVxdWVzdC5waG9uZSB8fCByZXF1ZXN0LnVzZXJuYW1lIHx8ICcnKS50cmltKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIHR5cGU6IHR5cGVvZiByZXF1ZXN0ICE9PSAnc3RyaW5nJyAmJiByZXF1ZXN0LnBob25lID8gJ3Bob25lJyA6IGlkZW50aWZpZXIuaW5jbHVkZXMoJ0AnKSA/ICdlbWFpbCcgOiAndXNlcm5hbWUnXG4gIH07XG59O1xuXG5jb25zdCBnZXRQYXNzd29yZFJlc2V0VHlwZSA9IChjb25maXJtYXRpb246IFBhc3N3b3JkUmVzZXRDb25maXJtYXRpb24pOiAnZW1haWwnIHwgJ3Bob25lJyA9PlxuICBjb25maXJtYXRpb24udHlwZSB8fCAoY29uZmlybWF0aW9uLnBob25lID8gJ3Bob25lJyA6ICdlbWFpbCcpO1xuXG5jb25zdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkgPSBhc3luYyA8VD4oXG4gIHJlcXVlc3RXaXRoUHJvcHM6IChwcm9wczogc3RyaW5nW10pID0+IFByb21pc2U8VD4sXG4gIHByb3BzOiBzdHJpbmdbXSxcbiAgZmFsbGJhY2tQcm9wczogc3RyaW5nW10gPSBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4pOiBQcm9taXNlPFQ+ID0+IHtcbiAgY29uc3Qgc2FmZVByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMocHJvcHMsIGZhbGxiYWNrUHJvcHMpO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RXaXRoUHJvcHMoc2FmZVByb3BzKTtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGNvbnN0IGludmFsaWRGaWVsZHMgPSBnZXRJbnZhbGlkRmllbGRzKGVycm9yKTtcblxuICAgIGlmKGludmFsaWRGaWVsZHMuc2l6ZSA9PT0gMCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0cnlQcm9wcyA9IHNhZmVQcm9wcy5maWx0ZXIoKGZpZWxkKSA9PiAhaW52YWxpZEZpZWxkcy5oYXMoZ2V0RmllbGRSb290KGZpZWxkKSkpO1xuXG4gICAgaWYocmV0cnlQcm9wcy5sZW5ndGggPT09IDAgfHwgcmV0cnlQcm9wcy5sZW5ndGggPT09IHNhZmVQcm9wcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0V2l0aFByb3BzKHJldHJ5UHJvcHMpO1xuICB9XG59O1xuXG5leHBvcnQgdHlwZSBVc2VyQWRhcHRlck9wdGlvbnMgPSBCYXNlQWRhcHRlck9wdGlvbnM7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjdGlvbnNPcHRpb25zIHtcbiAgcmVhZG9ubHkgdXNlckFkYXB0ZXI/OiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IGFueTtcbiAgcmVhZG9ubHkgdXNlckFkYXB0ZXJPcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkVtYWlsT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHN1YmplY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbXBsYXRlPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRSZXF1ZXN0IHtcbiAgcmVhZG9ubHkgZW1haWw/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBob25lPzogc3RyaW5nO1xuICByZWFkb25seSB1c2VybmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0Q29uZmlybWF0aW9uIGV4dGVuZHMgUGFzc3dvcmRSZXNldFJlcXVlc3Qge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU/OiAnZW1haWwnIHwgJ3Bob25lJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQXBpUmVzdWx0c1R5cGUge1xuICByZWFkb25seSB1c2Vyczoge1xuICAgIHJlYWRvbmx5IGFjdGl2ZUNvdW50PzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGFkZFVzZXI/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGNvbmZpcm1Db2RlPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBkZWFjdGl2YXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBmb3Jnb3RQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaXRlbUJ5SWQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJCeUF0dHJpYnV0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZ2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyTGlzdD86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHNlYXJjaD86IFVzZXJbXTtcbiAgICByZWFkb25seSByZWZyZXNoU2Vzc2lvbj86IFNlc3Npb25UeXBlO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgcmVzZXRQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2F2ZUJpbGxpbmdDYXJkPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzZW5kVmVyaWZpY2F0aW9uRW1haWw/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25Jbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgc2lnblVwPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBkZWxldGVCaWxsaW5nQ2FyZD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlVXNlcj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgdXBkYXRlUGFzc3dvcmQ/OiBQYXJ0aWFsPGJvb2xlYW4+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVBsYW4/OiBQYXJ0aWFsPFVzZXI+O1xuICB9O1xufVxuXG5jb25zdCBkZWZhdWx0VXNlclZhbGlkYXRvciA9IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4ge1xuICBjb25zdCB2YWxpZGF0ZWQgPSB2YWxpZGF0ZVVzZXJJbnB1dChpbnB1dCk7XG5cbiAgaWYob3B0aW9ucz8uc3RyaWN0ICYmICF2YWxpZGF0ZWQudXNlcm5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lIGlzIHJlcXVpcmVkIGluIHN0cmljdCBtb2RlJyk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSB1c2VyQWN0aW9ucyB7XG4gIGFkZFVzZXI6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBjb25maXJtQ29kZTogKGNvZGU6IG51bWJlciwge3R5cGUsIHZhbHVlfToge3R5cGU6ICdlbWFpbCcgfCAncGhvbmUnOyB2YWx1ZTogc3RyaW5nfSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgY29uZmlybVNpZ25VcDogKGNvZGU6IHN0cmluZywgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcjogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3Q6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlDb25uZWN0aW9uOiAodXNlcklkOiBzdHJpbmcsIGZyb20/OiBudW1iZXIsIHRvPzogbnVtYmVyLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBpdGVtQnlJZDogKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgZ2V0VXNlckJ5QXR0cmlidXRlOiAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXI+O1xuICBkZWxldGVCaWxsaW5nQ2FyZDogKHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBsaXN0QnlMYXRlc3Q6ICh1c2VybmFtZT86IHN0cmluZywgZnJvbT86IG51bWJlciwgdG8/OiBudW1iZXIsIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGxpc3RCeVJlYWN0aW9uczogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBmb3Jnb3RQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlcXVlc3RQYXNzd29yZFJlc2V0OiAocmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGlzTG9nZ2VkSW46ICgpID0+IGJvb2xlYW47XG4gIHJlZnJlc2hTZXNzaW9uOiAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICByZW1vdmU6ICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgcmVzZXRQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbXBsZXRlUGFzc3dvcmRSZXNldDogKGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbiwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsOiAoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbE9wdGlvbnM/OiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgc2F2ZUJpbGxpbmdDYXJkOiAoY2FyZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBzaWduSW46ICh1c2VyOiBQYXJ0aWFsPFVzZXI+LCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFNlc3Npb25UeXBlPjtcbiAgc2lnbk91dDogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNpZ25VcDogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVBhc3N3b3JkOiAocGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgdXBkYXRlVXNlcjogKHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPiwgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVBsYW46IChwbGFuSWQ6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIHVwZGF0ZVVzZXJBZGFwdGVyOiAoYWRhcHRlcjogKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogVXNlckFkYXB0ZXJPcHRpb25zKSA9PiBhbnkpID0+IHZvaWQ7XG4gIHVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVVzZXJBY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogVXNlckFjdGlvbnNPcHRpb25zXG4pOiB1c2VyQWN0aW9ucyA9PiB7XG4gIGNvbnN0IHVzZXJCYXNlID0gY3JlYXRlQmFzZUFjdGlvbnMoZmx1eCwgZGVmYXVsdFVzZXJWYWxpZGF0b3IsIHtcbiAgICBhZGFwdGVyOiBvcHRpb25zPy51c2VyQWRhcHRlcixcbiAgICBhZGFwdGVyT3B0aW9uczogb3B0aW9ucz8udXNlckFkYXB0ZXJPcHRpb25zXG4gIH0pO1xuICBjb25zdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzID0gYXN5bmMgKHVzZXJJZCA9ICcnKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3QnKTtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnKTtcbiAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgJ3VzZXIuc2VhcmNoJyk7XG4gICAgaWYodXNlcklkKSB7XG4gICAgICBhd2FpdCBjbGVhckNhY2hlZFJlcXVlc3QoZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFkZFVzZXIgPSBhc3luYyAoXG4gICAgdXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCB7dXNlcm5hbWUsIGVtYWlsLCBwYXNzd29yZH0gPSB1c2VySW5wdXQ7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBlbWFpbCxcbiAgICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgICB1c2VybmFtZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBVc2VyQXBpUmVzdWx0c1R5cGUpOiBQcm9taXNlPEZsdXhBY3Rpb24+ID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSBkYXRhPy51c2Vycz8uYWRkVXNlciB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuQUREX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHModXNlclByb3BzLCBbXG4gICAgICAnYWRkZWQnLFxuICAgICAgJ2FkZHJlc3MnLFxuICAgICAgJ2RvYicsXG4gICAgICAnY2l0eScsXG4gICAgICAnY291bnRyeScsXG4gICAgICAnZ2VuZGVyJyxcbiAgICAgICdpbWFnZVVybCcsXG4gICAgICAnbGF0aXR1ZGUnLFxuICAgICAgJ2xvbmdpdHVkZScsXG4gICAgICAnbWFpbGluZ0xpc3QnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhZGRVc2VyJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNpZ25VcCA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHt1c2VybmFtZSwgZW1haWwsIHBhc3N3b3JkfSA9IHVzZXJJbnB1dDtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGV4cGlyZXM6IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiAxNVxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IFVzZXJBcGlSZXN1bHRzVHlwZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3QgdXNlciA9IGRhdGE/LnVzZXJzPy5zaWduVXAgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fVVBfU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3NpZ25VcCcsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUlucHV0ID0gc2FuaXRpemVVcGRhdGVVc2VySW5wdXQodXNlcklucHV0LCAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgY29uc3Qge1xuICAgICAgYmlydGhkYXRlLFxuICAgICAgZG9iLFxuICAgICAgZW1haWwsXG4gICAgICBmaXJzdE5hbWUsXG4gICAgICBnZW5kZXIsXG4gICAgICBsYXN0TmFtZSxcbiAgICAgIG1haWxpbmdMaXN0LFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBwaG9uZSxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJuYW1lXG4gICAgfSA9IHVwZGF0ZUlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmlydGhkYXRlOiBiaXJ0aGRhdGUgPz8gZG9iLFxuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgICBnZW5kZXIsXG4gICAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgICAgbWFpbGluZ0xpc3QsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXJzID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2VycztcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycz8udXBkYXRlVXNlciB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3Bob25lJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhTdHJpbmcodXNlcklkIHx8ICcnKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGNvbmZpcm1Db2RlID0gYXN5bmMgKFxuICAgIGNvZGU6IG51bWJlcixcbiAgICB7dHlwZSwgdmFsdWV9OiB7dHlwZTogJ2VtYWlsJyB8ICdwaG9uZSc7IHZhbHVlOiBzdHJpbmd9LFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY29kZToge1xuICAgICAgICB0eXBlOiAnSW50IScsXG4gICAgICAgIHZhbHVlOiBjb2RlXG4gICAgICB9LFxuICAgICAgdHlwZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICB9LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAnY29uZmlybUNvZGUnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBbXSk7XG4gICAgY29uc3QgY29uZmlybWVkID0gISFkYXRhPy51c2Vycz8uY29uZmlybUNvZGU7XG5cbiAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtjb25maXJtZWQsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9TVUNDRVNTfSk7XG5cbiAgICByZXR1cm4gY29uZmlybWVkO1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZSA9IGFzeW5jICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnJlbW92ZSB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHt0eXBlOiBVU0VSX0NPTlNUQU5UUy5SRU1PVkVfSVRFTV9TVUNDRVNTLCB1c2VyfSk7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYXBwTXV0YXRpb24oZmx1eCwgJ3JlbW92ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXModXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jICh1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgYXN5bmMgKHNlc3Npb25Qcm9wcykgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFwcFF1ZXJ5KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0VXNlckJ5U2Vzc2lvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge30sXG4gICAgICAgIHNlc3Npb25Qcm9wc1xuICAgICAgKSBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj59O1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gZGF0YT8udXNlcnM/LmdldFVzZXJCeVNlc3Npb24gfHwge307XG5cbiAgICAgIGlmKCFoYXNTZXNzaW9uSWRlbnRpdHkoc2Vzc2lvbkRhdGEpKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyUGVyc2lzdGVkU2Vzc2lvbihmbHV4KTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fRVJST1J9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkX3Nlc3Npb24nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV4dFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBzZXNzaW9uRGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtzZXNzaW9uOiBuZXh0U2Vzc2lvbiwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX1NFU1NJT05fU1VDQ0VTU30pO1xuICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygobmV4dFNlc3Npb24gYXMgYW55KT8ucGVyc29uYUlkIHx8ICcnKSk7XG4gICAgICByZXR1cm4gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIG5leHRTZXNzaW9uKSB8fCBuZXh0U2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIGFzIFVzZXI7XG4gICAgfSxcbiAgICB1c2VyUHJvcHMsXG4gICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICApO1xuXG4gIGNvbnN0IGl0ZW1CeUlkID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyPihmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gLCB7dXNlcklkLCB1c2VyUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2V0VXNlckJ5SWQgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUgJiB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeUlkPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUlkKSB8fCB7fTtcblxuICAgICAgaWYodXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0VXNlckJ5SWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcjogZ2V0VXNlckJ5SWR9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdnZXRVc2VyQnlJZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXIsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBnZXRVc2VyQnlBdHRyaWJ1dGUgPSBhc3luYyAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlID0gU3RyaW5nKGF0dHJpYnV0ZSB8fCAnJykudHJpbSgpIGFzICdlbWFpbCcgfCAndXNlcm5hbWUnO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGxldCBtYXRjaGluZ1VzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXI+KFxuICAgICAgZmx1eCxcbiAgICAgIGB1c2VyLmdldFVzZXJCeUF0dHJpYnV0ZToke25vcm1hbGl6ZWRBdHRyaWJ1dGV9OiR7bm9ybWFsaXplZFZhbHVlfWAsXG4gICAgICB7YXR0cmlidXRlOiBub3JtYWxpemVkQXR0cmlidXRlLCB1c2VyUHJvcHMsIHZhbHVlOiBub3JtYWxpemVkVmFsdWV9LFxuICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBhdHRyaWJ1dGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogbm9ybWFsaXplZEF0dHJpYnV0ZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSAmIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5QXR0cmlidXRlPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUF0dHJpYnV0ZSkgfHwge307XG4gICAgICBtYXRjaGluZ1VzZXIgPSB1c2VyO1xuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcn0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gcHVibGljUXVlcnkoZmx1eCwgJ2dldFVzZXJCeUF0dHJpYnV0ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oXG4gICAgICBmbHV4LFxuICAgICAgYHVzZXIuZ2V0VXNlckJ5QXR0cmlidXRlOiR7bm9ybWFsaXplZEF0dHJpYnV0ZX06JHtub3JtYWxpemVkVmFsdWV9YCxcbiAgICAgIHthdHRyaWJ1dGU6IG5vcm1hbGl6ZWRBdHRyaWJ1dGUsIHVzZXJQcm9wcywgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZX0sXG4gICAgICBtYXRjaGluZ1VzZXIgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBzYXZlQmlsbGluZ0NhcmQgPSBhc3luYyAoXG4gICAgY2FyZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgY2FyZDoge1xuICAgICAgICB0eXBlOiAnQ3JlZGl0Q2FyZElucHV0IScsXG4gICAgICAgIHZhbHVlOiBjYXJkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNhdmVCaWxsaW5nQ2FyZCkgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RyaXBlQ2FyZEJyYW5kJyxcbiAgICAgICdzdHJpcGVDYXJkSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRMYXN0NCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcbiAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gU3RyaW5nKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSB8fCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2F2ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBkZWxldGVCaWxsaW5nQ2FyZCA9IGFzeW5jIChcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXIgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZGVsZXRlQmlsbGluZ0NhcmQpIHx8IHt9O1xuXG4gICAgICBpZigodXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVzZXIgYXMgYW55KS51c2VySWQgPT09IGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSkge1xuICAgICAgICBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCB1c2VyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5VUERBVEVfSVRFTV9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2RlbGV0ZUJpbGxpbmdDYXJkJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICB7fSxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVQbGFuID0gYXN5bmMgKFxuICAgIHBsYW5JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBuZXh0UGxhbklkID0gU3RyaW5nKHBsYW5JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5leHRQbGFuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdWJzY3JpcHRpb24gcGxhbklkIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHVzZXIgcGxhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcGxhbklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogbmV4dFBsYW5JZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy51cGRhdGVQbGFuKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwbGFuRXhwaXJlcycsXG4gICAgICAncGxhbklkJyxcbiAgICAgICdwbGFuU3RhdHVzJyxcbiAgICAgICdwbGFuU3Vic2NyaXB0aW9uSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVBsYW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoc2Vzc2lvblVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGxpc3QgPSBhc3luYyAodXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5nZXRVc2VyTGlzdCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnZ2V0VXNlckxpc3QnLCBEQVRBX1RZUEUsIHt9LCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdCcsIHt1c2VyUHJvcHN9LCByZXN1bHQgYXMgVXNlcltdLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgbGlzdEJ5TGF0ZXN0ID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcgPSAnJyxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+IHtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5TGF0ZXN0IHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlMYXRlc3QnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0Jywge3VzZXJuYW1lLCBmcm9tLCB0bywgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUNvbm5lY3Rpb24gPSBhc3luYyAoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PlxuICAgIFtdXG4gIDtcblxuICBjb25zdCBsaXN0QnlSZWFjdGlvbnMgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICByZWFjdGlvbk5hbWVzOiBzdHJpbmdbXSxcbiAgICBmcm9tOiBudW1iZXIgPSAwLFxuICAgIHRvOiBudW1iZXIgPSAxMCxcbiAgICBwZXJzb25hUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnLCB7dXNlcm5hbWUsIHRhZ05hbWVzLCBmcm9tLCB0bywgcGVyc29uYVByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgdHlwZTogJ1tTdHJpbmchXScsXG4gICAgICAgIHZhbHVlOiB0YWdOYW1lc1xuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5VGFncyB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnbGlzdEJ5VGFncycsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHBlcnNvbmFQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlUYWdzJywge3VzZXJuYW1lLCB0YWdOYW1lcywgZnJvbSwgdG8sIHBlcnNvbmFQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBzZWFyY2ggPSBhc3luYyAocXVlcnk6IHN0cmluZywgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlOiBxdWVyeVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgbGlzdCA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM/LnNlYXJjaCB8fCBbXTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtsaXN0LCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5HRVRfTElTVF9TVUNDRVNTfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdpdGhJbnZhbGlkRmllbGRSZXRyeShcbiAgICAgIChzYWZlVXNlclByb3BzKSA9PiBhcHBRdWVyeShmbHV4LCAnc2VhcmNoJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLnNlYXJjaCcsIHtxdWVyeSwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGlzTG9nZ2VkSW4gPSAoKTogYm9vbGVhbiA9PiBpc0xvZ2dlZEluV2l0aFN0b3JhZ2UoZmx1eCk7XG5cbiAgY29uc3QgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyID0gYXN5bmMgKHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UoZmx1eCk7XG4gICAgcmV0dXJuIChzZXNzaW9uIHx8IHt9KSBhcyBVc2VyO1xuICB9O1xuXG4gIGNvbnN0IHJlZnJlc2hTZXNzaW9uQWN0aW9uID0gYXN5bmMgKHRva2VuPzogc3RyaW5nLCBleHBpcmVzPzogbnVtYmVyLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWZyZXNoU2Vzc2lvbihmbHV4LCB0b2tlbiwgZXhwaXJlcyk7XG4gICAgcmV0dXJuIChyZXN1bHQ/LnJlZnJlc2hTZXNzaW9uIHx8IHt9KSBhcyBTZXNzaW9uVHlwZTtcbiAgfTtcblxuICBjb25zdCBzaWduSW4gPSBhc3luYyAoXG4gICAgdXNlcjogUGFydGlhbDxVc2VyPixcbiAgICBleHBpcmVzPzogbnVtYmVyLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICBjb25zdCB7ZW1haWwsIHBob25lLCB1c2VybmFtZSwgcGFzc3dvcmR9ID0gdXNlcjtcbiAgICBsZXQgdXNlcklucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZih1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgdXNlcm5hbWVcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmKGVtYWlsICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIGVtYWlsLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYocGhvbmUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgIHBob25lXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXJuYW1lLCBlbWFpbCwgb3IgcGhvbmUgbnVtYmVyIGFuZCBwYXNzd29yZCBhcmUgcmVxdWlyZWQgdG8gc2lnbiBpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZ0Zyb21GbHV4KGZsdXgpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEV4cGlyZXMgPSBNYXRoLm1heCgxLCBOdW1iZXIoZXhwaXJlcyB8fCBjb25maWcuYXBwPy5zZXNzaW9uPy5tYXhNaW51dGVzIHx8IDE1KSk7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0ID0ge1xuICAgICAgZXhwaXJlczoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3RlZEV4cGlyZXNcbiAgICAgIH0sXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJbnB1dFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSBhc3luYyAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSk6IFByb21pc2U8Rmx1eEFjdGlvbj4gPT4ge1xuICAgICAgY29uc3QgdXNlcnMgPSAoZGF0YSBhcyBhbnkpPy51c2VycztcbiAgICAgIGNvbnN0IHNlc3Npb25EYXRhID0gbm9ybWFsaXplU2Vzc2lvbih1c2Vycz8uc2lnbkluIHx8IHt9KTtcbiAgICAgIGNvbnN0IHN0b3JlZFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBzZXNzaW9uRGF0YSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXNzaW9uOiBzdG9yZWRTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH0gYXMgRmx1eEFjdGlvbjtcbiAgICB9O1xuXG4gICAgY29uc3QgcGVyZm9ybVNpZ25JbiA9IGFzeW5jIChxdWVyeVZhcmlhYmxlczogYW55KTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvblJlc3VsdCA9IGF3YWl0IHB1YmxpY011dGF0aW9uPFNlc3Npb25UeXBlICYgVXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3NpZ25JbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsnZXhwaXJlcycsICdpc3N1ZWQnLCAndG9rZW4nLCAndXNlcklkJywgJ3VzZXJuYW1lJ10sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgICAgY29uc3QgYmFzZVNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihmbHV4LCBnZXRTZXNzaW9uUGF5bG9hZChzZXNzaW9uUmVzdWx0KSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGh5ZHJhdGVkU2Vzc2lvbiA9IGF3YWl0IHNlc3Npb24oWyd1c2VySWQnLCAncGVyc29uYUlkJywgJ3VzZXJBY2Nlc3MnLCAndXNlcm5hbWUnXSwgcmVxdWVzdE9wdGlvbnMpO1xuICAgICAgICBhd2FpdCBzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb24oZmx1eCwgU3RyaW5nKChoeWRyYXRlZFNlc3Npb24gYXMgYW55KT8ucGVyc29uYUlkIHx8ICcnKSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrU2Vzc2lvbiA9IGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIGJhc2VTZXNzaW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgc2Vzc2lvbjogZmFsbGJhY2tTZXNzaW9uLFxuICAgICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrU2Vzc2lvbjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmluYWxTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oXG4gICAgICAgIGZsdXgsXG4gICAgICAgIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBiYXNlU2Vzc2lvbikgfHwgYmFzZVNlc3Npb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICApO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHNlc3Npb246IGZpbmFsU2Vzc2lvbixcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmaW5hbFNlc3Npb247XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcGVyZm9ybVNpZ25JbihxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyhTdHJpbmcoKHVzZXIgYXMgYW55KT8udXNlcklkIHx8ICcnKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNpZ25PdXQgPSBhc3luYyAocmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjoge30sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fT1VUX1NVQ0NFU1N9KTtcbiAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICB0cnVlO1xuXG4gIGNvbnN0IHJlcXVlc3RQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIHJlcXVlc3Q6IHN0cmluZyB8IFBhc3N3b3JkUmVzZXRSZXF1ZXN0LFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgIGxldCBmb3Jnb3RQYXNzd29yZFN1Y2NlZWRlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHtpZGVudGlmaWVyLCB0eXBlfSA9IGdldFBhc3N3b3JkUmVzZXRJZGVudGlmaWVyKHJlcXVlc3QpO1xuICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHR5cGUgPT09ICdwaG9uZScgPyAncGhvbmUnIDogdHlwZSA9PT0gJ2VtYWlsJyA/ICdlbWFpbCcgOiAndXNlcm5hbWUnO1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgW2F0dHJpYnV0ZV06IGlkZW50aWZpZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LmZvcmdvdFBhc3N3b3JkO1xuICAgICAgZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQgPSBzdWNjZXNzO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBzdWNjZXNzID8gVVNFUl9DT05TVEFOVFMuRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MgOiBVU0VSX0NPTlNUQU5UUy5GT1JHT1RfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdmb3Jnb3RQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSk7XG5cbiAgICBpZighZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yZ290X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdvdFBhc3N3b3JkID0gYXN5bmMgKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KHVzZXJuYW1lLCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgY29uc3Qgc2VuZFZlcmlmaWNhdGlvbkVtYWlsID0gYXN5bmMgKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgZW1haWxPcHRpb25zOiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMgPSB7fSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIC4uLihlbWFpbE9wdGlvbnMuc3ViamVjdCA/IHt2ZXJpZmljYXRpb25FbWFpbFN1YmplY3Q6IGVtYWlsT3B0aW9ucy5zdWJqZWN0fSA6IHt9KSxcbiAgICAgICAgICAuLi4oZW1haWxPcHRpb25zLnRlbXBsYXRlID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGU6IGVtYWlsT3B0aW9ucy50ZW1wbGF0ZX0gOiB7fSksXG4gICAgICAgICAgLi4uKGVtYWlsT3B0aW9ucy50ZXh0ID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGV4dDogZW1haWxPcHRpb25zLnRleHR9IDoge30pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5zZW5kVmVyaWZpY2F0aW9uRW1haWw7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3N9XG4gICAgKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gISFkYXRhPy51c2Vycz8uc2VuZFZlcmlmaWNhdGlvbkVtYWlsO1xuICAgICAgaWYoIXN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZW5kX3ZlcmlmaWNhdGlvbl9lbWFpbF9mYWlsZWQnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFzc3dvcmQgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICBwYXNzd29yZDogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGNvZGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogY29kZVxuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIC4uLih0eXBlID09PSAnZW1haWwnID8ge2VtYWlsOiB1c2VybmFtZX0gOiB7cGhvbmU6IHVzZXJuYW1lfSksXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YT86IFVzZXJBcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5SRVNFVF9QQVNTV09SRF9TVUNDRVNTIDogVVNFUl9DT05TVEFOVFMuUkVTRVRfUEFTU1dPUkRfRVJST1JcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihmbHV4LCAncmVzZXRQYXNzd29yZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdLCB7b25TdWNjZXNzfSkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICBpZighc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2V0X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1c2VybmFtZSA9IFN0cmluZyhjb25maXJtYXRpb24uZW1haWwgfHwgY29uZmlybWF0aW9uLnBob25lIHx8IGNvbmZpcm1hdGlvbi51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRQYXNzd29yZFJlc2V0VHlwZShjb25maXJtYXRpb24pO1xuICAgIHJldHVybiByZXNldFBhc3N3b3JkKHVzZXJuYW1lLCBjb25maXJtYXRpb24ucGFzc3dvcmQsIGNvbmZpcm1hdGlvbi5jb2RlLCB0eXBlLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBhc3luYyAocGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+XG4gICAgdHJ1ZVxuICA7XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRVc2VyLFxuICAgIGNvbmZpcm1Db2RlLFxuICAgIGNvbmZpcm1TaWduVXAsXG4gICAgY29tcGxldGVQYXNzd29yZFJlc2V0LFxuICAgIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcixcbiAgICBkZWxldGVCaWxsaW5nQ2FyZCxcbiAgICBsaXN0LFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIGlzTG9nZ2VkSW4sXG4gICAgaXRlbUJ5SWQsXG4gICAgZ2V0VXNlckJ5QXR0cmlidXRlLFxuICAgIGxpc3RCeUNvbm5lY3Rpb24sXG4gICAgbGlzdEJ5TGF0ZXN0LFxuICAgIGxpc3RCeVJlYWN0aW9ucyxcbiAgICBsaXN0QnlUYWdzLFxuICAgIHJlZnJlc2hTZXNzaW9uOiByZWZyZXNoU2Vzc2lvbkFjdGlvbixcbiAgICByZW1vdmUsXG4gICAgcmVxdWVzdFBhc3N3b3JkUmVzZXQsXG4gICAgcmVzZXRQYXNzd29yZCxcbiAgICBzYXZlQmlsbGluZ0NhcmQsXG4gICAgc2VhcmNoLFxuICAgIHNlbmRWZXJpZmljYXRpb25FbWFpbCxcbiAgICBzZXNzaW9uLFxuICAgIHNpZ25JbixcbiAgICBzaWduT3V0LFxuICAgIHNpZ25VcCxcbiAgICB1cGRhdGVQYXNzd29yZCxcbiAgICB1cGRhdGVVc2VyLFxuICAgIHVwZGF0ZVBsYW4sXG4gICAgdXBkYXRlVXNlckFkYXB0ZXI6IHVzZXJCYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlVXNlckFkYXB0ZXJPcHRpb25zOiB1c2VyQmFzZS51cGRhdGVPcHRpb25zXG4gIH07XG59O1xuIl0sIm5hbWVzIjpbInZhbGlkYXRlVXNlcklucHV0IiwiVVNFUl9DT05TVEFOVFMiLCJhcHBNdXRhdGlvbiIsImFwcFF1ZXJ5IiwicHVibGljTXV0YXRpb24iLCJwdWJsaWNRdWVyeSIsInJlZnJlc2hTZXNzaW9uIiwiY3JlYXRlQmFzZUFjdGlvbnMiLCJjbGVhclBlcnNpc3RlZFNlc3Npb24iLCJoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlIiwiaXNMb2dnZWRJbiIsImlzTG9nZ2VkSW5XaXRoU3RvcmFnZSIsIm5vcm1hbGl6ZVNlc3Npb24iLCJzdG9yZVNlc3Npb24iLCJnZXRDb25maWdGcm9tRmx1eCIsImNsZWFyQ2FjaGVkUmVxdWVzdCIsImdldENhY2hlZFJlcXVlc3QiLCJzZXRDYWNoZWRSZXF1ZXN0Iiwic3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uIiwiREFUQV9UWVBFIiwiREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyIsIlNFTlNJVElWRV9VU0VSX0ZJRUxEUyIsIlNldCIsIklOVkFMSURfRklFTERfUkVHRVgiLCJoYXNTZXNzaW9uSWRlbnRpdHkiLCJ1c2VyIiwiX2lkIiwidXNlcklkIiwidXNlcm5hbWUiLCJlbWFpbCIsInNhbml0aXplVXBkYXRlVXNlcklucHV0IiwidXNlcklucHV0IiwiY3VycmVudFNlc3Npb24iLCJuZXh0VXNlciIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJmaWVsZCIsInZhbHVlIiwidW5kZWZpbmVkIiwicGFzc3dvcmQiLCJTdHJpbmciLCJ0cmltIiwiY3VycmVudFZhbHVlIiwic3luY1N0b3JlZFNlc3Npb24iLCJmbHV4Iiwic2Vzc2lvblBhdGNoIiwiZ2V0U3RhdGUiLCJnZXRTZXNzaW9uUGF5bG9hZCIsInBheWxvYWQiLCJzZXNzaW9uIiwiZ2V0RmllbGRSb290IiwidHJpbW1lZCIsIm1hdGNoIiwic2FuaXRpemVVc2VyUHJvcHMiLCJwcm9wcyIsImZhbGxiYWNrUHJvcHMiLCJzZWVuIiwic2FuaXRpemVkIiwibGlzdCIsInJvb3QiLCJoYXMiLCJhZGQiLCJwdXNoIiwibGVuZ3RoIiwiZ2V0SW52YWxpZEZpZWxkcyIsImVycm9yIiwiZXJyb3JzIiwic291cmNlIiwiaW52YWxpZEZpZWxkcyIsImZvckVhY2giLCJpdGVtIiwibWVzc2FnZSIsImV4ZWMiLCJsYXN0SW5kZXgiLCJnZXRQYXNzd29yZFJlc2V0SWRlbnRpZmllciIsInJlcXVlc3QiLCJpZGVudGlmaWVyIiwicGhvbmUiLCJ0eXBlIiwiaW5jbHVkZXMiLCJnZXRQYXNzd29yZFJlc2V0VHlwZSIsImNvbmZpcm1hdGlvbiIsIndpdGhJbnZhbGlkRmllbGRSZXRyeSIsInJlcXVlc3RXaXRoUHJvcHMiLCJzYWZlUHJvcHMiLCJzaXplIiwicmV0cnlQcm9wcyIsImZpbHRlciIsImRlZmF1bHRVc2VyVmFsaWRhdG9yIiwiaW5wdXQiLCJvcHRpb25zIiwidmFsaWRhdGVkIiwic3RyaWN0IiwiRXJyb3IiLCJjcmVhdGVVc2VyQWN0aW9ucyIsInVzZXJCYXNlIiwiYWRhcHRlciIsInVzZXJBZGFwdGVyIiwiYWRhcHRlck9wdGlvbnMiLCJ1c2VyQWRhcHRlck9wdGlvbnMiLCJjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzIiwiYWRkVXNlciIsInVzZXJQcm9wcyIsInJlcXVlc3RPcHRpb25zIiwicXVlcnlWYXJpYWJsZXMiLCJvblN1Y2Nlc3MiLCJkYXRhIiwidXNlcnMiLCJkaXNwYXRjaCIsIkFERF9JVEVNX1NVQ0NFU1MiLCJyZXR1cm5Qcm9wcyIsInNpZ25VcCIsImV4cGlyZXMiLCJTSUdOX1VQX1NVQ0NFU1MiLCJTSUdOX1VQX0VSUk9SIiwidXBkYXRlVXNlciIsInVwZGF0ZUlucHV0IiwiYmlydGhkYXRlIiwiZG9iIiwiZmlyc3ROYW1lIiwiZ2VuZGVyIiwibGFzdE5hbWUiLCJtYWlsaW5nTGlzdCIsIlVQREFURV9JVEVNX1NVQ0NFU1MiLCJjb25maXJtQ29kZSIsImNvZGUiLCJjb25maXJtZWQiLCJDT05GSVJNX1NJR05fVVBfU1VDQ0VTUyIsInJlbW92ZSIsIlJFTU9WRV9JVEVNX1NVQ0NFU1MiLCJzZXNzaW9uUHJvcHMiLCJzZXNzaW9uRGF0YSIsImdldFVzZXJCeVNlc3Npb24iLCJHRVRfU0VTU0lPTl9FUlJPUiIsIm5leHRTZXNzaW9uIiwiR0VUX1NFU1NJT05fU1VDQ0VTUyIsInBlcnNvbmFJZCIsIml0ZW1CeUlkIiwiY2FjaGVkUmVzdWx0IiwiZ2V0VXNlckJ5SWQiLCJHRVRfSVRFTV9TVUNDRVNTIiwicmVzdWx0Iiwic2FmZVVzZXJQcm9wcyIsImdldFVzZXJCeUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsIm5vcm1hbGl6ZWRBdHRyaWJ1dGUiLCJub3JtYWxpemVkVmFsdWUiLCJtYXRjaGluZ1VzZXIiLCJzYXZlQmlsbGluZ0NhcmQiLCJjYXJkIiwic2Vzc2lvblVzZXJJZCIsImRlbGV0ZUJpbGxpbmdDYXJkIiwidXBkYXRlUGxhbiIsInBsYW5JZCIsIm5leHRQbGFuSWQiLCJnZXRVc2VyTGlzdCIsIkdFVF9MSVNUX1NVQ0NFU1MiLCJsaXN0QnlMYXRlc3QiLCJmcm9tIiwidG8iLCJsaXN0QnlDb25uZWN0aW9uIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lcyIsInBlcnNvbmFQcm9wcyIsImxpc3RCeVRhZ3MiLCJ0YWdOYW1lcyIsInRhZ3MiLCJzZWFyY2giLCJxdWVyeSIsImN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciIsInJlZnJlc2hTZXNzaW9uQWN0aW9uIiwidG9rZW4iLCJzaWduSW4iLCJjb25maWciLCJyZXF1ZXN0ZWRFeHBpcmVzIiwiTWF0aCIsIm1heCIsIk51bWJlciIsImFwcCIsIm1heE1pbnV0ZXMiLCJxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQiLCJzdG9yZWRTZXNzaW9uIiwiU0lHTl9JTl9TVUNDRVNTIiwicGVyZm9ybVNpZ25JbiIsInNlc3Npb25SZXN1bHQiLCJiYXNlU2Vzc2lvbiIsImh5ZHJhdGVkU2Vzc2lvbiIsImZhbGxiYWNrU2Vzc2lvbiIsImZpbmFsU2Vzc2lvbiIsIlNJR05fSU5fRVJST1IiLCJzaWduT3V0IiwiU0lHTl9PVVRfU1VDQ0VTUyIsImNvbmZpcm1TaWduVXAiLCJyZXF1ZXN0UGFzc3dvcmRSZXNldCIsImZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkIiwic3VjY2VzcyIsImZvcmdvdFBhc3N3b3JkIiwiRk9SR09UX1BBU1NXT1JEX1NVQ0NFU1MiLCJGT1JHT1RfUEFTU1dPUkRfRVJST1IiLCJzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJlbWFpbE9wdGlvbnMiLCJzdWJqZWN0IiwidmVyaWZpY2F0aW9uRW1haWxTdWJqZWN0IiwidGVtcGxhdGUiLCJ2ZXJpZmljYXRpb25FbWFpbFRlbXBsYXRlIiwidGV4dCIsInZlcmlmaWNhdGlvbkVtYWlsVGV4dCIsIkNPTkZJUk1fU0lHTl9VUF9FUlJPUiIsInRoZW4iLCJyZXNldFBhc3N3b3JkIiwiUkVTRVRfUEFTU1dPUkRfU1VDQ0VTUyIsIlJFU0VUX1BBU1NXT1JEX0VSUk9SIiwiY29tcGxldGVQYXNzd29yZFJlc2V0IiwidXBkYXRlUGFzc3dvcmQiLCJuZXdQYXNzd29yZCIsInVwZGF0ZVVzZXJBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGlCQUFpQixRQUFPLDRDQUE0QztBQUM1RSxTQUFRQyxjQUFjLFFBQU8sNEJBQTRCO0FBQ3pELFNBQVFDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxRQUFPLHFCQUFxQjtBQUN0RyxTQUFRQyxpQkFBaUIsUUFBTyxtQ0FBbUM7QUFDbkUsU0FDRUMscUJBQXFCLEVBQ3JCQyx5QkFBeUIsRUFDekJD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
|
|
977
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy91c2VyQWN0aW9ucy91c2VyQWN0aW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt2YWxpZGF0ZVVzZXJJbnB1dH0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHtVU0VSX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3VzZXJTdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeSwgcHVibGljTXV0YXRpb24sIHB1YmxpY1F1ZXJ5LCByZWZyZXNoU2Vzc2lvbn0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7Y3JlYXRlQmFzZUFjdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VBY3Rpb25GYWN0b3J5LmpzJztcbmltcG9ydCB7Z2V0Q29uZmlnRnJvbUZsdXh9IGZyb20gJy4uLy4uL3V0aWxzL2NvbmZpZ1V0aWxzLmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgY2xlYXJQZXJzaXN0ZWRTZXNzaW9uLFxuICBoeWRyYXRlU2Vzc2lvbkZyb21TdG9yYWdlLFxuICBpc0xvZ2dlZEluIGFzIGlzTG9nZ2VkSW5XaXRoU3RvcmFnZSxcbiAgbm9ybWFsaXplU2Vzc2lvbixcbiAgc3RvcmVTZXNzaW9uXG59IGZyb20gJy4uLy4uL3V0aWxzL3Nlc3Npb24uanMnO1xuaW1wb3J0IHtzeW5jUGVyc29uYVRhZ3NUb1Nlc3Npb259IGZyb20gJy4uL3BlcnNvbmFBY3Rpb25zL3BlcnNvbmFBY3Rpb25zLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhBY3Rpb24sIEZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7VXNlcn0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdXNlckFkYXB0ZXIvdXNlckFkYXB0ZXIuanMnO1xuaW1wb3J0IHR5cGUge0FwaVJlc3VsdHNUeXBlLCBTZXNzaW9uVHlwZX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB0eXBlIHtBY3Rpb25SZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdENhY2hlLmpzJztcbmltcG9ydCB0eXBlIHtCYXNlQWRhcHRlck9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvckZhY3RvcnkuanMnO1xuXG5jb25zdCBEQVRBX1RZUEUgPSAndXNlcnMnO1xuY29uc3QgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEUyA9IFsndXNlcklkJywgJ3VzZXJuYW1lJ107XG5jb25zdCBTRU5TSVRJVkVfVVNFUl9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgJ3Bhc3N3b3JkJyxcbiAgJ3NhbHQnLFxuICAndG9rZW4nLFxuICAncmVmcmVzaFRva2VuJyxcbiAgJ3ZlcmlmaWVkRW1haWxDb2RlJyxcbiAgJ3ZlcmlmaWVkU21zQ29kZSdcbl0pO1xuY29uc3QgSU5WQUxJRF9GSUVMRF9SRUdFWCA9IC9DYW5ub3QgcXVlcnkgZmllbGQgXCIoW15cIl0rKVwiL2c7XG5jb25zdCBoYXNTZXNzaW9uSWRlbnRpdHkgPSAodXNlcj86IFBhcnRpYWw8VXNlcj4gfCBudWxsKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHNlc3Npb25Vc2VyID0gdXNlciBhcyAoUGFydGlhbDxVc2VyPiAmIHtyZWFkb25seSBfaWQ/OiBzdHJpbmd9KSB8IG51bGwgfCB1bmRlZmluZWQ7XG4gIHJldHVybiBCb29sZWFuKHNlc3Npb25Vc2VyICYmIChcbiAgICBSZWZsZWN0LmdldChzZXNzaW9uVXNlciwgJ19pZCcpIHx8IHNlc3Npb25Vc2VyLnVzZXJJZCB8fCBzZXNzaW9uVXNlci51c2VybmFtZSB8fCBzZXNzaW9uVXNlci5lbWFpbFxuICApKTtcbn07XG5cbmNvbnN0IHNhbml0aXplVXBkYXRlVXNlcklucHV0ID0gKFxuICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4gPSB7fSxcbiAgY3VycmVudFNlc3Npb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge31cbik6IFBhcnRpYWw8VXNlcj4gPT4ge1xuICBjb25zdCBuZXh0VXNlciA9IE9iamVjdC5lbnRyaWVzKHVzZXJJbnB1dCkucmVkdWNlKCh1c2VyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgW2ZpZWxkLCB2YWx1ZV0pID0+IHtcbiAgICBpZih2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZihmaWVsZCA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgY29uc3QgcGFzc3dvcmQgPSBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKTtcblxuICAgICAgaWYocGFzc3dvcmQpIHtcbiAgICAgICAgdXNlci5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBpZihmaWVsZCA9PT0gJ3VzZXJJZCcpIHtcbiAgICAgIHVzZXIudXNlcklkID0gdmFsdWU7XG4gICAgICByZXR1cm4gdXNlcjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBjdXJyZW50U2Vzc2lvbltmaWVsZF07XG5cbiAgICBpZihTdHJpbmcodmFsdWUpICE9PSBTdHJpbmcoY3VycmVudFZhbHVlID8/ICcnKSkge1xuICAgICAgdXNlcltmaWVsZF0gPSB2YWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXNlcjtcbiAgfSwge30pO1xuXG4gIHJldHVybiBuZXh0VXNlciBhcyBQYXJ0aWFsPFVzZXI+O1xufTtcblxuY29uc3Qgc3luY1N0b3JlZFNlc3Npb24gPSBhc3luYyAoXG4gIGZsdXg6IEZsdXhGcmFtZXdvcmssXG4gIHNlc3Npb25QYXRjaDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCB7fSkgfHwge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4gc3RvcmVTZXNzaW9uKGZsdXgsIHsuLi5jdXJyZW50U2Vzc2lvbiwgLi4uc2Vzc2lvblBhdGNofSk7XG59O1xuXG5jb25zdCBnZXRTZXNzaW9uUGF5bG9hZCA9IChwYXlsb2FkOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBpZihwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkID09PSAnb2JqZWN0JyAmJiAnc2Vzc2lvbicgaW4gKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgcmV0dXJuICgoKHBheWxvYWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnNlc3Npb24pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJldHVybiAocGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZCA9PT0gJ29iamVjdCcgPyBwYXlsb2FkIDoge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuY29uc3QgZ2V0RmllbGRSb290ID0gKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0cmltbWVkID0gZmllbGQudHJpbSgpO1xuICBjb25zdCBtYXRjaCA9IHRyaW1tZWQubWF0Y2goL15bQS1aYS16X11bQS1aYS16MC05X10qLyk7XG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG59O1xuXG5jb25zdCBzYW5pdGl6ZVVzZXJQcm9wcyA9IChwcm9wczogc3RyaW5nW10gPSBbXSwgZmFsbGJhY2tQcm9wczogc3RyaW5nW10gPSBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNhbml0aXplZCA9IHByb3BzLnJlZHVjZSgobGlzdDogc3RyaW5nW10sIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0RmllbGRSb290KGZpZWxkKTtcblxuICAgIGlmKCFyb290IHx8IFNFTlNJVElWRV9VU0VSX0ZJRUxEUy5oYXMocm9vdCkgfHwgc2Vlbi5oYXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgbGlzdC5wdXNoKGZpZWxkKTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xuXG4gIGlmKHNhbml0aXplZC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHNhbml0aXplZDtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja1Byb3BzLnJlZHVjZSgobGlzdDogc3RyaW5nW10sIGZpZWxkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCByb290ID0gZ2V0RmllbGRSb290KGZpZWxkKTtcblxuICAgIGlmKCFyb290IHx8IFNFTlNJVElWRV9VU0VSX0ZJRUxEUy5oYXMocm9vdCkgfHwgc2Vlbi5oYXMoZmllbGQpKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBzZWVuLmFkZChmaWVsZCk7XG4gICAgbGlzdC5wdXNoKGZpZWxkKTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSwgW10pO1xufTtcblxuY29uc3QgZ2V0SW52YWxpZEZpZWxkcyA9IChlcnJvcjogdW5rbm93bik6IFNldDxzdHJpbmc+ID0+IHtcbiAgY29uc3QgZXJyb3JzID0gKGVycm9yIGFzIGFueSk/LmVycm9ycyB8fCAoZXJyb3IgYXMgYW55KT8uc291cmNlPy5lcnJvcnMgfHwgW107XG4gIGNvbnN0IGludmFsaWRGaWVsZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBlcnJvcnMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyA/IGl0ZW0gOiBpdGVtPy5tZXNzYWdlIHx8ICcnO1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IElOVkFMSURfRklFTERfUkVHRVguZXhlYyhtZXNzYWdlKTtcblxuICAgIHdoaWxlKG1hdGNoKSB7XG4gICAgICBpbnZhbGlkRmllbGRzLmFkZChtYXRjaFsxXSk7XG4gICAgICBtYXRjaCA9IElOVkFMSURfRklFTERfUkVHRVguZXhlYyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBJTlZBTElEX0ZJRUxEX1JFR0VYLmxhc3RJbmRleCA9IDA7XG4gIH0pO1xuXG4gIHJldHVybiBpbnZhbGlkRmllbGRzO1xufTtcblxuY29uc3QgZ2V0UGFzc3dvcmRSZXNldElkZW50aWZpZXIgPSAocmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QpOiB7XG4gIHJlYWRvbmx5IGlkZW50aWZpZXI6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScgfCAndXNlcm5hbWUnO1xufSA9PiB7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSB0eXBlb2YgcmVxdWVzdCA9PT0gJ3N0cmluZydcbiAgICA/IFN0cmluZyhyZXF1ZXN0IHx8ICcnKS50cmltKClcbiAgICA6IFN0cmluZyhyZXF1ZXN0LmVtYWlsIHx8IHJlcXVlc3QucGhvbmUgfHwgcmVxdWVzdC51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuXG4gIGxldCB0eXBlOiAnZW1haWwnIHwgJ3Bob25lJyB8ICd1c2VybmFtZScgPSBpZGVudGlmaWVyLmluY2x1ZGVzKCdAJykgPyAnZW1haWwnIDogJ3VzZXJuYW1lJztcblxuICBpZih0eXBlb2YgcmVxdWVzdCAhPT0gJ3N0cmluZycgJiYgcmVxdWVzdC5waG9uZSkge1xuICAgIHR5cGUgPSAncGhvbmUnO1xuICB9XG5cbiAgcmV0dXJuIHtpZGVudGlmaWVyLCB0eXBlfTtcbn07XG5cbmNvbnN0IGdldFBhc3N3b3JkUmVzZXRUeXBlID0gKGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbik6ICdlbWFpbCcgfCAncGhvbmUnID0+XG4gIGNvbmZpcm1hdGlvbi50eXBlIHx8IChjb25maXJtYXRpb24ucGhvbmUgPyAncGhvbmUnIDogJ2VtYWlsJyk7XG5cbmNvbnN0IHdpdGhJbnZhbGlkRmllbGRSZXRyeSA9IGFzeW5jIDxUPihcbiAgcmVxdWVzdFdpdGhQcm9wczogKHByb3BzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxUPixcbiAgcHJvcHM6IHN0cmluZ1tdLFxuICBmYWxsYmFja1Byb3BzOiBzdHJpbmdbXSA9IERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbik6IFByb21pc2U8VD4gPT4ge1xuICBjb25zdCBzYWZlUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhwcm9wcywgZmFsbGJhY2tQcm9wcyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdFdpdGhQcm9wcyhzYWZlUHJvcHMpO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc3QgaW52YWxpZEZpZWxkcyA9IGdldEludmFsaWRGaWVsZHMoZXJyb3IpO1xuXG4gICAgaWYoaW52YWxpZEZpZWxkcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCByZXRyeVByb3BzID0gc2FmZVByb3BzLmZpbHRlcigoZmllbGQpID0+ICFpbnZhbGlkRmllbGRzLmhhcyhnZXRGaWVsZFJvb3QoZmllbGQpKSk7XG5cbiAgICBpZihyZXRyeVByb3BzLmxlbmd0aCA9PT0gMCB8fCByZXRyeVByb3BzLmxlbmd0aCA9PT0gc2FmZVByb3BzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3RXaXRoUHJvcHMocmV0cnlQcm9wcyk7XG4gIH1cbn07XG5cbmV4cG9ydCB0eXBlIFVzZXJBZGFwdGVyT3B0aW9ucyA9IEJhc2VBZGFwdGVyT3B0aW9ucztcblxuZXhwb3J0IGludGVyZmFjZSBVc2VyQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSB1c2VyQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICByZWFkb25seSB1c2VyQWRhcHRlck9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZpY2F0aW9uRW1haWxPcHRpb25zIHtcbiAgcmVhZG9ubHkgc3ViamVjdD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRSZXNldFJlcXVlc3Qge1xuICByZWFkb25seSBlbWFpbD86IHN0cmluZztcbiAgcmVhZG9ubHkgcGhvbmU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVzZXJuYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkUmVzZXRDb25maXJtYXRpb24gZXh0ZW5kcyBQYXNzd29yZFJlc2V0UmVxdWVzdCB7XG4gIHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZztcbiAgcmVhZG9ubHkgdHlwZT86ICdlbWFpbCcgfCAncGhvbmUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBcGlSZXN1bHRzVHlwZSB7XG4gIHJlYWRvbmx5IHVzZXJzOiB7XG4gICAgcmVhZG9ubHkgYWN0aXZlQ291bnQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgYWRkVXNlcj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY29uZmlybUNvZGU/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGNvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbj86IHN0cmluZztcbiAgICByZWFkb25seSBkZWFjdGl2YXRlPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBmb3Jnb3RQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaXRlbUJ5SWQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGdldFVzZXJCeUF0dHJpYnV0ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZ2V0VXNlckJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5U2Vzc2lvbj86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgaXRlbUJ5VG9rZW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IGl0ZW1CeVVzZXJuYW1lPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBnZXRVc2VyTGlzdD86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeUNvbm5lY3Rpb24/OiBVc2VyW107XG4gICAgcmVhZG9ubHkgbGlzdEJ5TGF0ZXN0PzogVXNlcltdO1xuICAgIHJlYWRvbmx5IGxpc3RCeVJlYWN0aW9ucz86IFVzZXJbXTtcbiAgICByZWFkb25seSBsaXN0QnlUYWdzPzogVXNlcltdO1xuICAgIHJlYWRvbmx5IHNlYXJjaD86IFVzZXJbXTtcbiAgICByZWFkb25seSByZWZyZXNoU2Vzc2lvbj86IFNlc3Npb25UeXBlO1xuICAgIHJlYWRvbmx5IHJlbW92ZT86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgcmVzZXRQYXNzd29yZD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc2VuZFZlcmlmaWNhdGlvbkVtYWlsPzogYm9vbGVhbjtcbiAgICByZWFkb25seSBzZXNzaW9uPzogUGFydGlhbDxVc2VyPjtcbiAgICByZWFkb25seSBzaWduSW4/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHNpZ25VcD86IFBhcnRpYWw8VXNlcj47XG4gICAgcmVhZG9ubHkgZGVsZXRlQmlsbGluZ0NhcmQ/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVVzZXI/OiBQYXJ0aWFsPFVzZXI+O1xuICAgIHJlYWRvbmx5IHVwZGF0ZVBhc3N3b3JkPzogUGFydGlhbDxib29sZWFuPjtcbiAgICByZWFkb25seSB1cGRhdGVQbGFuPzogUGFydGlhbDxVc2VyPjtcbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdFVzZXJWYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkID0gdmFsaWRhdGVVc2VySW5wdXQoaW5wdXQpO1xuXG4gIGlmKG9wdGlvbnM/LnN0cmljdCAmJiAhdmFsaWRhdGVkLnVzZXJuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVc2VybmFtZSBpcyByZXF1aXJlZCBpbiBzdHJpY3QgbW9kZScpO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjdGlvbnMge1xuICBhZGRVc2VyOiAodXNlcklucHV0OiBQYXJ0aWFsPFVzZXI+LCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY29uZmlybUNvZGU6IChjb2RlOiBudW1iZXIsIHt0eXBlLCB2YWx1ZX06IHt0eXBlOiAnZW1haWwnIHwgJ3Bob25lJzsgdmFsdWU6IHN0cmluZ30sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbmZpcm1TaWduVXA6IChjb2RlOiBzdHJpbmcsIHR5cGU6ICdlbWFpbCcgfCAncGhvbmUnLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBjb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb246IChcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICB1c2VyUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyPjtcbiAgY3JlYXRlQmlsbGluZ1NldHVwU2Vzc2lvbjogKHJldHVyblVybDogc3RyaW5nLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPHN0cmluZz47XG4gIGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlcjogKHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcj47XG4gIGxpc3Q6ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlDb25uZWN0aW9uOiAoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICB1c2VyUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBpdGVtQnlJZDogKHVzZXJJZDogc3RyaW5nLCB1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgZ2V0VXNlckJ5QXR0cmlidXRlOiAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXI+O1xuICBkZWxldGVCaWxsaW5nQ2FyZDogKHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICBsaXN0QnlMYXRlc3Q6IChcbiAgICB1c2VybmFtZT86IHN0cmluZyxcbiAgICBmcm9tPzogbnVtYmVyLFxuICAgIHRvPzogbnVtYmVyLFxuICAgIHVzZXJQcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFVzZXJbXT47XG4gIGxpc3RCeVJlYWN0aW9uczogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcmVhY3Rpb25OYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBsaXN0QnlUYWdzOiAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbT86IG51bWJlcixcbiAgICB0bz86IG51bWJlcixcbiAgICBwZXJzb25hUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxVc2VyW10+O1xuICBmb3Jnb3RQYXNzd29yZDogKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHJlcXVlc3RQYXNzd29yZFJlc2V0OiAoXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGlzTG9nZ2VkSW46ICgpID0+IGJvb2xlYW47XG4gIHJlZnJlc2hTZXNzaW9uOiAodG9rZW4/OiBzdHJpbmcsIGV4cGlyZXM/OiBudW1iZXIsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8U2Vzc2lvblR5cGU+O1xuICByZW1vdmU6ICh1c2VySWQ6IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgcmVzZXRQYXNzd29yZDogKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIGNvbXBsZXRlUGFzc3dvcmRSZXNldDogKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgc2VhcmNoOiAocXVlcnk6IHN0cmluZywgdXNlclByb3BzPzogc3RyaW5nW10sIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8VXNlcltdPjtcbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsOiAoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbE9wdGlvbnM/OiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHNlc3Npb246ICh1c2VyUHJvcHM/OiBzdHJpbmdbXSwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxVc2VyPjtcbiAgc2lnbkluOiAodXNlcjogUGFydGlhbDxVc2VyPiwgZXhwaXJlcz86IG51bWJlciwgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTxTZXNzaW9uVHlwZT47XG4gIHNpZ25PdXQ6IChyZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPGJvb2xlYW4+O1xuICBzaWduVXA6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQYXNzd29yZDogKHBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnMpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIHVwZGF0ZVVzZXI6ICh1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVQbGFuOiAocGxhbklkOiBzdHJpbmcsIHVzZXJQcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFVzZXI+O1xuICB1cGRhdGVVc2VyQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IFVzZXJBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVVc2VyQWRhcHRlck9wdGlvbnM6IChvcHRpb25zOiBVc2VyQWRhcHRlck9wdGlvbnMpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVVc2VyQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFVzZXJBY3Rpb25zT3B0aW9uc1xuKTogVXNlckFjdGlvbnMgPT4ge1xuICBjb25zdCB1c2VyQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRVc2VyVmFsaWRhdG9yLCB7XG4gICAgYWRhcHRlcjogb3B0aW9ucz8udXNlckFkYXB0ZXIsXG4gICAgYWRhcHRlck9wdGlvbnM6IG9wdGlvbnM/LnVzZXJBZGFwdGVyT3B0aW9uc1xuICB9KTtcbiAgY29uc3QgY2xlYXJVc2VyUmVxdWVzdENhY2hlcyA9IGFzeW5jICh1c2VySWQgPSAnJyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0Jyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLmxpc3RCeUxhdGVzdCcpO1xuICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndXNlci5saXN0QnlUYWdzJyk7XG4gICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd1c2VyLnNlYXJjaCcpO1xuICAgIGlmKHVzZXJJZCkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsIGB1c2VyLml0ZW1CeUlkOiR7dXNlcklkfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBhZGRVc2VyID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LmFkZFVzZXIgfHwge307XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkFERF9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKHVzZXJQcm9wcywgW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdhZGRyZXNzJyxcbiAgICAgICdkb2InLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhdGl0dWRlJyxcbiAgICAgICdsb25naXR1ZGUnLFxuICAgICAgJ21haWxpbmdMaXN0JyxcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RhdGUnLFxuICAgICAgJ3RodW1iVXJsJyxcbiAgICAgICd1c2VyQWNjZXNzJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJ1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnYWRkVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzLCAuLi5yZXF1ZXN0T3B0aW9uc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnblVwID0gYXN5bmMgKFxuICAgIHVzZXJJbnB1dDogUGFydGlhbDxVc2VyPixcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBlbWFpbCwgcGFzc3dvcmR9ID0gdXNlcklucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgZXhwaXJlczoge1xuICAgICAgICB0eXBlOiAnSW50JyxcbiAgICAgICAgdmFsdWU6IDE1XG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgdXNlcm5hbWVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVXNlckFwaVJlc3VsdHNUeXBlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gZGF0YT8udXNlcnM/LnNpZ25VcCB8fCB7fTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9TVUNDRVNTLFxuICAgICAgICB1c2VyXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0dXJuUHJvcHMgPSBzYW5pdGl6ZVVzZXJQcm9wcyhbXG4gICAgICAnYWRkZWQnLFxuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnc2lnblVwJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICAgKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9VUF9FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlVXNlciA9IGFzeW5jIChcbiAgICB1c2VySW5wdXQ6IFBhcnRpYWw8VXNlcj4sXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHVwZGF0ZUlucHV0ID0gc2FuaXRpemVVcGRhdGVVc2VySW5wdXQodXNlcklucHV0LCAoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uJywge30pIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgY29uc3Qge1xuICAgICAgYmlydGhkYXRlLFxuICAgICAgZG9iLFxuICAgICAgZW1haWwsXG4gICAgICBmaXJzdE5hbWUsXG4gICAgICBnZW5kZXIsXG4gICAgICBsYXN0TmFtZSxcbiAgICAgIG1haWxpbmdMaXN0LFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBwaG9uZSxcbiAgICAgIHVzZXJJZCxcbiAgICAgIHVzZXJuYW1lXG4gICAgfSA9IHVwZGF0ZUlucHV0O1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcjoge1xuICAgICAgICB0eXBlOiAnVXNlcklucHV0IScsXG4gICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgYmlydGhkYXRlOiBiaXJ0aGRhdGUgPz8gZG9iLFxuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgICBnZW5kZXIsXG4gICAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgICAgbWFpbGluZ0xpc3QsXG4gICAgICAgICAgcGFzc3dvcmQsXG4gICAgICAgICAgcGhvbmUsXG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHVzZXJzID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2VycztcbiAgICAgIGNvbnN0IHVzZXIgPSB1c2Vycz8udXBkYXRlVXNlciB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ2FkZGVkJyxcbiAgICAgICdiaXJ0aGRhdGUnLFxuICAgICAgJ2NpdHknLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ2VtYWlsJyxcbiAgICAgICdmaXJzdE5hbWUnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaW1hZ2VDb3VudCcsXG4gICAgICAnaW1hZ2VVcmwnLFxuICAgICAgJ2xhc3ROYW1lJyxcbiAgICAgICdsYXRpdHVkZScsXG4gICAgICAnbG9uZ2l0dWRlJyxcbiAgICAgICdtYWlsaW5nTGlzdCcsXG4gICAgICAnbW9kaWZpZWQnLFxuICAgICAgJ3Bob25lJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAndGh1bWJVcmwnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAndXBkYXRlVXNlcicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIHJldHVyblByb3BzLFxuICAgICAgICB7b25TdWNjZXNzLCAuLi5yZXF1ZXN0T3B0aW9uc31cbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoU3RyaW5nKHVzZXJJZCB8fCAnJykpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBjb25maXJtQ29kZSA9IGFzeW5jIChcbiAgICBjb2RlOiBudW1iZXIsXG4gICAge3R5cGUsIHZhbHVlfToge3R5cGU6ICdlbWFpbCcgfCAncGhvbmUnOyB2YWx1ZTogc3RyaW5nfSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBjb2RlOiB7XG4gICAgICAgIHR5cGU6ICdJbnQhJyxcbiAgICAgICAgdmFsdWU6IGNvZGVcbiAgICAgIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IHR5cGVcbiAgICAgIH0sXG4gICAgICB2YWx1ZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgIHZhbHVlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KGZsdXgsICdjb25maXJtQ29kZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIFtdKTtcbiAgICBjb25zdCBjb25maXJtZWQgPSAhIWRhdGE/LnVzZXJzPy5jb25maXJtQ29kZTtcblxuICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2NvbmZpcm1lZCwgdHlwZTogVVNFUl9DT05TVEFOVFMuQ09ORklSTV9TSUdOX1VQX1NVQ0NFU1N9KTtcblxuICAgIHJldHVybiBjb25maXJtZWQ7XG4gIH07XG5cbiAgY29uc3QgcmVtb3ZlID0gYXN5bmMgKHVzZXJJZDogc3RyaW5nLCByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8VXNlcj4gPT4ge1xuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgdXNlcklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogdXNlcklkXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB1c2VyID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ucmVtb3ZlIHx8IHt9O1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLlJFTU9WRV9JVEVNX1NVQ0NFU1MsIHVzZXJ9KTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihmbHV4LCAncmVtb3ZlJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgW10sIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXModXNlcklkKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jIChcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgX3JlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcj4gPT4gd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgIGFzeW5jIChzZXNzaW9uUHJvcHMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBhcHBRdWVyeShcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFVzZXJCeVNlc3Npb24nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHt9LFxuICAgICAgICBzZXNzaW9uUHJvcHNcbiAgICAgICkgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeVNlc3Npb24/OiBQYXJ0aWFsPFVzZXI+fTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IGRhdGE/LnVzZXJzPy5nZXRVc2VyQnlTZXNzaW9uIHx8IHt9O1xuXG4gICAgICBpZighaGFzU2Vzc2lvbklkZW50aXR5KHNlc3Npb25EYXRhKSkge1xuICAgICAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe3R5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX0VSUk9SfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZF9zZXNzaW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjogbmV4dFNlc3Npb24sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9TRVNTSU9OX1NVQ0NFU1N9KTtcbiAgICAgIGF3YWl0IHN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbihmbHV4LCBTdHJpbmcoKG5leHRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgcmV0dXJuIGF3YWl0IHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIChmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24nLCBuZXh0U2Vzc2lvbikgfHwgbmV4dFNlc3Npb24pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSBhcyBVc2VyO1xuICAgIH0sXG4gICAgdXNlclByb3BzLFxuICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgKTtcblxuICBjb25zdCBpdGVtQnlJZCA9IGFzeW5jIChcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICB1c2VyUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gZ2V0Q2FjaGVkUmVxdWVzdDxVc2VyPihmbHV4LCBgdXNlci5pdGVtQnlJZDoke3VzZXJJZH1gLCB7dXNlcklkLCB1c2VyUHJvcHN9LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXJJZDoge1xuICAgICAgICB0eXBlOiAnSUQhJyxcbiAgICAgICAgdmFsdWU6IHVzZXJJZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgZ2V0VXNlckJ5SWQgPSAoKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUgJiB7XG4gICAgICAgIHVzZXJzPzoge2dldFVzZXJCeUlkPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUlkKSB8fCB7fTtcblxuICAgICAgaWYodXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0VXNlckJ5SWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcjogZ2V0VXNlckJ5SWR9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdnZXRVc2VyQnlJZCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oZmx1eCwgYHVzZXIuaXRlbUJ5SWQ6JHt1c2VySWR9YCwge3VzZXJJZCwgdXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXIsIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBnZXRVc2VyQnlBdHRyaWJ1dGUgPSBhc3luYyAoXG4gICAgYXR0cmlidXRlOiAnZW1haWwnIHwgJ3VzZXJuYW1lJyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkQXR0cmlidXRlID0gU3RyaW5nKGF0dHJpYnV0ZSB8fCAnJykudHJpbSgpIGFzICdlbWFpbCcgfCAndXNlcm5hbWUnO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGxldCBtYXRjaGluZ1VzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXI+KFxuICAgICAgZmx1eCxcbiAgICAgIGB1c2VyLmdldFVzZXJCeUF0dHJpYnV0ZToke25vcm1hbGl6ZWRBdHRyaWJ1dGV9OiR7bm9ybWFsaXplZFZhbHVlfWAsXG4gICAgICB7YXR0cmlidXRlOiBub3JtYWxpemVkQXR0cmlidXRlLCB1c2VyUHJvcHMsIHZhbHVlOiBub3JtYWxpemVkVmFsdWV9LFxuICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICApO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBhdHRyaWJ1dGU6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogbm9ybWFsaXplZEF0dHJpYnV0ZVxuICAgICAgfSxcbiAgICAgIHZhbHVlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSAmIHtcbiAgICAgICAgdXNlcnM/OiB7Z2V0VXNlckJ5QXR0cmlidXRlPzogUGFydGlhbDxVc2VyPn07XG4gICAgICB9KT8udXNlcnM/LmdldFVzZXJCeUF0dHJpYnV0ZSkgfHwge307XG4gICAgICBtYXRjaGluZ1VzZXIgPSB1c2VyO1xuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0lURU1fU1VDQ0VTUywgdXNlcn0pO1xuICAgIH07XG5cbiAgICBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gcHVibGljUXVlcnkoZmx1eCwgJ2dldFVzZXJCeUF0dHJpYnV0ZScsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcj4oXG4gICAgICBmbHV4LFxuICAgICAgYHVzZXIuZ2V0VXNlckJ5QXR0cmlidXRlOiR7bm9ybWFsaXplZEF0dHJpYnV0ZX06JHtub3JtYWxpemVkVmFsdWV9YCxcbiAgICAgIHthdHRyaWJ1dGU6IG5vcm1hbGl6ZWRBdHRyaWJ1dGUsIHVzZXJQcm9wcywgdmFsdWU6IG5vcm1hbGl6ZWRWYWx1ZX0sXG4gICAgICBtYXRjaGluZ1VzZXIgYXMgVXNlcixcbiAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBjcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uID0gYXN5bmMgKFxuICAgIHJldHVyblVybDogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFJldHVyblVybCA9IFN0cmluZyhyZXR1cm5VcmwgfHwgJycpLnRyaW0oKTtcblxuICAgIGlmKCFub3JtYWxpemVkUmV0dXJuVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgcmV0dXJuVXJsIGlzIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIGJpbGxpbmcgc2V0dXAgc2Vzc2lvbicpO1xuICAgIH1cblxuICAgIGxldCBjaGVja291dFVybCA9ICcnO1xuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjaGVja291dFVybCA9IFN0cmluZygoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5jcmVhdGVCaWxsaW5nU2V0dXBTZXNzaW9uIHx8ICcnKTtcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtjaGVja291dFVybCwgdHlwZTogVVNFUl9DT05TVEFOVFMuQklMTElOR19TRVRVUF9TRVNTSU9OX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgYXdhaXQgYXBwTXV0YXRpb24oXG4gICAgICBmbHV4LFxuICAgICAgJ2NyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24nLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAge1xuICAgICAgICByZXR1cm5Vcmw6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IG5vcm1hbGl6ZWRSZXR1cm5VcmxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgKTtcblxuICAgIGlmKCFjaGVja291dFVybCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCaWxsaW5nIHNldHVwIHNlc3Npb24gZGlkIG5vdCByZXR1cm4gYSBjaGVja291dCBVUkwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2hlY2tvdXRVcmw7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVCaWxsaW5nU2V0dXBTZXNzaW9uID0gYXN5bmMgKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkU2Vzc2lvbklkID0gU3RyaW5nKHNlc3Npb25JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5vcm1hbGl6ZWRTZXNzaW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzZXNzaW9uSWQgaXMgcmVxdWlyZWQgdG8gY29tcGxldGUgYSBiaWxsaW5nIHNldHVwIHNlc3Npb24nKTtcbiAgICB9XG5cbiAgICBsZXQgdXBkYXRlZFVzZXI6IFBhcnRpYWw8VXNlcj4gPSB7fTtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgdXBkYXRlZFVzZXIgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5jb21wbGV0ZUJpbGxpbmdTZXR1cFNlc3Npb24gfHwge307XG5cbiAgICAgIGlmKCh1cGRhdGVkVXNlciBhcyBhbnkpPy51c2VySWQgJiYgKHVwZGF0ZWRVc2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXBkYXRlZFVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7dHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUywgdXNlcjogdXBkYXRlZFVzZXJ9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdzdHJpcGVDYXJkQnJhbmQnLFxuICAgICAgJ3N0cmlwZUNhcmRJZCcsXG4gICAgICAnc3RyaXBlQ2FyZExhc3Q0JyxcbiAgICAgICd1c2VySWQnLFxuICAgICAgJ3VzZXJuYW1lJyxcbiAgICAgIC4uLnVzZXJQcm9wc1xuICAgIF0pO1xuICAgIGNvbnN0IHNlc3Npb25Vc2VySWQgPSBTdHJpbmcoZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpIHx8ICcnKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2NvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbicsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAge1xuICAgICAgICAgIHNlc3Npb25JZDoge1xuICAgICAgICAgICAgdHlwZTogJ0lEIScsXG4gICAgICAgICAgICB2YWx1ZTogbm9ybWFsaXplZFNlc3Npb25JZFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmV0dXJuUHJvcHMsXG4gICAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHVwZGF0ZWRVc2VyIGFzIFVzZXI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyVXNlclJlcXVlc3RDYWNoZXMoc2Vzc2lvblVzZXJJZCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGRlbGV0ZUJpbGxpbmdDYXJkID0gYXN5bmMgKFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5kZWxldGVCaWxsaW5nQ2FyZCkgfHwge307XG5cbiAgICAgIGlmKCh1c2VyIGFzIGFueSk/LnVzZXJJZCAmJiAodXNlciBhcyBhbnkpLnVzZXJJZCA9PT0gZmx1eC5nZXRTdGF0ZSgndXNlci5zZXNzaW9uLnVzZXJJZCcpKSB7XG4gICAgICAgIHN5bmNTdG9yZWRTZXNzaW9uKGZsdXgsIHVzZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlVQREFURV9JVEVNX1NVQ0NFU1MsXG4gICAgICAgIHVzZXJcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXR1cm5Qcm9wcyA9IHNhbml0aXplVXNlclByb3BzKFtcbiAgICAgICdtb2RpZmllZCcsXG4gICAgICAnc3RyaXBlQ2FyZEJyYW5kJyxcbiAgICAgICdzdHJpcGVDYXJkSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRMYXN0NCcsXG4gICAgICAndXNlcklkJyxcbiAgICAgICd1c2VybmFtZScsXG4gICAgICAuLi51c2VyUHJvcHNcbiAgICBdKTtcbiAgICBjb25zdCBzZXNzaW9uVXNlcklkID0gU3RyaW5nKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbi51c2VySWQnKSB8fCAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uKFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZGVsZXRlQmlsbGluZ0NhcmQnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHt9LFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB1cGRhdGVQbGFuID0gYXN5bmMgKFxuICAgIHBsYW5JZDogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBuZXh0UGxhbklkID0gU3RyaW5nKHBsYW5JZCB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYoIW5leHRQbGFuSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQSBzdWJzY3JpcHRpb24gcGxhbklkIGlzIHJlcXVpcmVkIHRvIHVwZGF0ZSBhIHVzZXIgcGxhbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcGxhbklkOiB7XG4gICAgICAgIHR5cGU6ICdJRCEnLFxuICAgICAgICB2YWx1ZTogbmV4dFBsYW5JZFxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogQXBpUmVzdWx0c1R5cGUgPSB7fSkgPT4ge1xuICAgICAgY29uc3QgdXNlciA9ICgoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy51cGRhdGVQbGFuKSB8fCB7fTtcblxuICAgICAgaWYoKHVzZXIgYXMgYW55KT8udXNlcklkICYmICh1c2VyIGFzIGFueSkudXNlcklkID09PSBmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykpIHtcbiAgICAgICAgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgdXNlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuVVBEQVRFX0lURU1fU1VDQ0VTUyxcbiAgICAgICAgdXNlclxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldHVyblByb3BzID0gc2FuaXRpemVVc2VyUHJvcHMoW1xuICAgICAgJ21vZGlmaWVkJyxcbiAgICAgICdwbGFuRXhwaXJlcycsXG4gICAgICAncGxhbklkJyxcbiAgICAgICdwbGFuU3RhdHVzJyxcbiAgICAgICdwbGFuU3Vic2NyaXB0aW9uSWQnLFxuICAgICAgJ3N0cmlwZUNhcmRCcmFuZCcsXG4gICAgICAnc3RyaXBlQ2FyZElkJyxcbiAgICAgICdzdHJpcGVDYXJkTGFzdDQnLFxuICAgICAgJ3VzZXJBY2Nlc3MnLFxuICAgICAgJ3VzZXJJZCcsXG4gICAgICAndXNlcm5hbWUnLFxuICAgICAgLi4udXNlclByb3BzXG4gICAgXSk7XG4gICAgY29uc3Qgc2Vzc2lvblVzZXJJZCA9IFN0cmluZyhmbHV4LmdldFN0YXRlKCd1c2VyLnNlc3Npb24udXNlcklkJykgfHwgJycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3VwZGF0ZVBsYW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICByZXR1cm5Qcm9wcyxcbiAgICAgICAge29uU3VjY2VzcywgLi4ucmVxdWVzdE9wdGlvbnN9XG4gICAgICApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKHNlc3Npb25Vc2VySWQpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBsaXN0ID0gYXN5bmMgKHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSwgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0Jywge3VzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8uZ2V0VXNlckxpc3QgfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ2dldFVzZXJMaXN0JywgREFUQV9UWVBFLCB7fSwgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgdXNlclByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3QnLCB7dXNlclByb3BzfSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IGxpc3RCeUxhdGVzdCA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nID0gJycsXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgdXNlclByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSB7ZnJvbSwgdG8sIHVzZXJQcm9wcywgdXNlcm5hbWV9O1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5saXN0QnlMYXRlc3QnLCBjYWNoZUtleSwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gICAgaWYoY2FjaGVkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWRSZXN1bHQ7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBmcm9tOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogZnJvbVxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogdG9cbiAgICAgIH0sXG4gICAgICB1c2VybmFtZToge1xuICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgdmFsdWU6IHVzZXJuYW1lXG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCBsaXN0ID0gKGRhdGEgYXMgdW5rbm93biBhcyBVc2VyQXBpUmVzdWx0c1R5cGUpPy51c2Vycz8ubGlzdEJ5TGF0ZXN0IHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlMYXRlc3QnLCBEQVRBX1RZUEUsIHF1ZXJ5VmFyaWFibGVzLCBzYWZlVXNlclByb3BzLCB7b25TdWNjZXNzfSksXG4gICAgICB1c2VyUHJvcHMsXG4gICAgICBERUZBVUxUX1VTRVJfUVVFUllfRklFTERTXG4gICAgKTtcblxuICAgIHJldHVybiBzZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5TGF0ZXN0JywgY2FjaGVLZXksIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBsaXN0QnlDb25uZWN0aW9uID0gYXN5bmMgKFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIF9mcm9tOiBudW1iZXIgPSAwLFxuICAgIF90bzogbnVtYmVyID0gMTAsXG4gICAgX3VzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVJlYWN0aW9ucyA9IGFzeW5jIChcbiAgICB1c2VybmFtZTogc3RyaW5nLFxuICAgIHJlYWN0aW9uTmFtZXM6IHN0cmluZ1tdLFxuICAgIF9mcm9tOiBudW1iZXIgPSAwLFxuICAgIF90bzogbnVtYmVyID0gMTAsXG4gICAgX3BlcnNvbmFQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxVc2VyW10+ID0+XG4gICAgW11cbiAgO1xuXG4gIGNvbnN0IGxpc3RCeVRhZ3MgPSBhc3luYyAoXG4gICAgdXNlcm5hbWU6IHN0cmluZyxcbiAgICB0YWdOYW1lczogc3RyaW5nW10sXG4gICAgZnJvbTogbnVtYmVyID0gMCxcbiAgICB0bzogbnVtYmVyID0gMTAsXG4gICAgcGVyc29uYVByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VXNlcltdPiA9PiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSB7ZnJvbSwgcGVyc29uYVByb3BzLCB0YWdOYW1lcywgdG8sIHVzZXJuYW1lfTtcbiAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFVzZXJbXT4oZmx1eCwgJ3VzZXIubGlzdEJ5VGFncycsIGNhY2hlS2V5LCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICBpZihjYWNoZWRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIGZyb206IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiBmcm9tXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICB0eXBlOiAnW1N0cmluZyFdJyxcbiAgICAgICAgdmFsdWU6IHRhZ05hbWVzXG4gICAgICB9LFxuICAgICAgdG86IHtcbiAgICAgICAgdHlwZTogJ0ludCcsXG4gICAgICAgIHZhbHVlOiB0b1xuICAgICAgfSxcbiAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICB2YWx1ZTogdXNlcm5hbWVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5saXN0QnlUYWdzIHx8IFtdO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe2xpc3QsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLkdFVF9MSVNUX1NVQ0NFU1N9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2l0aEludmFsaWRGaWVsZFJldHJ5KFxuICAgICAgKHNhZmVVc2VyUHJvcHMpID0+IGFwcFF1ZXJ5KGZsdXgsICdsaXN0QnlUYWdzJywgREFUQV9UWVBFLCBxdWVyeVZhcmlhYmxlcywgc2FmZVVzZXJQcm9wcywge29uU3VjY2Vzc30pLFxuICAgICAgcGVyc29uYVByb3BzLFxuICAgICAgREVGQVVMVF9VU0VSX1FVRVJZX0ZJRUxEU1xuICAgICk7XG5cbiAgICByZXR1cm4gc2V0Q2FjaGVkUmVxdWVzdDxVc2VyW10+KGZsdXgsICd1c2VyLmxpc3RCeVRhZ3MnLCBjYWNoZUtleSwgcmVzdWx0IGFzIFVzZXJbXSwgcmVxdWVzdE9wdGlvbnMpO1xuICB9O1xuXG4gIGNvbnN0IHNlYXJjaCA9IGFzeW5jIChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIHVzZXJQcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFVzZXJbXT4gPT4ge1xuICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIGlmKGNhY2hlZFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICB2YWx1ZTogcXVlcnlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE6IEFwaVJlc3VsdHNUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IGxpc3QgPSAoZGF0YSBhcyB1bmtub3duIGFzIFVzZXJBcGlSZXN1bHRzVHlwZSk/LnVzZXJzPy5zZWFyY2ggfHwgW107XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7bGlzdCwgdHlwZTogVVNFUl9DT05TVEFOVFMuR0VUX0xJU1RfU1VDQ0VTU30pO1xuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3aXRoSW52YWxpZEZpZWxkUmV0cnkoXG4gICAgICAoc2FmZVVzZXJQcm9wcykgPT4gYXBwUXVlcnkoZmx1eCwgJ3NlYXJjaCcsIERBVEFfVFlQRSwgcXVlcnlWYXJpYWJsZXMsIHNhZmVVc2VyUHJvcHMsIHtvblN1Y2Nlc3N9KSxcbiAgICAgIHVzZXJQcm9wcyxcbiAgICAgIERFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFNcbiAgICApO1xuXG4gICAgcmV0dXJuIHNldENhY2hlZFJlcXVlc3Q8VXNlcltdPihmbHV4LCAndXNlci5zZWFyY2gnLCB7cXVlcnksIHVzZXJQcm9wc30sIHJlc3VsdCBhcyBVc2VyW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgfTtcblxuICBjb25zdCBpc0xvZ2dlZEluID0gKCk6IGJvb2xlYW4gPT4gaXNMb2dnZWRJbldpdGhTdG9yYWdlKGZsdXgpO1xuXG4gIGNvbnN0IGN1cnJlbnRBdXRoZW50aWNhdGVkVXNlciA9IGFzeW5jIChfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFVzZXI+ID0+IHtcbiAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgaHlkcmF0ZVNlc3Npb25Gcm9tU3RvcmFnZShmbHV4KTtcbiAgICByZXR1cm4gKHNlc3Npb24gfHwge30pIGFzIFVzZXI7XG4gIH07XG5cbiAgY29uc3QgcmVmcmVzaFNlc3Npb25BY3Rpb24gPSBhc3luYyAoXG4gICAgdG9rZW4/OiBzdHJpbmcsXG4gICAgZXhwaXJlcz86IG51bWJlcixcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlZnJlc2hTZXNzaW9uKGZsdXgsIHRva2VuLCBleHBpcmVzKTtcbiAgICByZXR1cm4gKHJlc3VsdD8ucmVmcmVzaFNlc3Npb24gfHwge30pIGFzIFNlc3Npb25UeXBlO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25JbiA9IGFzeW5jIChcbiAgICB1c2VyOiBQYXJ0aWFsPFVzZXI+LFxuICAgIGV4cGlyZXM/OiBudW1iZXIsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxTZXNzaW9uVHlwZT4gPT4ge1xuICAgIGNvbnN0IHtlbWFpbCwgcGhvbmUsIHVzZXJuYW1lLCBwYXNzd29yZH0gPSB1c2VyO1xuICAgIGxldCB1c2VySW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmKHVzZXJuYW1lICYmIHBhc3N3b3JkKSB7XG4gICAgICB1c2VySW5wdXQgPSB7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICB1c2VybmFtZVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYoZW1haWwgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXJJbnB1dCA9IHtcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHBhc3N3b3JkXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZihwaG9uZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlcklucHV0ID0ge1xuICAgICAgICBwYXNzd29yZCxcbiAgICAgICAgcGhvbmVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVXNlcm5hbWUsIGVtYWlsLCBvciBwaG9uZSBudW1iZXIgYW5kIHBhc3N3b3JkIGFyZSByZXF1aXJlZCB0byBzaWduIGluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnRnJvbUZsdXgoZmx1eCk7XG4gICAgY29uc3QgcmVxdWVzdGVkRXhwaXJlcyA9IE1hdGgubWF4KDEsIE51bWJlcihleHBpcmVzIHx8IGNvbmZpZy5hcHA/LnNlc3Npb24/Lm1heE1pbnV0ZXMgfHwgMTUpKTtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlc1dpdGhVc2VySW5wdXQgPSB7XG4gICAgICBleHBpcmVzOiB7XG4gICAgICAgIHR5cGU6ICdJbnQnLFxuICAgICAgICB2YWx1ZTogcmVxdWVzdGVkRXhwaXJlc1xuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZTogdXNlcklucHV0XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IGFzeW5jIChkYXRhOiBBcGlSZXN1bHRzVHlwZSA9IHt9KTogUHJvbWlzZTxGbHV4QWN0aW9uPiA9PiB7XG4gICAgICBjb25zdCB1c2VycyA9IChkYXRhIGFzIHVua25vd24gYXMgVXNlckFwaVJlc3VsdHNUeXBlKT8udXNlcnM7XG4gICAgICBjb25zdCBzZXNzaW9uRGF0YSA9IG5vcm1hbGl6ZVNlc3Npb24odXNlcnM/LnNpZ25JbiB8fCB7fSk7XG4gICAgICBjb25zdCBzdG9yZWRTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgc2Vzc2lvbkRhdGEpO1xuICAgICAgY29uc3QgYWN0aW9uOiBGbHV4QWN0aW9uID0ge1xuICAgICAgICBzZXNzaW9uOiBzdG9yZWRTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhY3Rpb247XG4gICAgfTtcblxuICAgIGNvbnN0IHBlcmZvcm1TaWduSW4gPSBhc3luYyAocXVlcnlWYXJpYWJsZXM6IGFueSk6IFByb21pc2U8U2Vzc2lvblR5cGU+ID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25SZXN1bHQgPSBhd2FpdCBwdWJsaWNNdXRhdGlvbjxTZXNzaW9uVHlwZSAmIFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdzaWduSW4nLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2V4cGlyZXMnLCAnaXNzdWVkJywgJ3Rva2VuJywgJ3VzZXJJZCcsICd1c2VybmFtZSddLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGJhc2VTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgZ2V0U2Vzc2lvblBheWxvYWQoc2Vzc2lvblJlc3VsdCkpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoeWRyYXRlZFNlc3Npb24gPSBhd2FpdCBzZXNzaW9uKFsndXNlcklkJywgJ3BlcnNvbmFJZCcsICd1c2VyQWNjZXNzJywgJ3VzZXJuYW1lJ10sIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgICAgYXdhaXQgc3luY1BlcnNvbmFUYWdzVG9TZXNzaW9uKGZsdXgsIFN0cmluZygoaHlkcmF0ZWRTZXNzaW9uIGFzIGFueSk/LnBlcnNvbmFJZCB8fCAnJykpO1xuICAgICAgfSBjYXRjaHtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tTZXNzaW9uID0gYXdhaXQgc3luY1N0b3JlZFNlc3Npb24oZmx1eCwgYmFzZVNlc3Npb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICBzZXNzaW9uOiBmYWxsYmFja1Nlc3Npb24sXG4gICAgICAgICAgdHlwZTogVVNFUl9DT05TVEFOVFMuU0lHTl9JTl9TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2tTZXNzaW9uO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbFNlc3Npb24gPSBhd2FpdCBzeW5jU3RvcmVkU2Vzc2lvbihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgKGZsdXguZ2V0U3RhdGUoJ3VzZXIuc2Vzc2lvbicsIGJhc2VTZXNzaW9uKSB8fCBiYXNlU2Vzc2lvbikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICAgICk7XG4gICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgc2Vzc2lvbjogZmluYWxTZXNzaW9uLFxuICAgICAgICB0eXBlOiBVU0VSX0NPTlNUQU5UUy5TSUdOX0lOX1NVQ0NFU1NcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZpbmFsU2Vzc2lvbjtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBwZXJmb3JtU2lnbkluKHF1ZXJ5VmFyaWFibGVzV2l0aFVzZXJJbnB1dCk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fSU5fRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKFN0cmluZygodXNlciBhcyBhbnkpPy51c2VySWQgfHwgJycpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc2lnbk91dCA9IGFzeW5jIChfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge30pOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBhd2FpdCBjbGVhclBlcnNpc3RlZFNlc3Npb24oZmx1eCk7XG4gICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7c2Vzc2lvbjoge30sIHR5cGU6IFVTRVJfQ09OU1RBTlRTLlNJR05fT1VUX1NVQ0NFU1N9KTtcbiAgICBhd2FpdCBjbGVhclVzZXJSZXF1ZXN0Q2FjaGVzKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybVNpZ25VcCA9IGFzeW5jIChcbiAgICBfY29kZTogc3RyaW5nLFxuICAgIF90eXBlOiAnZW1haWwnIHwgJ3Bob25lJyxcbiAgICBfcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHRydWU7XG5cbiAgY29uc3QgcmVxdWVzdFBhc3N3b3JkUmVzZXQgPSBhc3luYyAoXG4gICAgcmVxdWVzdDogc3RyaW5nIHwgUGFzc3dvcmRSZXNldFJlcXVlc3QsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgbGV0IGZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkID0gZmFsc2U7XG4gICAgY29uc3Qge2lkZW50aWZpZXIsIHR5cGV9ID0gZ2V0UGFzc3dvcmRSZXNldElkZW50aWZpZXIocmVxdWVzdCk7XG4gICAgbGV0IGF0dHJpYnV0ZSA9ICd1c2VybmFtZSc7XG5cbiAgICBpZih0eXBlID09PSAncGhvbmUnKSB7XG4gICAgICBhdHRyaWJ1dGUgPSAncGhvbmUnO1xuICAgIH0gZWxzZSBpZih0eXBlID09PSAnZW1haWwnKSB7XG4gICAgICBhdHRyaWJ1dGUgPSAnZW1haWwnO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIFthdHRyaWJ1dGVdOiBpZGVudGlmaWVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5mb3Jnb3RQYXNzd29yZDtcbiAgICAgIGZvcmdvdFBhc3N3b3JkU3VjY2VlZGVkID0gc3VjY2VzcztcbiAgICAgIHJldHVybiBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogc3VjY2VzcyA/IFVTRVJfQ09OU1RBTlRTLkZPUkdPVF9QQVNTV09SRF9TVUNDRVNTIDogVVNFUl9DT05TVEFOVFMuRk9SR09UX1BBU1NXT1JEX0VSUk9SXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgYXdhaXQgcHVibGljTXV0YXRpb248VXNlckFwaVJlc3VsdHNUeXBlPihcbiAgICAgIGZsdXgsXG4gICAgICAnZm9yZ290UGFzc3dvcmQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICk7XG5cbiAgICBpZighZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZm9yZ290X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdvdFBhc3N3b3JkID0gYXN5bmMgKHVzZXJuYW1lOiBzdHJpbmcsIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxib29sZWFuPiA9PlxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KHVzZXJuYW1lLCByZXF1ZXN0T3B0aW9ucyk7XG5cbiAgY29uc3Qgc2VuZFZlcmlmaWNhdGlvbkVtYWlsID0gYXN5bmMgKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgZW1haWxPcHRpb25zOiBWZXJpZmljYXRpb25FbWFpbE9wdGlvbnMgPSB7fSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgdHlwZTogJ1VzZXJJbnB1dCEnLFxuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIGVtYWlsLFxuICAgICAgICAgIC4uLihlbWFpbE9wdGlvbnMuc3ViamVjdCA/IHt2ZXJpZmljYXRpb25FbWFpbFN1YmplY3Q6IGVtYWlsT3B0aW9ucy5zdWJqZWN0fSA6IHt9KSxcbiAgICAgICAgICAuLi4oZW1haWxPcHRpb25zLnRlbXBsYXRlID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGU6IGVtYWlsT3B0aW9ucy50ZW1wbGF0ZX0gOiB7fSksXG4gICAgICAgICAgLi4uKGVtYWlsT3B0aW9ucy50ZXh0ID8ge3ZlcmlmaWNhdGlvbkVtYWlsVGV4dDogZW1haWxPcHRpb25zLnRleHR9IDoge30pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5zZW5kVmVyaWZpY2F0aW9uRW1haWw7XG4gICAgICByZXR1cm4gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IHN1Y2Nlc3MgPyBVU0VSX0NPTlNUQU5UUy5DT05GSVJNX1NJR05fVVBfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLkNPTkZJUk1fU0lHTl9VUF9FUlJPUlxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBwdWJsaWNNdXRhdGlvbjxVc2VyQXBpUmVzdWx0c1R5cGU+KFxuICAgICAgZmx1eCxcbiAgICAgICdzZW5kVmVyaWZpY2F0aW9uRW1haWwnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnNlbmRWZXJpZmljYXRpb25FbWFpbDtcbiAgICAgIGlmKCFzdWNjZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignc2VuZF92ZXJpZmljYXRpb25fZW1haWxfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZXNldFBhc3N3b3JkID0gYXN5bmMgKFxuICAgIHVzZXJuYW1lOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgdHlwZTogJ2VtYWlsJyB8ICdwaG9uZScsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICBjb2RlOiB7XG4gICAgICAgIHR5cGU6ICdTdHJpbmchJyxcbiAgICAgICAgdmFsdWU6IGNvZGVcbiAgICAgIH0sXG4gICAgICB1c2VyOiB7XG4gICAgICAgIHR5cGU6ICdVc2VySW5wdXQhJyxcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAuLi4odHlwZSA9PT0gJ2VtYWlsJyA/IHtlbWFpbDogdXNlcm5hbWV9IDoge3Bob25lOiB1c2VybmFtZX0pLFxuICAgICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAgIHVzZXJuYW1lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25TdWNjZXNzID0gKGRhdGE/OiBVc2VyQXBpUmVzdWx0c1R5cGUpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIWRhdGE/LnVzZXJzPy5yZXNldFBhc3N3b3JkO1xuICAgICAgcmV0dXJuIGZsdXguZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBzdWNjZXNzID8gVVNFUl9DT05TVEFOVFMuUkVTRVRfUEFTU1dPUkRfU1VDQ0VTUyA6IFVTRVJfQ09OU1RBTlRTLlJFU0VUX1BBU1NXT1JEX0VSUk9SXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHB1YmxpY011dGF0aW9uPFVzZXJBcGlSZXN1bHRzVHlwZT4oXG4gICAgICBmbHV4LFxuICAgICAgJ3Jlc2V0UGFzc3dvcmQnLFxuICAgICAgREFUQV9UWVBFLFxuICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICBbXSxcbiAgICAgIHtvblN1Y2Nlc3MsIC4uLnJlcXVlc3RPcHRpb25zfVxuICAgICkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9ICEhZGF0YT8udXNlcnM/LnJlc2V0UGFzc3dvcmQ7XG4gICAgICBpZighc3VjY2Vzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jlc2V0X3Bhc3N3b3JkX2ZhaWxlZCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgY29tcGxldGVQYXNzd29yZFJlc2V0ID0gYXN5bmMgKFxuICAgIGNvbmZpcm1hdGlvbjogUGFzc3dvcmRSZXNldENvbmZpcm1hdGlvbixcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBjb25zdCB1c2VybmFtZSA9IFN0cmluZyhjb25maXJtYXRpb24uZW1haWwgfHwgY29uZmlybWF0aW9uLnBob25lIHx8IGNvbmZpcm1hdGlvbi51c2VybmFtZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRQYXNzd29yZFJlc2V0VHlwZShjb25maXJtYXRpb24pO1xuICAgIHJldHVybiByZXNldFBhc3N3b3JkKHVzZXJuYW1lLCBjb25maXJtYXRpb24ucGFzc3dvcmQsIGNvbmZpcm1hdGlvbi5jb2RlLCB0eXBlLCByZXF1ZXN0T3B0aW9ucyk7XG4gIH07XG5cbiAgY29uc3QgdXBkYXRlUGFzc3dvcmQgPSBhc3luYyAoXG4gICAgX3Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgX25ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICAgX3JlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8Ym9vbGVhbj4gPT5cbiAgICB0cnVlXG4gIDtcblxuICByZXR1cm4ge1xuICAgIGFkZFVzZXIsXG4gICAgY29tcGxldGVCaWxsaW5nU2V0dXBTZXNzaW9uLFxuICAgIGNvbXBsZXRlUGFzc3dvcmRSZXNldCxcbiAgICBjb25maXJtQ29kZSxcbiAgICBjb25maXJtU2lnblVwLFxuICAgIGNyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24sXG4gICAgY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyLFxuICAgIGRlbGV0ZUJpbGxpbmdDYXJkLFxuICAgIGZvcmdvdFBhc3N3b3JkLFxuICAgIGdldFVzZXJCeUF0dHJpYnV0ZSxcbiAgICBpc0xvZ2dlZEluLFxuICAgIGl0ZW1CeUlkLFxuICAgIGxpc3QsXG4gICAgbGlzdEJ5Q29ubmVjdGlvbixcbiAgICBsaXN0QnlMYXRlc3QsXG4gICAgbGlzdEJ5UmVhY3Rpb25zLFxuICAgIGxpc3RCeVRhZ3MsXG4gICAgcmVmcmVzaFNlc3Npb246IHJlZnJlc2hTZXNzaW9uQWN0aW9uLFxuICAgIHJlbW92ZSxcbiAgICByZXF1ZXN0UGFzc3dvcmRSZXNldCxcbiAgICByZXNldFBhc3N3b3JkLFxuICAgIHNlYXJjaCxcbiAgICBzZW5kVmVyaWZpY2F0aW9uRW1haWwsXG4gICAgc2Vzc2lvbixcbiAgICBzaWduSW4sXG4gICAgc2lnbk91dCxcbiAgICBzaWduVXAsXG4gICAgdXBkYXRlUGFzc3dvcmQsXG4gICAgdXBkYXRlUGxhbixcbiAgICB1cGRhdGVVc2VyLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyOiB1c2VyQmFzZS51cGRhdGVBZGFwdGVyLFxuICAgIHVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9uczogdXNlckJhc2UudXBkYXRlT3B0aW9uc1xuICB9O1xufTtcbiJdLCJuYW1lcyI6WyJ2YWxpZGF0ZVVzZXJJbnB1dCIsIlVTRVJfQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsInB1YmxpY011dGF0aW9uIiwicHVibGljUXVlcnkiLCJyZWZyZXNoU2Vzc2lvbiIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiZ2V0Q29uZmlnRnJvbUZsdXgiLCJjbGVhckNhY2hlZFJlcXVlc3QiLCJnZXRDYWNoZWRSZXF1ZXN0Iiwic2V0Q2FjaGVkUmVxdWVzdCIsImNsZWFyUGVyc2lzdGVkU2Vzc2lvbiIsImh5ZHJhdGVTZXNzaW9uRnJvbVN0b3JhZ2UiLCJpc0xvZ2dlZEluIiwiaXNMb2dnZWRJbldpdGhTdG9yYWdlIiwibm9ybWFsaXplU2Vzc2lvbiIsInN0b3JlU2Vzc2lvbiIsInN5bmNQZXJzb25hVGFnc1RvU2Vzc2lvbiIsIkRBVEFfVFlQRSIsIkRFRkFVTFRfVVNFUl9RVUVSWV9GSUVMRFMiLCJTRU5TSVRJVkVfVVNFUl9GSUVMRFMiLCJTZXQiLCJJTlZBTElEX0ZJRUxEX1JFR0VYIiwiaGFzU2Vzc2lvbklkZW50aXR5IiwidXNlciIsInNlc3Npb25Vc2VyIiwiQm9vbGVhbiIsIlJlZmxlY3QiLCJnZXQiLCJ1c2VySWQiLCJ1c2VybmFtZSIsImVtYWlsIiwic2FuaXRpemVVcGRhdGVVc2VySW5wdXQiLCJ1c2VySW5wdXQiLCJjdXJyZW50U2Vzc2lvbiIsIm5leHRVc2VyIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsImZpZWxkIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJwYXNzd29yZCIsIlN0cmluZyIsInRyaW0iLCJjdXJyZW50VmFsdWUiLCJzeW5jU3RvcmVkU2Vzc2lvbiIsImZsdXgiLCJzZXNzaW9uUGF0Y2giLCJnZXRTdGF0ZSIsImdldFNlc3Npb25QYXlsb2FkIiwicGF5bG9hZCIsInNlc3Npb24iLCJnZXRGaWVsZFJvb3QiLCJ0cmltbWVkIiwibWF0Y2giLCJzYW5pdGl6ZVVzZXJQcm9wcyIsInByb3BzIiwiZmFsbGJhY2tQcm9wcyIsInNlZW4iLCJzYW5pdGl6ZWQiLCJsaXN0Iiwicm9vdCIsImhhcyIsImFkZCIsInB1c2giLCJsZW5ndGgiLCJnZXRJbnZhbGlkRmllbGRzIiwiZXJyb3IiLCJlcnJvcnMiLCJzb3VyY2UiLCJpbnZhbGlkRmllbGRzIiwiZm9yRWFjaCIsIml0ZW0iLCJtZXNzYWdlIiwiZXhlYyIsImxhc3RJbmRleCIsImdldFBhc3N3b3JkUmVzZXRJZGVudGlmaWVyIiwicmVxdWVzdCIsImlkZW50aWZpZXIiLCJwaG9uZSIsInR5cGUiLCJpbmNsdWRlcyIsImdldFBhc3N3b3JkUmVzZXRUeXBlIiwiY29uZmlybWF0aW9uIiwid2l0aEludmFsaWRGaWVsZFJldHJ5IiwicmVxdWVzdFdpdGhQcm9wcyIsInNhZmVQcm9wcyIsInNpemUiLCJyZXRyeVByb3BzIiwiZmlsdGVyIiwiZGVmYXVsdFVzZXJWYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJ2YWxpZGF0ZWQiLCJzdHJpY3QiLCJFcnJvciIsImNyZWF0ZVVzZXJBY3Rpb25zIiwidXNlckJhc2UiLCJhZGFwdGVyIiwidXNlckFkYXB0ZXIiLCJhZGFwdGVyT3B0aW9ucyIsInVzZXJBZGFwdGVyT3B0aW9ucyIsImNsZWFyVXNlclJlcXVlc3RDYWNoZXMiLCJhZGRVc2VyIiwidXNlclByb3BzIiwicmVxdWVzdE9wdGlvbnMiLCJxdWVyeVZhcmlhYmxlcyIsIm9uU3VjY2VzcyIsImRhdGEiLCJ1c2VycyIsImRpc3BhdGNoIiwiQUREX0lURU1fU1VDQ0VTUyIsInJldHVyblByb3BzIiwic2lnblVwIiwiZXhwaXJlcyIsIlNJR05fVVBfU1VDQ0VTUyIsIlNJR05fVVBfRVJST1IiLCJ1cGRhdGVVc2VyIiwidXBkYXRlSW5wdXQiLCJiaXJ0aGRhdGUiLCJkb2IiLCJmaXJzdE5hbWUiLCJnZW5kZXIiLCJsYXN0TmFtZSIsIm1haWxpbmdMaXN0IiwiVVBEQVRFX0lURU1fU1VDQ0VTUyIsImNvbmZpcm1Db2RlIiwiY29kZSIsIl9yZXF1ZXN0T3B0aW9ucyIsImNvbmZpcm1lZCIsIkNPTkZJUk1fU0lHTl9VUF9TVUNDRVNTIiwicmVtb3ZlIiwiUkVNT1ZFX0lURU1fU1VDQ0VTUyIsInNlc3Npb25Qcm9wcyIsInNlc3Npb25EYXRhIiwiZ2V0VXNlckJ5U2Vzc2lvbiIsIkdFVF9TRVNTSU9OX0VSUk9SIiwibmV4dFNlc3Npb24iLCJHRVRfU0VTU0lPTl9TVUNDRVNTIiwicGVyc29uYUlkIiwiaXRlbUJ5SWQiLCJjYWNoZWRSZXN1bHQiLCJnZXRVc2VyQnlJZCIsIkdFVF9JVEVNX1NVQ0NFU1MiLCJyZXN1bHQiLCJzYWZlVXNlclByb3BzIiwiZ2V0VXNlckJ5QXR0cmlidXRlIiwiYXR0cmlidXRlIiwibm9ybWFsaXplZEF0dHJpYnV0ZSIsIm5vcm1hbGl6ZWRWYWx1ZSIsIm1hdGNoaW5nVXNlciIsImNyZWF0ZUJpbGxpbmdTZXR1cFNlc3Npb24iLCJyZXR1cm5VcmwiLCJub3JtYWxpemVkUmV0dXJuVXJsIiwiY2hlY2tvdXRVcmwiLCJCSUxMSU5HX1NFVFVQX1NFU1NJT05fU1VDQ0VTUyIsImNvbXBsZXRlQmlsbGluZ1NldHVwU2Vzc2lvbiIsInNlc3Npb25JZCIsIm5vcm1hbGl6ZWRTZXNzaW9uSWQiLCJ1cGRhdGVkVXNlciIsInNlc3Npb25Vc2VySWQiLCJkZWxldGVCaWxsaW5nQ2FyZCIsInVwZGF0ZVBsYW4iLCJwbGFuSWQiLCJuZXh0UGxhbklkIiwiZ2V0VXNlckxpc3QiLCJHRVRfTElTVF9TVUNDRVNTIiwibGlzdEJ5TGF0ZXN0IiwiZnJvbSIsInRvIiwiY2FjaGVLZXkiLCJsaXN0QnlDb25uZWN0aW9uIiwiX2Zyb20iLCJfdG8iLCJfdXNlclByb3BzIiwibGlzdEJ5UmVhY3Rpb25zIiwicmVhY3Rpb25OYW1lcyIsIl9wZXJzb25hUHJvcHMiLCJsaXN0QnlUYWdzIiwidGFnTmFtZXMiLCJwZXJzb25hUHJvcHMiLCJ0YWdzIiwic2VhcmNoIiwicXVlcnkiLCJjdXJyZW50QXV0aGVudGljYXRlZFVzZXIiLCJyZWZyZXNoU2Vzc2lvbkFjdGlvbiIsInRva2VuIiwic2lnbkluIiwiY29uZmlnIiwicmVxdWVzdGVkRXhwaXJlcyIsIk1hdGgiLCJtYXgiLCJOdW1iZXIiLCJhcHAiLCJtYXhNaW51dGVzIiwicXVlcnlWYXJpYWJsZXNXaXRoVXNlcklucHV0Iiwic3RvcmVkU2Vzc2lvbiIsImFjdGlvbiIsIlNJR05fSU5fU1VDQ0VTUyIsInBlcmZvcm1TaWduSW4iLCJzZXNzaW9uUmVzdWx0IiwiYmFzZVNlc3Npb24iLCJoeWRyYXRlZFNlc3Npb24iLCJmYWxsYmFja1Nlc3Npb24iLCJmaW5hbFNlc3Npb24iLCJTSUdOX0lOX0VSUk9SIiwic2lnbk91dCIsIlNJR05fT1VUX1NVQ0NFU1MiLCJjb25maXJtU2lnblVwIiwiX2NvZGUiLCJfdHlwZSIsInJlcXVlc3RQYXNzd29yZFJlc2V0IiwiZm9yZ290UGFzc3dvcmRTdWNjZWVkZWQiLCJzdWNjZXNzIiwiZm9yZ290UGFzc3dvcmQiLCJGT1JHT1RfUEFTU1dPUkRfU1VDQ0VTUyIsIkZPUkdPVF9QQVNTV09SRF9FUlJPUiIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsImVtYWlsT3B0aW9ucyIsInN1YmplY3QiLCJ2ZXJpZmljYXRpb25FbWFpbFN1YmplY3QiLCJ0ZW1wbGF0ZSIsInZlcmlmaWNhdGlvbkVtYWlsVGVtcGxhdGUiLCJ0ZXh0IiwidmVyaWZpY2F0aW9uRW1haWxUZXh0IiwiQ09ORklSTV9TSUdOX1VQX0VSUk9SIiwidGhlbiIsInJlc2V0UGFzc3dvcmQiLCJSRVNFVF9QQVNTV09SRF9TVUNDRVNTIiwiUkVTRVRfUEFTU1dPUkRfRVJST1IiLCJjb21wbGV0ZVBhc3N3b3JkUmVzZXQiLCJ1cGRhdGVQYXNzd29yZCIsIl9wYXNzd29yZCIsIl9uZXdQYXNzd29yZCIsInVwZGF0ZVVzZXJBZGFwdGVyIiwidXBkYXRlQWRhcHRlciIsInVwZGF0ZVVzZXJBZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGlCQUFpQixRQUFPLDRDQUE0QztBQUM1RSxTQUFRQyxjQUFjLFFBQU8sNEJBQTRCO0FBQ3pELFNBQVFDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxjQUFjLEVBQUVDLFdBQVcsRUFBRUMsY0FBYyxRQUFPLHFCQUFxQjtBQUN0RyxTQUFRQyxpQkFBaUIsUUFBTyxtQ0FBbUM7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
|