parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21
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 +45 -17
- package/lib/AccountLockout.js +11 -26
- package/lib/Adapters/AdapterLoader.js +8 -14
- package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
- package/lib/Adapters/Auth/AuthAdapter.js +7 -16
- package/lib/Adapters/Auth/OAuth1Client.js +32 -57
- package/lib/Adapters/Auth/apple.js +6 -22
- package/lib/Adapters/Auth/facebook.js +7 -37
- package/lib/Adapters/Auth/gcenter.js +8 -37
- package/lib/Adapters/Auth/github.js +7 -10
- package/lib/Adapters/Auth/google.js +11 -34
- package/lib/Adapters/Auth/gpgames.js +5 -8
- package/lib/Adapters/Auth/httpsRequest.js +1 -7
- package/lib/Adapters/Auth/index.js +20 -65
- package/lib/Adapters/Auth/instagram.js +5 -9
- package/lib/Adapters/Auth/janraincapture.js +8 -12
- package/lib/Adapters/Auth/janrainengage.js +7 -11
- package/lib/Adapters/Auth/keycloak.js +5 -19
- package/lib/Adapters/Auth/ldap.js +1 -15
- package/lib/Adapters/Auth/line.js +7 -10
- package/lib/Adapters/Auth/linkedin.js +7 -12
- package/lib/Adapters/Auth/meetup.js +7 -10
- package/lib/Adapters/Auth/microsoft.js +7 -10
- package/lib/Adapters/Auth/oauth2.js +6 -18
- package/lib/Adapters/Auth/phantauth.js +8 -10
- package/lib/Adapters/Auth/qq.js +7 -13
- package/lib/Adapters/Auth/spotify.js +7 -14
- package/lib/Adapters/Auth/twitter.js +5 -15
- package/lib/Adapters/Auth/vkontakte.js +9 -15
- package/lib/Adapters/Auth/wechat.js +7 -10
- package/lib/Adapters/Auth/weibo.js +7 -11
- package/lib/Adapters/Cache/CacheAdapter.js +4 -12
- package/lib/Adapters/Cache/InMemoryCache.js +5 -19
- package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
- package/lib/Adapters/Cache/LRUCache.js +1 -11
- package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
- package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
- package/lib/Adapters/Cache/SchemaCache.js +1 -6
- package/lib/Adapters/Email/MailAdapter.js +2 -7
- package/lib/Adapters/Files/FilesAdapter.js +7 -21
- package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
- package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
- package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
- package/lib/Adapters/Logger/WinstonLogger.js +3 -30
- package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
- package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
- package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
- package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
- package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
- package/lib/Adapters/Push/PushAdapter.js +2 -8
- package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
- package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
- package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
- package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
- package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
- package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
- package/lib/Adapters/Storage/StorageAdapter.js +1 -1
- package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
- package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
- package/lib/Auth.js +54 -121
- package/lib/ClientSDK.js +3 -11
- package/lib/Config.js +69 -113
- package/lib/Controllers/AdaptableController.js +6 -18
- package/lib/Controllers/AnalyticsController.js +1 -9
- package/lib/Controllers/CacheController.js +3 -23
- package/lib/Controllers/DatabaseController.js +147 -345
- package/lib/Controllers/FilesController.js +5 -34
- package/lib/Controllers/HooksController.js +1 -51
- package/lib/Controllers/LiveQueryController.js +4 -23
- package/lib/Controllers/LoggerController.js +15 -54
- package/lib/Controllers/ParseGraphQLController.js +49 -104
- package/lib/Controllers/PushController.js +20 -59
- package/lib/Controllers/SchemaController.js +154 -344
- package/lib/Controllers/UserController.js +11 -72
- package/lib/Controllers/index.js +19 -68
- package/lib/Controllers/types.js +1 -1
- package/lib/Deprecator/Deprecations.js +1 -8
- package/lib/Deprecator/Deprecator.js +9 -18
- package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
- package/lib/GraphQL/ParseGraphQLServer.js +2 -29
- package/lib/GraphQL/helpers/objectsMutations.js +2 -12
- package/lib/GraphQL/helpers/objectsQueries.js +18 -76
- package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
- package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
- package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
- package/lib/GraphQL/loaders/filesMutations.js +2 -19
- package/lib/GraphQL/loaders/functionsMutations.js +6 -17
- package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
- package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
- package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
- package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
- package/lib/GraphQL/loaders/schemaMutations.js +1 -20
- package/lib/GraphQL/loaders/schemaQueries.js +1 -14
- package/lib/GraphQL/loaders/schemaTypes.js +2 -6
- package/lib/GraphQL/loaders/usersMutations.js +6 -28
- package/lib/GraphQL/loaders/usersQueries.js +4 -26
- package/lib/GraphQL/parseGraphQLUtils.js +6 -19
- package/lib/GraphQL/transformers/className.js +1 -4
- package/lib/GraphQL/transformers/constraintType.js +1 -20
- package/lib/GraphQL/transformers/inputType.js +1 -20
- package/lib/GraphQL/transformers/mutation.js +6 -51
- package/lib/GraphQL/transformers/outputType.js +1 -20
- package/lib/GraphQL/transformers/query.js +6 -42
- package/lib/GraphQL/transformers/schemaFields.js +7 -34
- package/lib/KeyPromiseQueue.js +1 -12
- package/lib/LiveQuery/Client.js +1 -25
- package/lib/LiveQuery/Id.js +1 -7
- package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
- package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
- package/lib/LiveQuery/ParsePubSub.js +1 -12
- package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
- package/lib/LiveQuery/QueryTools.js +14 -116
- package/lib/LiveQuery/RequestSchema.js +1 -1
- package/lib/LiveQuery/SessionTokenCache.js +1 -17
- package/lib/LiveQuery/Subscription.js +4 -18
- package/lib/LiveQuery/equalObjects.js +2 -14
- package/lib/Options/Definitions.js +79 -10
- package/lib/Options/docs.js +23 -3
- package/lib/Options/index.js +4 -12
- package/lib/Options/parsers.js +1 -18
- package/lib/Page.js +1 -9
- package/lib/ParseMessageQueue.js +1 -10
- package/lib/ParseServer.js +144 -182
- package/lib/ParseServerRESTController.js +6 -33
- package/lib/PromiseRouter.js +16 -50
- package/lib/Push/PushQueue.js +3 -15
- package/lib/Push/PushWorker.js +7 -32
- package/lib/Push/utils.js +9 -38
- package/lib/RestQuery.js +105 -242
- package/lib/RestWrite.js +212 -377
- package/lib/Routers/AggregateRouter.js +14 -51
- package/lib/Routers/AnalyticsRouter.js +2 -8
- package/lib/Routers/AudiencesRouter.js +1 -15
- package/lib/Routers/ClassesRouter.js +3 -53
- package/lib/Routers/CloudCodeRouter.js +1 -19
- package/lib/Routers/FeaturesRouter.js +1 -10
- package/lib/Routers/FilesRouter.js +29 -76
- package/lib/Routers/FunctionsRouter.js +5 -28
- package/lib/Routers/GlobalConfigRouter.js +4 -18
- package/lib/Routers/GraphQLRouter.js +1 -14
- package/lib/Routers/HooksRouter.js +1 -29
- package/lib/Routers/IAPValidationRouter.js +6 -29
- package/lib/Routers/InstallationsRouter.js +2 -12
- package/lib/Routers/LogsRouter.js +4 -16
- package/lib/Routers/PagesRouter.js +69 -129
- package/lib/Routers/PublicAPIRouter.js +3 -62
- package/lib/Routers/PurgeRouter.js +1 -15
- package/lib/Routers/PushRouter.js +2 -18
- package/lib/Routers/RolesRouter.js +1 -7
- package/lib/Routers/SchemasRouter.js +4 -34
- package/lib/Routers/SecurityRouter.js +1 -12
- package/lib/Routers/SessionsRouter.js +3 -19
- package/lib/Routers/UsersRouter.js +58 -155
- package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
- package/lib/SchemaMigrations/Migrations.js +2 -8
- package/lib/Security/Check.js +8 -16
- package/lib/Security/CheckGroup.js +4 -11
- package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
- package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
- package/lib/Security/CheckGroups/CheckGroups.js +1 -4
- package/lib/Security/CheckRunner.js +22 -41
- package/lib/StatusHandler.js +12 -69
- package/lib/TestUtils.js +1 -6
- package/lib/Utils.js +27 -66
- package/lib/batch.js +17 -28
- package/lib/cache.js +1 -3
- package/lib/cli/definitions/parse-live-query-server.js +1 -3
- package/lib/cli/definitions/parse-server.js +1 -3
- package/lib/cli/parse-live-query-server.js +1 -6
- package/lib/cli/parse-server.js +11 -21
- package/lib/cli/utils/commander.js +13 -51
- package/lib/cli/utils/runner.js +1 -14
- package/lib/cloud-code/Parse.Cloud.js +71 -92
- package/lib/cryptoUtils.js +11 -19
- package/lib/defaults.js +2 -14
- package/lib/deprecated.js +1 -2
- package/lib/index.js +16 -34
- package/lib/logger.js +6 -13
- package/lib/middlewares.js +147 -151
- package/lib/password.js +6 -10
- package/lib/request.js +173 -2
- package/lib/requiredParameter.js +1 -3
- package/lib/rest.js +19 -41
- package/lib/triggers.js +54 -252
- package/lib/vendor/mongodbUrl.js +125 -305
- package/package.json +22 -19
- package/lib/cloud-code/HTTPResponse.js +0 -73
- package/lib/cloud-code/httpRequest.js +0 -192
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
'use strict';
|
|
1
|
+
'use strict';
|
|
2
2
|
|
|
3
|
+
// Helper functions for accessing the google API.
|
|
3
4
|
var Parse = require('parse/node').Parse;
|
|
4
|
-
|
|
5
5
|
const https = require('https');
|
|
6
|
-
|
|
7
6
|
const jwt = require('jsonwebtoken');
|
|
8
|
-
|
|
9
7
|
const TOKEN_ISSUER = 'accounts.google.com';
|
|
10
8
|
const HTTPS_TOKEN_ISSUER = 'https://accounts.google.com';
|
|
11
|
-
let cache = {};
|
|
9
|
+
let cache = {};
|
|
12
10
|
|
|
11
|
+
// Retrieve Google Signin Keys (with cache control)
|
|
13
12
|
function getGoogleKeyByKeyId(keyId) {
|
|
14
13
|
if (cache[keyId] && cache.expiresAt > new Date()) {
|
|
15
14
|
return cache[keyId];
|
|
16
15
|
}
|
|
17
|
-
|
|
18
16
|
return new Promise((resolve, reject) => {
|
|
19
17
|
https.get(`https://www.googleapis.com/oauth2/v3/certs`, res => {
|
|
20
18
|
let data = '';
|
|
@@ -32,35 +30,28 @@ function getGoogleKeyByKeyId(keyId) {
|
|
|
32
30
|
}) => Object.assign(pems, {
|
|
33
31
|
[kid]: rsaPublicKeyToPEM(modulus, exposant)
|
|
34
32
|
}), {});
|
|
35
|
-
|
|
36
33
|
if (res.headers['cache-control']) {
|
|
37
34
|
var expire = res.headers['cache-control'].match(/max-age=([0-9]+)/);
|
|
38
|
-
|
|
39
35
|
if (expire) {
|
|
40
36
|
cache = Object.assign({}, pems, {
|
|
41
37
|
expiresAt: new Date(new Date().getTime() + Number(expire[1]) * 1000)
|
|
42
38
|
});
|
|
43
39
|
}
|
|
44
40
|
}
|
|
45
|
-
|
|
46
41
|
resolve(pems[keyId]);
|
|
47
42
|
});
|
|
48
43
|
}).on('error', reject);
|
|
49
44
|
});
|
|
50
45
|
}
|
|
51
|
-
|
|
52
46
|
function getHeaderFromToken(token) {
|
|
53
47
|
const decodedToken = jwt.decode(token, {
|
|
54
48
|
complete: true
|
|
55
49
|
});
|
|
56
|
-
|
|
57
50
|
if (!decodedToken) {
|
|
58
51
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
|
|
59
52
|
}
|
|
60
|
-
|
|
61
53
|
return decodedToken.header;
|
|
62
54
|
}
|
|
63
|
-
|
|
64
55
|
async function verifyIdToken({
|
|
65
56
|
id_token: token,
|
|
66
57
|
id
|
|
@@ -70,14 +61,12 @@ async function verifyIdToken({
|
|
|
70
61
|
if (!token) {
|
|
71
62
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
|
|
72
63
|
}
|
|
73
|
-
|
|
74
64
|
const {
|
|
75
65
|
kid: keyId,
|
|
76
66
|
alg: algorithm
|
|
77
67
|
} = getHeaderFromToken(token);
|
|
78
68
|
let jwtClaims;
|
|
79
69
|
const googleKey = await getGoogleKeyByKeyId(keyId);
|
|
80
|
-
|
|
81
70
|
try {
|
|
82
71
|
jwtClaims = jwt.verify(token, googleKey, {
|
|
83
72
|
algorithms: algorithm,
|
|
@@ -87,37 +76,33 @@ async function verifyIdToken({
|
|
|
87
76
|
const message = exception.message;
|
|
88
77
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${message}`);
|
|
89
78
|
}
|
|
90
|
-
|
|
91
79
|
if (jwtClaims.iss !== TOKEN_ISSUER && jwtClaims.iss !== HTTPS_TOKEN_ISSUER) {
|
|
92
80
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token not issued by correct provider - expected: ${TOKEN_ISSUER} or ${HTTPS_TOKEN_ISSUER} | from: ${jwtClaims.iss}`);
|
|
93
81
|
}
|
|
94
|
-
|
|
95
82
|
if (jwtClaims.sub !== id) {
|
|
96
83
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `auth data is invalid for this user.`);
|
|
97
84
|
}
|
|
98
|
-
|
|
99
85
|
if (clientId && jwtClaims.aud !== clientId) {
|
|
100
86
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token not authorized for this clientId.`);
|
|
101
87
|
}
|
|
102
|
-
|
|
103
88
|
return jwtClaims;
|
|
104
|
-
}
|
|
105
|
-
|
|
89
|
+
}
|
|
106
90
|
|
|
91
|
+
// Returns a promise that fulfills if this user id is valid.
|
|
107
92
|
function validateAuthData(authData, options = {}) {
|
|
108
93
|
return verifyIdToken(authData, options);
|
|
109
|
-
}
|
|
110
|
-
|
|
94
|
+
}
|
|
111
95
|
|
|
96
|
+
// Returns a promise that fulfills if this app id is valid.
|
|
112
97
|
function validateAppId() {
|
|
113
98
|
return Promise.resolve();
|
|
114
99
|
}
|
|
115
|
-
|
|
116
100
|
module.exports = {
|
|
117
101
|
validateAppId: validateAppId,
|
|
118
102
|
validateAuthData: validateAuthData
|
|
119
|
-
};
|
|
103
|
+
};
|
|
120
104
|
|
|
105
|
+
// Helpers functions to convert the RSA certs to PEM (from jwks-rsa)
|
|
121
106
|
function rsaPublicKeyToPEM(modulusB64, exponentB64) {
|
|
122
107
|
const modulus = new Buffer(modulusB64, 'base64');
|
|
123
108
|
const exponent = new Buffer(exponentB64, 'base64');
|
|
@@ -134,34 +119,26 @@ function rsaPublicKeyToPEM(modulusB64, exponentB64) {
|
|
|
134
119
|
pem += '\n-----END RSA PUBLIC KEY-----\n';
|
|
135
120
|
return pem;
|
|
136
121
|
}
|
|
137
|
-
|
|
138
122
|
function prepadSigned(hexStr) {
|
|
139
123
|
const msb = hexStr[0];
|
|
140
|
-
|
|
141
124
|
if (msb < '0' || msb > '7') {
|
|
142
125
|
return `00${hexStr}`;
|
|
143
126
|
}
|
|
144
|
-
|
|
145
127
|
return hexStr;
|
|
146
128
|
}
|
|
147
|
-
|
|
148
129
|
function toHex(number) {
|
|
149
130
|
const nstr = number.toString(16);
|
|
150
|
-
|
|
151
131
|
if (nstr.length % 2) {
|
|
152
132
|
return `0${nstr}`;
|
|
153
133
|
}
|
|
154
|
-
|
|
155
134
|
return nstr;
|
|
156
135
|
}
|
|
157
|
-
|
|
158
136
|
function encodeLengthHex(n) {
|
|
159
137
|
if (n <= 127) {
|
|
160
138
|
return toHex(n);
|
|
161
139
|
}
|
|
162
|
-
|
|
163
140
|
const nHex = toHex(n);
|
|
164
141
|
const lengthOfLengthByte = 128 + nHex.length / 2;
|
|
165
142
|
return toHex(lengthOfLengthByte) + nHex;
|
|
166
143
|
}
|
|
167
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2dvb2dsZS5qcyJdLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwcyIsImp3dCIsIlRPS0VOX0lTU1VFUiIsIkhUVFBTX1RPS0VOX0lTU1VFUiIsImNhY2hlIiwiZ2V0R29vZ2xlS2V5QnlLZXlJZCIsImtleUlkIiwiZXhwaXJlc0F0IiwiRGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImtleXMiLCJKU09OIiwicGFyc2UiLCJwZW1zIiwicmVkdWNlIiwibiIsIm1vZHVsdXMiLCJlIiwiZXhwb3NhbnQiLCJraWQiLCJPYmplY3QiLCJhc3NpZ24iLCJyc2FQdWJsaWNLZXlUb1BFTSIsImhlYWRlcnMiLCJleHBpcmUiLCJtYXRjaCIsImdldFRpbWUiLCJOdW1iZXIiLCJnZXRIZWFkZXJGcm9tVG9rZW4iLCJ0b2tlbiIsImRlY29kZWRUb2tlbiIsImRlY29kZSIsImNvbXBsZXRlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiaGVhZGVyIiwidmVyaWZ5SWRUb2tlbiIsImlkX3Rva2VuIiwiaWQiLCJjbGllbnRJZCIsImFsZyIsImFsZ29yaXRobSIsImp3dENsYWltcyIsImdvb2dsZUtleSIsInZlcmlmeSIsImFsZ29yaXRobXMiLCJhdWRpZW5jZSIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJpc3MiLCJzdWIiLCJhdWQiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJvcHRpb25zIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bHVzQjY0IiwiZXhwb25lbnRCNjQiLCJCdWZmZXIiLCJleHBvbmVudCIsIm1vZHVsdXNIZXgiLCJwcmVwYWRTaWduZWQiLCJleHBvbmVudEhleCIsIm1vZGxlbiIsImxlbmd0aCIsImV4cGxlbiIsImVuY29kZWRNb2RsZW4iLCJlbmNvZGVMZW5ndGhIZXgiLCJlbmNvZGVkRXhwbGVuIiwiZW5jb2RlZFB1YmtleSIsImRlciIsInBlbSIsImpvaW4iLCJoZXhTdHIiLCJtc2IiLCJ0b0hleCIsIm51bWJlciIsIm5zdHIiLCJuSGV4IiwibGVuZ3RoT2ZMZW5ndGhCeXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxhLENBRUE7O0FBQ0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUFQLENBQXNCRCxLQUFsQzs7QUFFQSxNQUFNRSxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU1FLEdBQUcsR0FBR0YsT0FBTyxDQUFDLGNBQUQsQ0FBbkI7O0FBRUEsTUFBTUcsWUFBWSxHQUFHLHFCQUFyQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLDZCQUEzQjtBQUVBLElBQUlDLEtBQUssR0FBRyxFQUFaLEMsQ0FFQTs7QUFDQSxTQUFTQyxtQkFBVCxDQUE2QkMsS0FBN0IsRUFBb0M7QUFDbEMsTUFBSUYsS0FBSyxDQUFDRSxLQUFELENBQUwsSUFBZ0JGLEtBQUssQ0FBQ0csU0FBTixHQUFrQixJQUFJQyxJQUFKLEVBQXRDLEVBQWtEO0FBQ2hELFdBQU9KLEtBQUssQ0FBQ0UsS0FBRCxDQUFaO0FBQ0Q7O0FBRUQsU0FBTyxJQUFJRyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDWCxJQUFBQSxLQUFLLENBQ0ZZLEdBREgsQ0FDUSw0Q0FEUixFQUNxREMsR0FBRyxJQUFJO0FBQ3hELFVBQUlDLElBQUksR0FBRyxFQUFYO0FBQ0FELE1BQUFBLEdBQUcsQ0FBQ0UsRUFBSixDQUFPLE1BQVAsRUFBZUMsS0FBSyxJQUFJO0FBQ3RCRixRQUFBQSxJQUFJLElBQUlFLEtBQUssQ0FBQ0MsUUFBTixDQUFlLE1BQWYsQ0FBUjtBQUNELE9BRkQ7QUFHQUosTUFBQUEsR0FBRyxDQUFDRSxFQUFKLENBQU8sS0FBUCxFQUFjLE1BQU07QUFDbEIsY0FBTTtBQUFFRyxVQUFBQTtBQUFGLFlBQVdDLElBQUksQ0FBQ0Ms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O0FBQ0EsU0FBT0EsR0FBUDtBQUNEOztBQUVELFNBQVNWLFlBQVQsQ0FBc0JZLE1BQXRCLEVBQThCO0FBQzVCLFFBQU1DLEdBQUcsR0FBR0QsTUFBTSxDQUFDLENBQUQsQ0FBbEI7O0FBQ0EsTUFBSUMsR0FBRyxHQUFHLEdBQU4sSUFBYUEsR0FBRyxHQUFHLEdBQXZCLEVBQTRCO0FBQzFCLFdBQVEsS0FBSUQsTUFBTyxFQUFuQjtBQUNEOztBQUNELFNBQU9BLE1BQVA7QUFDRDs7QUFFRCxTQUFTRSxLQUFULENBQWVDLE1BQWYsRUFBdUI7QUFDckIsUUFBTUMsSUFBSSxHQUFHRCxNQUFNLENBQUNyRSxRQUFQLENBQWdCLEVBQWhCLENBQWI7O0FBQ0EsTUFBSXNFLElBQUksQ0FBQ2IsTUFBTCxHQUFjLENBQWxCLEVBQXFCO0FBQ25CLFdBQVEsSUFBR2EsSUFBSyxFQUFoQjtBQUNEOztBQUNELFNBQU9BLElBQVA7QUFDRDs7QUFFRCxTQUFTVixlQUFULENBQXlCdEQsQ0FBekIsRUFBNEI7QUFDMUIsTUFBSUEsQ0FBQyxJQUFJLEdBQVQsRUFBYztBQUNaLFdBQU84RCxLQUFLLENBQUM5RCxDQUFELENBQVo7QUFDRDs7QUFDRCxRQUFNaUUsSUFBSSxHQUFHSCxLQUFLLENBQUM5RCxDQUFELENBQWxCO0FBQ0EsUUFBTWtFLGtCQUFrQixHQUFHLE1BQU1ELElBQUksQ0FBQ2QsTUFBTCxHQUFjLENBQS9DO0FBQ0EsU0FBT1csS0FBSyxDQUFDSSxrQkFBRCxDQUFMLEdBQTRCRCxJQUFuQztBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlIGdvb2dsZSBBUEkuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5cbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGp3dCA9IHJlcXVpcmUoJ2pzb253ZWJ0b2tlbicpO1xuXG5jb25zdCBUT0tFTl9JU1NVRVIgPSAnYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5jb25zdCBIVFRQU19UT0tFTl9JU1NVRVIgPSAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tJztcblxubGV0IGNhY2hlID0ge307XG5cbi8vIFJldHJpZXZlIEdvb2dsZSBTaWduaW4gS2V5cyAod2l0aCBjYWNoZSBjb250cm9sKVxuZnVuY3Rpb24gZ2V0R29vZ2xlS2V5QnlLZXlJZChrZXlJZCkge1xuICBpZiAoY2FjaGVba2V5SWRdICYmIGNhY2hlLmV4cGlyZXNBdCA+IG5ldyBEYXRlKCkpIHtcbiAgICByZXR1cm4gY2FjaGVba2V5SWRdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwc1xuICAgICAgLmdldChgaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vb2F1dGgyL3YzL2NlcnRzYCwgcmVzID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5cyB9ID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBjb25zdCBwZW1zID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgICAgICAocGVtcywgeyBuOiBtb2R1bHVzLCBlOiBleHBvc2FudCwga2lkIH0pID0+XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGVtcywge1xuICAgICAgICAgICAgICAgIFtraWRdOiByc2FQdWJsaWNLZXlUb1BFTShtb2R1bHVzLCBleHBvc2FudCksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICAgICAgICAgIHZhciBleHBpcmUgPSByZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG5cbiAgICAgICAgICAgIGlmIChleHBpcmUpIHtcbiAgICAgICAgICAgICAgY2FjaGUgPSBPYmplY3QuYXNzaWduKHt9LCBwZW1zLCB7XG4gICAgICAgICAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIE51bWJlcihleHBpcmVbMV0pICogMTAwMCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocGVtc1trZXlJZF0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlckZyb21Ub2tlbih0b2tlbikge1xuICBjb25zdCBkZWNvZGVkVG9rZW4gPSBqd3QuZGVjb2RlKHRva2VuLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBwcm92aWRlZCB0b2tlbiBkb2VzIG5vdCBkZWNvZGUgYXMgSldUYCk7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZFRva2VuLmhlYWRlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5SWRUb2tlbih7IGlkX3Rva2VuOiB0b2tlbiwgaWQgfSwgeyBjbGllbnRJZCB9KSB7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYGlkIHRva2VuIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci5gKTtcbiAgfVxuXG4gIGNvbnN0IHsga2lkOiBrZXlJZCwgYWxnOiBhbGdvcml0aG0gfSA9IGdldEhlYWRlckZyb21Ub2tlbih0b2tlbik7XG4gIGxldCBqd3RDbGFpbXM7XG4gIGNvbnN0IGdvb2dsZUtleSA9IGF3YWl0IGdldEdvb2dsZUtleUJ5S2V5SWQoa2V5SWQpO1xuXG4gIHRyeSB7XG4gICAgand0Q2xhaW1zID0gand0LnZlcmlmeSh0b2tlbiwgZ29vZ2xlS2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBhbGdvcml0aG0sXG4gICAgICBhdWRpZW5jZTogY2xpZW50SWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYCR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuaXNzICE9PSBUT0tFTl9JU1NVRVIgJiYgand0Q2xhaW1zLmlzcyAhPT0gSFRUUFNfVE9LRU5fSVNTVUVSKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBpZCB0b2tlbiBub3QgaXNzdWVkIGJ5IGNvcnJlY3QgcHJvdmlkZXIgLSBleHBlY3RlZDogJHtUT0tFTl9JU1NVRVJ9IG9yICR7SFRUUFNfVE9LRU5fSVNTVUVSfSB8IGZyb206ICR7and0Q2xhaW1zLmlzc31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuc3ViICE9PSBpZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgYXV0aCBkYXRhIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci5gKTtcbiAgfVxuXG4gIGlmIChjbGllbnRJZCAmJiBqd3RDbGFpbXMuYXVkICE9PSBjbGllbnRJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgY2xpZW50SWQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gand0Q2xhaW1zO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gdmVyaWZ5SWRUb2tlbihhdXRoRGF0YSwgb3B0aW9ucyk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcblxuLy8gSGVscGVycyBmdW5jdGlvbnMgdG8gY29udmVydCB0aGUgUlNBIGNlcnRzIHRvIFBFTSAoZnJvbSBqd2tzLXJzYSlcbmZ1bmN0aW9uIHJzYVB1YmxpY0tleVRvUEVNKG1vZHVsdXNCNjQsIGV4cG9uZW50QjY0KSB7XG4gIGNvbnN0IG1vZHVsdXMgPSBuZXcgQnVmZmVyKG1vZHVsdXNCNjQsICdiYXNlNjQnKTtcbiAgY29uc3QgZXhwb25lbnQgPSBuZXcgQnVmZmVyKGV4cG9uZW50QjY0LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IG1vZHVsdXNIZXggPSBwcmVwYWRTaWduZWQobW9kdWx1cy50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBleHBvbmVudEhleCA9IHByZXBhZFNpZ25lZChleHBvbmVudC50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBtb2RsZW4gPSBtb2R1bHVzSGV4Lmxlbmd0aCAvIDI7XG4gIGNvbnN0IGV4cGxlbiA9IGV4cG9uZW50SGV4Lmxlbmd0aCAvIDI7XG5cbiAgY29uc3QgZW5jb2RlZE1vZGxlbiA9IGVuY29kZUxlbmd0aEhleChtb2RsZW4pO1xuICBjb25zdCBlbmNvZGVkRXhwbGVuID0gZW5jb2RlTGVuZ3RoSGV4KGV4cGxlbik7XG4gIGNvbnN0IGVuY29kZWRQdWJrZXkgPVxuICAgICczMCcgK1xuICAgIGVuY29kZUxlbmd0aEhleChtb2RsZW4gKyBleHBsZW4gKyBlbmNvZGVkTW9kbGVuLmxlbmd0aCAvIDIgKyBlbmNvZGVkRXhwbGVuLmxlbmd0aCAvIDIgKyAyKSArXG4gICAgJzAyJyArXG4gICAgZW5jb2RlZE1vZGxlbiArXG4gICAgbW9kdWx1c0hleCArXG4gICAgJzAyJyArXG4gICAgZW5jb2RlZEV4cGxlbiArXG4gICAgZXhwb25lbnRIZXg7XG5cbiAgY29uc3QgZGVyID0gbmV3IEJ1ZmZlcihlbmNvZGVkUHVia2V5LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIGxldCBwZW0gPSAnLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tXFxuJztcbiAgcGVtICs9IGAke2Rlci5tYXRjaCgvLnsxLDY0fS9nKS5qb2luKCdcXG4nKX1gO1xuICBwZW0gKz0gJ1xcbi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS1cXG4nO1xuICByZXR1cm4gcGVtO1xufVxuXG5mdW5jdGlvbiBwcmVwYWRTaWduZWQoaGV4U3RyKSB7XG4gIGNvbnN0IG1zYiA9IGhleFN0clswXTtcbiAgaWYgKG1zYiA8ICcwJyB8fCBtc2IgPiAnNycpIHtcbiAgICByZXR1cm4gYDAwJHtoZXhTdHJ9YDtcbiAgfVxuICByZXR1cm4gaGV4U3RyO1xufVxuXG5mdW5jdGlvbiB0b0hleChudW1iZXIpIHtcbiAgY29uc3QgbnN0ciA9IG51bWJlci50b1N0cmluZygxNik7XG4gIGlmIChuc3RyLmxlbmd0aCAlIDIpIHtcbiAgICByZXR1cm4gYDAke25zdHJ9YDtcbiAgfVxuICByZXR1cm4gbnN0cjtcbn1cblxuZnVuY3Rpb24gZW5jb2RlTGVuZ3RoSGV4KG4pIHtcbiAgaWYgKG4gPD0gMTI3KSB7XG4gICAgcmV0dXJuIHRvSGV4KG4pO1xuICB9XG4gIGNvbnN0IG5IZXggPSB0b0hleChuKTtcbiAgY29uc3QgbGVuZ3RoT2ZMZW5ndGhCeXRlID0gMTI4ICsgbkhleC5sZW5ndGggLyAyO1xuICByZXR1cm4gdG9IZXgobGVuZ3RoT2ZMZW5ndGhCeXRlKSArIG5IZXg7XG59XG4iXX0=
|
|
144
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwcyIsImp3dCIsIlRPS0VOX0lTU1VFUiIsIkhUVFBTX1RPS0VOX0lTU1VFUiIsImNhY2hlIiwiZ2V0R29vZ2xlS2V5QnlLZXlJZCIsImtleUlkIiwiZXhwaXJlc0F0IiwiRGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImtleXMiLCJKU09OIiwicGFyc2UiLCJwZW1zIiwicmVkdWNlIiwibiIsIm1vZHVsdXMiLCJlIiwiZXhwb3NhbnQiLCJraWQiLCJPYmplY3QiLCJhc3NpZ24iLCJyc2FQdWJsaWNLZXlUb1BFTSIsImhlYWRlcnMiLCJleHBpcmUiLCJtYXRjaCIsImdldFRpbWUiLCJOdW1iZXIiLCJnZXRIZWFkZXJGcm9tVG9rZW4iLCJ0b2tlbiIsImRlY29kZWRUb2tlbiIsImRlY29kZSIsImNvbXBsZXRlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiaGVhZGVyIiwidmVyaWZ5SWRUb2tlbiIsImlkX3Rva2VuIiwiaWQiLCJjbGllbnRJZCIsImFsZyIsImFsZ29yaXRobSIsImp3dENsYWltcyIsImdvb2dsZUtleSIsInZlcmlmeSIsImFsZ29yaXRobXMiLCJhdWRpZW5jZSIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJpc3MiLCJzdWIiLCJhdWQiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJvcHRpb25zIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bHVzQjY0IiwiZXhwb25lbnRCNjQiLCJCdWZmZXIiLCJleHBvbmVudCIsIm1vZHVsdXNIZXgiLCJwcmVwYWRTaWduZWQiLCJleHBvbmVudEhleCIsIm1vZGxlbiIsImxlbmd0aCIsImV4cGxlbiIsImVuY29kZWRNb2RsZW4iLCJlbmNvZGVMZW5ndGhIZXgiLCJlbmNvZGVkRXhwbGVuIiwiZW5jb2RlZFB1YmtleSIsImRlciIsInBlbSIsImpvaW4iLCJoZXhTdHIiLCJtc2IiLCJ0b0hleCIsIm51bWJlciIsIm5zdHIiLCJuSGV4IiwibGVuZ3RoT2ZMZW5ndGhCeXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ29vZ2xlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZSBnb29nbGUgQVBJLlxudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCBqd3QgPSByZXF1aXJlKCdqc29ud2VidG9rZW4nKTtcblxuY29uc3QgVE9LRU5fSVNTVUVSID0gJ2FjY291bnRzLmdvb2dsZS5jb20nO1xuY29uc3QgSFRUUFNfVE9LRU5fSVNTVUVSID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5cbmxldCBjYWNoZSA9IHt9O1xuXG4vLyBSZXRyaWV2ZSBHb29nbGUgU2lnbmluIEtleXMgKHdpdGggY2FjaGUgY29udHJvbClcbmZ1bmN0aW9uIGdldEdvb2dsZUtleUJ5S2V5SWQoa2V5SWQpIHtcbiAgaWYgKGNhY2hlW2tleUlkXSAmJiBjYWNoZS5leHBpcmVzQXQgPiBuZXcgRGF0ZSgpKSB7XG4gICAgcmV0dXJuIGNhY2hlW2tleUlkXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQoYGh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92My9jZXJ0c2AsIHJlcyA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG4gICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGtleXMgfSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgY29uc3QgcGVtcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAgICAgKHBlbXMsIHsgbjogbW9kdWx1cywgZTogZXhwb3NhbnQsIGtpZCB9KSA9PlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHBlbXMsIHtcbiAgICAgICAgICAgICAgICBba2lkXTogcnNhUHVibGljS2V5VG9QRU0obW9kdWx1cywgZXhwb3NhbnQpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChyZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgICAgICAgICB2YXIgZXhwaXJlID0gcmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXS5tYXRjaCgvbWF4LWFnZT0oWzAtOV0rKS8pO1xuXG4gICAgICAgICAgICBpZiAoZXhwaXJlKSB7XG4gICAgICAgICAgICAgIGNhY2hlID0gT2JqZWN0LmFzc2lnbih7fSwgcGVtcywge1xuICAgICAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyBOdW1iZXIoZXhwaXJlWzFdKSAqIDEwMDApLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHBlbXNba2V5SWRdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJGcm9tVG9rZW4odG9rZW4pIHtcbiAgY29uc3QgZGVjb2RlZFRva2VuID0gand0LmRlY29kZSh0b2tlbiwgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcblxuICBpZiAoIWRlY29kZWRUb2tlbikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgcHJvdmlkZWQgdG9rZW4gZG9lcyBub3QgZGVjb2RlIGFzIEpXVGApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29kZWRUb2tlbi5oZWFkZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUlkVG9rZW4oeyBpZF90b2tlbjogdG9rZW4sIGlkIH0sIHsgY2xpZW50SWQgfSkge1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBpZCB0b2tlbiBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gIH1cblxuICBjb25zdCB7IGtpZDoga2V5SWQsIGFsZzogYWxnb3JpdGhtIH0gPSBnZXRIZWFkZXJGcm9tVG9rZW4odG9rZW4pO1xuICBsZXQgand0Q2xhaW1zO1xuICBjb25zdCBnb29nbGVLZXkgPSBhd2FpdCBnZXRHb29nbGVLZXlCeUtleUlkKGtleUlkKTtcblxuICB0cnkge1xuICAgIGp3dENsYWltcyA9IGp3dC52ZXJpZnkodG9rZW4sIGdvb2dsZUtleSwge1xuICAgICAgYWxnb3JpdGhtczogYWxnb3JpdGhtLFxuICAgICAgYXVkaWVuY2U6IGNsaWVudElkLFxuICAgIH0pO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGAke21lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLmlzcyAhPT0gVE9LRU5fSVNTVUVSICYmIGp3dENsYWltcy5pc3MgIT09IEhUVFBTX1RPS0VOX0lTU1VFUikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGlzc3VlZCBieSBjb3JyZWN0IHByb3ZpZGVyIC0gZXhwZWN0ZWQ6ICR7VE9LRU5fSVNTVUVSfSBvciAke0hUVFBTX1RPS0VOX0lTU1VFUn0gfCBmcm9tOiAke2p3dENsYWltcy5pc3N9YFxuICAgICk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLnN1YiAhPT0gaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYGF1dGggZGF0YSBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gIH1cblxuICBpZiAoY2xpZW50SWQgJiYgand0Q2xhaW1zLmF1ZCAhPT0gY2xpZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYGlkIHRva2VuIG5vdCBhdXRob3JpemVkIGZvciB0aGlzIGNsaWVudElkLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGp3dENsYWltcztcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHZlcmlmeUlkVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZDogdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YTogdmFsaWRhdGVBdXRoRGF0YSxcbn07XG5cbi8vIEhlbHBlcnMgZnVuY3Rpb25zIHRvIGNvbnZlcnQgdGhlIFJTQSBjZXJ0cyB0byBQRU0gKGZyb20gandrcy1yc2EpXG5mdW5jdGlvbiByc2FQdWJsaWNLZXlUb1BFTShtb2R1bHVzQjY0LCBleHBvbmVudEI2NCkge1xuICBjb25zdCBtb2R1bHVzID0gbmV3IEJ1ZmZlcihtb2R1bHVzQjY0LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGV4cG9uZW50ID0gbmV3IEJ1ZmZlcihleHBvbmVudEI2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBtb2R1bHVzSGV4ID0gcHJlcGFkU2lnbmVkKG1vZHVsdXMudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgZXhwb25lbnRIZXggPSBwcmVwYWRTaWduZWQoZXhwb25lbnQudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgbW9kbGVuID0gbW9kdWx1c0hleC5sZW5ndGggLyAyO1xuICBjb25zdCBleHBsZW4gPSBleHBvbmVudEhleC5sZW5ndGggLyAyO1xuXG4gIGNvbnN0IGVuY29kZWRNb2RsZW4gPSBlbmNvZGVMZW5ndGhIZXgobW9kbGVuKTtcbiAgY29uc3QgZW5jb2RlZEV4cGxlbiA9IGVuY29kZUxlbmd0aEhleChleHBsZW4pO1xuICBjb25zdCBlbmNvZGVkUHVia2V5ID1cbiAgICAnMzAnICtcbiAgICBlbmNvZGVMZW5ndGhIZXgobW9kbGVuICsgZXhwbGVuICsgZW5jb2RlZE1vZGxlbi5sZW5ndGggLyAyICsgZW5jb2RlZEV4cGxlbi5sZW5ndGggLyAyICsgMikgK1xuICAgICcwMicgK1xuICAgIGVuY29kZWRNb2RsZW4gK1xuICAgIG1vZHVsdXNIZXggK1xuICAgICcwMicgK1xuICAgIGVuY29kZWRFeHBsZW4gK1xuICAgIGV4cG9uZW50SGV4O1xuXG4gIGNvbnN0IGRlciA9IG5ldyBCdWZmZXIoZW5jb2RlZFB1YmtleSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICBsZXQgcGVtID0gJy0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLVxcbic7XG4gIHBlbSArPSBgJHtkZXIubWF0Y2goLy57MSw2NH0vZykuam9pbignXFxuJyl9YDtcbiAgcGVtICs9ICdcXG4tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tXFxuJztcbiAgcmV0dXJuIHBlbTtcbn1cblxuZnVuY3Rpb24gcHJlcGFkU2lnbmVkKGhleFN0cikge1xuICBjb25zdCBtc2IgPSBoZXhTdHJbMF07XG4gIGlmIChtc2IgPCAnMCcgfHwgbXNiID4gJzcnKSB7XG4gICAgcmV0dXJuIGAwMCR7aGV4U3RyfWA7XG4gIH1cbiAgcmV0dXJuIGhleFN0cjtcbn1cblxuZnVuY3Rpb24gdG9IZXgobnVtYmVyKSB7XG4gIGNvbnN0IG5zdHIgPSBudW1iZXIudG9TdHJpbmcoMTYpO1xuICBpZiAobnN0ci5sZW5ndGggJSAyKSB7XG4gICAgcmV0dXJuIGAwJHtuc3RyfWA7XG4gIH1cbiAgcmV0dXJuIG5zdHI7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUxlbmd0aEhleChuKSB7XG4gIGlmIChuIDw9IDEyNykge1xuICAgIHJldHVybiB0b0hleChuKTtcbiAgfVxuICBjb25zdCBuSGV4ID0gdG9IZXgobik7XG4gIGNvbnN0IGxlbmd0aE9mTGVuZ3RoQnl0ZSA9IDEyOCArIG5IZXgubGVuZ3RoIC8gMjtcbiAgcmV0dXJuIHRvSGV4KGxlbmd0aE9mTGVuZ3RoQnl0ZSkgKyBuSGV4O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUVaO0FBQ0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNELEtBQUs7QUFFdkMsTUFBTUUsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzlCLE1BQU1FLEdBQUcsR0FBR0YsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUVuQyxNQUFNRyxZQUFZLEdBQUcscUJBQXFCO0FBQzFDLE1BQU1DLGtCQUFrQixHQUFHLDZCQUE2QjtBQUV4RCxJQUFJQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztBQUVkO0FBQ0EsU0FBU0MsbUJBQW1CLENBQUNDLEtBQUssRUFBRTtFQUNsQyxJQUFJRixLQUFLLENBQUNFLEtBQUssQ0FBQyxJQUFJRixLQUFLLENBQUNHLFNBQVMsR0FBRyxJQUFJQyxJQUFJLEVBQUUsRUFBRTtJQUNoRCxPQUFPSixLQUFLLENBQUNFLEtBQUssQ0FBQztFQUNyQjtFQUVBLE9BQU8sSUFBSUcsT0FBTyxDQUFDLENBQUNDLE9BQU8sRUFBRUMsTUFBTSxLQUFLO0lBQ3RDWCxLQUFLLENBQ0ZZLEdBQUcsQ0FBRSw0Q0FBMkMsRUFBRUMsR0FBRyxJQUFJO01BQ3hELElBQUlDLElBQUksR0FBRyxFQUFFO01BQ2JELEdBQUcsQ0FBQ0UsRUFBRSxDQUFDLE1BQU0sRUFBRUMsS0FBSyxJQUFJO1FBQ3RCRixJQUFJLElBQUlFLEtBQUssQ0FBQ0MsUUFBUSxDQUFDLE1BQU0sQ0FBQztNQUNoQyxDQUFDLENBQUM7TUFDRkosR0FBRyxDQUFDRSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU07UUFDbEIsTUFBTTtVQUFFRztRQUFLLENBQUMsR0FBR0MsSUFBSSxDQUFDQyxLQUFLLENBQUNOLElBQUksQ0FBQztRQUNqQyxNQUFNTyxJQUFJLEdBQUdILElBQUksQ0FBQ0ksTUFBTSxDQUN0QixDQUFDRCxJQUFJLEVBQUU7VUFBRUUsQ0FBQyxFQUFFQyxPQUFPO1VBQUVDLENBQUMsRUFBRUMsUUFBUTtVQUFFQztRQUFJLENBQUMsS0FDckNDLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDUixJQUFJLEVBQUU7VUFDbEIsQ0FBQ00sR0FBRyxHQUFHRyxpQkFBaUIsQ0FBQ04sT0FBTyxFQUFFRSxRQUFRO1FBQzVDLENBQUMsQ0FBQyxFQUNKLENBQUMsQ0FBQyxDQUNIO1FBRUQsSUFBSWIsR0FBRyxDQUFDa0IsT0FBTyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1VBQ2hDLElBQUlDLE1BQU0sR0FBR25CLEdBQUcsQ0FBQ2tCLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQ0UsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1VBRW5FLElBQUlELE1BQU0sRUFBRTtZQUNWNUIsS0FBSyxHQUFHd0IsTUFBTSxDQUFDQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUVSLElBQUksRUFBRTtjQUM5QmQsU0FBUyxFQUFFLElBQUlDLElBQUksQ0FBQyxJQUFJQSxJQUFJLEVBQUUsQ0FBQzBCLE9BQU8sRUFBRSxHQUFHQyxNQUFNLENBQUNILE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUk7WUFDckUsQ0FBQyxDQUFDO1VBQ0o7UUFDRjtRQUVBdEIsT0FBTyxDQUFDVyxJQUFJLENBQUNmLEtBQUssQ0FBQyxDQUFDO01BQ3RCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUNEUyxFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7RUFDeEIsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxTQUFTeUIsa0JBQWtCLENBQUNDLEtBQUssRUFBRTtFQUNqQyxNQUFNQyxZQUFZLEdBQUdyQyxHQUFHLENBQUNzQyxNQUFNLENBQUNGLEtBQUssRUFBRTtJQUFFRyxRQUFRLEVBQUU7RUFBSyxDQUFDLENBQUM7RUFFMUQsSUFBSSxDQUFDRixZQUFZLEVBQUU7SUFDakIsTUFBTSxJQUFJeEMsS0FBSyxDQUFDMkMsS0FBSyxDQUFDM0MsS0FBSyxDQUFDMkMsS0FBSyxDQUFDQyxnQkFBZ0IsRUFBRyx1Q0FBc0MsQ0FBQztFQUM5RjtFQUVBLE9BQU9KLFlBQVksQ0FBQ0ssTUFBTTtBQUM1QjtBQUVBLGVBQWVDLGFBQWEsQ0FBQztFQUFFQyxRQUFRLEVBQUVSLEtBQUs7RUFBRVM7QUFBRyxDQUFDLEVBQUU7RUFBRUM7QUFBUyxDQUFDLEVBQUU7RUFDbEUsSUFBSSxDQUFDVixLQUFLLEVBQUU7SUFDVixNQUFNLElBQUl2QyxLQUFLLENBQUMyQyxLQUFLLENBQUMzQyxLQUFLLENBQUMyQyxLQUFLLENBQUNDLGdCQUFnQixFQUFHLG9DQUFtQyxDQUFDO0VBQzNGO0VBRUEsTUFBTTtJQUFFZixHQUFHLEVBQUVyQixLQUFLO0lBQUUwQyxHQUFHLEVBQUVDO0VBQVUsQ0FBQyxHQUFHYixrQkFBa0IsQ0FBQ0MsS0FBSyxDQUFDO0VBQ2hFLElBQUlhLFNBQVM7RUFDYixNQUFNQyxTQUFTLEdBQUcsTUFBTTlDLG1CQUFtQixDQUFDQyxLQUFLLENBQUM7RUFFbEQsSUFBSTtJQUNGNEMsU0FBUyxHQUFHakQsR0FBRyxDQUFDbUQsTUFBTSxDQUFDZixLQUFLLEVBQUVjLFNBQVMsRUFBRTtNQUN2Q0UsVUFBVSxFQUFFSixTQUFTO01BQ3JCSyxRQUFRLEVBQUVQO0lBQ1osQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDLE9BQU9RLFNBQVMsRUFBRTtJQUNsQixNQUFNQyxPQUFPLEdBQUdELFNBQVMsQ0FBQ0MsT0FBTztJQUNqQyxNQUFNLElBQUkxRCxLQUFLLENBQUMyQyxLQUFLLENBQUMzQyxLQUFLLENBQUMyQyxLQUFLLENBQUNDLGdCQUFnQixFQUFHLEdBQUVjLE9BQVEsRUFBQyxDQUFDO0VBQ25FO0VBRUEsSUFBSU4sU0FBUyxDQUFDTyxHQUFHLEtBQUt2RCxZQUFZLElBQUlnRCxTQUFTLENBQUNPLEdBQUcsS0FBS3RELGtCQUFrQixFQUFFO0lBQzFFLE1BQU0sSUFBSUwsS0FBSyxDQUFDMkMsS0FBSyxDQUNuQjNDLEtBQUssQ0FBQzJDLEtBQUssQ0FBQ0MsZ0JBQWdCLEVBQzNCLHVEQUFzRHhDLFlBQWEsT0FBTUMsa0JBQW1CLFlBQVcrQyxTQUFTLENBQUNPLEdBQUksRUFBQyxDQUN4SDtFQUNIO0VBRUEsSUFBSVAsU0FBUyxDQUFDUSxHQUFHLEtBQUtaLEVBQUUsRUFBRTtJQUN4QixNQUFNLElBQUloRCxLQUFLLENBQUMyQyxLQUFLLENBQUMzQyxLQUFLLENBQUMyQyxLQUFLLENBQUNDLGdCQUFnQixFQUFHLHFDQUFvQyxDQUFDO0VBQzVGO0VBRUEsSUFBSUssUUFBUSxJQUFJRyxTQUFTLENBQUNTLEdBQUcsS0FBS1osUUFBUSxFQUFFO0lBQzFDLE1BQU0sSUFBSWpELEtBQUssQ0FBQzJDLEtBQUssQ0FDbkIzQyxLQUFLLENBQUMyQyxLQUFLLENBQUNDLGdCQUFnQixFQUMzQiw0Q0FBMkMsQ0FDN0M7RUFDSDtFQUVBLE9BQU9RLFNBQVM7QUFDbEI7O0FBRUE7QUFDQSxTQUFTVSxnQkFBZ0IsQ0FBQ0MsUUFBUSxFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDaEQsT0FBT2xCLGFBQWEsQ0FBQ2lCLFFBQVEsRUFBRUMsT0FBTyxDQUFDO0FBQ3pDOztBQUVBO0FBQ0EsU0FBU0MsYUFBYSxHQUFHO0VBQ3ZCLE9BQU90RCxPQUFPLENBQUNDLE9BQU8sRUFBRTtBQUMxQjtBQUVBc0QsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFDZkYsYUFBYSxFQUFFQSxhQUFhO0VBQzVCSCxnQkFBZ0IsRUFBRUE7QUFDcEIsQ0FBQzs7QUFFRDtBQUNBLFNBQVM5QixpQkFBaUIsQ0FBQ29DLFVBQVUsRUFBRUMsV0FBVyxFQUFFO0VBQ2xELE1BQU0zQyxPQUFPLEdBQUcsSUFBSTRDLE1BQU0sQ0FBQ0YsVUFBVSxFQUFFLFFBQVEsQ0FBQztFQUNoRCxNQUFNRyxRQUFRLEdBQUcsSUFBSUQsTUFBTSxDQUFDRCxXQUFXLEVBQUUsUUFBUSxDQUFDO0VBQ2xELE1BQU1HLFVBQVUsR0FBR0MsWUFBWSxDQUFDL0MsT0FBTyxDQUFDUCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDeEQsTUFBTXVELFdBQVcsR0FBR0QsWUFBWSxDQUFDRixRQUFRLENBQUNwRCxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDMUQsTUFBTXdELE1BQU0sR0FBR0gsVUFBVSxDQUFDSSxNQUFNLEdBQUcsQ0FBQztFQUNwQyxNQUFNQyxNQUFNLEdBQUdILFdBQVcsQ0FBQ0UsTUFBTSxHQUFHLENBQUM7RUFFckMsTUFBTUUsYUFBYSxHQUFHQyxlQUFlLENBQUNKLE1BQU0sQ0FBQztFQUM3QyxNQUFNSyxhQUFhLEdBQUdELGVBQWUsQ0FBQ0YsTUFBTSxDQUFDO0VBQzdDLE1BQU1JLGFBQWEsR0FDakIsSUFBSSxHQUNKRixlQUFlLENBQUNKLE1BQU0sR0FBR0UsTUFBTSxHQUFHQyxhQUFhLENBQUNGLE1BQU0sR0FBRyxDQUFDLEdBQUdJLGFBQWEsQ0FBQ0osTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FDMUYsSUFBSSxHQUNKRSxhQUFhLEdBQ2JOLFVBQVUsR0FDVixJQUFJLEdBQ0pRLGFBQWEsR0FDYk4sV0FBVztFQUViLE1BQU1RLEdBQUcsR0FBRyxJQUFJWixNQUFNLENBQUNXLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQzlELFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFFL0QsSUFBSWdFLEdBQUcsR0FBRyxrQ0FBa0M7RUFDNUNBLEdBQUcsSUFBSyxHQUFFRCxHQUFHLENBQUMvQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUNpRCxJQUFJLENBQUMsSUFBSSxDQUFFLEVBQUM7RUFDNUNELEdBQUcsSUFBSSxrQ0FBa0M7RUFDekMsT0FBT0EsR0FBRztBQUNaO0FBRUEsU0FBU1YsWUFBWSxDQUFDWSxNQUFNLEVBQUU7RUFDNUIsTUFBTUMsR0FBRyxHQUFHRCxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLElBQUlDLEdBQUcsR0FBRyxHQUFHLElBQUlBLEdBQUcsR0FBRyxHQUFHLEVBQUU7SUFDMUIsT0FBUSxLQUFJRCxNQUFPLEVBQUM7RUFDdEI7RUFDQSxPQUFPQSxNQUFNO0FBQ2Y7QUFFQSxTQUFTRSxLQUFLLENBQUNDLE1BQU0sRUFBRTtFQUNyQixNQUFNQyxJQUFJLEdBQUdELE1BQU0sQ0FBQ3JFLFFBQVEsQ0FBQyxFQUFFLENBQUM7RUFDaEMsSUFBSXNFLElBQUksQ0FBQ2IsTUFBTSxHQUFHLENBQUMsRUFBRTtJQUNuQixPQUFRLElBQUdhLElBQUssRUFBQztFQUNuQjtFQUNBLE9BQU9BLElBQUk7QUFDYjtBQUVBLFNBQVNWLGVBQWUsQ0FBQ3RELENBQUMsRUFBRTtFQUMxQixJQUFJQSxDQUFDLElBQUksR0FBRyxFQUFFO0lBQ1osT0FBTzhELEtBQUssQ0FBQzlELENBQUMsQ0FBQztFQUNqQjtFQUNBLE1BQU1pRSxJQUFJLEdBQUdILEtBQUssQ0FBQzlELENBQUMsQ0FBQztFQUNyQixNQUFNa0Usa0JBQWtCLEdBQUcsR0FBRyxHQUFHRCxJQUFJLENBQUNkLE1BQU0sR0FBRyxDQUFDO0VBQ2hELE9BQU9XLEtBQUssQ0FBQ0ksa0JBQWtCLENBQUMsR0FBR0QsSUFBSTtBQUN6QyJ9
|
|
@@ -11,25 +11,22 @@ const authData = {
|
|
|
11
11
|
const {
|
|
12
12
|
Parse
|
|
13
13
|
} = require('parse/node');
|
|
14
|
+
const httpsRequest = require('./httpsRequest');
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
// Returns a promise that fulfills if this user id is valid.
|
|
18
17
|
async function validateAuthData(authData) {
|
|
19
18
|
const response = await httpsRequest.get(`https://www.googleapis.com/games/v1/players/${authData.id}?access_token=${authData.access_token}`);
|
|
20
|
-
|
|
21
19
|
if (!(response && response.playerId === authData.id)) {
|
|
22
20
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Google Play Games Services - authData is invalid for this user.');
|
|
23
21
|
}
|
|
24
|
-
}
|
|
25
|
-
|
|
22
|
+
}
|
|
26
23
|
|
|
24
|
+
// Returns a promise that fulfills if this app id is valid.
|
|
27
25
|
function validateAppId() {
|
|
28
26
|
return Promise.resolve();
|
|
29
27
|
}
|
|
30
|
-
|
|
31
28
|
module.exports = {
|
|
32
29
|
validateAppId,
|
|
33
30
|
validateAuthData
|
|
34
31
|
};
|
|
35
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXNwb25zZSIsImdldCIsImlkIiwiYWNjZXNzX3Rva2VuIiwicGxheWVySWQiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUFwcElkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ3BnYW1lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBHb29nbGUgUGxheSBHYW1lIFNlcnZpY2VzXG5odHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nYW1lcy9zZXJ2aWNlcy93ZWIvYXBpL3BsYXllcnMvZ2V0XG5cbmNvbnN0IGF1dGhEYXRhID0ge1xuICBpZDogJ3BsYXllcklkJyxcbiAgYWNjZXNzX3Rva2VuOiAndG9rZW4nLFxufTtcbiovXG5jb25zdCB7IFBhcnNlIH0gPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG5jb25zdCBodHRwc1JlcXVlc3QgPSByZXF1aXJlKCcuL2h0dHBzUmVxdWVzdCcpO1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwc1JlcXVlc3QuZ2V0KFxuICAgIGBodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9nYW1lcy92MS9wbGF5ZXJzLyR7YXV0aERhdGEuaWR9P2FjY2Vzc190b2tlbj0ke2F1dGhEYXRhLmFjY2Vzc190b2tlbn1gXG4gICk7XG4gIGlmICghKHJlc3BvbnNlICYmIHJlc3BvbnNlLnBsYXllcklkID09PSBhdXRoRGF0YS5pZCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0dvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzIC0gYXV0aERhdGEgaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLidcbiAgICApO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtFQUFFQTtBQUFNLENBQUMsR0FBR0MsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN2QyxNQUFNQyxZQUFZLEdBQUdELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs7QUFFOUM7QUFDQSxlQUFlRSxnQkFBZ0IsQ0FBQ0MsUUFBUSxFQUFFO0VBQ3hDLE1BQU1DLFFBQVEsR0FBRyxNQUFNSCxZQUFZLENBQUNJLEdBQUcsQ0FDcEMsK0NBQThDRixRQUFRLENBQUNHLEVBQUcsaUJBQWdCSCxRQUFRLENBQUNJLFlBQWEsRUFBQyxDQUNuRztFQUNELElBQUksRUFBRUgsUUFBUSxJQUFJQSxRQUFRLENBQUNJLFFBQVEsS0FBS0wsUUFBUSxDQUFDRyxFQUFFLENBQUMsRUFBRTtJQUNwRCxNQUFNLElBQUlQLEtBQUssQ0FBQ1UsS0FBSyxDQUNuQlYsS0FBSyxDQUFDVSxLQUFLLENBQUNDLGdCQUFnQixFQUM1QixpRUFBaUUsQ0FDbEU7RUFDSDtBQUNGOztBQUVBO0FBQ0EsU0FBU0MsYUFBYSxHQUFHO0VBQ3ZCLE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO0FBQzFCO0FBRUFDLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2ZKLGFBQWE7RUFDYlQ7QUFDRixDQUFDIn0=
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
const https = require('https');
|
|
4
|
-
|
|
5
4
|
function makeCallback(resolve, reject, noJSON) {
|
|
6
5
|
return function (res) {
|
|
7
6
|
let data = '';
|
|
@@ -12,25 +11,21 @@ function makeCallback(resolve, reject, noJSON) {
|
|
|
12
11
|
if (noJSON) {
|
|
13
12
|
return resolve(data);
|
|
14
13
|
}
|
|
15
|
-
|
|
16
14
|
try {
|
|
17
15
|
data = JSON.parse(data);
|
|
18
16
|
} catch (e) {
|
|
19
17
|
return reject(e);
|
|
20
18
|
}
|
|
21
|
-
|
|
22
19
|
resolve(data);
|
|
23
20
|
});
|
|
24
21
|
res.on('error', reject);
|
|
25
22
|
};
|
|
26
23
|
}
|
|
27
|
-
|
|
28
24
|
function get(options, noJSON = false) {
|
|
29
25
|
return new Promise((resolve, reject) => {
|
|
30
26
|
https.get(options, makeCallback(resolve, reject, noJSON)).on('error', reject);
|
|
31
27
|
});
|
|
32
28
|
}
|
|
33
|
-
|
|
34
29
|
function request(options, postData) {
|
|
35
30
|
return new Promise((resolve, reject) => {
|
|
36
31
|
const req = https.request(options, makeCallback(resolve, reject));
|
|
@@ -39,9 +34,8 @@ function request(options, postData) {
|
|
|
39
34
|
req.end();
|
|
40
35
|
});
|
|
41
36
|
}
|
|
42
|
-
|
|
43
37
|
module.exports = {
|
|
44
38
|
get,
|
|
45
39
|
request
|
|
46
40
|
};
|
|
47
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwcyIsInJlcXVpcmUiLCJtYWtlQ2FsbGJhY2siLCJyZXNvbHZlIiwicmVqZWN0Iiwibm9KU09OIiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJKU09OIiwicGFyc2UiLCJlIiwiZ2V0Iiwib3B0aW9ucyIsIlByb21pc2UiLCJyZXF1ZXN0IiwicG9zdERhdGEiLCJyZXEiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9odHRwc1JlcXVlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5mdW5jdGlvbiBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0LCBub0pTT04pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICBsZXQgZGF0YSA9ICcnO1xuICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBpZiAobm9KU09OKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGEpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuICAgIHJlcy5vbignZXJyb3InLCByZWplY3QpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXQob3B0aW9ucywgbm9KU09OID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwcy5nZXQob3B0aW9ucywgbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCwgbm9KU09OKSkub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3Qob3B0aW9ucywgcG9zdERhdGEpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXEgPSBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICByZXEud3JpdGUocG9zdERhdGEpO1xuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBnZXQsIHJlcXVlc3QgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFFOUIsU0FBU0MsWUFBWSxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUFFO0VBQzdDLE9BQU8sVUFBVUMsR0FBRyxFQUFFO0lBQ3BCLElBQUlDLElBQUksR0FBRyxFQUFFO0lBQ2JELEdBQUcsQ0FBQ0UsRUFBRSxDQUFDLE1BQU0sRUFBRUMsS0FBSyxJQUFJO01BQ3RCRixJQUFJLElBQUlFLEtBQUs7SUFDZixDQUFDLENBQUM7SUFDRkgsR0FBRyxDQUFDRSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU07TUFDbEIsSUFBSUgsTUFBTSxFQUFFO1FBQ1YsT0FBT0YsT0FBTyxDQUFDSSxJQUFJLENBQUM7TUFDdEI7TUFDQSxJQUFJO1FBQ0ZBLElBQUksR0FBR0csSUFBSSxDQUFDQyxLQUFLLENBQUNKLElBQUksQ0FBQztNQUN6QixDQUFDLENBQUMsT0FBT0ssQ0FBQyxFQUFFO1FBQ1YsT0FBT1IsTUFBTSxDQUFDUSxDQUFDLENBQUM7TUFDbEI7TUFDQVQsT0FBTyxDQUFDSSxJQUFJLENBQUM7SUFDZixDQUFDLENBQUM7SUFDRkQsR0FBRyxDQUFDRSxFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7RUFDekIsQ0FBQztBQUNIO0FBRUEsU0FBU1MsR0FBRyxDQUFDQyxPQUFPLEVBQUVULE1BQU0sR0FBRyxLQUFLLEVBQUU7RUFDcEMsT0FBTyxJQUFJVSxPQUFPLENBQUMsQ0FBQ1osT0FBTyxFQUFFQyxNQUFNLEtBQUs7SUFDdENKLEtBQUssQ0FBQ2EsR0FBRyxDQUFDQyxPQUFPLEVBQUVaLFlBQVksQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLENBQUNHLEVBQUUsQ0FBQyxPQUFPLEVBQUVKLE1BQU0sQ0FBQztFQUMvRSxDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVNZLE9BQU8sQ0FBQ0YsT0FBTyxFQUFFRyxRQUFRLEVBQUU7RUFDbEMsT0FBTyxJQUFJRixPQUFPLENBQUMsQ0FBQ1osT0FBTyxFQUFFQyxNQUFNLEtBQUs7SUFDdEMsTUFBTWMsR0FBRyxHQUFHbEIsS0FBSyxDQUFDZ0IsT0FBTyxDQUFDRixPQUFPLEVBQUVaLFlBQVksQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLENBQUMsQ0FBQztJQUNqRWMsR0FBRyxDQUFDVixFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7SUFDdkJjLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixRQUFRLENBQUM7SUFDbkJDLEdBQUcsQ0FBQ0UsR0FBRyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ0o7QUFFQUMsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFBRVQsR0FBRztFQUFFRztBQUFRLENBQUMifQ==
|
|
@@ -1,60 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _AdapterLoader = _interopRequireDefault(require("../AdapterLoader"));
|
|
4
|
-
|
|
5
4
|
var _node = _interopRequireDefault(require("parse/node"));
|
|
6
|
-
|
|
7
5
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
8
|
-
|
|
9
6
|
const apple = require('./apple');
|
|
10
|
-
|
|
11
7
|
const gcenter = require('./gcenter');
|
|
12
|
-
|
|
13
8
|
const gpgames = require('./gpgames');
|
|
14
|
-
|
|
15
9
|
const facebook = require('./facebook');
|
|
16
|
-
|
|
17
10
|
const instagram = require('./instagram');
|
|
18
|
-
|
|
19
11
|
const linkedin = require('./linkedin');
|
|
20
|
-
|
|
21
12
|
const meetup = require('./meetup');
|
|
22
|
-
|
|
23
13
|
const google = require('./google');
|
|
24
|
-
|
|
25
14
|
const github = require('./github');
|
|
26
|
-
|
|
27
15
|
const twitter = require('./twitter');
|
|
28
|
-
|
|
29
16
|
const spotify = require('./spotify');
|
|
30
|
-
|
|
31
17
|
const digits = require('./twitter'); // digits tokens are validated by twitter
|
|
32
|
-
|
|
33
|
-
|
|
34
18
|
const janrainengage = require('./janrainengage');
|
|
35
|
-
|
|
36
19
|
const janraincapture = require('./janraincapture');
|
|
37
|
-
|
|
38
20
|
const line = require('./line');
|
|
39
|
-
|
|
40
21
|
const vkontakte = require('./vkontakte');
|
|
41
|
-
|
|
42
22
|
const qq = require('./qq');
|
|
43
|
-
|
|
44
23
|
const wechat = require('./wechat');
|
|
45
|
-
|
|
46
24
|
const weibo = require('./weibo');
|
|
47
|
-
|
|
48
25
|
const oauth2 = require('./oauth2');
|
|
49
|
-
|
|
50
26
|
const phantauth = require('./phantauth');
|
|
51
|
-
|
|
52
27
|
const microsoft = require('./microsoft');
|
|
53
|
-
|
|
54
28
|
const keycloak = require('./keycloak');
|
|
55
|
-
|
|
56
29
|
const ldap = require('./ldap');
|
|
57
|
-
|
|
58
30
|
const anonymous = {
|
|
59
31
|
validateAuthData: () => {
|
|
60
32
|
return Promise.resolve();
|
|
@@ -88,40 +60,34 @@ const providers = {
|
|
|
88
60
|
microsoft,
|
|
89
61
|
keycloak,
|
|
90
62
|
ldap
|
|
91
|
-
};
|
|
63
|
+
};
|
|
92
64
|
|
|
65
|
+
// Indexed auth policies
|
|
93
66
|
const authAdapterPolicies = {
|
|
94
67
|
default: true,
|
|
95
68
|
solo: true,
|
|
96
69
|
additional: true
|
|
97
70
|
};
|
|
98
|
-
|
|
99
71
|
function authDataValidator(provider, adapter, appIds, options) {
|
|
100
72
|
return async function (authData, req, user, requestObject) {
|
|
101
73
|
if (appIds && typeof adapter.validateAppId === 'function') {
|
|
102
74
|
await Promise.resolve(adapter.validateAppId(appIds, authData, options, requestObject));
|
|
103
75
|
}
|
|
104
|
-
|
|
105
76
|
if (adapter.policy && !authAdapterPolicies[adapter.policy]) {
|
|
106
77
|
throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'AuthAdapter policy is not configured correctly. The value must be either "solo", "additional", "default" or undefined (will be handled as "default")');
|
|
107
78
|
}
|
|
108
|
-
|
|
109
79
|
if (typeof adapter.validateAuthData === 'function') {
|
|
110
80
|
return adapter.validateAuthData(authData, options, requestObject);
|
|
111
81
|
}
|
|
112
|
-
|
|
113
82
|
if (typeof adapter.validateSetUp !== 'function' || typeof adapter.validateLogin !== 'function' || typeof adapter.validateUpdate !== 'function') {
|
|
114
83
|
throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'Adapter is not configured. Implement either validateAuthData or all of the following: validateSetUp, validateLogin and validateUpdate');
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
84
|
+
}
|
|
85
|
+
// When masterKey is detected, we should trigger a logged in user
|
|
118
86
|
const isLoggedIn = req.auth.user && user && req.auth.user.id === user.id || user && req.auth.isMaster;
|
|
119
87
|
let hasAuthDataConfigured = false;
|
|
120
|
-
|
|
121
88
|
if (user && user.get('authData') && user.get('authData')[provider]) {
|
|
122
89
|
hasAuthDataConfigured = true;
|
|
123
90
|
}
|
|
124
|
-
|
|
125
91
|
if (isLoggedIn) {
|
|
126
92
|
// User is updating their authData
|
|
127
93
|
if (hasAuthDataConfigured) {
|
|
@@ -129,54 +95,50 @@ function authDataValidator(provider, adapter, appIds, options) {
|
|
|
129
95
|
method: 'validateUpdate',
|
|
130
96
|
validator: () => adapter.validateUpdate(authData, options, requestObject)
|
|
131
97
|
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
|
|
98
|
+
}
|
|
99
|
+
// Set up if the user does not have the provider configured
|
|
135
100
|
return {
|
|
136
101
|
method: 'validateSetUp',
|
|
137
102
|
validator: () => adapter.validateSetUp(authData, options, requestObject)
|
|
138
103
|
};
|
|
139
|
-
}
|
|
140
|
-
|
|
104
|
+
}
|
|
141
105
|
|
|
106
|
+
// Not logged in and authData is configured on the user
|
|
142
107
|
if (hasAuthDataConfigured) {
|
|
143
108
|
return {
|
|
144
109
|
method: 'validateLogin',
|
|
145
110
|
validator: () => adapter.validateLogin(authData, options, requestObject)
|
|
146
111
|
};
|
|
147
|
-
}
|
|
148
|
-
// signs up or an existing user uses a new auth provider
|
|
149
|
-
|
|
112
|
+
}
|
|
150
113
|
|
|
114
|
+
// User not logged in and the provider is not set up, for example when a new user
|
|
115
|
+
// signs up or an existing user uses a new auth provider
|
|
151
116
|
return {
|
|
152
117
|
method: 'validateSetUp',
|
|
153
118
|
validator: () => adapter.validateSetUp(authData, options, requestObject)
|
|
154
119
|
};
|
|
155
120
|
};
|
|
156
121
|
}
|
|
157
|
-
|
|
158
122
|
function loadAuthAdapter(provider, authOptions) {
|
|
159
123
|
// providers are auth providers implemented by default
|
|
160
|
-
let defaultAdapter = providers[provider];
|
|
124
|
+
let defaultAdapter = providers[provider];
|
|
125
|
+
// authOptions can contain complete custom auth adapters or
|
|
161
126
|
// a default auth adapter like Facebook
|
|
162
|
-
|
|
163
127
|
const providerOptions = authOptions[provider];
|
|
164
|
-
|
|
165
128
|
if (providerOptions && Object.prototype.hasOwnProperty.call(providerOptions, 'oauth2') && providerOptions['oauth2'] === true) {
|
|
166
129
|
defaultAdapter = oauth2;
|
|
167
|
-
}
|
|
168
|
-
|
|
130
|
+
}
|
|
169
131
|
|
|
132
|
+
// Default provider not found and a custom auth provider was not provided
|
|
170
133
|
if (!defaultAdapter && !providerOptions) {
|
|
171
134
|
return;
|
|
172
135
|
}
|
|
173
|
-
|
|
174
136
|
const adapter = Object.assign({}, defaultAdapter);
|
|
175
|
-
const appIds = providerOptions ? providerOptions.appIds : undefined;
|
|
137
|
+
const appIds = providerOptions ? providerOptions.appIds : undefined;
|
|
176
138
|
|
|
139
|
+
// Try the configuration methods
|
|
177
140
|
if (providerOptions) {
|
|
178
141
|
const optionalAdapter = (0, _AdapterLoader.default)(providerOptions, undefined, providerOptions);
|
|
179
|
-
|
|
180
142
|
if (optionalAdapter) {
|
|
181
143
|
['validateAuthData', 'validateAppId', 'validateSetUp', 'validateLogin', 'validateUpdate', 'challenge', 'policy'].forEach(key => {
|
|
182
144
|
if (optionalAdapter[key]) {
|
|
@@ -185,29 +147,24 @@ function loadAuthAdapter(provider, authOptions) {
|
|
|
185
147
|
});
|
|
186
148
|
}
|
|
187
149
|
}
|
|
188
|
-
|
|
189
150
|
return {
|
|
190
151
|
adapter,
|
|
191
152
|
appIds,
|
|
192
153
|
providerOptions
|
|
193
154
|
};
|
|
194
155
|
}
|
|
195
|
-
|
|
196
156
|
module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
|
|
197
157
|
let _enableAnonymousUsers = enableAnonymousUsers;
|
|
198
|
-
|
|
199
158
|
const setEnableAnonymousUsers = function (enable) {
|
|
200
159
|
_enableAnonymousUsers = enable;
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
|
|
160
|
+
};
|
|
161
|
+
// To handle the test cases on configuration
|
|
204
162
|
const getValidatorForProvider = function (provider) {
|
|
205
163
|
if (provider === 'anonymous' && !_enableAnonymousUsers) {
|
|
206
164
|
return {
|
|
207
165
|
validator: undefined
|
|
208
166
|
};
|
|
209
167
|
}
|
|
210
|
-
|
|
211
168
|
const authAdapter = loadAuthAdapter(provider, authOptions);
|
|
212
169
|
if (!authAdapter) return;
|
|
213
170
|
const {
|
|
@@ -220,12 +177,10 @@ module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
|
|
|
220
177
|
adapter
|
|
221
178
|
};
|
|
222
179
|
};
|
|
223
|
-
|
|
224
180
|
return Object.freeze({
|
|
225
181
|
getValidatorForProvider,
|
|
226
182
|
setEnableAnonymousUsers
|
|
227
183
|
});
|
|
228
184
|
};
|
|
229
|
-
|
|
230
185
|
module.exports.loadAuthAdapter = loadAuthAdapter;
|
|
231
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luZGV4LmpzIl0sIm5hbWVzIjpbImFwcGxlIiwicmVxdWlyZSIsImdjZW50ZXIiLCJncGdhbWVzIiwiZmFjZWJvb2siLCJpbnN0YWdyYW0iLCJsaW5rZWRpbiIsIm1lZXR1cCIsImdvb2dsZSIsImdpdGh1YiIsInR3aXR0ZXIiLCJzcG90aWZ5IiwiZGlnaXRzIiwiamFucmFpbmVuZ2FnZSIsImphbnJhaW5jYXB0dXJlIiwibGluZSIsInZrb250YWt0ZSIsInFxIiwid2VjaGF0Iiwid2VpYm8iLCJvYXV0aDIiLCJwaGFudGF1dGgiLCJtaWNyb3NvZnQiLCJrZXljbG9hayIsImxkYXAiLCJhbm9ueW1vdXMiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ2YWxpZGF0ZUFwcElkIiwicHJvdmlkZXJzIiwiYXV0aEFkYXB0ZXJQb2xpY2llcyIsImRlZmF1bHQiLCJzb2xvIiwiYWRkaXRpb25hbCIsImF1dGhEYXRhVmFsaWRhdG9yIiwicHJvdmlkZXIiLCJhZGFwdGVyIiwiYXBwSWRzIiwib3B0aW9ucyIsImF1dGhEYXRhIiwicmVxIiwidXNlciIsInJlcXVlc3RPYmplY3QiLCJwb2xpY3kiLCJQYXJzZSIsIkVycm9yIiwiT1RIRVJfQ0FVU0UiLCJ2YWxpZGF0ZVNldFVwIiwidmFsaWRhdGVMb2dpbiIsInZhbGlkYXRlVXBkYXRlIiwiaXNMb2dnZWRJbiIsImF1dGgiLCJpZCIsImlzTWFzdGVyIiwiaGFzQXV0aERhdGFDb25maWd1cmVkIiwiZ2V0IiwibWV0aG9kIiwidmFsaWRhdG9yIiwibG9hZEF1dGhBZGFwdGVyIiwiYXV0aE9wdGlvbnMiLCJkZWZhdWx0QWRhcHRlciIsInByb3ZpZGVyT3B0aW9ucyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFzc2lnbiIsInVuZGVmaW5lZCIsIm9wdGlvbmFsQWRhcHRlciIsImZvckVhY2giLCJrZXkiLCJtb2R1bGUiLCJleHBvcnRzIiwiZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJfZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJzZXRFbmFibGVBbm9ueW1vdXNVc2VycyIsImVuYWJsZSIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiYXV0aEFkYXB0ZXIiLCJmcmVlemUiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxTQUFELENBQXJCOztBQUNBLE1BQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0EsTUFBTUUsT0FBTyxHQUFHRixPQUFPLENBQUMsV0FBRCxDQUF2Qjs7QUFDQSxNQUFNRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxZQUFELENBQXhCOztBQUNBLE1BQU1JLFNBQVMsR0FBR0osT0FBTyxDQUFDLGFBQUQsQ0FBekI7O0FBQ0EsTUFBTUssUUFBUSxHQUFHTCxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxNQUFNTSxNQUFNLEdBQUdOLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLE1BQU1PLE1BQU0sR0FBR1AsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsTUFBTVEsTUFBTSxHQUFHUixPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxNQUFNUyxPQUFPLEdBQUdULE9BQU8sQ0FBQyxXQUFELENBQXZCOztBQUNBLE1BQU1VLE9BQU8sR0FBR1YsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0EsTUFBTVcsTUFBTSxHQUFHWCxPQUFPLENBQUMsV0FBRCxDQUF0QixDLENBQXFDOzs7QUFDckMsTUFBTVksYUFBYSxHQUFHWixPQUFPLENBQUMsaUJBQUQsQ0FBN0I7O0FBQ0EsTUFBTWEsY0FBYyxHQUFHYixPQUFPLENBQUMsa0JBQUQsQ0FBOUI7O0FBQ0EsTUFBTWMsSUFBSSxHQUFHZCxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxNQUFNZSxTQUFTLEdBQUdmLE9BQU8sQ0FBQyxhQUFELENBQXpCOztBQUNBLE1B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QUFYO0FBQW1Cd0IsTUFBQUE7QUFBbkIsUUFBdUNpQixXQUE3QztBQUNBLFdBQU87QUFBRXJCLE1BQUFBLFNBQVMsRUFBRXZCLGlCQUFpQixDQUFDQyxRQUFELEVBQVdDLE9BQVgsRUFBb0JDLE1BQXBCLEVBQTRCd0IsZUFBNUIsQ0FBOUI7QUFBNEV6QixNQUFBQTtBQUE1RSxLQUFQO0FBQ0QsR0FSRDs7QUFVQSxTQUFPMEIsTUFBTSxDQUFDaUIsTUFBUCxDQUFjO0FBQ25CRixJQUFBQSx1QkFEbUI7QUFFbkJGLElBQUFBO0FBRm1CLEdBQWQsQ0FBUDtBQUlELENBcEJEOztBQXNCQUosTUFBTSxDQUFDQyxPQUFQLENBQWVkLGVBQWYsR0FBaUNBLGVBQWpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvYWRBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJMb2FkZXInO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5jb25zdCBhcHBsZSA9IHJlcXVpcmUoJy4vYXBwbGUnKTtcbmNvbnN0IGdjZW50ZXIgPSByZXF1aXJlKCcuL2djZW50ZXInKTtcbmNvbnN0IGdwZ2FtZXMgPSByZXF1aXJlKCcuL2dwZ2FtZXMnKTtcbmNvbnN0IGZhY2Vib29rID0gcmVxdWlyZSgnLi9mYWNlYm9vaycpO1xuY29uc3QgaW5zdGFncmFtID0gcmVxdWlyZSgnLi9pbnN0YWdyYW0nKTtcbmNvbnN0IGxpbmtlZGluID0gcmVxdWlyZSgnLi9saW5rZWRpbicpO1xuY29uc3QgbWVldHVwID0gcmVxdWlyZSgnLi9tZWV0dXAnKTtcbmNvbnN0IGdvb2dsZSA9IHJlcXVpcmUoJy4vZ29vZ2xlJyk7XG5jb25zdCBnaXRodWIgPSByZXF1aXJlKCcuL2dpdGh1YicpO1xuY29uc3QgdHdpdHRlciA9IHJlcXVpcmUoJy4vdHdpdHRlcicpO1xuY29uc3Qgc3BvdGlmeSA9IHJlcXVpcmUoJy4vc3BvdGlmeScpO1xuY29uc3QgZGlnaXRzID0gcmVxdWlyZSgnLi90d2l0dGVyJyk7IC8vIGRpZ2l0cyB0b2tlbnMgYXJlIHZhbGlkYXRlZCBieSB0d2l0dGVyXG5jb25zdCBqYW5yYWluZW5nYWdlID0gcmVxdWlyZSgnLi9qYW5yYWluZW5nYWdlJyk7XG5jb25zdCBqYW5yYWluY2FwdHVyZSA9IHJlcXVpcmUoJy4vamFucmFpbmNhcHR1cmUnKTtcbmNvbnN0IGxpbmUgPSByZXF1aXJlKCcuL2xpbmUnKTtcbmNvbnN0IHZrb250YWt0ZSA9IHJlcXVpcmUoJy4vdmtvbnRha3RlJyk7XG5jb25zdCBxcSA9IHJlcXVpcmUoJy4vcXEnKTtcbmNvbnN0IHdlY2hhdCA9IHJlcXVpcmUoJy4vd2VjaGF0Jyk7XG5jb25zdCB3ZWlibyA9IHJlcXVpcmUoJy4vd2VpYm8nKTtcbmNvbnN0IG9hdXRoMiA9IHJlcXVpcmUoJy4vb2F1dGgyJyk7XG5jb25zdCBwaGFudGF1dGggPSByZXF1aXJlKCcuL3BoYW50YXV0aCcpO1xuY29uc3QgbWljcm9zb2Z0ID0gcmVxdWlyZSgnLi9taWNyb3NvZnQnKTtcbmNvbnN0IGtleWNsb2FrID0gcmVxdWlyZSgnLi9rZXljbG9haycpO1xuY29uc3QgbGRhcCA9IHJlcXVpcmUoJy4vbGRhcCcpO1xuXG5jb25zdCBhbm9ueW1vdXMgPSB7XG4gIHZhbGlkYXRlQXV0aERhdGE6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG4gIHZhbGlkYXRlQXBwSWQ6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG59O1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gIGFwcGxlLFxuICBnY2VudGVyLFxuICBncGdhbWVzLFxuICBmYWNlYm9vayxcbiAgaW5zdGFncmFtLFxuICBsaW5rZWRpbixcbiAgbWVldHVwLFxuICBnb29nbGUsXG4gIGdpdGh1YixcbiAgdHdpdHRlcixcbiAgc3BvdGlmeSxcbiAgYW5vbnltb3VzLFxuICBkaWdpdHMsXG4gIGphbnJhaW5lbmdhZ2UsXG4gIGphbnJhaW5jYXB0dXJlLFxuICBsaW5lLFxuICB2a29udGFrdGUsXG4gIHFxLFxuICB3ZWNoYXQsXG4gIHdlaWJvLFxuICBwaGFudGF1dGgsXG4gIG1pY3Jvc29mdCxcbiAga2V5Y2xvYWssXG4gIGxkYXAsXG59O1xuXG4vLyBJbmRleGVkIGF1dGggcG9saWNpZXNcbmNvbnN0IGF1dGhBZGFwdGVyUG9saWNpZXMgPSB7XG4gIGRlZmF1bHQ6IHRydWUsXG4gIHNvbG86IHRydWUsXG4gIGFkZGl0aW9uYWw6IHRydWUsXG59O1xuXG5mdW5jdGlvbiBhdXRoRGF0YVZhbGlkYXRvcihwcm92aWRlciwgYWRhcHRlciwgYXBwSWRzLCBvcHRpb25zKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoYXV0aERhdGEsIHJlcSwgdXNlciwgcmVxdWVzdE9iamVjdCkge1xuICAgIGlmIChhcHBJZHMgJiYgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVBcHBJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGFkYXB0ZXIudmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSk7XG4gICAgfVxuICAgIGlmIChhZGFwdGVyLnBvbGljeSAmJiAhYXV0aEFkYXB0ZXJQb2xpY2llc1thZGFwdGVyLnBvbGljeV0pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgICAgICdBdXRoQWRhcHRlciBwb2xpY3kgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LiBUaGUgdmFsdWUgbXVzdCBiZSBlaXRoZXIgXCJzb2xvXCIsIFwiYWRkaXRpb25hbFwiLCBcImRlZmF1bHRcIiBvciB1bmRlZmluZWQgKHdpbGwgYmUgaGFuZGxlZCBhcyBcImRlZmF1bHRcIiknXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVBdXRoRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFkYXB0ZXIudmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlU2V0VXAgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlTG9naW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9USEVSX0NBVVNFLFxuICAgICAgICAnQWRhcHRlciBpcyBub3QgY29uZmlndXJlZC4gSW1wbGVtZW50IGVpdGhlciB2YWxpZGF0ZUF1dGhEYXRhIG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nOiB2YWxpZGF0ZVNldFVwLCB2YWxpZGF0ZUxvZ2luIGFuZCB2YWxpZGF0ZVVwZGF0ZSdcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFdoZW4gbWFzdGVyS2V5IGlzIGRldGVjdGVkLCB3ZSBzaG91bGQgdHJpZ2dlciBhIGxvZ2dlZCBpbiB1c2VyXG4gICAgY29uc3QgaXNMb2dnZWRJbiA9XG4gICAgICAocmVxLmF1dGgudXNlciAmJiB1c2VyICYmIHJlcS5hdXRoLnVzZXIuaWQgPT09IHVzZXIuaWQpIHx8ICh1c2VyICYmIHJlcS5hdXRoLmlzTWFzdGVyKTtcbiAgICBsZXQgaGFzQXV0aERhdGFDb25maWd1cmVkID0gZmFsc2U7XG5cbiAgICBpZiAodXNlciAmJiB1c2VyLmdldCgnYXV0aERhdGEnKSAmJiB1c2VyLmdldCgnYXV0aERhdGEnKVtwcm92aWRlcl0pIHtcbiAgICAgIGhhc0F1dGhEYXRhQ29uZmlndXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTG9nZ2VkSW4pIHtcbiAgICAgIC8vIFVzZXIgaXMgdXBkYXRpbmcgdGhlaXIgYXV0aERhdGFcbiAgICAgIGlmIChoYXNBdXRoRGF0YUNvbmZpZ3VyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlVXBkYXRlKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCB1cCBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSBwcm92aWRlciBjb25maWd1cmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlU2V0VXAoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBOb3QgbG9nZ2VkIGluIGFuZCBhdXRoRGF0YSBpcyBjb25maWd1cmVkIG9uIHRoZSB1c2VyXG4gICAgaWYgKGhhc0F1dGhEYXRhQ29uZmlndXJlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kOiAndmFsaWRhdGVMb2dpbicsXG4gICAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZUxvZ2luKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlciBub3QgbG9nZ2VkIGluIGFuZCB0aGUgcHJvdmlkZXIgaXMgbm90IHNldCB1cCwgZm9yIGV4YW1wbGUgd2hlbiBhIG5ldyB1c2VyXG4gICAgLy8gc2lnbnMgdXAgb3IgYW4gZXhpc3RpbmcgdXNlciB1c2VzIGEgbmV3IGF1dGggcHJvdmlkZXJcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAndmFsaWRhdGVTZXRVcCcsXG4gICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVTZXRVcChhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbG9hZEF1dGhBZGFwdGVyKHByb3ZpZGVyLCBhdXRoT3B0aW9ucykge1xuICAvLyBwcm92aWRlcnMgYXJlIGF1dGggcHJvdmlkZXJzIGltcGxlbWVudGVkIGJ5IGRlZmF1bHRcbiAgbGV0IGRlZmF1bHRBZGFwdGVyID0gcHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgLy8gYXV0aE9wdGlvbnMgY2FuIGNvbnRhaW4gY29tcGxldGUgY3VzdG9tIGF1dGggYWRhcHRlcnMgb3JcbiAgLy8gYSBkZWZhdWx0IGF1dGggYWRhcHRlciBsaWtlIEZhY2Vib29rXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IGF1dGhPcHRpb25zW3Byb3ZpZGVyXTtcbiAgaWYgKFxuICAgIHByb3ZpZGVyT3B0aW9ucyAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm92aWRlck9wdGlvbnMsICdvYXV0aDInKSAmJlxuICAgIHByb3ZpZGVyT3B0aW9uc1snb2F1dGgyJ10gPT09IHRydWVcbiAgKSB7XG4gICAgZGVmYXVsdEFkYXB0ZXIgPSBvYXV0aDI7XG4gIH1cblxuICAvLyBEZWZhdWx0IHByb3ZpZGVyIG5vdCBmb3VuZCBhbmQgYSBjdXN0b20gYXV0aCBwcm92aWRlciB3YXMgbm90IHByb3ZpZGVkXG4gIGlmICghZGVmYXVsdEFkYXB0ZXIgJiYgIXByb3ZpZGVyT3B0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0QWRhcHRlcik7XG4gIGNvbnN0IGFwcElkcyA9IHByb3ZpZGVyT3B0aW9ucyA/IHByb3ZpZGVyT3B0aW9ucy5hcHBJZHMgOiB1bmRlZmluZWQ7XG5cbiAgLy8gVHJ5IHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZHNcbiAgaWYgKHByb3ZpZGVyT3B0aW9ucykge1xuICAgIGNvbnN0IG9wdGlvbmFsQWRhcHRlciA9IGxvYWRBZGFwdGVyKHByb3ZpZGVyT3B0aW9ucywgdW5kZWZpbmVkLCBwcm92aWRlck9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25hbEFkYXB0ZXIpIHtcbiAgICAgIFtcbiAgICAgICAgJ3ZhbGlkYXRlQXV0aERhdGEnLFxuICAgICAgICAndmFsaWRhdGVBcHBJZCcsXG4gICAgICAgICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgICAgJ3ZhbGlkYXRlTG9naW4nLFxuICAgICAgICAndmFsaWRhdGVVcGRhdGUnLFxuICAgICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICAgJ3BvbGljeScsXG4gICAgICBdLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbmFsQWRhcHRlcltrZXldKSB7XG4gICAgICAgICAgYWRhcHRlcltrZXldID0gb3B0aW9uYWxBZGFwdGVyW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGF1dGhPcHRpb25zID0ge30sIGVuYWJsZUFub255bW91c1VzZXJzID0gdHJ1ZSkge1xuICBsZXQgX2VuYWJsZUFub255bW91c1VzZXJzID0gZW5hYmxlQW5vbnltb3VzVXNlcnM7XG4gIGNvbnN0IHNldEVuYWJsZUFub255bW91c1VzZXJzID0gZnVuY3Rpb24gKGVuYWJsZSkge1xuICAgIF9lbmFibGVBbm9ueW1vdXNVc2VycyA9IGVuYWJsZTtcbiAgfTtcbiAgLy8gVG8gaGFuZGxlIHRoZSB0ZXN0IGNhc2VzIG9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICBpZiAocHJvdmlkZXIgPT09ICdhbm9ueW1vdXMnICYmICFfZW5hYmxlQW5vbnltb3VzVXNlcnMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkYXRvcjogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIGNvbnN0IGF1dGhBZGFwdGVyID0gbG9hZEF1dGhBZGFwdGVyKHByb3ZpZGVyLCBhdXRoT3B0aW9ucyk7XG4gICAgaWYgKCFhdXRoQWRhcHRlcikgcmV0dXJuO1xuICAgIGNvbnN0IHsgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMgfSA9IGF1dGhBZGFwdGVyO1xuICAgIHJldHVybiB7IHZhbGlkYXRvcjogYXV0aERhdGFWYWxpZGF0b3IocHJvdmlkZXIsIGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zKSwgYWRhcHRlciB9O1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBnZXRWYWxpZGF0b3JGb3JQcm92aWRlcixcbiAgICBzZXRFbmFibGVBbm9ueW1vdXNVc2VycyxcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQXV0aEFkYXB0ZXIgPSBsb2FkQXV0aEFkYXB0ZXI7XG4iXX0=
|
|
186
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcHBsZSIsInJlcXVpcmUiLCJnY2VudGVyIiwiZ3BnYW1lcyIsImZhY2Vib29rIiwiaW5zdGFncmFtIiwibGlua2VkaW4iLCJtZWV0dXAiLCJnb29nbGUiLCJnaXRodWIiLCJ0d2l0dGVyIiwic3BvdGlmeSIsImRpZ2l0cyIsImphbnJhaW5lbmdhZ2UiLCJqYW5yYWluY2FwdHVyZSIsImxpbmUiLCJ2a29udGFrdGUiLCJxcSIsIndlY2hhdCIsIndlaWJvIiwib2F1dGgyIiwicGhhbnRhdXRoIiwibWljcm9zb2Z0Iiwia2V5Y2xvYWsiLCJsZGFwIiwiYW5vbnltb3VzIiwidmFsaWRhdGVBdXRoRGF0YSIsIlByb21pc2UiLCJyZXNvbHZlIiwidmFsaWRhdGVBcHBJZCIsInByb3ZpZGVycyIsImF1dGhBZGFwdGVyUG9saWNpZXMiLCJkZWZhdWx0Iiwic29sbyIsImFkZGl0aW9uYWwiLCJhdXRoRGF0YVZhbGlkYXRvciIsInByb3ZpZGVyIiwiYWRhcHRlciIsImFwcElkcyIsIm9wdGlvbnMiLCJhdXRoRGF0YSIsInJlcSIsInVzZXIiLCJyZXF1ZXN0T2JqZWN0IiwicG9saWN5IiwiUGFyc2UiLCJFcnJvciIsIk9USEVSX0NBVVNFIiwidmFsaWRhdGVTZXRVcCIsInZhbGlkYXRlTG9naW4iLCJ2YWxpZGF0ZVVwZGF0ZSIsImlzTG9nZ2VkSW4iLCJhdXRoIiwiaWQiLCJpc01hc3RlciIsImhhc0F1dGhEYXRhQ29uZmlndXJlZCIsImdldCIsIm1ldGhvZCIsInZhbGlkYXRvciIsImxvYWRBdXRoQWRhcHRlciIsImF1dGhPcHRpb25zIiwiZGVmYXVsdEFkYXB0ZXIiLCJwcm92aWRlck9wdGlvbnMiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhc3NpZ24iLCJ1bmRlZmluZWQiLCJvcHRpb25hbEFkYXB0ZXIiLCJsb2FkQWRhcHRlciIsImZvckVhY2giLCJrZXkiLCJtb2R1bGUiLCJleHBvcnRzIiwiZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJfZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJzZXRFbmFibGVBbm9ueW1vdXNVc2VycyIsImVuYWJsZSIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiYXV0aEFkYXB0ZXIiLCJmcmVlemUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9hZEFkYXB0ZXIgZnJvbSAnLi4vQWRhcHRlckxvYWRlcic7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5cbmNvbnN0IGFwcGxlID0gcmVxdWlyZSgnLi9hcHBsZScpO1xuY29uc3QgZ2NlbnRlciA9IHJlcXVpcmUoJy4vZ2NlbnRlcicpO1xuY29uc3QgZ3BnYW1lcyA9IHJlcXVpcmUoJy4vZ3BnYW1lcycpO1xuY29uc3QgZmFjZWJvb2sgPSByZXF1aXJlKCcuL2ZhY2Vib29rJyk7XG5jb25zdCBpbnN0YWdyYW0gPSByZXF1aXJlKCcuL2luc3RhZ3JhbScpO1xuY29uc3QgbGlua2VkaW4gPSByZXF1aXJlKCcuL2xpbmtlZGluJyk7XG5jb25zdCBtZWV0dXAgPSByZXF1aXJlKCcuL21lZXR1cCcpO1xuY29uc3QgZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcbmNvbnN0IGdpdGh1YiA9IHJlcXVpcmUoJy4vZ2l0aHViJyk7XG5jb25zdCB0d2l0dGVyID0gcmVxdWlyZSgnLi90d2l0dGVyJyk7XG5jb25zdCBzcG90aWZ5ID0gcmVxdWlyZSgnLi9zcG90aWZ5Jyk7XG5jb25zdCBkaWdpdHMgPSByZXF1aXJlKCcuL3R3aXR0ZXInKTsgLy8gZGlnaXRzIHRva2VucyBhcmUgdmFsaWRhdGVkIGJ5IHR3aXR0ZXJcbmNvbnN0IGphbnJhaW5lbmdhZ2UgPSByZXF1aXJlKCcuL2phbnJhaW5lbmdhZ2UnKTtcbmNvbnN0IGphbnJhaW5jYXB0dXJlID0gcmVxdWlyZSgnLi9qYW5yYWluY2FwdHVyZScpO1xuY29uc3QgbGluZSA9IHJlcXVpcmUoJy4vbGluZScpO1xuY29uc3QgdmtvbnRha3RlID0gcmVxdWlyZSgnLi92a29udGFrdGUnKTtcbmNvbnN0IHFxID0gcmVxdWlyZSgnLi9xcScpO1xuY29uc3Qgd2VjaGF0ID0gcmVxdWlyZSgnLi93ZWNoYXQnKTtcbmNvbnN0IHdlaWJvID0gcmVxdWlyZSgnLi93ZWlibycpO1xuY29uc3Qgb2F1dGgyID0gcmVxdWlyZSgnLi9vYXV0aDInKTtcbmNvbnN0IHBoYW50YXV0aCA9IHJlcXVpcmUoJy4vcGhhbnRhdXRoJyk7XG5jb25zdCBtaWNyb3NvZnQgPSByZXF1aXJlKCcuL21pY3Jvc29mdCcpO1xuY29uc3Qga2V5Y2xvYWsgPSByZXF1aXJlKCcuL2tleWNsb2FrJyk7XG5jb25zdCBsZGFwID0gcmVxdWlyZSgnLi9sZGFwJyk7XG5cbmNvbnN0IGFub255bW91cyA9IHtcbiAgdmFsaWRhdGVBdXRoRGF0YTogKCkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSxcbiAgdmFsaWRhdGVBcHBJZDogKCkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSxcbn07XG5cbmNvbnN0IHByb3ZpZGVycyA9IHtcbiAgYXBwbGUsXG4gIGdjZW50ZXIsXG4gIGdwZ2FtZXMsXG4gIGZhY2Vib29rLFxuICBpbnN0YWdyYW0sXG4gIGxpbmtlZGluLFxuICBtZWV0dXAsXG4gIGdvb2dsZSxcbiAgZ2l0aHViLFxuICB0d2l0dGVyLFxuICBzcG90aWZ5LFxuICBhbm9ueW1vdXMsXG4gIGRpZ2l0cyxcbiAgamFucmFpbmVuZ2FnZSxcbiAgamFucmFpbmNhcHR1cmUsXG4gIGxpbmUsXG4gIHZrb250YWt0ZSxcbiAgcXEsXG4gIHdlY2hhdCxcbiAgd2VpYm8sXG4gIHBoYW50YXV0aCxcbiAgbWljcm9zb2Z0LFxuICBrZXljbG9hayxcbiAgbGRhcCxcbn07XG5cbi8vIEluZGV4ZWQgYXV0aCBwb2xpY2llc1xuY29uc3QgYXV0aEFkYXB0ZXJQb2xpY2llcyA9IHtcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgc29sbzogdHJ1ZSxcbiAgYWRkaXRpb25hbDogdHJ1ZSxcbn07XG5cbmZ1bmN0aW9uIGF1dGhEYXRhVmFsaWRhdG9yKHByb3ZpZGVyLCBhZGFwdGVyLCBhcHBJZHMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChhdXRoRGF0YSwgcmVxLCB1c2VyLCByZXF1ZXN0T2JqZWN0KSB7XG4gICAgaWYgKGFwcElkcyAmJiB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUFwcElkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoYWRhcHRlci52YWxpZGF0ZUFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpKTtcbiAgICB9XG4gICAgaWYgKGFkYXB0ZXIucG9saWN5ICYmICFhdXRoQWRhcHRlclBvbGljaWVzW2FkYXB0ZXIucG9saWN5XSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PVEhFUl9DQVVTRSxcbiAgICAgICAgJ0F1dGhBZGFwdGVyIHBvbGljeSBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcInNvbG9cIiwgXCJhZGRpdGlvbmFsXCIsIFwiZGVmYXVsdFwiIG9yIHVuZGVmaW5lZCAod2lsbCBiZSBoYW5kbGVkIGFzIFwiZGVmYXVsdFwiKSdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUF1dGhEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYWRhcHRlci52YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVTZXRVcCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVMb2dpbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVVcGRhdGUgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgICAgICdBZGFwdGVyIGlzIG5vdCBjb25maWd1cmVkLiBJbXBsZW1lbnQgZWl0aGVyIHZhbGlkYXRlQXV0aERhdGEgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmc6IHZhbGlkYXRlU2V0VXAsIHZhbGlkYXRlTG9naW4gYW5kIHZhbGlkYXRlVXBkYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gV2hlbiBtYXN0ZXJLZXkgaXMgZGV0ZWN0ZWQsIHdlIHNob3VsZCB0cmlnZ2VyIGEgbG9nZ2VkIGluIHVzZXJcbiAgICBjb25zdCBpc0xvZ2dlZEluID1cbiAgICAgIChyZXEuYXV0aC51c2VyICYmIHVzZXIgJiYgcmVxLmF1dGgudXNlci5pZCA9PT0gdXNlci5pZCkgfHwgKHVzZXIgJiYgcmVxLmF1dGguaXNNYXN0ZXIpO1xuICAgIGxldCBoYXNBdXRoRGF0YUNvbmZpZ3VyZWQgPSBmYWxzZTtcblxuICAgIGlmICh1c2VyICYmIHVzZXIuZ2V0KCdhdXRoRGF0YScpICYmIHVzZXIuZ2V0KCdhdXRoRGF0YScpW3Byb3ZpZGVyXSkge1xuICAgICAgaGFzQXV0aERhdGFDb25maWd1cmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNMb2dnZWRJbikge1xuICAgICAgLy8gVXNlciBpcyB1cGRhdGluZyB0aGVpciBhdXRoRGF0YVxuICAgICAgaWYgKGhhc0F1dGhEYXRhQ29uZmlndXJlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlVXBkYXRlJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVVcGRhdGUoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gU2V0IHVwIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgdGhlIHByb3ZpZGVyIGNvbmZpZ3VyZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlU2V0VXAnLFxuICAgICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVTZXRVcChhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE5vdCBsb2dnZWQgaW4gYW5kIGF1dGhEYXRhIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHVzZXJcbiAgICBpZiAoaGFzQXV0aERhdGFDb25maWd1cmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZUxvZ2luJyxcbiAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlTG9naW4oYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIG5vdCBsb2dnZWQgaW4gYW5kIHRoZSBwcm92aWRlciBpcyBub3Qgc2V0IHVwLCBmb3IgZXhhbXBsZSB3aGVuIGEgbmV3IHVzZXJcbiAgICAvLyBzaWducyB1cCBvciBhbiBleGlzdGluZyB1c2VyIHVzZXMgYSBuZXcgYXV0aCBwcm92aWRlclxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6ICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZVNldFVwKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBsb2FkQXV0aEFkYXB0ZXIocHJvdmlkZXIsIGF1dGhPcHRpb25zKSB7XG4gIC8vIHByb3ZpZGVycyBhcmUgYXV0aCBwcm92aWRlcnMgaW1wbGVtZW50ZWQgYnkgZGVmYXVsdFxuICBsZXQgZGVmYXVsdEFkYXB0ZXIgPSBwcm92aWRlcnNbcHJvdmlkZXJdO1xuICAvLyBhdXRoT3B0aW9ucyBjYW4gY29udGFpbiBjb21wbGV0ZSBjdXN0b20gYXV0aCBhZGFwdGVycyBvclxuICAvLyBhIGRlZmF1bHQgYXV0aCBhZGFwdGVyIGxpa2UgRmFjZWJvb2tcbiAgY29uc3QgcHJvdmlkZXJPcHRpb25zID0gYXV0aE9wdGlvbnNbcHJvdmlkZXJdO1xuICBpZiAoXG4gICAgcHJvdmlkZXJPcHRpb25zICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3ZpZGVyT3B0aW9ucywgJ29hdXRoMicpICYmXG4gICAgcHJvdmlkZXJPcHRpb25zWydvYXV0aDInXSA9PT0gdHJ1ZVxuICApIHtcbiAgICBkZWZhdWx0QWRhcHRlciA9IG9hdXRoMjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgcHJvdmlkZXIgbm90IGZvdW5kIGFuZCBhIGN1c3RvbSBhdXRoIHByb3ZpZGVyIHdhcyBub3QgcHJvdmlkZWRcbiAgaWYgKCFkZWZhdWx0QWRhcHRlciAmJiAhcHJvdmlkZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRBZGFwdGVyKTtcbiAgY29uc3QgYXBwSWRzID0gcHJvdmlkZXJPcHRpb25zID8gcHJvdmlkZXJPcHRpb25zLmFwcElkcyA6IHVuZGVmaW5lZDtcblxuICAvLyBUcnkgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kc1xuICBpZiAocHJvdmlkZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0aW9uYWxBZGFwdGVyID0gbG9hZEFkYXB0ZXIocHJvdmlkZXJPcHRpb25zLCB1bmRlZmluZWQsIHByb3ZpZGVyT3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbmFsQWRhcHRlcikge1xuICAgICAgW1xuICAgICAgICAndmFsaWRhdGVBdXRoRGF0YScsXG4gICAgICAgICd2YWxpZGF0ZUFwcElkJyxcbiAgICAgICAgJ3ZhbGlkYXRlU2V0VXAnLFxuICAgICAgICAndmFsaWRhdGVMb2dpbicsXG4gICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICdjaGFsbGVuZ2UnLFxuICAgICAgICAncG9saWN5JyxcbiAgICAgIF0uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAob3B0aW9uYWxBZGFwdGVyW2tleV0pIHtcbiAgICAgICAgICBhZGFwdGVyW2tleV0gPSBvcHRpb25hbEFkYXB0ZXJba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXV0aE9wdGlvbnMgPSB7fSwgZW5hYmxlQW5vbnltb3VzVXNlcnMgPSB0cnVlKSB7XG4gIGxldCBfZW5hYmxlQW5vbnltb3VzVXNlcnMgPSBlbmFibGVBbm9ueW1vdXNVc2VycztcbiAgY29uc3Qgc2V0RW5hYmxlQW5vbnltb3VzVXNlcnMgPSBmdW5jdGlvbiAoZW5hYmxlKSB7XG4gICAgX2VuYWJsZUFub255bW91c1VzZXJzID0gZW5hYmxlO1xuICB9O1xuICAvLyBUbyBoYW5kbGUgdGhlIHRlc3QgY2FzZXMgb24gY29uZmlndXJhdGlvblxuICBjb25zdCBnZXRWYWxpZGF0b3JGb3JQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgIGlmIChwcm92aWRlciA9PT0gJ2Fub255bW91cycgJiYgIV9lbmFibGVBbm9ueW1vdXNVc2Vycykge1xuICAgICAgcmV0dXJuIHsgdmFsaWRhdG9yOiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgY29uc3QgYXV0aEFkYXB0ZXIgPSBsb2FkQXV0aEFkYXB0ZXIocHJvdmlkZXIsIGF1dGhPcHRpb25zKTtcbiAgICBpZiAoIWF1dGhBZGFwdGVyKSByZXR1cm47XG4gICAgY29uc3QgeyBhZGFwdGVyLCBhcHBJZHMsIHByb3ZpZGVyT3B0aW9ucyB9ID0gYXV0aEFkYXB0ZXI7XG4gICAgcmV0dXJuIHsgdmFsaWRhdG9yOiBhdXRoRGF0YVZhbGlkYXRvcihwcm92aWRlciwgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMpLCBhZGFwdGVyIH07XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGdldFZhbGlkYXRvckZvclByb3ZpZGVyLFxuICAgIHNldEVuYWJsZUFub255bW91c1VzZXJzLFxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBdXRoQWRhcHRlciA9IGxvYWRBdXRoQWRhcHRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQStCO0FBRS9CLE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNoQyxNQUFNQyxPQUFPLEdBQUdELE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDcEMsTUFBTUUsT0FBTyxHQUFHRixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3BDLE1BQU1HLFFBQVEsR0FBR0gsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN0QyxNQUFNSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDeEMsTUFBTUssUUFBUSxHQUFHTCxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3RDLE1BQU1NLE1BQU0sR0FBR04sT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNsQyxNQUFNTyxNQUFNLEdBQUdQLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDbEMsTUFBTVEsTUFBTSxHQUFHUixPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2xDLE1BQU1TLE9BQU8sR0FBR1QsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQyxNQUFNVSxPQUFPLEdBQUdWLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDcEMsTUFBTVcsTUFBTSxHQUFHWCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNWSxhQUFhLEdBQUdaLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUNoRCxNQUFNYSxjQUFjLEdBQUdiLE9BQU8s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
|