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
package/lib/RestQuery.js
CHANGED
|
@@ -2,17 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
// An object that encapsulates everything we need to run a 'find'
|
|
4
4
|
// operation, encoded in the REST API format.
|
|
5
|
-
var SchemaController = require('./Controllers/SchemaController');
|
|
6
5
|
|
|
6
|
+
var SchemaController = require('./Controllers/SchemaController');
|
|
7
7
|
var Parse = require('parse/node').Parse;
|
|
8
|
-
|
|
9
8
|
const triggers = require('./triggers');
|
|
10
|
-
|
|
11
9
|
const {
|
|
12
10
|
continueWhile
|
|
13
11
|
} = require('parse/lib/node/promiseUtils');
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt', 'ACL'];
|
|
13
|
+
// restOptions can include:
|
|
16
14
|
// skip
|
|
17
15
|
// limit
|
|
18
16
|
// order
|
|
@@ -24,7 +22,6 @@ const AlwaysSelectedKeys = ['objectId', 'createdAt', 'updatedAt', 'ACL']; // res
|
|
|
24
22
|
// readPreference
|
|
25
23
|
// includeReadPreference
|
|
26
24
|
// subqueryReadPreference
|
|
27
|
-
|
|
28
25
|
function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, clientSDK, runAfterFind = true, context) {
|
|
29
26
|
this.config = config;
|
|
30
27
|
this.auth = auth;
|
|
@@ -36,13 +33,11 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
36
33
|
this.response = null;
|
|
37
34
|
this.findOptions = {};
|
|
38
35
|
this.context = context || {};
|
|
39
|
-
|
|
40
36
|
if (!this.auth.isMaster) {
|
|
41
37
|
if (this.className == '_Session') {
|
|
42
38
|
if (!this.auth.user) {
|
|
43
39
|
throw new Parse.Error(Parse.Error.INVALID_SESSION_TOKEN, 'Invalid session token');
|
|
44
40
|
}
|
|
45
|
-
|
|
46
41
|
this.restWhere = {
|
|
47
42
|
$and: [this.restWhere, {
|
|
48
43
|
user: {
|
|
@@ -54,29 +49,29 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
54
49
|
};
|
|
55
50
|
}
|
|
56
51
|
}
|
|
57
|
-
|
|
58
52
|
this.doCount = false;
|
|
59
|
-
this.includeAll = false;
|
|
53
|
+
this.includeAll = false;
|
|
54
|
+
|
|
55
|
+
// The format for this.include is not the same as the format for the
|
|
60
56
|
// include option - it's the paths we should include, in order,
|
|
61
57
|
// stored as arrays, taking into account that we need to include foo
|
|
62
58
|
// before including foo.bar. Also it should dedupe.
|
|
63
59
|
// For example, passing an arg of include=foo.bar,foo.baz could lead to
|
|
64
60
|
// this.include = [['foo'], ['foo', 'baz'], ['foo', 'bar']]
|
|
65
|
-
|
|
66
61
|
this.include = [];
|
|
67
|
-
let keysForInclude = '';
|
|
68
|
-
// See issue: https://github.com/parse-community/parse-server/issues/3185
|
|
62
|
+
let keysForInclude = '';
|
|
69
63
|
|
|
64
|
+
// If we have keys, we probably want to force some includes (n-1 level)
|
|
65
|
+
// See issue: https://github.com/parse-community/parse-server/issues/3185
|
|
70
66
|
if (Object.prototype.hasOwnProperty.call(restOptions, 'keys')) {
|
|
71
67
|
keysForInclude = restOptions.keys;
|
|
72
|
-
}
|
|
73
|
-
// in order to exclude specific keys.
|
|
74
|
-
|
|
68
|
+
}
|
|
75
69
|
|
|
70
|
+
// If we have keys, we probably want to force some includes (n-1 level)
|
|
71
|
+
// in order to exclude specific keys.
|
|
76
72
|
if (Object.prototype.hasOwnProperty.call(restOptions, 'excludeKeys')) {
|
|
77
73
|
keysForInclude += ',' + restOptions.excludeKeys;
|
|
78
74
|
}
|
|
79
|
-
|
|
80
75
|
if (keysForInclude.length > 0) {
|
|
81
76
|
keysForInclude = keysForInclude.split(',').filter(key => {
|
|
82
77
|
// At least 2 components
|
|
@@ -85,9 +80,10 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
85
80
|
// Slice the last component (a.b.c -> a.b)
|
|
86
81
|
// Otherwise we'll include one level too much.
|
|
87
82
|
return key.slice(0, key.lastIndexOf('.'));
|
|
88
|
-
}).join(',');
|
|
89
|
-
// Dedup / sorting is handle in 'include' case.
|
|
83
|
+
}).join(',');
|
|
90
84
|
|
|
85
|
+
// Concat the possibly present include string with the one from the keys
|
|
86
|
+
// Dedup / sorting is handle in 'include' case.
|
|
91
87
|
if (keysForInclude.length > 0) {
|
|
92
88
|
if (!restOptions.include || restOptions.include.length == 0) {
|
|
93
89
|
restOptions.include = keysForInclude;
|
|
@@ -96,7 +92,6 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
96
92
|
}
|
|
97
93
|
}
|
|
98
94
|
}
|
|
99
|
-
|
|
100
95
|
for (var option in restOptions) {
|
|
101
96
|
switch (option) {
|
|
102
97
|
case 'keys':
|
|
@@ -105,22 +100,18 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
105
100
|
this.keys = Array.from(new Set(keys));
|
|
106
101
|
break;
|
|
107
102
|
}
|
|
108
|
-
|
|
109
103
|
case 'excludeKeys':
|
|
110
104
|
{
|
|
111
105
|
const exclude = restOptions.excludeKeys.split(',').filter(k => AlwaysSelectedKeys.indexOf(k) < 0);
|
|
112
106
|
this.excludeKeys = Array.from(new Set(exclude));
|
|
113
107
|
break;
|
|
114
108
|
}
|
|
115
|
-
|
|
116
109
|
case 'count':
|
|
117
110
|
this.doCount = true;
|
|
118
111
|
break;
|
|
119
|
-
|
|
120
112
|
case 'includeAll':
|
|
121
113
|
this.includeAll = true;
|
|
122
114
|
break;
|
|
123
|
-
|
|
124
115
|
case 'explain':
|
|
125
116
|
case 'hint':
|
|
126
117
|
case 'distinct':
|
|
@@ -130,12 +121,10 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
130
121
|
case 'readPreference':
|
|
131
122
|
this.findOptions[option] = restOptions[option];
|
|
132
123
|
break;
|
|
133
|
-
|
|
134
124
|
case 'order':
|
|
135
125
|
var fields = restOptions.order.split(',');
|
|
136
126
|
this.findOptions.sort = fields.reduce((sortMap, field) => {
|
|
137
127
|
field = field.trim();
|
|
138
|
-
|
|
139
128
|
if (field === '$score' || field === '-$score') {
|
|
140
129
|
sortMap.score = {
|
|
141
130
|
$meta: 'textScore'
|
|
@@ -145,21 +134,17 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
145
134
|
} else {
|
|
146
135
|
sortMap[field] = 1;
|
|
147
136
|
}
|
|
148
|
-
|
|
149
137
|
return sortMap;
|
|
150
138
|
}, {});
|
|
151
139
|
break;
|
|
152
|
-
|
|
153
140
|
case 'include':
|
|
154
141
|
{
|
|
155
142
|
const paths = restOptions.include.split(',');
|
|
156
|
-
|
|
157
143
|
if (paths.includes('*')) {
|
|
158
144
|
this.includeAll = true;
|
|
159
145
|
break;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
146
|
+
}
|
|
147
|
+
// Load the existing includes (from keys)
|
|
163
148
|
const pathSet = paths.reduce((memo, path) => {
|
|
164
149
|
// Split each paths on . (a.b.c -> [a,b,c])
|
|
165
150
|
// reduce to create all paths
|
|
@@ -174,29 +159,27 @@ function RestQuery(config, auth, className, restWhere = {}, restOptions = {}, cl
|
|
|
174
159
|
}).sort((a, b) => {
|
|
175
160
|
return a.length - b.length; // Sort by number of components
|
|
176
161
|
});
|
|
162
|
+
|
|
177
163
|
break;
|
|
178
164
|
}
|
|
179
|
-
|
|
180
165
|
case 'redirectClassNameForKey':
|
|
181
166
|
this.redirectKey = restOptions.redirectClassNameForKey;
|
|
182
167
|
this.redirectClassName = null;
|
|
183
168
|
break;
|
|
184
|
-
|
|
185
169
|
case 'includeReadPreference':
|
|
186
170
|
case 'subqueryReadPreference':
|
|
187
171
|
break;
|
|
188
|
-
|
|
189
172
|
default:
|
|
190
173
|
throw new Parse.Error(Parse.Error.INVALID_JSON, 'bad option: ' + option);
|
|
191
174
|
}
|
|
192
175
|
}
|
|
193
|
-
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// A convenient method to perform all the steps of processing a query
|
|
194
179
|
// in order.
|
|
195
180
|
// Returns a promise for the response - an object with optional keys
|
|
196
181
|
// 'results' and 'count'.
|
|
197
182
|
// TODO: consolidate the replaceX functions
|
|
198
|
-
|
|
199
|
-
|
|
200
183
|
RestQuery.prototype.execute = function (executeOptions) {
|
|
201
184
|
return Promise.resolve().then(() => {
|
|
202
185
|
return this.buildRestWhere();
|
|
@@ -218,7 +201,6 @@ RestQuery.prototype.execute = function (executeOptions) {
|
|
|
218
201
|
return this.response;
|
|
219
202
|
});
|
|
220
203
|
};
|
|
221
|
-
|
|
222
204
|
RestQuery.prototype.each = function (callback) {
|
|
223
205
|
const {
|
|
224
206
|
config,
|
|
@@ -227,8 +209,8 @@ RestQuery.prototype.each = function (callback) {
|
|
|
227
209
|
restWhere,
|
|
228
210
|
restOptions,
|
|
229
211
|
clientSDK
|
|
230
|
-
} = this;
|
|
231
|
-
|
|
212
|
+
} = this;
|
|
213
|
+
// if the limit is set, use it
|
|
232
214
|
restOptions.limit = restOptions.limit || 100;
|
|
233
215
|
restOptions.order = 'objectId';
|
|
234
216
|
let finished = false;
|
|
@@ -241,7 +223,6 @@ RestQuery.prototype.each = function (callback) {
|
|
|
241
223
|
} = await query.execute();
|
|
242
224
|
results.forEach(callback);
|
|
243
225
|
finished = results.length < restOptions.limit;
|
|
244
|
-
|
|
245
226
|
if (!finished) {
|
|
246
227
|
restWhere.objectId = Object.assign({}, restWhere.objectId, {
|
|
247
228
|
$gt: results[results.length - 1].objectId
|
|
@@ -249,7 +230,6 @@ RestQuery.prototype.each = function (callback) {
|
|
|
249
230
|
}
|
|
250
231
|
});
|
|
251
232
|
};
|
|
252
|
-
|
|
253
233
|
RestQuery.prototype.buildRestWhere = function () {
|
|
254
234
|
return Promise.resolve().then(() => {
|
|
255
235
|
return this.getUserAndRoleACL();
|
|
@@ -268,16 +248,14 @@ RestQuery.prototype.buildRestWhere = function () {
|
|
|
268
248
|
}).then(() => {
|
|
269
249
|
return this.replaceEquality();
|
|
270
250
|
});
|
|
271
|
-
};
|
|
272
|
-
|
|
251
|
+
};
|
|
273
252
|
|
|
253
|
+
// Uses the Auth object to get the list of roles, adds the user id
|
|
274
254
|
RestQuery.prototype.getUserAndRoleACL = function () {
|
|
275
255
|
if (this.auth.isMaster) {
|
|
276
256
|
return Promise.resolve();
|
|
277
257
|
}
|
|
278
|
-
|
|
279
258
|
this.findOptions.acl = ['*'];
|
|
280
|
-
|
|
281
259
|
if (this.auth.user) {
|
|
282
260
|
return this.auth.getUserRoles().then(roles => {
|
|
283
261
|
this.findOptions.acl = this.findOptions.acl.concat(roles, [this.auth.user.id]);
|
|
@@ -286,23 +264,23 @@ RestQuery.prototype.getUserAndRoleACL = function () {
|
|
|
286
264
|
} else {
|
|
287
265
|
return Promise.resolve();
|
|
288
266
|
}
|
|
289
|
-
};
|
|
290
|
-
// Returns a promise.
|
|
291
|
-
|
|
267
|
+
};
|
|
292
268
|
|
|
269
|
+
// Changes the className if redirectClassNameForKey is set.
|
|
270
|
+
// Returns a promise.
|
|
293
271
|
RestQuery.prototype.redirectClassNameForKey = function () {
|
|
294
272
|
if (!this.redirectKey) {
|
|
295
273
|
return Promise.resolve();
|
|
296
|
-
}
|
|
297
|
-
|
|
274
|
+
}
|
|
298
275
|
|
|
276
|
+
// We need to change the class name based on the schema
|
|
299
277
|
return this.config.database.redirectClassNameForKey(this.className, this.redirectKey).then(newClassName => {
|
|
300
278
|
this.className = newClassName;
|
|
301
279
|
this.redirectClassName = newClassName;
|
|
302
280
|
});
|
|
303
|
-
};
|
|
304
|
-
|
|
281
|
+
};
|
|
305
282
|
|
|
283
|
+
// Validates this operation against the allowClientClassCreation config.
|
|
306
284
|
RestQuery.prototype.validateClientClassCreation = function () {
|
|
307
285
|
if (this.config.allowClientClassCreation === false && !this.auth.isMaster && SchemaController.systemClasses.indexOf(this.className) === -1) {
|
|
308
286
|
return this.config.database.loadSchema().then(schemaController => schemaController.hasClass(this.className)).then(hasClass => {
|
|
@@ -314,10 +292,8 @@ RestQuery.prototype.validateClientClassCreation = function () {
|
|
|
314
292
|
return Promise.resolve();
|
|
315
293
|
}
|
|
316
294
|
};
|
|
317
|
-
|
|
318
295
|
function transformInQuery(inQueryObject, className, results) {
|
|
319
296
|
var values = [];
|
|
320
|
-
|
|
321
297
|
for (var result of results) {
|
|
322
298
|
values.push({
|
|
323
299
|
__type: 'Pointer',
|
|
@@ -325,56 +301,47 @@ function transformInQuery(inQueryObject, className, results) {
|
|
|
325
301
|
objectId: result.objectId
|
|
326
302
|
});
|
|
327
303
|
}
|
|
328
|
-
|
|
329
304
|
delete inQueryObject['$inQuery'];
|
|
330
|
-
|
|
331
305
|
if (Array.isArray(inQueryObject['$in'])) {
|
|
332
306
|
inQueryObject['$in'] = inQueryObject['$in'].concat(values);
|
|
333
307
|
} else {
|
|
334
308
|
inQueryObject['$in'] = values;
|
|
335
309
|
}
|
|
336
|
-
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Replaces a $inQuery clause by running the subquery, if there is an
|
|
337
313
|
// $inQuery clause.
|
|
338
314
|
// The $inQuery clause turns into an $in with values that are just
|
|
339
315
|
// pointers to the objects returned in the subquery.
|
|
340
|
-
|
|
341
|
-
|
|
342
316
|
RestQuery.prototype.replaceInQuery = function () {
|
|
343
317
|
var inQueryObject = findObjectWithKey(this.restWhere, '$inQuery');
|
|
344
|
-
|
|
345
318
|
if (!inQueryObject) {
|
|
346
319
|
return;
|
|
347
|
-
}
|
|
348
|
-
|
|
320
|
+
}
|
|
349
321
|
|
|
322
|
+
// The inQuery value must have precisely two keys - where and className
|
|
350
323
|
var inQueryValue = inQueryObject['$inQuery'];
|
|
351
|
-
|
|
352
324
|
if (!inQueryValue.where || !inQueryValue.className) {
|
|
353
325
|
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $inQuery');
|
|
354
326
|
}
|
|
355
|
-
|
|
356
327
|
const additionalOptions = {
|
|
357
328
|
redirectClassNameForKey: inQueryValue.redirectClassNameForKey
|
|
358
329
|
};
|
|
359
|
-
|
|
360
330
|
if (this.restOptions.subqueryReadPreference) {
|
|
361
331
|
additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
|
|
362
332
|
additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
|
|
363
333
|
} else if (this.restOptions.readPreference) {
|
|
364
334
|
additionalOptions.readPreference = this.restOptions.readPreference;
|
|
365
335
|
}
|
|
366
|
-
|
|
367
336
|
var subquery = new RestQuery(this.config, this.auth, inQueryValue.className, inQueryValue.where, additionalOptions);
|
|
368
337
|
return subquery.execute().then(response => {
|
|
369
|
-
transformInQuery(inQueryObject, subquery.className, response.results);
|
|
370
|
-
|
|
338
|
+
transformInQuery(inQueryObject, subquery.className, response.results);
|
|
339
|
+
// Recurse to repeat
|
|
371
340
|
return this.replaceInQuery();
|
|
372
341
|
});
|
|
373
342
|
};
|
|
374
|
-
|
|
375
343
|
function transformNotInQuery(notInQueryObject, className, results) {
|
|
376
344
|
var values = [];
|
|
377
|
-
|
|
378
345
|
for (var result of results) {
|
|
379
346
|
values.push({
|
|
380
347
|
__type: 'Pointer',
|
|
@@ -382,195 +349,165 @@ function transformNotInQuery(notInQueryObject, className, results) {
|
|
|
382
349
|
objectId: result.objectId
|
|
383
350
|
});
|
|
384
351
|
}
|
|
385
|
-
|
|
386
352
|
delete notInQueryObject['$notInQuery'];
|
|
387
|
-
|
|
388
353
|
if (Array.isArray(notInQueryObject['$nin'])) {
|
|
389
354
|
notInQueryObject['$nin'] = notInQueryObject['$nin'].concat(values);
|
|
390
355
|
} else {
|
|
391
356
|
notInQueryObject['$nin'] = values;
|
|
392
357
|
}
|
|
393
|
-
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Replaces a $notInQuery clause by running the subquery, if there is an
|
|
394
361
|
// $notInQuery clause.
|
|
395
362
|
// The $notInQuery clause turns into a $nin with values that are just
|
|
396
363
|
// pointers to the objects returned in the subquery.
|
|
397
|
-
|
|
398
|
-
|
|
399
364
|
RestQuery.prototype.replaceNotInQuery = function () {
|
|
400
365
|
var notInQueryObject = findObjectWithKey(this.restWhere, '$notInQuery');
|
|
401
|
-
|
|
402
366
|
if (!notInQueryObject) {
|
|
403
367
|
return;
|
|
404
|
-
}
|
|
405
|
-
|
|
368
|
+
}
|
|
406
369
|
|
|
370
|
+
// The notInQuery value must have precisely two keys - where and className
|
|
407
371
|
var notInQueryValue = notInQueryObject['$notInQuery'];
|
|
408
|
-
|
|
409
372
|
if (!notInQueryValue.where || !notInQueryValue.className) {
|
|
410
373
|
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $notInQuery');
|
|
411
374
|
}
|
|
412
|
-
|
|
413
375
|
const additionalOptions = {
|
|
414
376
|
redirectClassNameForKey: notInQueryValue.redirectClassNameForKey
|
|
415
377
|
};
|
|
416
|
-
|
|
417
378
|
if (this.restOptions.subqueryReadPreference) {
|
|
418
379
|
additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
|
|
419
380
|
additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
|
|
420
381
|
} else if (this.restOptions.readPreference) {
|
|
421
382
|
additionalOptions.readPreference = this.restOptions.readPreference;
|
|
422
383
|
}
|
|
423
|
-
|
|
424
384
|
var subquery = new RestQuery(this.config, this.auth, notInQueryValue.className, notInQueryValue.where, additionalOptions);
|
|
425
385
|
return subquery.execute().then(response => {
|
|
426
|
-
transformNotInQuery(notInQueryObject, subquery.className, response.results);
|
|
427
|
-
|
|
386
|
+
transformNotInQuery(notInQueryObject, subquery.className, response.results);
|
|
387
|
+
// Recurse to repeat
|
|
428
388
|
return this.replaceNotInQuery();
|
|
429
389
|
});
|
|
430
|
-
};
|
|
431
|
-
|
|
390
|
+
};
|
|
432
391
|
|
|
392
|
+
// Used to get the deepest object from json using dot notation.
|
|
433
393
|
const getDeepestObjectFromKey = (json, key, idx, src) => {
|
|
434
394
|
if (key in json) {
|
|
435
395
|
return json[key];
|
|
436
396
|
}
|
|
437
|
-
|
|
438
397
|
src.splice(1); // Exit Early
|
|
439
398
|
};
|
|
440
399
|
|
|
441
400
|
const transformSelect = (selectObject, key, objects) => {
|
|
442
401
|
var values = [];
|
|
443
|
-
|
|
444
402
|
for (var result of objects) {
|
|
445
403
|
values.push(key.split('.').reduce(getDeepestObjectFromKey, result));
|
|
446
404
|
}
|
|
447
|
-
|
|
448
405
|
delete selectObject['$select'];
|
|
449
|
-
|
|
450
406
|
if (Array.isArray(selectObject['$in'])) {
|
|
451
407
|
selectObject['$in'] = selectObject['$in'].concat(values);
|
|
452
408
|
} else {
|
|
453
409
|
selectObject['$in'] = values;
|
|
454
410
|
}
|
|
455
|
-
};
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
// Replaces a $select clause by running the subquery, if there is a
|
|
456
414
|
// $select clause.
|
|
457
415
|
// The $select clause turns into an $in with values selected out of
|
|
458
416
|
// the subquery.
|
|
459
417
|
// Returns a possible-promise.
|
|
460
|
-
|
|
461
|
-
|
|
462
418
|
RestQuery.prototype.replaceSelect = function () {
|
|
463
419
|
var selectObject = findObjectWithKey(this.restWhere, '$select');
|
|
464
|
-
|
|
465
420
|
if (!selectObject) {
|
|
466
421
|
return;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
var selectValue = selectObject['$select']; // iOS SDK don't send where if not set, let it pass
|
|
422
|
+
}
|
|
471
423
|
|
|
424
|
+
// The select value must have precisely two keys - query and key
|
|
425
|
+
var selectValue = selectObject['$select'];
|
|
426
|
+
// iOS SDK don't send where if not set, let it pass
|
|
472
427
|
if (!selectValue.query || !selectValue.key || typeof selectValue.query !== 'object' || !selectValue.query.className || Object.keys(selectValue).length !== 2) {
|
|
473
428
|
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $select');
|
|
474
429
|
}
|
|
475
|
-
|
|
476
430
|
const additionalOptions = {
|
|
477
431
|
redirectClassNameForKey: selectValue.query.redirectClassNameForKey
|
|
478
432
|
};
|
|
479
|
-
|
|
480
433
|
if (this.restOptions.subqueryReadPreference) {
|
|
481
434
|
additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
|
|
482
435
|
additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
|
|
483
436
|
} else if (this.restOptions.readPreference) {
|
|
484
437
|
additionalOptions.readPreference = this.restOptions.readPreference;
|
|
485
438
|
}
|
|
486
|
-
|
|
487
439
|
var subquery = new RestQuery(this.config, this.auth, selectValue.query.className, selectValue.query.where, additionalOptions);
|
|
488
440
|
return subquery.execute().then(response => {
|
|
489
|
-
transformSelect(selectObject, selectValue.key, response.results);
|
|
490
|
-
|
|
441
|
+
transformSelect(selectObject, selectValue.key, response.results);
|
|
442
|
+
// Keep replacing $select clauses
|
|
491
443
|
return this.replaceSelect();
|
|
492
444
|
});
|
|
493
445
|
};
|
|
494
|
-
|
|
495
446
|
const transformDontSelect = (dontSelectObject, key, objects) => {
|
|
496
447
|
var values = [];
|
|
497
|
-
|
|
498
448
|
for (var result of objects) {
|
|
499
449
|
values.push(key.split('.').reduce(getDeepestObjectFromKey, result));
|
|
500
450
|
}
|
|
501
|
-
|
|
502
451
|
delete dontSelectObject['$dontSelect'];
|
|
503
|
-
|
|
504
452
|
if (Array.isArray(dontSelectObject['$nin'])) {
|
|
505
453
|
dontSelectObject['$nin'] = dontSelectObject['$nin'].concat(values);
|
|
506
454
|
} else {
|
|
507
455
|
dontSelectObject['$nin'] = values;
|
|
508
456
|
}
|
|
509
|
-
};
|
|
457
|
+
};
|
|
458
|
+
|
|
459
|
+
// Replaces a $dontSelect clause by running the subquery, if there is a
|
|
510
460
|
// $dontSelect clause.
|
|
511
461
|
// The $dontSelect clause turns into an $nin with values selected out of
|
|
512
462
|
// the subquery.
|
|
513
463
|
// Returns a possible-promise.
|
|
514
|
-
|
|
515
|
-
|
|
516
464
|
RestQuery.prototype.replaceDontSelect = function () {
|
|
517
465
|
var dontSelectObject = findObjectWithKey(this.restWhere, '$dontSelect');
|
|
518
|
-
|
|
519
466
|
if (!dontSelectObject) {
|
|
520
467
|
return;
|
|
521
|
-
}
|
|
522
|
-
|
|
468
|
+
}
|
|
523
469
|
|
|
470
|
+
// The dontSelect value must have precisely two keys - query and key
|
|
524
471
|
var dontSelectValue = dontSelectObject['$dontSelect'];
|
|
525
|
-
|
|
526
472
|
if (!dontSelectValue.query || !dontSelectValue.key || typeof dontSelectValue.query !== 'object' || !dontSelectValue.query.className || Object.keys(dontSelectValue).length !== 2) {
|
|
527
473
|
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'improper usage of $dontSelect');
|
|
528
474
|
}
|
|
529
|
-
|
|
530
475
|
const additionalOptions = {
|
|
531
476
|
redirectClassNameForKey: dontSelectValue.query.redirectClassNameForKey
|
|
532
477
|
};
|
|
533
|
-
|
|
534
478
|
if (this.restOptions.subqueryReadPreference) {
|
|
535
479
|
additionalOptions.readPreference = this.restOptions.subqueryReadPreference;
|
|
536
480
|
additionalOptions.subqueryReadPreference = this.restOptions.subqueryReadPreference;
|
|
537
481
|
} else if (this.restOptions.readPreference) {
|
|
538
482
|
additionalOptions.readPreference = this.restOptions.readPreference;
|
|
539
483
|
}
|
|
540
|
-
|
|
541
484
|
var subquery = new RestQuery(this.config, this.auth, dontSelectValue.query.className, dontSelectValue.query.where, additionalOptions);
|
|
542
485
|
return subquery.execute().then(response => {
|
|
543
|
-
transformDontSelect(dontSelectObject, dontSelectValue.key, response.results);
|
|
544
|
-
|
|
486
|
+
transformDontSelect(dontSelectObject, dontSelectValue.key, response.results);
|
|
487
|
+
// Keep replacing $dontSelect clauses
|
|
545
488
|
return this.replaceDontSelect();
|
|
546
489
|
});
|
|
547
490
|
};
|
|
548
|
-
|
|
549
491
|
RestQuery.prototype.cleanResultAuthData = function (result) {
|
|
550
492
|
delete result.password;
|
|
551
|
-
|
|
552
493
|
if (result.authData) {
|
|
553
494
|
Object.keys(result.authData).forEach(provider => {
|
|
554
495
|
if (result.authData[provider] === null) {
|
|
555
496
|
delete result.authData[provider];
|
|
556
497
|
}
|
|
557
498
|
});
|
|
558
|
-
|
|
559
499
|
if (Object.keys(result.authData).length == 0) {
|
|
560
500
|
delete result.authData;
|
|
561
501
|
}
|
|
562
502
|
}
|
|
563
503
|
};
|
|
564
|
-
|
|
565
504
|
const replaceEqualityConstraint = constraint => {
|
|
566
505
|
if (typeof constraint !== 'object') {
|
|
567
506
|
return constraint;
|
|
568
507
|
}
|
|
569
|
-
|
|
570
508
|
const equalToObject = {};
|
|
571
509
|
let hasDirectConstraint = false;
|
|
572
510
|
let hasOperatorConstraint = false;
|
|
573
|
-
|
|
574
511
|
for (const key in constraint) {
|
|
575
512
|
if (key.indexOf('$') !== 0) {
|
|
576
513
|
hasDirectConstraint = true;
|
|
@@ -579,29 +516,25 @@ const replaceEqualityConstraint = constraint => {
|
|
|
579
516
|
hasOperatorConstraint = true;
|
|
580
517
|
}
|
|
581
518
|
}
|
|
582
|
-
|
|
583
519
|
if (hasDirectConstraint && hasOperatorConstraint) {
|
|
584
520
|
constraint['$eq'] = equalToObject;
|
|
585
521
|
Object.keys(equalToObject).forEach(key => {
|
|
586
522
|
delete constraint[key];
|
|
587
523
|
});
|
|
588
524
|
}
|
|
589
|
-
|
|
590
525
|
return constraint;
|
|
591
526
|
};
|
|
592
|
-
|
|
593
527
|
RestQuery.prototype.replaceEquality = function () {
|
|
594
528
|
if (typeof this.restWhere !== 'object') {
|
|
595
529
|
return;
|
|
596
530
|
}
|
|
597
|
-
|
|
598
531
|
for (const key in this.restWhere) {
|
|
599
532
|
this.restWhere[key] = replaceEqualityConstraint(this.restWhere[key]);
|
|
600
533
|
}
|
|
601
|
-
};
|
|
602
|
-
// Populates this.response with an object that only has 'results'.
|
|
603
|
-
|
|
534
|
+
};
|
|
604
535
|
|
|
536
|
+
// Returns a promise for whether it was successful.
|
|
537
|
+
// Populates this.response with an object that only has 'results'.
|
|
605
538
|
RestQuery.prototype.runFind = function (options = {}) {
|
|
606
539
|
if (this.findOptions.limit === 0) {
|
|
607
540
|
this.response = {
|
|
@@ -609,47 +542,39 @@ RestQuery.prototype.runFind = function (options = {}) {
|
|
|
609
542
|
};
|
|
610
543
|
return Promise.resolve();
|
|
611
544
|
}
|
|
612
|
-
|
|
613
545
|
const findOptions = Object.assign({}, this.findOptions);
|
|
614
|
-
|
|
615
546
|
if (this.keys) {
|
|
616
547
|
findOptions.keys = this.keys.map(key => {
|
|
617
548
|
return key.split('.')[0];
|
|
618
549
|
});
|
|
619
550
|
}
|
|
620
|
-
|
|
621
551
|
if (options.op) {
|
|
622
552
|
findOptions.op = options.op;
|
|
623
553
|
}
|
|
624
|
-
|
|
625
554
|
return this.config.database.find(this.className, this.restWhere, findOptions, this.auth).then(results => {
|
|
626
555
|
if (this.className === '_User' && !findOptions.explain) {
|
|
627
556
|
for (var result of results) {
|
|
628
557
|
this.cleanResultAuthData(result);
|
|
629
558
|
}
|
|
630
559
|
}
|
|
631
|
-
|
|
632
560
|
this.config.filesController.expandFilesInObject(this.config, results);
|
|
633
|
-
|
|
634
561
|
if (this.redirectClassName) {
|
|
635
562
|
for (var r of results) {
|
|
636
563
|
r.className = this.redirectClassName;
|
|
637
564
|
}
|
|
638
565
|
}
|
|
639
|
-
|
|
640
566
|
this.response = {
|
|
641
567
|
results: results
|
|
642
568
|
};
|
|
643
569
|
});
|
|
644
|
-
};
|
|
645
|
-
// Populates this.response.count with the count
|
|
646
|
-
|
|
570
|
+
};
|
|
647
571
|
|
|
572
|
+
// Returns a promise for whether it was successful.
|
|
573
|
+
// Populates this.response.count with the count
|
|
648
574
|
RestQuery.prototype.runCount = function () {
|
|
649
575
|
if (!this.doCount) {
|
|
650
576
|
return;
|
|
651
577
|
}
|
|
652
|
-
|
|
653
578
|
this.findOptions.count = true;
|
|
654
579
|
delete this.findOptions.skip;
|
|
655
580
|
delete this.findOptions.limit;
|
|
@@ -657,73 +582,63 @@ RestQuery.prototype.runCount = function () {
|
|
|
657
582
|
this.response.count = c;
|
|
658
583
|
});
|
|
659
584
|
};
|
|
660
|
-
|
|
661
585
|
RestQuery.prototype.denyProtectedFields = async function () {
|
|
662
586
|
if (this.auth.isMaster) {
|
|
663
587
|
return;
|
|
664
588
|
}
|
|
665
|
-
|
|
666
589
|
const schemaController = await this.config.database.loadSchema();
|
|
667
590
|
const protectedFields = this.config.database.addProtectedFields(schemaController, this.className, this.restWhere, this.findOptions.acl, this.auth, this.findOptions) || [];
|
|
668
|
-
|
|
669
591
|
for (const key of protectedFields) {
|
|
670
592
|
if (this.restWhere[key]) {
|
|
671
593
|
throw new Parse.Error(Parse.Error.OPERATION_FORBIDDEN, `This user is not allowed to query ${key} on class ${this.className}`);
|
|
672
594
|
}
|
|
673
595
|
}
|
|
674
|
-
};
|
|
675
|
-
|
|
596
|
+
};
|
|
676
597
|
|
|
598
|
+
// Augments this.response with all pointers on an object
|
|
677
599
|
RestQuery.prototype.handleIncludeAll = function () {
|
|
678
600
|
if (!this.includeAll) {
|
|
679
601
|
return;
|
|
680
602
|
}
|
|
681
|
-
|
|
682
603
|
return this.config.database.loadSchema().then(schemaController => schemaController.getOneSchema(this.className)).then(schema => {
|
|
683
604
|
const includeFields = [];
|
|
684
605
|
const keyFields = [];
|
|
685
|
-
|
|
686
606
|
for (const field in schema.fields) {
|
|
687
607
|
if (schema.fields[field].type && schema.fields[field].type === 'Pointer' || schema.fields[field].type && schema.fields[field].type === 'Array') {
|
|
688
608
|
includeFields.push([field]);
|
|
689
609
|
keyFields.push(field);
|
|
690
610
|
}
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
611
|
+
}
|
|
612
|
+
// Add fields to include, keys, remove dups
|
|
613
|
+
this.include = [...new Set([...this.include, ...includeFields])];
|
|
614
|
+
// if this.keys not set, then all keys are already included
|
|
696
615
|
if (this.keys) {
|
|
697
616
|
this.keys = [...new Set([...this.keys, ...keyFields])];
|
|
698
617
|
}
|
|
699
618
|
});
|
|
700
|
-
};
|
|
701
|
-
|
|
619
|
+
};
|
|
702
620
|
|
|
621
|
+
// Updates property `this.keys` to contain all keys but the ones unselected.
|
|
703
622
|
RestQuery.prototype.handleExcludeKeys = function () {
|
|
704
623
|
if (!this.excludeKeys) {
|
|
705
624
|
return;
|
|
706
625
|
}
|
|
707
|
-
|
|
708
626
|
if (this.keys) {
|
|
709
627
|
this.keys = this.keys.filter(k => !this.excludeKeys.includes(k));
|
|
710
628
|
return;
|
|
711
629
|
}
|
|
712
|
-
|
|
713
630
|
return this.config.database.loadSchema().then(schemaController => schemaController.getOneSchema(this.className)).then(schema => {
|
|
714
631
|
const fields = Object.keys(schema.fields);
|
|
715
632
|
this.keys = fields.filter(k => !this.excludeKeys.includes(k));
|
|
716
633
|
});
|
|
717
|
-
};
|
|
718
|
-
|
|
634
|
+
};
|
|
719
635
|
|
|
636
|
+
// Augments this.response with data at the paths provided in this.include.
|
|
720
637
|
RestQuery.prototype.handleInclude = function () {
|
|
721
638
|
if (this.include.length == 0) {
|
|
722
639
|
return;
|
|
723
640
|
}
|
|
724
|
-
|
|
725
641
|
var pathResponse = includePath(this.config, this.auth, this.response, this.include[0], this.restOptions);
|
|
726
|
-
|
|
727
642
|
if (pathResponse.then) {
|
|
728
643
|
return pathResponse.then(newResponse => {
|
|
729
644
|
this.response = newResponse;
|
|
@@ -734,37 +649,31 @@ RestQuery.prototype.handleInclude = function () {
|
|
|
734
649
|
this.include = this.include.slice(1);
|
|
735
650
|
return this.handleInclude();
|
|
736
651
|
}
|
|
737
|
-
|
|
738
652
|
return pathResponse;
|
|
739
|
-
};
|
|
740
|
-
|
|
653
|
+
};
|
|
741
654
|
|
|
655
|
+
//Returns a promise of a processed set of results
|
|
742
656
|
RestQuery.prototype.runAfterFindTrigger = function () {
|
|
743
657
|
if (!this.response) {
|
|
744
658
|
return;
|
|
745
659
|
}
|
|
746
|
-
|
|
747
660
|
if (!this.runAfterFind) {
|
|
748
661
|
return;
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
|
|
662
|
+
}
|
|
663
|
+
// Avoid doing any setup for triggers if there is no 'afterFind' trigger for this class.
|
|
752
664
|
const hasAfterFindHook = triggers.triggerExists(this.className, triggers.Types.afterFind, this.config.applicationId);
|
|
753
|
-
|
|
754
665
|
if (!hasAfterFindHook) {
|
|
755
666
|
return Promise.resolve();
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
|
|
667
|
+
}
|
|
668
|
+
// Skip Aggregate and Distinct Queries
|
|
759
669
|
if (this.findOptions.pipeline || this.findOptions.distinct) {
|
|
760
670
|
return Promise.resolve();
|
|
761
671
|
}
|
|
762
|
-
|
|
763
672
|
const json = Object.assign({}, this.restOptions);
|
|
764
673
|
json.where = this.restWhere;
|
|
765
674
|
const parseQuery = new Parse.Query(this.className);
|
|
766
|
-
parseQuery.withJSON(json);
|
|
767
|
-
|
|
675
|
+
parseQuery.withJSON(json);
|
|
676
|
+
// Run afterFind trigger and set the new results
|
|
768
677
|
return triggers.maybeRunAfterFindTrigger(triggers.Types.afterFind, this.auth, this.className, this.response.results, this.config, parseQuery, this.context).then(results => {
|
|
769
678
|
// Ensure we properly set the className back
|
|
770
679
|
if (this.redirectClassName) {
|
|
@@ -772,7 +681,6 @@ RestQuery.prototype.runAfterFindTrigger = function () {
|
|
|
772
681
|
if (object instanceof Parse.Object) {
|
|
773
682
|
object = object.toJSON();
|
|
774
683
|
}
|
|
775
|
-
|
|
776
684
|
object.className = this.redirectClassName;
|
|
777
685
|
return object;
|
|
778
686
|
});
|
|
@@ -780,94 +688,76 @@ RestQuery.prototype.runAfterFindTrigger = function () {
|
|
|
780
688
|
this.response.results = results;
|
|
781
689
|
}
|
|
782
690
|
});
|
|
783
|
-
};
|
|
691
|
+
};
|
|
692
|
+
|
|
693
|
+
// Adds included values to the response.
|
|
784
694
|
// Path is a list of field names.
|
|
785
695
|
// Returns a promise for an augmented response.
|
|
786
|
-
|
|
787
|
-
|
|
788
696
|
function includePath(config, auth, response, path, restOptions = {}) {
|
|
789
697
|
var pointers = findPointers(response.results, path);
|
|
790
|
-
|
|
791
698
|
if (pointers.length == 0) {
|
|
792
699
|
return response;
|
|
793
700
|
}
|
|
794
|
-
|
|
795
701
|
const pointersHash = {};
|
|
796
|
-
|
|
797
702
|
for (var pointer of pointers) {
|
|
798
703
|
if (!pointer) {
|
|
799
704
|
continue;
|
|
800
705
|
}
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
706
|
+
const className = pointer.className;
|
|
707
|
+
// only include the good pointers
|
|
804
708
|
if (className) {
|
|
805
709
|
pointersHash[className] = pointersHash[className] || new Set();
|
|
806
710
|
pointersHash[className].add(pointer.objectId);
|
|
807
711
|
}
|
|
808
712
|
}
|
|
809
|
-
|
|
810
713
|
const includeRestOptions = {};
|
|
811
|
-
|
|
812
714
|
if (restOptions.keys) {
|
|
813
715
|
const keys = new Set(restOptions.keys.split(','));
|
|
814
716
|
const keySet = Array.from(keys).reduce((set, key) => {
|
|
815
717
|
const keyPath = key.split('.');
|
|
816
718
|
let i = 0;
|
|
817
|
-
|
|
818
719
|
for (i; i < path.length; i++) {
|
|
819
720
|
if (path[i] != keyPath[i]) {
|
|
820
721
|
return set;
|
|
821
722
|
}
|
|
822
723
|
}
|
|
823
|
-
|
|
824
724
|
if (i < keyPath.length) {
|
|
825
725
|
set.add(keyPath[i]);
|
|
826
726
|
}
|
|
827
|
-
|
|
828
727
|
return set;
|
|
829
728
|
}, new Set());
|
|
830
|
-
|
|
831
729
|
if (keySet.size > 0) {
|
|
832
730
|
includeRestOptions.keys = Array.from(keySet).join(',');
|
|
833
731
|
}
|
|
834
732
|
}
|
|
835
|
-
|
|
836
733
|
if (restOptions.excludeKeys) {
|
|
837
734
|
const excludeKeys = new Set(restOptions.excludeKeys.split(','));
|
|
838
735
|
const excludeKeySet = Array.from(excludeKeys).reduce((set, key) => {
|
|
839
736
|
const keyPath = key.split('.');
|
|
840
737
|
let i = 0;
|
|
841
|
-
|
|
842
738
|
for (i; i < path.length; i++) {
|
|
843
739
|
if (path[i] != keyPath[i]) {
|
|
844
740
|
return set;
|
|
845
741
|
}
|
|
846
742
|
}
|
|
847
|
-
|
|
848
743
|
if (i == keyPath.length - 1) {
|
|
849
744
|
set.add(keyPath[i]);
|
|
850
745
|
}
|
|
851
|
-
|
|
852
746
|
return set;
|
|
853
747
|
}, new Set());
|
|
854
|
-
|
|
855
748
|
if (excludeKeySet.size > 0) {
|
|
856
749
|
includeRestOptions.excludeKeys = Array.from(excludeKeySet).join(',');
|
|
857
750
|
}
|
|
858
751
|
}
|
|
859
|
-
|
|
860
752
|
if (restOptions.includeReadPreference) {
|
|
861
753
|
includeRestOptions.readPreference = restOptions.includeReadPreference;
|
|
862
754
|
includeRestOptions.includeReadPreference = restOptions.includeReadPreference;
|
|
863
755
|
} else if (restOptions.readPreference) {
|
|
864
756
|
includeRestOptions.readPreference = restOptions.readPreference;
|
|
865
757
|
}
|
|
866
|
-
|
|
867
758
|
const queryPromises = Object.keys(pointersHash).map(className => {
|
|
868
759
|
const objectIds = Array.from(pointersHash[className]);
|
|
869
760
|
let where;
|
|
870
|
-
|
|
871
761
|
if (objectIds.length === 1) {
|
|
872
762
|
where = {
|
|
873
763
|
objectId: objectIds[0]
|
|
@@ -879,7 +769,6 @@ function includePath(config, auth, response, path, restOptions = {}) {
|
|
|
879
769
|
}
|
|
880
770
|
};
|
|
881
771
|
}
|
|
882
|
-
|
|
883
772
|
var query = new RestQuery(config, auth, className, where, includeRestOptions);
|
|
884
773
|
return query.execute({
|
|
885
774
|
op: 'get'
|
|
@@ -887,105 +776,86 @@ function includePath(config, auth, response, path, restOptions = {}) {
|
|
|
887
776
|
results.className = className;
|
|
888
777
|
return Promise.resolve(results);
|
|
889
778
|
});
|
|
890
|
-
});
|
|
779
|
+
});
|
|
891
780
|
|
|
781
|
+
// Get the objects for all these object ids
|
|
892
782
|
return Promise.all(queryPromises).then(responses => {
|
|
893
783
|
var replace = responses.reduce((replace, includeResponse) => {
|
|
894
784
|
for (var obj of includeResponse.results) {
|
|
895
785
|
obj.__type = 'Object';
|
|
896
786
|
obj.className = includeResponse.className;
|
|
897
|
-
|
|
898
787
|
if (obj.className == '_User' && !auth.isMaster) {
|
|
899
788
|
delete obj.sessionToken;
|
|
900
789
|
delete obj.authData;
|
|
901
790
|
}
|
|
902
|
-
|
|
903
791
|
replace[obj.objectId] = obj;
|
|
904
792
|
}
|
|
905
|
-
|
|
906
793
|
return replace;
|
|
907
794
|
}, {});
|
|
908
795
|
var resp = {
|
|
909
796
|
results: replacePointers(response.results, path, replace)
|
|
910
797
|
};
|
|
911
|
-
|
|
912
798
|
if (response.count) {
|
|
913
799
|
resp.count = response.count;
|
|
914
800
|
}
|
|
915
|
-
|
|
916
801
|
return resp;
|
|
917
802
|
});
|
|
918
|
-
}
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// Object may be a list of REST-format object to find pointers in, or
|
|
919
806
|
// it may be a single object.
|
|
920
807
|
// If the path yields things that aren't pointers, this throws an error.
|
|
921
808
|
// Path is a list of fields to search into.
|
|
922
809
|
// Returns a list of pointers in REST format.
|
|
923
|
-
|
|
924
|
-
|
|
925
810
|
function findPointers(object, path) {
|
|
926
811
|
if (object instanceof Array) {
|
|
927
812
|
var answer = [];
|
|
928
|
-
|
|
929
813
|
for (var x of object) {
|
|
930
814
|
answer = answer.concat(findPointers(x, path));
|
|
931
815
|
}
|
|
932
|
-
|
|
933
816
|
return answer;
|
|
934
817
|
}
|
|
935
|
-
|
|
936
818
|
if (typeof object !== 'object' || !object) {
|
|
937
819
|
return [];
|
|
938
820
|
}
|
|
939
|
-
|
|
940
821
|
if (path.length == 0) {
|
|
941
822
|
if (object === null || object.__type == 'Pointer') {
|
|
942
823
|
return [object];
|
|
943
824
|
}
|
|
944
|
-
|
|
945
825
|
return [];
|
|
946
826
|
}
|
|
947
|
-
|
|
948
827
|
var subobject = object[path[0]];
|
|
949
|
-
|
|
950
828
|
if (!subobject) {
|
|
951
829
|
return [];
|
|
952
830
|
}
|
|
953
|
-
|
|
954
831
|
return findPointers(subobject, path.slice(1));
|
|
955
|
-
}
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
// Object may be a list of REST-format objects to replace pointers
|
|
956
835
|
// in, or it may be a single object.
|
|
957
836
|
// Path is a list of fields to search into.
|
|
958
837
|
// replace is a map from object id -> object.
|
|
959
838
|
// Returns something analogous to object, but with the appropriate
|
|
960
839
|
// pointers inflated.
|
|
961
|
-
|
|
962
|
-
|
|
963
840
|
function replacePointers(object, path, replace) {
|
|
964
841
|
if (object instanceof Array) {
|
|
965
842
|
return object.map(obj => replacePointers(obj, path, replace)).filter(obj => typeof obj !== 'undefined');
|
|
966
843
|
}
|
|
967
|
-
|
|
968
844
|
if (typeof object !== 'object' || !object) {
|
|
969
845
|
return object;
|
|
970
846
|
}
|
|
971
|
-
|
|
972
847
|
if (path.length === 0) {
|
|
973
848
|
if (object && object.__type === 'Pointer') {
|
|
974
849
|
return replace[object.objectId];
|
|
975
850
|
}
|
|
976
|
-
|
|
977
851
|
return object;
|
|
978
852
|
}
|
|
979
|
-
|
|
980
853
|
var subobject = object[path[0]];
|
|
981
|
-
|
|
982
854
|
if (!subobject) {
|
|
983
855
|
return object;
|
|
984
856
|
}
|
|
985
|
-
|
|
986
857
|
var newsub = replacePointers(subobject, path.slice(1), replace);
|
|
987
858
|
var answer = {};
|
|
988
|
-
|
|
989
859
|
for (var key in object) {
|
|
990
860
|
if (key == path[0]) {
|
|
991
861
|
answer[key] = newsub;
|
|
@@ -993,39 +863,32 @@ function replacePointers(object, path, replace) {
|
|
|
993
863
|
answer[key] = object[key];
|
|
994
864
|
}
|
|
995
865
|
}
|
|
996
|
-
|
|
997
866
|
return answer;
|
|
998
|
-
}
|
|
999
|
-
// Returns undefined otherwise.
|
|
1000
|
-
|
|
867
|
+
}
|
|
1001
868
|
|
|
869
|
+
// Finds a subobject that has the given key, if there is one.
|
|
870
|
+
// Returns undefined otherwise.
|
|
1002
871
|
function findObjectWithKey(root, key) {
|
|
1003
872
|
if (typeof root !== 'object') {
|
|
1004
873
|
return;
|
|
1005
874
|
}
|
|
1006
|
-
|
|
1007
875
|
if (root instanceof Array) {
|
|
1008
876
|
for (var item of root) {
|
|
1009
877
|
const answer = findObjectWithKey(item, key);
|
|
1010
|
-
|
|
1011
878
|
if (answer) {
|
|
1012
879
|
return answer;
|
|
1013
880
|
}
|
|
1014
881
|
}
|
|
1015
882
|
}
|
|
1016
|
-
|
|
1017
883
|
if (root && root[key]) {
|
|
1018
884
|
return root;
|
|
1019
885
|
}
|
|
1020
|
-
|
|
1021
886
|
for (var subkey in root) {
|
|
1022
887
|
const answer = findObjectWithKey(root[subkey], key);
|
|
1023
|
-
|
|
1024
888
|
if (answer) {
|
|
1025
889
|
return answer;
|
|
1026
890
|
}
|
|
1027
891
|
}
|
|
1028
892
|
}
|
|
1029
|
-
|
|
1030
893
|
module.exports = RestQuery;
|
|
1031
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0UXVlcnkuanMiXSwibmFtZXMiOlsiU2NoZW1hQ29udHJvbGxlciIsInJlcXVpcmUiLCJQYXJzZSIsInRyaWdnZXJzIiwiY29udGludWVXaGlsZSIsIkFsd2F5c1NlbGVjdGVkS2V5cyIsIlJlc3RRdWVyeSIsImNvbmZpZyIsImF1dGgiLCJjbGFzc05hbWUiLCJyZXN0V2hlcmUiLCJyZXN0T3B0aW9ucyIsImNsaWVudFNESyIsInJ1bkFmdGVyRmluZCIsImNvbnRleHQiLCJyZXNwb25zZSIsImZpbmRPcHRpb25zIiwiaXNNYXN0ZXIiLCJ1c2VyIiwiRXJyb3IiLCJJTlZBTElEX1NFU1NJT05fVE9LRU4iLCIkYW5kIiwiX190eXBlIiwib2JqZWN0SWQiLCJpZCIsImRvQ291bnQiLCJpbmNsdWRlQWxsIiwiaW5jbHVkZSIsImtleXNGb3JJbmNsdWRlIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwia2V5cyIsImV4Y2x1ZGVLZXlzIiwibGVuZ3RoIiwic3BsaXQiLCJmaWx0ZXIiLCJrZXkiLCJtYXAiLCJzbGljZSIsImxhc3RJbmRleE9mIiwiam9pbiIsIm9wdGlvbiIsImNvbmNhdCIsIkFycmF5IiwiZnJvbSIsIlNldCIsImV4Y2x1ZGUiLCJrIiwiaW5kZXhPZiIsImZpZWxkcyIsIm9yZGVyIiwic29ydCIsInJlZHVjZSIsInNvcnRNYXAiLCJmaWVsZCIsInRyaW0iLCJzY29yZSIsIiRtZXRhIiwicGF0aHMiLCJpbmNsdWRlcyIsInBhdGhTZXQiLCJtZW1vIiwicGF0aCIsImluZGV4IiwicGFydHMiLCJzIiwiYSIsImIiLCJyZWRpcmVjdEtleSIsInJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5IiwicmVkaXJlY3RDbGFzc05hbWUiLCJJTlZBTElEX0pTT04iLCJleGVjdXRlIiwiZXhlY3V0ZU9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInRoZW4iLCJidWlsZFJlc3RXaGVyZSIsImRlbnlQcm90ZWN0ZWRGaWVsZHMiLCJoYW5kbGVJbmNsdWRlQWxsIiwiaGFuZGxlRXhjbHVkZUtleXMiLCJydW5GaW5kIiwicnVuQ291bnQiLCJoYW5kbGVJbmNsdWRlIiwicnVuQWZ0ZXJGaW5kVHJpZ2dlciIsImVhY2giLCJjYWxsYmFjayIsImxpbWl0IiwiZmluaXNoZWQiLCJxdWVyeSIsInJlc3VsdHMiLCJmb3JFYWNoIiwiYXNzaWduIiwiJGd0IiwiZ2V0VXNlckFuZFJvbGVBQ0wiLCJ2YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24iLCJyZXBsYWNlU2VsZWN0IiwicmVwbGFjZURvbnRTZWxlY3QiLCJyZXBsYWNlSW5RdWVyeSIsInJlcGxhY2VOb3RJblF1ZXJ5IiwicmVwbGFjZUVxdWFsaXR5IiwiYWNsIiwiZ2V0VXNlclJvbGVzIiwicm9sZXMiLCJkYXRhYmFzZSIsIm5ld0NsYXNzTmFtZSIsImFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiIsInN5c3RlbUNsYXNzZXMiLCJsb2FkU2NoZW1hIiwic2NoZW1hQ29udHJvbGxlciIsImhhc0NsYXNzIiwiT1BFUkFUSU9OX0ZPUkJJRERFTiIsInRyYW5zZm9ybUluUXVlcnkiLCJpblF1ZXJ5T2JqZWN0IiwidmFsdWVzIiwicmVzdWx0IiwicHVzaCIsImlzQXJyYXkiLCJmaW5kT2JqZWN0V2l0aEtleSIsImluUXVlcnlWYWx1ZSIsIndoZXJlIiwiSU5WQUxJRF9RVUVSWSIsImFkZGl0aW9uYWxPcHRpb25zIiwic3VicXVlcnlSZWFkUHJlZmVyZW5jZSIsInJlYWRQcmVmZXJlbmNlIiwic3VicXVlcnkiLCJ0cmFuc2Zvcm1Ob3RJblF1ZXJ5Iiwibm90SW5RdWVyeU9iamVjdCIsIm5vdEluUXVlcnlWYWx1ZSIsImdldERlZXBlc3RPYmplY3RGcm9tS2V5IiwianNvbiIsImlkeCIsInNyYyIsInNwbGljZSIsInRyYW5zZm9ybVNlbGVjdCIsInNlbGVjdE9iamVjdCIsIm9iamVjdHMiLCJzZWxlY3RWYWx1ZSIsInRyYW5zZm9ybURvbnRTZWxlY3QiLCJkb250U2VsZWN0T2JqZWN0IiwiZG9udFNlbGVjdFZhbHVlIiwiY2xlYW5SZXN1bHRBdXRoRGF0YSIsInBhc3N3b3JkIiwiYXV0aERhdGEiLCJwcm92aWRlciIsInJlcGxhY2VFcXVhbGl0eUNvbnN0cmFpbnQiLCJjb25zdHJhaW50IiwiZXF1YWxUb09iamVjdCIsImhhc0RpcmVjdENvbnN0cmFpbnQiLCJoYXNPcGVyYXRvckNvbnN0cmFpbnQiLCJvcHRpb25zIiwib3AiLCJmaW5kIiwiZXhwbGFpbiIsImZpbGVzQ29udHJvbGxlciIsImV4cGFuZEZpbGVzSW5PYmplY3QiLCJyIiwiY291bnQiLCJza2lwIiwiYyIsInByb3RlY3RlZEZpZWxkcyIsImFkZFByb3RlY3RlZEZpZWxkcyIsImdldE9uZVNjaGVtYSIsInNjaGVtYSIsImluY2x1ZGVGaWVsZHMiLCJrZXlGaWVsZHMiLCJ0eXBlIiwicGF0aFJlc3BvbnNlIiwiaW5jbHVkZVBhdGgiLCJuZXdSZXNwb25zZSIsImhhc0FmdGVyRmluZEhvb2siLCJ0cmlnZ2VyRXhpc3RzIiwiVHlwZXMiLCJhZnRlckZpbmQiLCJhcHBsaWNhdGlvbklkIiwicGlwZWxpbmUiLCJkaXN0aW5jdCIsInBhcnNlUXVlcnkiLCJRdWVyeSIsIndpdGhKU09OIiwibWF5YmVSdW5BZnRlckZpbmRUcmlnZ2VyIiwib2JqZWN0IiwidG9KU09OIiwicG9pbnRlcnMiLCJmaW5kUG9pbnRlcnMiLCJwb2ludGVyc0hhc2giLCJwb2ludGVyIiwiYWRkIiwiaW5jbHVkZVJlc3RPcHRpb25zIiwia2V5U2V0Iiwic2V0Iiwia2V5UGF0aCIsImkiLCJzaXplIiwiZXhjbHVkZUtleVNldCIsImluY2x1ZGVSZWFkUHJlZmVyZW5jZSIsInF1ZXJ5UHJvbWlzZXMiLCJvYmplY3RJZHMiLCIkaW4iLCJhbGwiLCJyZXNwb25zZXMiLCJyZXBsYWNlIiwiaW5jbHVkZVJlc3BvbnNlIiwib2JqIiwic2Vzc2lvblRva2VuIiwicmVzcCIsInJlcGxhY2VQb2ludGVycyIsImFuc3dlciIsIngiLCJzdWJvYmplY3QiLCJuZXdzdWIi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LENBQUMsQ0FBRCxDQUFmLEVBQW9CO0FBQ2xCaUosTUFBQUEsTUFBTSxDQUFDM0ssR0FBRCxDQUFOLEdBQWM4SyxNQUFkO0FBQ0QsS0FGRCxNQUVPO0FBQ0xILE1BQUFBLE1BQU0sQ0FBQzNLLEdBQUQsQ0FBTixHQUFjaUosTUFBTSxDQUFDakosR0FBRCxDQUFwQjtBQUNEO0FBQ0Y7O0FBQ0QsU0FBTzJLLE1BQVA7QUFDRCxDLENBRUQ7QUFDQTs7O0FBQ0EsU0FBU3pGLGlCQUFULENBQTJCNkYsSUFBM0IsRUFBaUMvSyxHQUFqQyxFQUFzQztBQUNwQyxNQUFJLE9BQU8rSyxJQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQzVCO0FBQ0Q7O0FBQ0QsTUFBSUEsSUFBSSxZQUFZeEssS0FBcEIsRUFBMkI7QUFDekIsU0FBSyxJQUFJeUssSUFBVCxJQUFpQkQsSUFBakIsRUFBdUI7QUFDckIsWUFBTUosTUFBTSxHQUFHekYsaUJBQWlCLENBQUM4RixJQUFELEVBQU9oTCxHQUFQLENBQWhDOztBQUNBLFVBQUkySyxNQUFKLEVBQVk7QUFDVixlQUFPQSxNQUFQO0FBQ0Q7QUFDRjtBQUNGOztBQUNELE1BQUlJLElBQUksSUFBSUEsSUFBSSxDQUFDL0ssR0FBRCxDQUFoQixFQUF1QjtBQUNyQixXQUFPK0ssSUFBUDtBQUNEOztBQUNELE9BQUssSUFBSUUsTUFBVCxJQUFtQkYsSUFBbkIsRUFBeUI7QUFDdkIsVUFBTUosTUFBTSxHQUFHekYsaUJBQWlCLENBQUM2RixJQUFJLENBQUNFLE1BQUQsQ0FBTCxFQUFlakwsR0FBZixDQUFoQzs7QUFDQSxRQUFJMkssTUFBSixFQUFZO0FBQ1YsYUFBT0EsTUFBUDtBQUNEO0FBQ0Y7QUFDRjs7QUFFRE8sTUFBTSxDQUFDQyxPQUFQLEdBQWlCbk4sU0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgZXZlcnl0aGluZyB3ZSBuZWVkIHRvIHJ1biBhICdmaW5kJ1xuLy8gb3BlcmF0aW9uLCBlbmNvZGVkIGluIHRoZSBSRVNUIEFQSSBmb3JtYXQuXG5cbnZhciBTY2hlbWFDb250cm9sbGVyID0gcmVxdWlyZSgnLi9Db250cm9sbGVycy9TY2hlbWFDb250cm9sbGVyJyk7XG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCB0cmlnZ2VycyA9IHJlcXVpcmUoJy4vdHJpZ2dlcnMnKTtcbmNvbnN0IHsgY29udGludWVXaGlsZSB9ID0gcmVxdWlyZSgncGFyc2UvbGliL25vZGUvcHJvbWlzZVV0aWxzJyk7XG5jb25zdCBBbHdheXNTZWxlY3RlZEtleXMgPSBbJ29iamVjdElkJywgJ2NyZWF0ZWRBdCcsICd1cGRhdGVkQXQnLCAnQUNMJ107XG4vLyByZXN0T3B0aW9ucyBjYW4gaW5jbHVkZTpcbi8vICAgc2tpcFxuLy8gICBsaW1pdFxuLy8gICBvcmRlclxuLy8gICBjb3VudFxuLy8gICBpbmNsdWRlXG4vLyAgIGtleXNcbi8vICAgZXhjbHVkZUtleXNcbi8vICAgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXlcbi8vICAgcmVhZFByZWZlcmVuY2Vcbi8vICAgaW5jbHVkZVJlYWRQcmVmZXJlbmNlXG4vLyAgIHN1YnF1ZXJ5UmVhZFByZWZlcmVuY2VcbmZ1bmN0aW9uIFJlc3RRdWVyeShcbiAgY29uZmlnLFxuICBhdXRoLFxuICBjbGFzc05hbWUsXG4gIHJlc3RXaGVyZSA9IHt9LFxuICByZXN0T3B0aW9ucyA9IHt9LFxuICBjbGllbnRTREssXG4gIHJ1bkFmdGVyRmluZCA9IHRydWUsXG4gIGNvbnRleHRcbikge1xuICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgdGhpcy5hdXRoID0gYXV0aDtcbiAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gIHRoaXMucmVzdFdoZXJlID0gcmVzdFdoZXJlO1xuICB0aGlzLnJlc3RPcHRpb25zID0gcmVzdE9wdGlvbnM7XG4gIHRoaXMuY2xpZW50U0RLID0gY2xpZW50U0RLO1xuICB0aGlzLnJ1bkFmdGVyRmluZCA9IHJ1bkFmdGVyRmluZDtcbiAgdGhpcy5yZXNwb25zZSA9IG51bGw7XG4gIHRoaXMuZmluZE9wdGlvbnMgPSB7fTtcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dCB8fCB7fTtcbiAgaWYgKCF0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICBpZiAodGhpcy5jbGFzc05hbWUgPT0gJ19TZXNzaW9uJykge1xuICAgICAgaWYgKCF0aGlzLmF1dGgudXNlcikge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9TRVNTSU9OX1RPS0VOLCAnSW52YWxpZCBzZXNzaW9uIHRva2VuJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3RXaGVyZSA9IHtcbiAgICAgICAgJGFuZDogW1xuICAgICAgICAgIHRoaXMucmVzdFdoZXJlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHVzZXI6IHtcbiAgICAgICAgICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJ19Vc2VyJyxcbiAgICAgICAgICAgICAgb2JqZWN0SWQ6IHRoaXMuYXV0aC51c2VyLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmRvQ291bnQgPSBmYWxzZTtcbiAgdGhpcy5pbmNsdWRlQWxsID0gZmFsc2U7XG5cbiAgLy8gVGhlIGZvcm1hdCBmb3IgdGhpcy5pbmNsdWRlIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0IGZvciB0aGVcbiAgLy8gaW5jbHVkZSBvcHRpb24gLSBpdCdzIHRoZSBwYXRocyB3ZSBzaG91bGQgaW5jbHVkZSwgaW4gb3JkZXIsXG4gIC8vIHN0b3JlZCBhcyBhcnJheXMsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdCB3ZSBuZWVkIHRvIGluY2x1ZGUgZm9vXG4gIC8vIGJlZm9yZSBpbmNsdWRpbmcgZm9vLmJhci4gQWxzbyBpdCBzaG91bGQgZGVkdXBlLlxuICAvLyBGb3IgZXhhbXBsZSwgcGFzc2luZyBhbiBhcmcgb2YgaW5jbHVkZT1mb28uYmFyLGZvby5iYXogY291bGQgbGVhZCB0b1xuICAvLyB0aGlzLmluY2x1ZGUgPSBbWydmb28nXSwgWydmb28nLCAnYmF6J10sIFsnZm9vJywgJ2JhciddXVxuICB0aGlzLmluY2x1ZGUgPSBbXTtcbiAgbGV0IGtleXNGb3JJbmNsdWRlID0gJyc7XG5cbiAgLy8gSWYgd2UgaGF2ZSBrZXlzLCB3ZSBwcm9iYWJseSB3YW50IHRvIGZvcmNlIHNvbWUgaW5jbHVkZXMgKG4tMSBsZXZlbClcbiAgLy8gU2VlIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vcGFyc2UtY29tbXVuaXR5L3BhcnNlLXNlcnZlci9pc3N1ZXMvMzE4NVxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3RPcHRpb25zLCAna2V5cycpKSB7XG4gICAga2V5c0ZvckluY2x1ZGUgPSByZXN0T3B0aW9ucy5rZXlzO1xuICB9XG5cbiAgLy8gSWYgd2UgaGF2ZSBrZXlzLCB3ZSBwcm9iYWJseSB3YW50IHRvIGZvcmNlIHNvbWUgaW5jbHVkZXMgKG4tMSBsZXZlbClcbiAgLy8gaW4gb3JkZXIgdG8gZXhjbHVkZSBzcGVjaWZpYyBrZXlzLlxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlc3RPcHRpb25zLCAnZXhjbHVkZUtleXMnKSkge1xuICAgIGtleXNGb3JJbmNsdWRlICs9ICcsJyArIHJlc3RPcHRpb25zLmV4Y2x1ZGVLZXlzO1xuICB9XG5cbiAgaWYgKGtleXNGb3JJbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICBrZXlzRm9ySW5jbHVkZSA9IGtleXNGb3JJbmNsdWRlXG4gICAgICAuc3BsaXQoJywnKVxuICAgICAgLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAvLyBBdCBsZWFzdCAyIGNvbXBvbmVudHNcbiAgICAgICAgcmV0dXJuIGtleS5zcGxpdCgnLicpLmxlbmd0aCA+IDE7XG4gICAgICB9KVxuICAgICAgLm1hcChrZXkgPT4ge1xuICAgICAgICAvLyBTbGljZSB0aGUgbGFzdCBjb21wb25lbnQgKGEuYi5jIC0+IGEuYilcbiAgICAgICAgLy8gT3RoZXJ3aXNlIHdlJ2xsIGluY2x1ZGUgb25lIGxldmVsIHRvbyBtdWNoLlxuICAgICAgICByZXR1cm4ga2V5LnNsaWNlKDAsIGtleS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgIH0pXG4gICAgICAuam9pbignLCcpO1xuXG4gICAgLy8gQ29uY2F0IHRoZSBwb3NzaWJseSBwcmVzZW50IGluY2x1ZGUgc3RyaW5nIHdpdGggdGhlIG9uZSBmcm9tIHRoZSBrZXlzXG4gICAgLy8gRGVkdXAgLyBzb3J0aW5nIGlzIGhhbmRsZSBpbiAnaW5jbHVkZScgY2FzZS5cbiAgICBpZiAoa2V5c0ZvckluY2x1ZGUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKCFyZXN0T3B0aW9ucy5pbmNsdWRlIHx8IHJlc3RPcHRpb25zLmluY2x1ZGUubGVuZ3RoID09IDApIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuaW5jbHVkZSA9IGtleXNGb3JJbmNsdWRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdE9wdGlvbnMuaW5jbHVkZSArPSAnLCcgKyBrZXlzRm9ySW5jbHVkZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBvcHRpb24gaW4gcmVzdE9wdGlvbnMpIHtcbiAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgY2FzZSAna2V5cyc6IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHJlc3RPcHRpb25zLmtleXNcbiAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IGtleS5sZW5ndGggPiAwKVxuICAgICAgICAgIC5jb25jYXQoQWx3YXlzU2VsZWN0ZWRLZXlzKTtcbiAgICAgICAgdGhpcy5rZXlzID0gQXJyYXkuZnJvbShuZXcgU2V0KGtleXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdleGNsdWRlS2V5cyc6IHtcbiAgICAgICAgY29uc3QgZXhjbHVkZSA9IHJlc3RPcHRpb25zLmV4Y2x1ZGVLZXlzXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAuZmlsdGVyKGsgPT4gQWx3YXlzU2VsZWN0ZWRLZXlzLmluZGV4T2YoaykgPCAwKTtcbiAgICAgICAgdGhpcy5leGNsdWRlS2V5cyA9IEFycmF5LmZyb20obmV3IFNldChleGNsdWRlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY291bnQnOlxuICAgICAgICB0aGlzLmRvQ291bnQgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luY2x1ZGVBbGwnOlxuICAgICAgICB0aGlzLmluY2x1ZGVBbGwgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2V4cGxhaW4nOlxuICAgICAgY2FzZSAnaGludCc6XG4gICAgICBjYXNlICdkaXN0aW5jdCc6XG4gICAgICBjYXNlICdwaXBlbGluZSc6XG4gICAgICBjYXNlICdza2lwJzpcbiAgICAgIGNhc2UgJ2xpbWl0JzpcbiAgICAgIGNhc2UgJ3JlYWRQcmVmZXJlbmNlJzpcbiAgICAgICAgdGhpcy5maW5kT3B0aW9uc1tvcHRpb25dID0gcmVzdE9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcmRlcic6XG4gICAgICAgIHZhciBmaWVsZHMgPSByZXN0T3B0aW9ucy5vcmRlci5zcGxpdCgnLCcpO1xuICAgICAgICB0aGlzLmZpbmRPcHRpb25zLnNvcnQgPSBmaWVsZHMucmVkdWNlKChzb3J0TWFwLCBmaWVsZCkgPT4ge1xuICAgICAgICAgIGZpZWxkID0gZmllbGQudHJpbSgpO1xuICAgICAgICAgIGlmIChmaWVsZCA9PT0gJyRzY29yZScgfHwgZmllbGQgPT09ICctJHNjb3JlJykge1xuICAgICAgICAgICAgc29ydE1hcC5zY29yZSA9IHsgJG1ldGE6ICd0ZXh0U2NvcmUnIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZFswXSA9PSAnLScpIHtcbiAgICAgICAgICAgIHNvcnRNYXBbZmllbGQuc2xpY2UoMSldID0gLTE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvcnRNYXBbZmllbGRdID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHNvcnRNYXA7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbmNsdWRlJzoge1xuICAgICAgICBjb25zdCBwYXRocyA9IHJlc3RPcHRpb25zLmluY2x1ZGUuc3BsaXQoJywnKTtcbiAgICAgICAgaWYgKHBhdGhzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICB0aGlzLmluY2x1ZGVBbGwgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvYWQgdGhlIGV4aXN0aW5nIGluY2x1ZGVzIChmcm9tIGtleXMpXG4gICAgICAgIGNvbnN0IHBhdGhTZXQgPSBwYXRocy5yZWR1Y2UoKG1lbW8sIHBhdGgpID0+IHtcbiAgICAgICAgICAvLyBTcGxpdCBlYWNoIHBhdGhzIG9uIC4gKGEuYi5jIC0+IFthLGIsY10pXG4gICAgICAgICAgLy8gcmVkdWNlIHRvIGNyZWF0ZSBhbGwgcGF0aHNcbiAgICAgICAgICAvLyAoW2EsYixjXSAtPiB7YTogdHJ1ZSwgJ2EuYic6IHRydWUsICdhLmIuYyc6IHRydWV9KVxuICAgICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcuJykucmVkdWNlKChtZW1vLCBwYXRoLCBpbmRleCwgcGFydHMpID0+IHtcbiAgICAgICAgICAgIG1lbW9bcGFydHMuc2xpY2UoMCwgaW5kZXggKyAxKS5qb2luKCcuJyldID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICAgIH0sIG1lbW8pO1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgdGhpcy5pbmNsdWRlID0gT2JqZWN0LmtleXMocGF0aFNldClcbiAgICAgICAgICAubWFwKHMgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHMuc3BsaXQoJy4nKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDsgLy8gU29ydCBieSBudW1iZXIgb2YgY29tcG9uZW50c1xuICAgICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5JzpcbiAgICAgICAgdGhpcy5yZWRpcmVjdEtleSA9IHJlc3RPcHRpb25zLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5O1xuICAgICAgICB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lID0gbnVsbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbmNsdWRlUmVhZFByZWZlcmVuY2UnOlxuICAgICAgY2FzZSAnc3VicXVlcnlSZWFkUHJlZmVyZW5jZSc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfSlNPTiwgJ2JhZCBvcHRpb246ICcgKyBvcHRpb24pO1xuICAgIH1cbiAgfVxufVxuXG4vLyBBIGNvbnZlbmllbnQgbWV0aG9kIHRvIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBvZiBwcm9jZXNzaW5nIGEgcXVlcnlcbi8vIGluIG9yZGVyLlxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSByZXNwb25zZSAtIGFuIG9iamVjdCB3aXRoIG9wdGlvbmFsIGtleXNcbi8vICdyZXN1bHRzJyBhbmQgJ2NvdW50Jy5cbi8vIFRPRE86IGNvbnNvbGlkYXRlIHRoZSByZXBsYWNlWCBmdW5jdGlvbnNcblJlc3RRdWVyeS5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uIChleGVjdXRlT3B0aW9ucykge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5idWlsZFJlc3RXaGVyZSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZGVueVByb3RlY3RlZEZpZWxkcygpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZUFsbCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXhjbHVkZUtleXMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkZpbmQoZXhlY3V0ZU9wdGlvbnMpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucnVuQ291bnQoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluY2x1ZGUoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkFmdGVyRmluZFRyaWdnZXIoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlO1xuICAgIH0pO1xufTtcblxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gIGNvbnN0IHsgY29uZmlnLCBhdXRoLCBjbGFzc05hbWUsIHJlc3RXaGVyZSwgcmVzdE9wdGlvbnMsIGNsaWVudFNESyB9ID0gdGhpcztcbiAgLy8gaWYgdGhlIGxpbWl0IGlzIHNldCwgdXNlIGl0XG4gIHJlc3RPcHRpb25zLmxpbWl0ID0gcmVzdE9wdGlvbnMubGltaXQgfHwgMTAwO1xuICByZXN0T3B0aW9ucy5vcmRlciA9ICdvYmplY3RJZCc7XG4gIGxldCBmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIHJldHVybiBjb250aW51ZVdoaWxlKFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAhZmluaXNoZWQ7XG4gICAgfSxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBxdWVyeSA9IG5ldyBSZXN0UXVlcnkoXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgYXV0aCxcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICByZXN0V2hlcmUsXG4gICAgICAgIHJlc3RPcHRpb25zLFxuICAgICAgICBjbGllbnRTREssXG4gICAgICAgIHRoaXMucnVuQWZ0ZXJGaW5kLFxuICAgICAgICB0aGlzLmNvbnRleHRcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHJlc3VsdHMgfSA9IGF3YWl0IHF1ZXJ5LmV4ZWN1dGUoKTtcbiAgICAgIHJlc3VsdHMuZm9yRWFjaChjYWxsYmFjayk7XG4gICAgICBmaW5pc2hlZCA9IHJlc3VsdHMubGVuZ3RoIDwgcmVzdE9wdGlvbnMubGltaXQ7XG4gICAgICBpZiAoIWZpbmlzaGVkKSB7XG4gICAgICAgIHJlc3RXaGVyZS5vYmplY3RJZCA9IE9iamVjdC5hc3NpZ24oe30sIHJlc3RXaGVyZS5vYmplY3RJZCwge1xuICAgICAgICAgICRndDogcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLm9iamVjdElkLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59O1xuXG5SZXN0UXVlcnkucHJvdG90eXBlLmJ1aWxkUmVzdFdoZXJlID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRVc2VyQW5kUm9sZUFDTCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbigpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdCgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZURvbnRTZWxlY3QoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VJblF1ZXJ5KCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlTm90SW5RdWVyeSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZUVxdWFsaXR5KCk7XG4gICAgfSk7XG59O1xuXG4vLyBVc2VzIHRoZSBBdXRoIG9iamVjdCB0byBnZXQgdGhlIGxpc3Qgb2Ygcm9sZXMsIGFkZHMgdGhlIHVzZXIgaWRcblJlc3RRdWVyeS5wcm90b3R5cGUuZ2V0VXNlckFuZFJvbGVBQ0wgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICB0aGlzLmZpbmRPcHRpb25zLmFjbCA9IFsnKiddO1xuXG4gIGlmICh0aGlzLmF1dGgudXNlcikge1xuICAgIHJldHVybiB0aGlzLmF1dGguZ2V0VXNlclJvbGVzKCkudGhlbihyb2xlcyA9PiB7XG4gICAgICB0aGlzLmZpbmRPcHRpb25zLmFjbCA9IHRoaXMuZmluZE9wdGlvbnMuYWNsLmNvbmNhdChyb2xlcywgW3RoaXMuYXV0aC51c2VyLmlkXSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59O1xuXG4vLyBDaGFuZ2VzIHRoZSBjbGFzc05hbWUgaWYgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXkgaXMgc2V0LlxuLy8gUmV0dXJucyBhIHByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVkaXJlY3RLZXkpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvLyBXZSBuZWVkIHRvIGNoYW5nZSB0aGUgY2xhc3MgbmFtZSBiYXNlZCBvbiB0aGUgc2NoZW1hXG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5yZWRpcmVjdENsYXNzTmFtZUZvcktleSh0aGlzLmNsYXNzTmFtZSwgdGhpcy5yZWRpcmVjdEtleSlcbiAgICAudGhlbihuZXdDbGFzc05hbWUgPT4ge1xuICAgICAgdGhpcy5jbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7XG4gICAgICB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lO1xuICAgIH0pO1xufTtcblxuLy8gVmFsaWRhdGVzIHRoaXMgb3BlcmF0aW9uIGFnYWluc3QgdGhlIGFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiBjb25maWcuXG5SZXN0UXVlcnkucHJvdG90eXBlLnZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKFxuICAgIHRoaXMuY29uZmlnLmFsbG93Q2xpZW50Q2xhc3NDcmVhdGlvbiA9PT0gZmFsc2UgJiZcbiAgICAhdGhpcy5hdXRoLmlzTWFzdGVyICYmXG4gICAgU2NoZW1hQ29udHJvbGxlci5zeXN0ZW1DbGFzc2VzLmluZGV4T2YodGhpcy5jbGFzc05hbWUpID09PSAtMVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5sb2FkU2NoZW1hKClcbiAgICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5oYXNDbGFzcyh0aGlzLmNsYXNzTmFtZSkpXG4gICAgICAudGhlbihoYXNDbGFzcyA9PiB7XG4gICAgICAgIGlmIChoYXNDbGFzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgICAgICAnVGhpcyB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyAnICsgJ25vbi1leGlzdGVudCBjbGFzczogJyArIHRoaXMuY2xhc3NOYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1JblF1ZXJ5KGluUXVlcnlPYmplY3QsIGNsYXNzTmFtZSwgcmVzdWx0cykge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIHJlc3VsdCBvZiByZXN1bHRzKSB7XG4gICAgdmFsdWVzLnB1c2goe1xuICAgICAgX190eXBlOiAnUG9pbnRlcicsXG4gICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcbiAgICAgIG9iamVjdElkOiByZXN1bHQub2JqZWN0SWQsXG4gICAgfSk7XG4gIH1cbiAgZGVsZXRlIGluUXVlcnlPYmplY3RbJyRpblF1ZXJ5J107XG4gIGlmIChBcnJheS5pc0FycmF5KGluUXVlcnlPYmplY3RbJyRpbiddKSkge1xuICAgIGluUXVlcnlPYmplY3RbJyRpbiddID0gaW5RdWVyeU9iamVjdFsnJGluJ10uY29uY2F0KHZhbHVlcyk7XG4gIH0gZWxzZSB7XG4gICAgaW5RdWVyeU9iamVjdFsnJGluJ10gPSB2YWx1ZXM7XG4gIH1cbn1cblxuLy8gUmVwbGFjZXMgYSAkaW5RdWVyeSBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFuXG4vLyAkaW5RdWVyeSBjbGF1c2UuXG4vLyBUaGUgJGluUXVlcnkgY2xhdXNlIHR1cm5zIGludG8gYW4gJGluIHdpdGggdmFsdWVzIHRoYXQgYXJlIGp1c3Rcbi8vIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHJldHVybmVkIGluIHRoZSBzdWJxdWVyeS5cblJlc3RRdWVyeS5wcm90b3R5cGUucmVwbGFjZUluUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpblF1ZXJ5T2JqZWN0ID0gZmluZE9iamVjdFdpdGhLZXkodGhpcy5yZXN0V2hlcmUsICckaW5RdWVyeScpO1xuICBpZiAoIWluUXVlcnlPYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgaW5RdWVyeSB2YWx1ZSBtdXN0IGhhdmUgcHJlY2lzZWx5IHR3byBrZXlzIC0gd2hlcmUgYW5kIGNsYXNzTmFtZVxuICB2YXIgaW5RdWVyeVZhbHVlID0gaW5RdWVyeU9iamVjdFsnJGluUXVlcnknXTtcbiAgaWYgKCFpblF1ZXJ5VmFsdWUud2hlcmUgfHwgIWluUXVlcnlWYWx1ZS5jbGFzc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ2ltcHJvcGVyIHVzYWdlIG9mICRpblF1ZXJ5Jyk7XG4gIH1cblxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogaW5RdWVyeVZhbHVlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5LFxuICB9O1xuXG4gIGlmICh0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICB9IGVsc2UgaWYgKHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLFxuICAgIHRoaXMuYXV0aCxcbiAgICBpblF1ZXJ5VmFsdWUuY2xhc3NOYW1lLFxuICAgIGluUXVlcnlWYWx1ZS53aGVyZSxcbiAgICBhZGRpdGlvbmFsT3B0aW9uc1xuICApO1xuICByZXR1cm4gc3VicXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIHRyYW5zZm9ybUluUXVlcnkoaW5RdWVyeU9iamVjdCwgc3VicXVlcnkuY2xhc3NOYW1lLCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBSZWN1cnNlIHRvIHJlcGVhdFxuICAgIHJldHVybiB0aGlzLnJlcGxhY2VJblF1ZXJ5KCk7XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtTm90SW5RdWVyeShub3RJblF1ZXJ5T2JqZWN0LCBjbGFzc05hbWUsIHJlc3VsdHMpIHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHZhbHVlcy5wdXNoKHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcmVzdWx0Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZSBub3RJblF1ZXJ5T2JqZWN0Wyckbm90SW5RdWVyeSddO1xuICBpZiAoQXJyYXkuaXNBcnJheShub3RJblF1ZXJ5T2JqZWN0WyckbmluJ10pKSB7XG4gICAgbm90SW5RdWVyeU9iamVjdFsnJG5pbiddID0gbm90SW5RdWVyeU9iamVjdFsnJG5pbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIG5vdEluUXVlcnlPYmplY3RbJyRuaW4nXSA9IHZhbHVlcztcbiAgfVxufVxuXG4vLyBSZXBsYWNlcyBhICRub3RJblF1ZXJ5IGNsYXVzZSBieSBydW5uaW5nIHRoZSBzdWJxdWVyeSwgaWYgdGhlcmUgaXMgYW5cbi8vICRub3RJblF1ZXJ5IGNsYXVzZS5cbi8vIFRoZSAkbm90SW5RdWVyeSBjbGF1c2UgdHVybnMgaW50byBhICRuaW4gd2l0aCB2YWx1ZXMgdGhhdCBhcmUganVzdFxuLy8gcG9pbnRlcnMgdG8gdGhlIG9iamVjdHMgcmV0dXJuZWQgaW4gdGhlIHN1YnF1ZXJ5LlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlTm90SW5RdWVyeSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIG5vdEluUXVlcnlPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRub3RJblF1ZXJ5Jyk7XG4gIGlmICghbm90SW5RdWVyeU9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBub3RJblF1ZXJ5IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSB3aGVyZSBhbmQgY2xhc3NOYW1lXG4gIHZhciBub3RJblF1ZXJ5VmFsdWUgPSBub3RJblF1ZXJ5T2JqZWN0Wyckbm90SW5RdWVyeSddO1xuICBpZiAoIW5vdEluUXVlcnlWYWx1ZS53aGVyZSB8fCAhbm90SW5RdWVyeVZhbHVlLmNsYXNzTmFtZSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnaW1wcm9wZXIgdXNhZ2Ugb2YgJG5vdEluUXVlcnknKTtcbiAgfVxuXG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBub3RJblF1ZXJ5VmFsdWUucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIHZhciBzdWJxdWVyeSA9IG5ldyBSZXN0UXVlcnkoXG4gICAgdGhpcy5jb25maWcsXG4gICAgdGhpcy5hdXRoLFxuICAgIG5vdEluUXVlcnlWYWx1ZS5jbGFzc05hbWUsXG4gICAgbm90SW5RdWVyeVZhbHVlLndoZXJlLFxuICAgIGFkZGl0aW9uYWxPcHRpb25zXG4gICk7XG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgdHJhbnNmb3JtTm90SW5RdWVyeShub3RJblF1ZXJ5T2JqZWN0LCBzdWJxdWVyeS5jbGFzc05hbWUsIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIC8vIFJlY3Vyc2UgdG8gcmVwZWF0XG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZU5vdEluUXVlcnkoKTtcbiAgfSk7XG59O1xuXG4vLyBVc2VkIHRvIGdldCB0aGUgZGVlcGVzdCBvYmplY3QgZnJvbSBqc29uIHVzaW5nIGRvdCBub3RhdGlvbi5cbmNvbnN0IGdldERlZXBlc3RPYmplY3RGcm9tS2V5ID0gKGpzb24sIGtleSwgaWR4LCBzcmMpID0+IHtcbiAgaWYgKGtleSBpbiBqc29uKSB7XG4gICAgcmV0dXJuIGpzb25ba2V5XTtcbiAgfVxuICBzcmMuc3BsaWNlKDEpOyAvLyBFeGl0IEVhcmx5XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1TZWxlY3QgPSAoc2VsZWN0T2JqZWN0LCBrZXksIG9iamVjdHMpID0+IHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2Ygb2JqZWN0cykge1xuICAgIHZhbHVlcy5wdXNoKGtleS5zcGxpdCgnLicpLnJlZHVjZShnZXREZWVwZXN0T2JqZWN0RnJvbUtleSwgcmVzdWx0KSk7XG4gIH1cbiAgZGVsZXRlIHNlbGVjdE9iamVjdFsnJHNlbGVjdCddO1xuICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RPYmplY3RbJyRpbiddKSkge1xuICAgIHNlbGVjdE9iamVjdFsnJGluJ10gPSBzZWxlY3RPYmplY3RbJyRpbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIHNlbGVjdE9iamVjdFsnJGluJ10gPSB2YWx1ZXM7XG4gIH1cbn07XG5cbi8vIFJlcGxhY2VzIGEgJHNlbGVjdCBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFcbi8vICRzZWxlY3QgY2xhdXNlLlxuLy8gVGhlICRzZWxlY3QgY2xhdXNlIHR1cm5zIGludG8gYW4gJGluIHdpdGggdmFsdWVzIHNlbGVjdGVkIG91dCBvZlxuLy8gdGhlIHN1YnF1ZXJ5LlxuLy8gUmV0dXJucyBhIHBvc3NpYmxlLXByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VTZWxlY3QgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzZWxlY3RPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRzZWxlY3QnKTtcbiAgaWYgKCFzZWxlY3RPYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgc2VsZWN0IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSBxdWVyeSBhbmQga2V5XG4gIHZhciBzZWxlY3RWYWx1ZSA9IHNlbGVjdE9iamVjdFsnJHNlbGVjdCddO1xuICAvLyBpT1MgU0RLIGRvbid0IHNlbmQgd2hlcmUgaWYgbm90IHNldCwgbGV0IGl0IHBhc3NcbiAgaWYgKFxuICAgICFzZWxlY3RWYWx1ZS5xdWVyeSB8fFxuICAgICFzZWxlY3RWYWx1ZS5rZXkgfHxcbiAgICB0eXBlb2Ygc2VsZWN0VmFsdWUucXVlcnkgIT09ICdvYmplY3QnIHx8XG4gICAgIXNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSB8fFxuICAgIE9iamVjdC5rZXlzKHNlbGVjdFZhbHVlKS5sZW5ndGggIT09IDJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdpbXByb3BlciB1c2FnZSBvZiAkc2VsZWN0Jyk7XG4gIH1cblxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogc2VsZWN0VmFsdWUucXVlcnkucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIHZhciBzdWJxdWVyeSA9IG5ldyBSZXN0UXVlcnkoXG4gICAgdGhpcy5jb25maWcsXG4gICAgdGhpcy5hdXRoLFxuICAgIHNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSxcbiAgICBzZWxlY3RWYWx1ZS5xdWVyeS53aGVyZSxcbiAgICBhZGRpdGlvbmFsT3B0aW9uc1xuICApO1xuICByZXR1cm4gc3VicXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIHRyYW5zZm9ybVNlbGVjdChzZWxlY3RPYmplY3QsIHNlbGVjdFZhbHVlLmtleSwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgLy8gS2VlcCByZXBsYWNpbmcgJHNlbGVjdCBjbGF1c2VzXG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZVNlbGVjdCgpO1xuICB9KTtcbn07XG5cbmNvbnN0IHRyYW5zZm9ybURvbnRTZWxlY3QgPSAoZG9udFNlbGVjdE9iamVjdCwga2V5LCBvYmplY3RzKSA9PiB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgcmVzdWx0IG9mIG9iamVjdHMpIHtcbiAgICB2YWx1ZXMucHVzaChrZXkuc3BsaXQoJy4nKS5yZWR1Y2UoZ2V0RGVlcGVzdE9iamVjdEZyb21LZXksIHJlc3VsdCkpO1xuICB9XG4gIGRlbGV0ZSBkb250U2VsZWN0T2JqZWN0WyckZG9udFNlbGVjdCddO1xuICBpZiAoQXJyYXkuaXNBcnJheShkb250U2VsZWN0T2JqZWN0WyckbmluJ10pKSB7XG4gICAgZG9udFNlbGVjdE9iamVjdFsnJG5pbiddID0gZG9udFNlbGVjdE9iamVjdFsnJG5pbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXSA9IHZhbHVlcztcbiAgfVxufTtcblxuLy8gUmVwbGFjZXMgYSAkZG9udFNlbGVjdCBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFcbi8vICRkb250U2VsZWN0IGNsYXVzZS5cbi8vIFRoZSAkZG9udFNlbGVjdCBjbGF1c2UgdHVybnMgaW50byBhbiAkbmluIHdpdGggdmFsdWVzIHNlbGVjdGVkIG91dCBvZlxuLy8gdGhlIHN1YnF1ZXJ5LlxuLy8gUmV0dXJucyBhIHBvc3NpYmxlLXByb21pc2UuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VEb250U2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgZG9udFNlbGVjdE9iamVjdCA9IGZpbmRPYmplY3RXaXRoS2V5KHRoaXMucmVzdFdoZXJlLCAnJGRvbnRTZWxlY3QnKTtcbiAgaWYgKCFkb250U2VsZWN0T2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIGRvbnRTZWxlY3QgdmFsdWUgbXVzdCBoYXZlIHByZWNpc2VseSB0d28ga2V5cyAtIHF1ZXJ5IGFuZCBrZXlcbiAgdmFyIGRvbnRTZWxlY3RWYWx1ZSA9IGRvbnRTZWxlY3RPYmplY3RbJyRkb250U2VsZWN0J107XG4gIGlmIChcbiAgICAhZG9udFNlbGVjdFZhbHVlLnF1ZXJ5IHx8XG4gICAgIWRvbnRTZWxlY3RWYWx1ZS5rZXkgfHxcbiAgICB0eXBlb2YgZG9udFNlbGVjdFZhbHVlLnF1ZXJ5ICE9PSAnb2JqZWN0JyB8fFxuICAgICFkb250U2VsZWN0VmFsdWUucXVlcnkuY2xhc3NOYW1lIHx8XG4gICAgT2JqZWN0LmtleXMoZG9udFNlbGVjdFZhbHVlKS5sZW5ndGggIT09IDJcbiAgKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdpbXByb3BlciB1c2FnZSBvZiAkZG9udFNlbGVjdCcpO1xuICB9XG4gIGNvbnN0IGFkZGl0aW9uYWxPcHRpb25zID0ge1xuICAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5OiBkb250U2VsZWN0VmFsdWUucXVlcnkucmVkaXJlY3RDbGFzc05hbWVGb3JLZXksXG4gIH07XG5cbiAgaWYgKHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAodGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGFkZGl0aW9uYWxPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIHZhciBzdWJxdWVyeSA9IG5ldyBSZXN0UXVlcnkoXG4gICAgdGhpcy5jb25maWcsXG4gICAgdGhpcy5hdXRoLFxuICAgIGRvbnRTZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUsXG4gICAgZG9udFNlbGVjdFZhbHVlLnF1ZXJ5LndoZXJlLFxuICAgIGFkZGl0aW9uYWxPcHRpb25zXG4gICk7XG4gIHJldHVybiBzdWJxdWVyeS5leGVjdXRlKCkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgdHJhbnNmb3JtRG9udFNlbGVjdChkb250U2VsZWN0T2JqZWN0LCBkb250U2VsZWN0VmFsdWUua2V5LCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBLZWVwIHJlcGxhY2luZyAkZG9udFNlbGVjdCBjbGF1c2VzXG4gICAgcmV0dXJuIHRoaXMucmVwbGFjZURvbnRTZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5SZXN0UXVlcnkucHJvdG90eXBlLmNsZWFuUmVzdWx0QXV0aERhdGEgPSBmdW5jdGlvbiAocmVzdWx0KSB7XG4gIGRlbGV0ZSByZXN1bHQucGFzc3dvcmQ7XG4gIGlmIChyZXN1bHQuYXV0aERhdGEpIHtcbiAgICBPYmplY3Qua2V5cyhyZXN1bHQuYXV0aERhdGEpLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgaWYgKHJlc3VsdC5hdXRoRGF0YVtwcm92aWRlcl0gPT09IG51bGwpIHtcbiAgICAgICAgZGVsZXRlIHJlc3VsdC5hdXRoRGF0YVtwcm92aWRlcl07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMocmVzdWx0LmF1dGhEYXRhKS5sZW5ndGggPT0gMCkge1xuICAgICAgZGVsZXRlIHJlc3VsdC5hdXRoRGF0YTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IHJlcGxhY2VFcXVhbGl0eUNvbnN0cmFpbnQgPSBjb25zdHJhaW50ID0+IHtcbiAgaWYgKHR5cGVvZiBjb25zdHJhaW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG4gIGNvbnN0IGVxdWFsVG9PYmplY3QgPSB7fTtcbiAgbGV0IGhhc0RpcmVjdENvbnN0cmFpbnQgPSBmYWxzZTtcbiAgbGV0IGhhc09wZXJhdG9yQ29uc3RyYWludCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBpbiBjb25zdHJhaW50KSB7XG4gICAgaWYgKGtleS5pbmRleE9mKCckJykgIT09IDApIHtcbiAgICAgIGhhc0RpcmVjdENvbnN0cmFpbnQgPSB0cnVlO1xuICAgICAgZXF1YWxUb09iamVjdFtrZXldID0gY29uc3RyYWludFtrZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBoYXNPcGVyYXRvckNvbnN0cmFpbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoaGFzRGlyZWN0Q29uc3RyYWludCAmJiBoYXNPcGVyYXRvckNvbnN0cmFpbnQpIHtcbiAgICBjb25zdHJhaW50WyckZXEnXSA9IGVxdWFsVG9PYmplY3Q7XG4gICAgT2JqZWN0LmtleXMoZXF1YWxUb09iamVjdCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGNvbnN0cmFpbnRba2V5XTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY29uc3RyYWludDtcbn07XG5cblJlc3RRdWVyeS5wcm90b3R5cGUucmVwbGFjZUVxdWFsaXR5ID0gZnVuY3Rpb24gKCkge1xuICBpZiAodHlwZW9mIHRoaXMucmVzdFdoZXJlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLnJlc3RXaGVyZSkge1xuICAgIHRoaXMucmVzdFdoZXJlW2tleV0gPSByZXBsYWNlRXF1YWxpdHlDb25zdHJhaW50KHRoaXMucmVzdFdoZXJlW2tleV0pO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bC5cbi8vIFBvcHVsYXRlcyB0aGlzLnJlc3BvbnNlIHdpdGggYW4gb2JqZWN0IHRoYXQgb25seSBoYXMgJ3Jlc3VsdHMnLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5GaW5kID0gZnVuY3Rpb24gKG9wdGlvbnMgPSB7fSkge1xuICBpZiAodGhpcy5maW5kT3B0aW9ucy5saW1pdCA9PT0gMCkge1xuICAgIHRoaXMucmVzcG9uc2UgPSB7IHJlc3VsdHM6IFtdIH07XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG4gIGNvbnN0IGZpbmRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5maW5kT3B0aW9ucyk7XG4gIGlmICh0aGlzLmtleXMpIHtcbiAgICBmaW5kT3B0aW9ucy5rZXlzID0gdGhpcy5rZXlzLm1hcChrZXkgPT4ge1xuICAgICAgcmV0dXJuIGtleS5zcGxpdCgnLicpWzBdO1xuICAgIH0pO1xuICB9XG4gIGlmIChvcHRpb25zLm9wKSB7XG4gICAgZmluZE9wdGlvbnMub3AgPSBvcHRpb25zLm9wO1xuICB9XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5maW5kKHRoaXMuY2xhc3NOYW1lLCB0aGlzLnJlc3RXaGVyZSwgZmluZE9wdGlvbnMsIHRoaXMuYXV0aClcbiAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIGlmICh0aGlzLmNsYXNzTmFtZSA9PT0gJ19Vc2VyJyAmJiAhZmluZE9wdGlvbnMuZXhwbGFpbikge1xuICAgICAgICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgIHRoaXMuY2xlYW5SZXN1bHRBdXRoRGF0YShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29uZmlnLmZpbGVzQ29udHJvbGxlci5leHBhbmRGaWxlc0luT2JqZWN0KHRoaXMuY29uZmlnLCByZXN1bHRzKTtcblxuICAgICAgaWYgKHRoaXMucmVkaXJlY3RDbGFzc05hbWUpIHtcbiAgICAgICAgZm9yICh2YXIgciBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgci5jbGFzc05hbWUgPSB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLnJlc3BvbnNlID0geyByZXN1bHRzOiByZXN1bHRzIH07XG4gICAgfSk7XG59O1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3Igd2hldGhlciBpdCB3YXMgc3VjY2Vzc2Z1bC5cbi8vIFBvcHVsYXRlcyB0aGlzLnJlc3BvbnNlLmNvdW50IHdpdGggdGhlIGNvdW50XG5SZXN0UXVlcnkucHJvdG90eXBlLnJ1bkNvdW50ID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuZG9Db3VudCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmZpbmRPcHRpb25zLmNvdW50ID0gdHJ1ZTtcbiAgZGVsZXRlIHRoaXMuZmluZE9wdGlvbnMuc2tpcDtcbiAgZGVsZXRlIHRoaXMuZmluZE9wdGlvbnMubGltaXQ7XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZS5maW5kKHRoaXMuY2xhc3NOYW1lLCB0aGlzLnJlc3RXaGVyZSwgdGhpcy5maW5kT3B0aW9ucykudGhlbihjID0+IHtcbiAgICB0aGlzLnJlc3BvbnNlLmNvdW50ID0gYztcbiAgfSk7XG59O1xuXG5SZXN0UXVlcnkucHJvdG90eXBlLmRlbnlQcm90ZWN0ZWRGaWVsZHMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmF1dGguaXNNYXN0ZXIpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgc2NoZW1hQ29udHJvbGxlciA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmxvYWRTY2hlbWEoKTtcbiAgY29uc3QgcHJvdGVjdGVkRmllbGRzID1cbiAgICB0aGlzLmNvbmZpZy5kYXRhYmFzZS5hZGRQcm90ZWN0ZWRGaWVsZHMoXG4gICAgICBzY2hlbWFDb250cm9sbGVyLFxuICAgICAgdGhpcy5jbGFzc05hbWUsXG4gICAgICB0aGlzLnJlc3RXaGVyZSxcbiAgICAgIHRoaXMuZmluZE9wdGlvbnMuYWNsLFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgdGhpcy5maW5kT3B0aW9uc1xuICAgICkgfHwgW107XG4gIGZvciAoY29uc3Qga2V5IG9mIHByb3RlY3RlZEZpZWxkcykge1xuICAgIGlmICh0aGlzLnJlc3RXaGVyZVtrZXldKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9QRVJBVElPTl9GT1JCSURERU4sXG4gICAgICAgIGBUaGlzIHVzZXIgaXMgbm90IGFsbG93ZWQgdG8gcXVlcnkgJHtrZXl9IG9uIGNsYXNzICR7dGhpcy5jbGFzc05hbWV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIEF1Z21lbnRzIHRoaXMucmVzcG9uc2Ugd2l0aCBhbGwgcG9pbnRlcnMgb24gYW4gb2JqZWN0XG5SZXN0UXVlcnkucHJvdG90eXBlLmhhbmRsZUluY2x1ZGVBbGwgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5pbmNsdWRlQWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiB0aGlzLmNvbmZpZy5kYXRhYmFzZVxuICAgIC5sb2FkU2NoZW1hKClcbiAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHNjaGVtYUNvbnRyb2xsZXIuZ2V0T25lU2NoZW1hKHRoaXMuY2xhc3NOYW1lKSlcbiAgICAudGhlbihzY2hlbWEgPT4ge1xuICAgICAgY29uc3QgaW5jbHVkZUZpZWxkcyA9IFtdO1xuICAgICAgY29uc3Qga2V5RmllbGRzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIGluIHNjaGVtYS5maWVsZHMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlICYmIHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgPT09ICdQb2ludGVyJykgfHxcbiAgICAgICAgICAoc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlID09PSAnQXJyYXknKVxuICAgICAgICApIHtcbiAgICAgICAgICBpbmNsdWRlRmllbGRzLnB1c2goW2ZpZWxkXSk7XG4gICAgICAgICAga2V5RmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBBZGQgZmllbGRzIHRvIGluY2x1ZGUsIGtleXMsIHJlbW92ZSBkdXBzXG4gICAgICB0aGlzLmluY2x1ZGUgPSBbLi4ubmV3IFNldChbLi4udGhpcy5pbmNsdWRlLCAuLi5pbmNsdWRlRmllbGRzXSldO1xuICAgICAgLy8gaWYgdGhpcy5rZXlzIG5vdCBzZXQsIHRoZW4gYWxsIGtleXMgYXJlIGFscmVhZHkgaW5jbHVkZWRcbiAgICAgIGlmICh0aGlzLmtleXMpIHtcbiAgICAgICAgdGhpcy5rZXlzID0gWy4uLm5ldyBTZXQoWy4uLnRoaXMua2V5cywgLi4ua2V5RmllbGRzXSldO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gVXBkYXRlcyBwcm9wZXJ0eSBgdGhpcy5rZXlzYCB0byBjb250YWluIGFsbCBrZXlzIGJ1dCB0aGUgb25lcyB1bnNlbGVjdGVkLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5oYW5kbGVFeGNsdWRlS2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmV4Y2x1ZGVLZXlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLmtleXMpIHtcbiAgICB0aGlzLmtleXMgPSB0aGlzLmtleXMuZmlsdGVyKGsgPT4gIXRoaXMuZXhjbHVkZUtleXMuaW5jbHVkZXMoaykpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAubG9hZFNjaGVtYSgpXG4gICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiBzY2hlbWFDb250cm9sbGVyLmdldE9uZVNjaGVtYSh0aGlzLmNsYXNzTmFtZSkpXG4gICAgLnRoZW4oc2NoZW1hID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IE9iamVjdC5rZXlzKHNjaGVtYS5maWVsZHMpO1xuICAgICAgdGhpcy5rZXlzID0gZmllbGRzLmZpbHRlcihrID0+ICF0aGlzLmV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICB9KTtcbn07XG5cbi8vIEF1Z21lbnRzIHRoaXMucmVzcG9uc2Ugd2l0aCBkYXRhIGF0IHRoZSBwYXRocyBwcm92aWRlZCBpbiB0aGlzLmluY2x1ZGUuXG5SZXN0UXVlcnkucHJvdG90eXBlLmhhbmRsZUluY2x1ZGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICh0aGlzLmluY2x1ZGUubGVuZ3RoID09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGF0aFJlc3BvbnNlID0gaW5jbHVkZVBhdGgoXG4gICAgdGhpcy5jb25maWcsXG4gICAgdGhpcy5hdXRoLFxuICAgIHRoaXMucmVzcG9uc2UsXG4gICAgdGhpcy5pbmNsdWRlWzBdLFxuICAgIHRoaXMucmVzdE9wdGlvbnNcbiAgKTtcbiAgaWYgKHBhdGhSZXNwb25zZS50aGVuKSB7XG4gICAgcmV0dXJuIHBhdGhSZXNwb25zZS50aGVuKG5ld1Jlc3BvbnNlID0+IHtcbiAgICAgIHRoaXMucmVzcG9uc2UgPSBuZXdSZXNwb25zZTtcbiAgICAgIHRoaXMuaW5jbHVkZSA9IHRoaXMuaW5jbHVkZS5zbGljZSgxKTtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluY2x1ZGUoKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0aGlzLmluY2x1ZGUubGVuZ3RoID4gMCkge1xuICAgIHRoaXMuaW5jbHVkZSA9IHRoaXMuaW5jbHVkZS5zbGljZSgxKTtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVJbmNsdWRlKCk7XG4gIH1cblxuICByZXR1cm4gcGF0aFJlc3BvbnNlO1xufTtcblxuLy9SZXR1cm5zIGEgcHJvbWlzZSBvZiBhIHByb2Nlc3NlZCBzZXQgb2YgcmVzdWx0c1xuUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5BZnRlckZpbmRUcmlnZ2VyID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMucmVzcG9uc2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCF0aGlzLnJ1bkFmdGVyRmluZCkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBBdm9pZCBkb2luZyBhbnkgc2V0dXAgZm9yIHRyaWdnZXJzIGlmIHRoZXJlIGlzIG5vICdhZnRlckZpbmQnIHRyaWdnZXIgZm9yIHRoaXMgY2xhc3MuXG4gIGNvbnN0IGhhc0FmdGVyRmluZEhvb2sgPSB0cmlnZ2Vycy50cmlnZ2VyRXhpc3RzKFxuICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyRmluZCxcbiAgICB0aGlzLmNvbmZpZy5hcHBsaWNhdGlvbklkXG4gICk7XG4gIGlmICghaGFzQWZ0ZXJGaW5kSG9vaykge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICAvLyBTa2lwIEFnZ3JlZ2F0ZSBhbmQgRGlzdGluY3QgUXVlcmllc1xuICBpZiAodGhpcy5maW5kT3B0aW9ucy5waXBlbGluZSB8fCB0aGlzLmZpbmRPcHRpb25zLmRpc3RpbmN0KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QganNvbiA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVzdE9wdGlvbnMpO1xuICBqc29uLndoZXJlID0gdGhpcy5yZXN0V2hlcmU7XG4gIGNvbnN0IHBhcnNlUXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkodGhpcy5jbGFzc05hbWUpO1xuICBwYXJzZVF1ZXJ5LndpdGhKU09OKGpzb24pO1xuICAvLyBSdW4gYWZ0ZXJGaW5kIHRyaWdnZXIgYW5kIHNldCB0aGUgbmV3IHJlc3VsdHNcbiAgcmV0dXJuIHRyaWdnZXJzXG4gICAgLm1heWJlUnVuQWZ0ZXJGaW5kVHJpZ2dlcihcbiAgICAgIHRyaWdnZXJzLlR5cGVzLmFmdGVyRmluZCxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgdGhpcy5yZXNwb25zZS5yZXN1bHRzLFxuICAgICAgdGhpcy5jb25maWcsXG4gICAgICBwYXJzZVF1ZXJ5LFxuICAgICAgdGhpcy5jb250ZXh0XG4gICAgKVxuICAgIC50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgLy8gRW5zdXJlIHdlIHByb3Blcmx5IHNldCB0aGUgY2xhc3NOYW1lIGJhY2tcbiAgICAgIGlmICh0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzdWx0cyA9IHJlc3VsdHMubWFwKG9iamVjdCA9PiB7XG4gICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFBhcnNlLk9iamVjdCkge1xuICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0LnRvSlNPTigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvYmplY3QuY2xhc3NOYW1lID0gdGhpcy5yZWRpcmVjdENsYXNzTmFtZTtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2UucmVzdWx0cyA9IHJlc3VsdHM7XG4gICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBBZGRzIGluY2x1ZGVkIHZhbHVlcyB0byB0aGUgcmVzcG9uc2UuXG4vLyBQYXRoIGlzIGEgbGlzdCBvZiBmaWVsZCBuYW1lcy5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiBhdWdtZW50ZWQgcmVzcG9uc2UuXG5mdW5jdGlvbiBpbmNsdWRlUGF0aChjb25maWcsIGF1dGgsIHJlc3BvbnNlLCBwYXRoLCByZXN0T3B0aW9ucyA9IHt9KSB7XG4gIHZhciBwb2ludGVycyA9IGZpbmRQb2ludGVycyhyZXNwb25zZS5yZXN1bHRzLCBwYXRoKTtcbiAgaWYgKHBvaW50ZXJzLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG4gIGNvbnN0IHBvaW50ZXJzSGFzaCA9IHt9O1xuICBmb3IgKHZhciBwb2ludGVyIG9mIHBvaW50ZXJzKSB7XG4gICAgaWYgKCFwb2ludGVyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgY2xhc3NOYW1lID0gcG9pbnRlci5jbGFzc05hbWU7XG4gICAgLy8gb25seSBpbmNsdWRlIHRoZSBnb29kIHBvaW50ZXJzXG4gICAgaWYgKGNsYXNzTmFtZSkge1xuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0gPSBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSB8fCBuZXcgU2V0KCk7XG4gICAgICBwb2ludGVyc0hhc2hbY2xhc3NOYW1lXS5hZGQocG9pbnRlci5vYmplY3RJZCk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGluY2x1ZGVSZXN0T3B0aW9ucyA9IHt9O1xuICBpZiAocmVzdE9wdGlvbnMua2V5cykge1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0KHJlc3RPcHRpb25zLmtleXMuc3BsaXQoJywnKSk7XG4gICAgY29uc3Qga2V5U2V0ID0gQXJyYXkuZnJvbShrZXlzKS5yZWR1Y2UoKHNldCwga2V5KSA9PiB7XG4gICAgICBjb25zdCBrZXlQYXRoID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGk7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChwYXRoW2ldICE9IGtleVBhdGhbaV0pIHtcbiAgICAgICAgICByZXR1cm4gc2V0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaSA8IGtleVBhdGgubGVuZ3RoKSB7XG4gICAgICAgIHNldC5hZGQoa2V5UGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0O1xuICAgIH0sIG5ldyBTZXQoKSk7XG4gICAgaWYgKGtleVNldC5zaXplID4gMCkge1xuICAgICAgaW5jbHVkZVJlc3RPcHRpb25zLmtleXMgPSBBcnJheS5mcm9tKGtleVNldCkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN0T3B0aW9ucy5leGNsdWRlS2V5cykge1xuICAgIGNvbnN0IGV4Y2x1ZGVLZXlzID0gbmV3IFNldChyZXN0T3B0aW9ucy5leGNsdWRlS2V5cy5zcGxpdCgnLCcpKTtcbiAgICBjb25zdCBleGNsdWRlS2V5U2V0ID0gQXJyYXkuZnJvbShleGNsdWRlS2V5cykucmVkdWNlKChzZXQsIGtleSkgPT4ge1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChpOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aFtpXSAhPSBrZXlQYXRoW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPT0ga2V5UGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgIHNldC5hZGQoa2V5UGF0aFtpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0O1xuICAgIH0sIG5ldyBTZXQoKSk7XG4gICAgaWYgKGV4Y2x1ZGVLZXlTZXQuc2l6ZSA+IDApIHtcbiAgICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5leGNsdWRlS2V5cyA9IEFycmF5LmZyb20oZXhjbHVkZUtleVNldCkuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2UpIHtcbiAgICBpbmNsdWRlUmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSByZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gICAgaW5jbHVkZVJlc3RPcHRpb25zLmluY2x1ZGVSZWFkUHJlZmVyZW5jZSA9IHJlc3RPcHRpb25zLmluY2x1ZGVSZWFkUHJlZmVyZW5jZTtcbiAgfSBlbHNlIGlmIChyZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSkge1xuICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlO1xuICB9XG5cbiAgY29uc3QgcXVlcnlQcm9taXNlcyA9IE9iamVjdC5rZXlzKHBvaW50ZXJzSGFzaCkubWFwKGNsYXNzTmFtZSA9PiB7XG4gICAgY29uc3Qgb2JqZWN0SWRzID0gQXJyYXkuZnJvbShwb2ludGVyc0hhc2hbY2xhc3NOYW1lXSk7XG4gICAgbGV0IHdoZXJlO1xuICAgIGlmIChvYmplY3RJZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB3aGVyZSA9IHsgb2JqZWN0SWQ6IG9iamVjdElkc1swXSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZSA9IHsgb2JqZWN0SWQ6IHsgJGluOiBvYmplY3RJZHMgfSB9O1xuICAgIH1cbiAgICB2YXIgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCB3aGVyZSwgaW5jbHVkZVJlc3RPcHRpb25zKTtcbiAgICByZXR1cm4gcXVlcnkuZXhlY3V0ZSh7IG9wOiAnZ2V0JyB9KS50aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgcmVzdWx0cy5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBHZXQgdGhlIG9iamVjdHMgZm9yIGFsbCB0aGVzZSBvYmplY3QgaWRzXG4gIHJldHVybiBQcm9taXNlLmFsbChxdWVyeVByb21pc2VzKS50aGVuKHJlc3BvbnNlcyA9PiB7XG4gICAgdmFyIHJlcGxhY2UgPSByZXNwb25zZXMucmVkdWNlKChyZXBsYWNlLCBpbmNsdWRlUmVzcG9uc2UpID0+IHtcbiAgICAgIGZvciAodmFyIG9iaiBvZiBpbmNsdWRlUmVzcG9uc2UucmVzdWx0cykge1xuICAgICAgICBvYmouX190eXBlID0gJ09iamVjdCc7XG4gICAgICAgIG9iai5jbGFzc05hbWUgPSBpbmNsdWRlUmVzcG9uc2UuY2xhc3NOYW1lO1xuXG4gICAgICAgIGlmIChvYmouY2xhc3NOYW1lID09ICdfVXNlcicgJiYgIWF1dGguaXNNYXN0ZXIpIHtcbiAgICAgICAgICBkZWxldGUgb2JqLnNlc3Npb25Ub2tlbjtcbiAgICAgICAgICBkZWxldGUgb2JqLmF1dGhEYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJlcGxhY2Vbb2JqLm9iamVjdElkXSA9IG9iajtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXBsYWNlO1xuICAgIH0sIHt9KTtcblxuICAgIHZhciByZXNwID0ge1xuICAgICAgcmVzdWx0czogcmVwbGFjZVBvaW50ZXJzKHJlc3BvbnNlLnJlc3VsdHMsIHBhdGgsIHJlcGxhY2UpLFxuICAgIH07XG4gICAgaWYgKHJlc3BvbnNlLmNvdW50KSB7XG4gICAgICByZXNwLmNvdW50ID0gcmVzcG9uc2UuY291bnQ7XG4gICAgfVxuICAgIHJldHVybiByZXNwO1xuICB9KTtcbn1cblxuLy8gT2JqZWN0IG1heSBiZSBhIGxpc3Qgb2YgUkVTVC1mb3JtYXQgb2JqZWN0IHRvIGZpbmQgcG9pbnRlcnMgaW4sIG9yXG4vLyBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0LlxuLy8gSWYgdGhlIHBhdGggeWllbGRzIHRoaW5ncyB0aGF0IGFyZW4ndCBwb2ludGVycywgdGhpcyB0aHJvd3MgYW4gZXJyb3IuXG4vLyBQYXRoIGlzIGEgbGlzdCBvZiBmaWVsZHMgdG8gc2VhcmNoIGludG8uXG4vLyBSZXR1cm5zIGEgbGlzdCBvZiBwb2ludGVycyBpbiBSRVNUIGZvcm1hdC5cbmZ1bmN0aW9uIGZpbmRQb2ludGVycyhvYmplY3QsIHBhdGgpIHtcbiAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdmFyIGFuc3dlciA9IFtdO1xuICAgIGZvciAodmFyIHggb2Ygb2JqZWN0KSB7XG4gICAgICBhbnN3ZXIgPSBhbnN3ZXIuY29uY2F0KGZpbmRQb2ludGVycyh4LCBwYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXI7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCAhPT0gJ29iamVjdCcgfHwgIW9iamVjdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PSAwKSB7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QuX190eXBlID09ICdQb2ludGVyJykge1xuICAgICAgcmV0dXJuIFtvYmplY3RdO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgc3Vib2JqZWN0ID0gb2JqZWN0W3BhdGhbMF1dO1xuICBpZiAoIXN1Ym9iamVjdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gZmluZFBvaW50ZXJzKHN1Ym9iamVjdCwgcGF0aC5zbGljZSgxKSk7XG59XG5cbi8vIE9iamVjdCBtYXkgYmUgYSBsaXN0IG9mIFJFU1QtZm9ybWF0IG9iamVjdHMgdG8gcmVwbGFjZSBwb2ludGVyc1xuLy8gaW4sIG9yIGl0IG1heSBiZSBhIHNpbmdsZSBvYmplY3QuXG4vLyBQYXRoIGlzIGEgbGlzdCBvZiBmaWVsZHMgdG8gc2VhcmNoIGludG8uXG4vLyByZXBsYWNlIGlzIGEgbWFwIGZyb20gb2JqZWN0IGlkIC0+IG9iamVjdC5cbi8vIFJldHVybnMgc29tZXRoaW5nIGFuYWxvZ291cyB0byBvYmplY3QsIGJ1dCB3aXRoIHRoZSBhcHByb3ByaWF0ZVxuLy8gcG9pbnRlcnMgaW5mbGF0ZWQuXG5mdW5jdGlvbiByZXBsYWNlUG9pbnRlcnMob2JqZWN0LCBwYXRoLCByZXBsYWNlKSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBvYmplY3RcbiAgICAgIC5tYXAob2JqID0+IHJlcGxhY2VQb2ludGVycyhvYmosIHBhdGgsIHJlcGxhY2UpKVxuICAgICAgLmZpbHRlcihvYmogPT4gdHlwZW9mIG9iaiAhPT0gJ3VuZGVmaW5lZCcpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8ICFvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKG9iamVjdCAmJiBvYmplY3QuX190eXBlID09PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiByZXBsYWNlW29iamVjdC5vYmplY3RJZF07XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cblxuICB2YXIgc3Vib2JqZWN0ID0gb2JqZWN0W3BhdGhbMF1dO1xuICBpZiAoIXN1Ym9iamVjdCkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgdmFyIG5ld3N1YiA9IHJlcGxhY2VQb2ludGVycyhzdWJvYmplY3QsIHBhdGguc2xpY2UoMSksIHJlcGxhY2UpO1xuICB2YXIgYW5zd2VyID0ge307XG4gIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoa2V5ID09IHBhdGhbMF0pIHtcbiAgICAgIGFuc3dlcltrZXldID0gbmV3c3ViO1xuICAgIH0gZWxzZSB7XG4gICAgICBhbnN3ZXJba2V5XSA9IG9iamVjdFtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYW5zd2VyO1xufVxuXG4vLyBGaW5kcyBhIHN1Ym9iamVjdCB0aGF0IGhhcyB0aGUgZ2l2ZW4ga2V5LCBpZiB0aGVyZSBpcyBvbmUuXG4vLyBSZXR1cm5zIHVuZGVmaW5lZCBvdGhlcndpc2UuXG5mdW5jdGlvbiBmaW5kT2JqZWN0V2l0aEtleShyb290LCBrZXkpIHtcbiAgaWYgKHR5cGVvZiByb290ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocm9vdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgZm9yICh2YXIgaXRlbSBvZiByb290KSB7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBmaW5kT2JqZWN0V2l0aEtleShpdGVtLCBrZXkpO1xuICAgICAgaWYgKGFuc3dlcikge1xuICAgICAgICByZXR1cm4gYW5zd2VyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAocm9vdCAmJiByb290W2tleV0pIHtcbiAgICByZXR1cm4gcm9vdDtcbiAgfVxuICBmb3IgKHZhciBzdWJrZXkgaW4gcm9vdCkge1xuICAgIGNvbnN0IGFuc3dlciA9IGZpbmRPYmplY3RXaXRoS2V5KHJvb3Rbc3Via2V5XSwga2V5KTtcbiAgICBpZiAoYW5zd2VyKSB7XG4gICAgICByZXR1cm4gYW5zd2VyO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc3RRdWVyeTtcbiJdfQ==
|
|
894
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTY2hlbWFDb250cm9sbGVyIiwicmVxdWlyZSIsIlBhcnNlIiwidHJpZ2dlcnMiLCJjb250aW51ZVdoaWxlIiwiQWx3YXlzU2VsZWN0ZWRLZXlzIiwiUmVzdFF1ZXJ5IiwiY29uZmlnIiwiYXV0aCIsImNsYXNzTmFtZSIsInJlc3RXaGVyZSIsInJlc3RPcHRpb25zIiwiY2xpZW50U0RLIiwicnVuQWZ0ZXJGaW5kIiwiY29udGV4dCIsInJlc3BvbnNlIiwiZmluZE9wdGlvbnMiLCJpc01hc3RlciIsInVzZXIiLCJFcnJvciIsIklOVkFMSURfU0VTU0lPTl9UT0tFTiIsIiRhbmQiLCJfX3R5cGUiLCJvYmplY3RJZCIsImlkIiwiZG9Db3VudCIsImluY2x1ZGVBbGwiLCJpbmNsdWRlIiwia2V5c0ZvckluY2x1ZGUiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJrZXlzIiwiZXhjbHVkZUtleXMiLCJsZW5ndGgiLCJzcGxpdCIsImZpbHRlciIsImtleSIsIm1hcCIsInNsaWNlIiwibGFzdEluZGV4T2YiLCJqb2luIiwib3B0aW9uIiwiY29uY2F0IiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZXhjbHVkZSIsImsiLCJpbmRleE9mIiwiZmllbGRzIiwib3JkZXIiLCJzb3J0IiwicmVkdWNlIiwic29ydE1hcCIsImZpZWxkIiwidHJpbSIsInNjb3JlIiwiJG1ldGEiLCJwYXRocyIsImluY2x1ZGVzIiwicGF0aFNldCIsIm1lbW8iLCJwYXRoIiwiaW5kZXgiLCJwYXJ0cyIsInMiLCJhIiwiYiIsInJlZGlyZWN0S2V5IiwicmVkaXJlY3RDbGFzc05hbWVGb3JLZXkiLCJyZWRpcmVjdENsYXNzTmFtZSIsIklOVkFMSURfSlNPTiIsImV4ZWN1dGUiLCJleGVjdXRlT3B0aW9ucyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsImJ1aWxkUmVzdFdoZXJlIiwiZGVueVByb3RlY3RlZEZpZWxkcyIsImhhbmRsZUluY2x1ZGVBbGwiLCJoYW5kbGVFeGNsdWRlS2V5cyIsInJ1bkZpbmQiLCJydW5Db3VudCIsImhhbmRsZUluY2x1ZGUiLCJydW5BZnRlckZpbmRUcmlnZ2VyIiwiZWFjaCIsImNhbGxiYWNrIiwibGltaXQiLCJmaW5pc2hlZCIsInF1ZXJ5IiwicmVzdWx0cyIsImZvckVhY2giLCJhc3NpZ24iLCIkZ3QiLCJnZXRVc2VyQW5kUm9sZUFDTCIsInZhbGlkYXRlQ2xpZW50Q2xhc3NDcmVhdGlvbiIsInJlcGxhY2VTZWxlY3QiLCJyZXBsYWNlRG9udFNlbGVjdCIsInJlcGxhY2VJblF1ZXJ5IiwicmVwbGFjZU5vdEluUXVlcnkiLCJyZXBsYWNlRXF1YWxpdHkiLCJhY2wiLCJnZXRVc2VyUm9sZXMiLCJyb2xlcyIsImRhdGFiYXNlIiwibmV3Q2xhc3NOYW1lIiwiYWxsb3dDbGllbnRDbGFzc0NyZWF0aW9uIiwic3lzdGVtQ2xhc3NlcyIsImxvYWRTY2hlbWEiLCJzY2hlbWFDb250cm9sbGVyIiwiaGFzQ2xhc3MiLCJPUEVSQVRJT05fRk9SQklEREVOIiwidHJhbnNmb3JtSW5RdWVyeSIsImluUXVlcnlPYmplY3QiLCJ2YWx1ZXMiLCJyZXN1bHQiLCJwdXNoIiwiaXNBcnJheSIsImZpbmRPYmplY3RXaXRoS2V5IiwiaW5RdWVyeVZhbHVlIiwid2hlcmUiLCJJTlZBTElEX1FVRVJZIiwiYWRkaXRpb25hbE9wdGlvbnMiLCJzdWJxdWVyeVJlYWRQcmVmZXJlbmNlIiwicmVhZFByZWZlcmVuY2UiLCJzdWJxdWVyeSIsInRyYW5zZm9ybU5vdEluUXVlcnkiLCJub3RJblF1ZXJ5T2JqZWN0Iiwibm90SW5RdWVyeVZhbHVlIiwiZ2V0RGVlcGVzdE9iamVjdEZyb21LZXkiLCJqc29uIiwiaWR4Iiwic3JjIiwic3BsaWNlIiwidHJhbnNmb3JtU2VsZWN0Iiwic2VsZWN0T2JqZWN0Iiwib2JqZWN0cyIsInNlbGVjdFZhbHVlIiwidHJhbnNmb3JtRG9udFNlbGVjdCIsImRvbnRTZWxlY3RPYmplY3QiLCJkb250U2VsZWN0VmFsdWUiLCJjbGVhblJlc3VsdEF1dGhEYXRhIiwicGFzc3dvcmQiLCJhdXRoRGF0YSIsInByb3ZpZGVyIiwicmVwbGFjZUVxdWFsaXR5Q29uc3RyYWludCIsImNvbnN0cmFpbnQiLCJlcXVhbFRvT2JqZWN0IiwiaGFzRGlyZWN0Q29uc3RyYWludCIsImhhc09wZXJhdG9yQ29uc3RyYWludCIsIm9wdGlvbnMiLCJvcCIsImZpbmQiLCJleHBsYWluIiwiZmlsZXNDb250cm9sbGVyIiwiZXhwYW5kRmlsZXNJbk9iamVjdCIsInIiLCJjb3VudCIsInNraXAiLCJjIiwicHJvdGVjdGVkRmllbGRzIiwiYWRkUHJvdGVjdGVkRmllbGRzIiwiZ2V0T25lU2NoZW1hIiwic2NoZW1hIiwiaW5jbHVkZUZpZWxkcyIsImtleUZpZWxkcyIsInR5cGUiLCJwYXRoUmVzcG9uc2UiLCJpbmNsdWRlUGF0aCIsIm5ld1Jlc3BvbnNlIiwiaGFzQWZ0ZXJGaW5kSG9vayIsInRyaWdnZXJFeGlzdHMiLCJUeXBlcyIsImFmdGVyRmluZCIsImFwcGxpY2F0aW9uSWQiLCJwaXBlbGluZSIsImRpc3RpbmN0IiwicGFyc2VRdWVyeSIsIlF1ZXJ5Iiwid2l0aEpTT04iLCJtYXliZVJ1bkFmdGVyRmluZFRyaWdnZXIiLCJvYmplY3QiLCJ0b0pTT04iLCJwb2ludGVycyIsImZpbmRQb2ludGVycyIsInBvaW50ZXJzSGFzaCIsInBvaW50ZXIiLCJhZGQiLCJpbmNsdWRlUmVzdE9wdGlvbnMiLCJrZXlTZXQiLCJzZXQiLCJrZXlQYXRoIiwiaSIsInNpemUiLCJleGNsdWRlS2V5U2V0IiwiaW5jbHVkZVJlYWRQcmVmZXJlbmNlIiwicXVlcnlQcm9taXNlcyIsIm9iamVjdElkcyIsIiRpbiIsImFsbCIsInJlc3BvbnNlcyIsInJlcGxhY2UiLCJpbmNsdWRlUmVzcG9uc2UiLCJvYmoiLCJzZXNzaW9uVG9rZW4iLCJyZXNwIiwicmVwbGFjZVBvaW50ZXJzIiwiYW5zd2VyIiwieCIsInN1Ym9iamVjdCIsIm5ld3N1YiIsInJvb3QiLCJpdGVtIiwic3Via2V5IiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9SZXN0UXVlcnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBydW4gYSAnZmluZCdcbi8vIG9wZXJhdGlvbiwgZW5jb2RlZCBpbiB0aGUgUkVTVCBBUEkgZm9ybWF0LlxuXG52YXIgU2NoZW1hQ29udHJvbGxlciA9IHJlcXVpcmUoJy4vQ29udHJvbGxlcnMvU2NoZW1hQ29udHJvbGxlcicpO1xudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuY29uc3QgdHJpZ2dlcnMgPSByZXF1aXJlKCcuL3RyaWdnZXJzJyk7XG5jb25zdCB7IGNvbnRpbnVlV2hpbGUgfSA9IHJlcXVpcmUoJ3BhcnNlL2xpYi9ub2RlL3Byb21pc2VVdGlscycpO1xuY29uc3QgQWx3YXlzU2VsZWN0ZWRLZXlzID0gWydvYmplY3RJZCcsICdjcmVhdGVkQXQnLCAndXBkYXRlZEF0JywgJ0FDTCddO1xuLy8gcmVzdE9wdGlvbnMgY2FuIGluY2x1ZGU6XG4vLyAgIHNraXBcbi8vICAgbGltaXRcbi8vICAgb3JkZXJcbi8vICAgY291bnRcbi8vICAgaW5jbHVkZVxuLy8gICBrZXlzXG4vLyAgIGV4Y2x1ZGVLZXlzXG4vLyAgIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5XG4vLyAgIHJlYWRQcmVmZXJlbmNlXG4vLyAgIGluY2x1ZGVSZWFkUHJlZmVyZW5jZVxuLy8gICBzdWJxdWVyeVJlYWRQcmVmZXJlbmNlXG5mdW5jdGlvbiBSZXN0UXVlcnkoXG4gIGNvbmZpZyxcbiAgYXV0aCxcbiAgY2xhc3NOYW1lLFxuICByZXN0V2hlcmUgPSB7fSxcbiAgcmVzdE9wdGlvbnMgPSB7fSxcbiAgY2xpZW50U0RLLFxuICBydW5BZnRlckZpbmQgPSB0cnVlLFxuICBjb250ZXh0XG4pIHtcbiAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gIHRoaXMuYXV0aCA9IGF1dGg7XG4gIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICB0aGlzLnJlc3RXaGVyZSA9IHJlc3RXaGVyZTtcbiAgdGhpcy5yZXN0T3B0aW9ucyA9IHJlc3RPcHRpb25zO1xuICB0aGlzLmNsaWVudFNESyA9IGNsaWVudFNESztcbiAgdGhpcy5ydW5BZnRlckZpbmQgPSBydW5BZnRlckZpbmQ7XG4gIHRoaXMucmVzcG9uc2UgPSBudWxsO1xuICB0aGlzLmZpbmRPcHRpb25zID0ge307XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQgfHwge307XG4gIGlmICghdGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgaWYgKHRoaXMuY2xhc3NOYW1lID09ICdfU2Vzc2lvbicpIHtcbiAgICAgIGlmICghdGhpcy5hdXRoLnVzZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfU0VTU0lPTl9UT0tFTiwgJ0ludmFsaWQgc2Vzc2lvbiB0b2tlbicpO1xuICAgICAgfVxuICAgICAgdGhpcy5yZXN0V2hlcmUgPSB7XG4gICAgICAgICRhbmQ6IFtcbiAgICAgICAgICB0aGlzLnJlc3RXaGVyZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgICAgICAgICBjbGFzc05hbWU6ICdfVXNlcicsXG4gICAgICAgICAgICAgIG9iamVjdElkOiB0aGlzLmF1dGgudXNlci5pZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdGhpcy5kb0NvdW50ID0gZmFsc2U7XG4gIHRoaXMuaW5jbHVkZUFsbCA9IGZhbHNlO1xuXG4gIC8vIFRoZSBmb3JtYXQgZm9yIHRoaXMuaW5jbHVkZSBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGZvcm1hdCBmb3IgdGhlXG4gIC8vIGluY2x1ZGUgb3B0aW9uIC0gaXQncyB0aGUgcGF0aHMgd2Ugc2hvdWxkIGluY2x1ZGUsIGluIG9yZGVyLFxuICAvLyBzdG9yZWQgYXMgYXJyYXlzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgd2UgbmVlZCB0byBpbmNsdWRlIGZvb1xuICAvLyBiZWZvcmUgaW5jbHVkaW5nIGZvby5iYXIuIEFsc28gaXQgc2hvdWxkIGRlZHVwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIHBhc3NpbmcgYW4gYXJnIG9mIGluY2x1ZGU9Zm9vLmJhcixmb28uYmF6IGNvdWxkIGxlYWQgdG9cbiAgLy8gdGhpcy5pbmNsdWRlID0gW1snZm9vJ10sIFsnZm9vJywgJ2JheiddLCBbJ2ZvbycsICdiYXInXV1cbiAgdGhpcy5pbmNsdWRlID0gW107XG4gIGxldCBrZXlzRm9ySW5jbHVkZSA9ICcnO1xuXG4gIC8vIElmIHdlIGhhdmUga2V5cywgd2UgcHJvYmFibHkgd2FudCB0byBmb3JjZSBzb21lIGluY2x1ZGVzIChuLTEgbGV2ZWwpXG4gIC8vIFNlZSBpc3N1ZTogaHR0cHM6Ly9naXRodWIuY29tL3BhcnNlLWNvbW11bml0eS9wYXJzZS1zZXJ2ZXIvaXNzdWVzLzMxODVcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXN0T3B0aW9ucywgJ2tleXMnKSkge1xuICAgIGtleXNGb3JJbmNsdWRlID0gcmVzdE9wdGlvbnMua2V5cztcbiAgfVxuXG4gIC8vIElmIHdlIGhhdmUga2V5cywgd2UgcHJvYmFibHkgd2FudCB0byBmb3JjZSBzb21lIGluY2x1ZGVzIChuLTEgbGV2ZWwpXG4gIC8vIGluIG9yZGVyIHRvIGV4Y2x1ZGUgc3BlY2lmaWMga2V5cy5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXN0T3B0aW9ucywgJ2V4Y2x1ZGVLZXlzJykpIHtcbiAgICBrZXlzRm9ySW5jbHVkZSArPSAnLCcgKyByZXN0T3B0aW9ucy5leGNsdWRlS2V5cztcbiAgfVxuXG4gIGlmIChrZXlzRm9ySW5jbHVkZS5sZW5ndGggPiAwKSB7XG4gICAga2V5c0ZvckluY2x1ZGUgPSBrZXlzRm9ySW5jbHVkZVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgLy8gQXQgbGVhc3QgMiBjb21wb25lbnRzXG4gICAgICAgIHJldHVybiBrZXkuc3BsaXQoJy4nKS5sZW5ndGggPiAxO1xuICAgICAgfSlcbiAgICAgIC5tYXAoa2V5ID0+IHtcbiAgICAgICAgLy8gU2xpY2UgdGhlIGxhc3QgY29tcG9uZW50IChhLmIuYyAtPiBhLmIpXG4gICAgICAgIC8vIE90aGVyd2lzZSB3ZSdsbCBpbmNsdWRlIG9uZSBsZXZlbCB0b28gbXVjaC5cbiAgICAgICAgcmV0dXJuIGtleS5zbGljZSgwLCBrZXkubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJywnKTtcblxuICAgIC8vIENvbmNhdCB0aGUgcG9zc2libHkgcHJlc2VudCBpbmNsdWRlIHN0cmluZyB3aXRoIHRoZSBvbmUgZnJvbSB0aGUga2V5c1xuICAgIC8vIERlZHVwIC8gc29ydGluZyBpcyBoYW5kbGUgaW4gJ2luY2x1ZGUnIGNhc2UuXG4gICAgaWYgKGtleXNGb3JJbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmICghcmVzdE9wdGlvbnMuaW5jbHVkZSB8fCByZXN0T3B0aW9ucy5pbmNsdWRlLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmluY2x1ZGUgPSBrZXlzRm9ySW5jbHVkZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3RPcHRpb25zLmluY2x1ZGUgKz0gJywnICsga2V5c0ZvckluY2x1ZGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yICh2YXIgb3B0aW9uIGluIHJlc3RPcHRpb25zKSB7XG4gICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgIGNhc2UgJ2tleXMnOiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSByZXN0T3B0aW9ucy5rZXlzXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAuZmlsdGVyKGtleSA9PiBrZXkubGVuZ3RoID4gMClcbiAgICAgICAgICAuY29uY2F0KEFsd2F5c1NlbGVjdGVkS2V5cyk7XG4gICAgICAgIHRoaXMua2V5cyA9IEFycmF5LmZyb20obmV3IFNldChrZXlzKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXhjbHVkZUtleXMnOiB7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGUgPSByZXN0T3B0aW9ucy5leGNsdWRlS2V5c1xuICAgICAgICAgIC5zcGxpdCgnLCcpXG4gICAgICAgICAgLmZpbHRlcihrID0+IEFsd2F5c1NlbGVjdGVkS2V5cy5pbmRleE9mKGspIDwgMCk7XG4gICAgICAgIHRoaXMuZXhjbHVkZUtleXMgPSBBcnJheS5mcm9tKG5ldyBTZXQoZXhjbHVkZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvdW50JzpcbiAgICAgICAgdGhpcy5kb0NvdW50ID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbmNsdWRlQWxsJzpcbiAgICAgICAgdGhpcy5pbmNsdWRlQWxsID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleHBsYWluJzpcbiAgICAgIGNhc2UgJ2hpbnQnOlxuICAgICAgY2FzZSAnZGlzdGluY3QnOlxuICAgICAgY2FzZSAncGlwZWxpbmUnOlxuICAgICAgY2FzZSAnc2tpcCc6XG4gICAgICBjYXNlICdsaW1pdCc6XG4gICAgICBjYXNlICdyZWFkUHJlZmVyZW5jZSc6XG4gICAgICAgIHRoaXMuZmluZE9wdGlvbnNbb3B0aW9uXSA9IHJlc3RPcHRpb25zW29wdGlvbl07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3JkZXInOlxuICAgICAgICB2YXIgZmllbGRzID0gcmVzdE9wdGlvbnMub3JkZXIuc3BsaXQoJywnKTtcbiAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5zb3J0ID0gZmllbGRzLnJlZHVjZSgoc29ydE1hcCwgZmllbGQpID0+IHtcbiAgICAgICAgICBmaWVsZCA9IGZpZWxkLnRyaW0oKTtcbiAgICAgICAgICBpZiAoZmllbGQgPT09ICckc2NvcmUnIHx8IGZpZWxkID09PSAnLSRzY29yZScpIHtcbiAgICAgICAgICAgIHNvcnRNYXAuc2NvcmUgPSB7ICRtZXRhOiAndGV4dFNjb3JlJyB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRbMF0gPT0gJy0nKSB7XG4gICAgICAgICAgICBzb3J0TWFwW2ZpZWxkLnNsaWNlKDEpXSA9IC0xO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3J0TWFwW2ZpZWxkXSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzb3J0TWFwO1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5jbHVkZSc6IHtcbiAgICAgICAgY29uc3QgcGF0aHMgPSByZXN0T3B0aW9ucy5pbmNsdWRlLnNwbGl0KCcsJyk7XG4gICAgICAgIGlmIChwYXRocy5pbmNsdWRlcygnKicpKSB7XG4gICAgICAgICAgdGhpcy5pbmNsdWRlQWxsID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIHRoZSBleGlzdGluZyBpbmNsdWRlcyAoZnJvbSBrZXlzKVxuICAgICAgICBjb25zdCBwYXRoU2V0ID0gcGF0aHMucmVkdWNlKChtZW1vLCBwYXRoKSA9PiB7XG4gICAgICAgICAgLy8gU3BsaXQgZWFjaCBwYXRocyBvbiAuIChhLmIuYyAtPiBbYSxiLGNdKVxuICAgICAgICAgIC8vIHJlZHVjZSB0byBjcmVhdGUgYWxsIHBhdGhzXG4gICAgICAgICAgLy8gKFthLGIsY10gLT4ge2E6IHRydWUsICdhLmInOiB0cnVlLCAnYS5iLmMnOiB0cnVlfSlcbiAgICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgnLicpLnJlZHVjZSgobWVtbywgcGF0aCwgaW5kZXgsIHBhcnRzKSA9PiB7XG4gICAgICAgICAgICBtZW1vW3BhcnRzLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbignLicpXSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgICB9LCBtZW1vKTtcbiAgICAgICAgfSwge30pO1xuXG4gICAgICAgIHRoaXMuaW5jbHVkZSA9IE9iamVjdC5rZXlzKHBhdGhTZXQpXG4gICAgICAgICAgLm1hcChzID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzLnNwbGl0KCcuJyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGEubGVuZ3RoIC0gYi5sZW5ndGg7IC8vIFNvcnQgYnkgbnVtYmVyIG9mIGNvbXBvbmVudHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdyZWRpcmVjdENsYXNzTmFtZUZvcktleSc6XG4gICAgICAgIHRoaXMucmVkaXJlY3RLZXkgPSByZXN0T3B0aW9ucy5yZWRpcmVjdENsYXNzTmFtZUZvcktleTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdENsYXNzTmFtZSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5jbHVkZVJlYWRQcmVmZXJlbmNlJzpcbiAgICAgIGNhc2UgJ3N1YnF1ZXJ5UmVhZFByZWZlcmVuY2UnOlxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX0pTT04sICdiYWQgb3B0aW9uOiAnICsgb3B0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBjb252ZW5pZW50IG1ldGhvZCB0byBwZXJmb3JtIGFsbCB0aGUgc3RlcHMgb2YgcHJvY2Vzc2luZyBhIHF1ZXJ5XG4vLyBpbiBvcmRlci5cbi8vIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcmVzcG9uc2UgLSBhbiBvYmplY3Qgd2l0aCBvcHRpb25hbCBrZXlzXG4vLyAncmVzdWx0cycgYW5kICdjb3VudCcuXG4vLyBUT0RPOiBjb25zb2xpZGF0ZSB0aGUgcmVwbGFjZVggZnVuY3Rpb25zXG5SZXN0UXVlcnkucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoZXhlY3V0ZU9wdGlvbnMpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuYnVpbGRSZXN0V2hlcmUoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmRlbnlQcm90ZWN0ZWRGaWVsZHMoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUluY2x1ZGVBbGwoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZUV4Y2x1ZGVLZXlzKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5GaW5kKGV4ZWN1dGVPcHRpb25zKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJ1bkNvdW50KCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbmNsdWRlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ydW5BZnRlckZpbmRUcmlnZ2VyKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNwb25zZTtcbiAgICB9KTtcbn07XG5cblJlc3RRdWVyeS5wcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICBjb25zdCB7IGNvbmZpZywgYXV0aCwgY2xhc3NOYW1lLCByZXN0V2hlcmUsIHJlc3RPcHRpb25zLCBjbGllbnRTREsgfSA9IHRoaXM7XG4gIC8vIGlmIHRoZSBsaW1pdCBpcyBzZXQsIHVzZSBpdFxuICByZXN0T3B0aW9ucy5saW1pdCA9IHJlc3RPcHRpb25zLmxpbWl0IHx8IDEwMDtcbiAgcmVzdE9wdGlvbnMub3JkZXIgPSAnb2JqZWN0SWQnO1xuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcblxuICByZXR1cm4gY29udGludWVXaGlsZShcbiAgICAoKSA9PiB7XG4gICAgICByZXR1cm4gIWZpbmlzaGVkO1xuICAgIH0sXG4gICAgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgICAgICBjb25maWcsXG4gICAgICAgIGF1dGgsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgcmVzdFdoZXJlLFxuICAgICAgICByZXN0T3B0aW9ucyxcbiAgICAgICAgY2xpZW50U0RLLFxuICAgICAgICB0aGlzLnJ1bkFmdGVyRmluZCxcbiAgICAgICAgdGhpcy5jb250ZXh0XG4gICAgICApO1xuICAgICAgY29uc3QgeyByZXN1bHRzIH0gPSBhd2FpdCBxdWVyeS5leGVjdXRlKCk7XG4gICAgICByZXN1bHRzLmZvckVhY2goY2FsbGJhY2spO1xuICAgICAgZmluaXNoZWQgPSByZXN1bHRzLmxlbmd0aCA8IHJlc3RPcHRpb25zLmxpbWl0O1xuICAgICAgaWYgKCFmaW5pc2hlZCkge1xuICAgICAgICByZXN0V2hlcmUub2JqZWN0SWQgPSBPYmplY3QuYXNzaWduKHt9LCByZXN0V2hlcmUub2JqZWN0SWQsIHtcbiAgICAgICAgICAkZ3Q6IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXS5vYmplY3RJZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICApO1xufTtcblxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5idWlsZFJlc3RXaGVyZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VXNlckFuZFJvbGVBQ0woKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5KCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24oKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3QoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VEb250U2VsZWN0KCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5yZXBsYWNlSW5RdWVyeSgpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucmVwbGFjZU5vdEluUXVlcnkoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VFcXVhbGl0eSgpO1xuICAgIH0pO1xufTtcblxuLy8gVXNlcyB0aGUgQXV0aCBvYmplY3QgdG8gZ2V0IHRoZSBsaXN0IG9mIHJvbGVzLCBhZGRzIHRoZSB1c2VyIGlkXG5SZXN0UXVlcnkucHJvdG90eXBlLmdldFVzZXJBbmRSb2xlQUNMID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgdGhpcy5maW5kT3B0aW9ucy5hY2wgPSBbJyonXTtcblxuICBpZiAodGhpcy5hdXRoLnVzZXIpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoLmdldFVzZXJSb2xlcygpLnRoZW4ocm9sZXMgPT4ge1xuICAgICAgdGhpcy5maW5kT3B0aW9ucy5hY2wgPSB0aGlzLmZpbmRPcHRpb25zLmFjbC5jb25jYXQocm9sZXMsIFt0aGlzLmF1dGgudXNlci5pZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gQ2hhbmdlcyB0aGUgY2xhc3NOYW1lIGlmIHJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5IGlzIHNldC5cbi8vIFJldHVybnMgYSBwcm9taXNlLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZWRpcmVjdENsYXNzTmFtZUZvcktleSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnJlZGlyZWN0S2V5KSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gV2UgbmVlZCB0byBjaGFuZ2UgdGhlIGNsYXNzIG5hbWUgYmFzZWQgb24gdGhlIHNjaGVtYVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAucmVkaXJlY3RDbGFzc05hbWVGb3JLZXkodGhpcy5jbGFzc05hbWUsIHRoaXMucmVkaXJlY3RLZXkpXG4gICAgLnRoZW4obmV3Q2xhc3NOYW1lID0+IHtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lO1xuICAgICAgdGhpcy5yZWRpcmVjdENsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTtcbiAgICB9KTtcbn07XG5cbi8vIFZhbGlkYXRlcyB0aGlzIG9wZXJhdGlvbiBhZ2FpbnN0IHRoZSBhbGxvd0NsaWVudENsYXNzQ3JlYXRpb24gY29uZmlnLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS52YWxpZGF0ZUNsaWVudENsYXNzQ3JlYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChcbiAgICB0aGlzLmNvbmZpZy5hbGxvd0NsaWVudENsYXNzQ3JlYXRpb24gPT09IGZhbHNlICYmXG4gICAgIXRoaXMuYXV0aC5pc01hc3RlciAmJlxuICAgIFNjaGVtYUNvbnRyb2xsZXIuc3lzdGVtQ2xhc3Nlcy5pbmRleE9mKHRoaXMuY2xhc3NOYW1lKSA9PT0gLTFcbiAgKSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgICAubG9hZFNjaGVtYSgpXG4gICAgICAudGhlbihzY2hlbWFDb250cm9sbGVyID0+IHNjaGVtYUNvbnRyb2xsZXIuaGFzQ2xhc3ModGhpcy5jbGFzc05hbWUpKVxuICAgICAgLnRoZW4oaGFzQ2xhc3MgPT4ge1xuICAgICAgICBpZiAoaGFzQ2xhc3MgIT09IHRydWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICAgICAgJ1RoaXMgdXNlciBpcyBub3QgYWxsb3dlZCB0byBhY2Nlc3MgJyArICdub24tZXhpc3RlbnQgY2xhc3M6ICcgKyB0aGlzLmNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtSW5RdWVyeShpblF1ZXJ5T2JqZWN0LCBjbGFzc05hbWUsIHJlc3VsdHMpIHtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICBmb3IgKHZhciByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgIHZhbHVlcy5wdXNoKHtcbiAgICAgIF9fdHlwZTogJ1BvaW50ZXInLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICBvYmplY3RJZDogcmVzdWx0Lm9iamVjdElkLFxuICAgIH0pO1xuICB9XG4gIGRlbGV0ZSBpblF1ZXJ5T2JqZWN0WyckaW5RdWVyeSddO1xuICBpZiAoQXJyYXkuaXNBcnJheShpblF1ZXJ5T2JqZWN0WyckaW4nXSkpIHtcbiAgICBpblF1ZXJ5T2JqZWN0WyckaW4nXSA9IGluUXVlcnlPYmplY3RbJyRpbiddLmNvbmNhdCh2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIGluUXVlcnlPYmplY3RbJyRpbiddID0gdmFsdWVzO1xuICB9XG59XG5cbi8vIFJlcGxhY2VzIGEgJGluUXVlcnkgY2xhdXNlIGJ5IHJ1bm5pbmcgdGhlIHN1YnF1ZXJ5LCBpZiB0aGVyZSBpcyBhblxuLy8gJGluUXVlcnkgY2xhdXNlLlxuLy8gVGhlICRpblF1ZXJ5IGNsYXVzZSB0dXJucyBpbnRvIGFuICRpbiB3aXRoIHZhbHVlcyB0aGF0IGFyZSBqdXN0XG4vLyBwb2ludGVycyB0byB0aGUgb2JqZWN0cyByZXR1cm5lZCBpbiB0aGUgc3VicXVlcnkuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VJblF1ZXJ5ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaW5RdWVyeU9iamVjdCA9IGZpbmRPYmplY3RXaXRoS2V5KHRoaXMucmVzdFdoZXJlLCAnJGluUXVlcnknKTtcbiAgaWYgKCFpblF1ZXJ5T2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIGluUXVlcnkgdmFsdWUgbXVzdCBoYXZlIHByZWNpc2VseSB0d28ga2V5cyAtIHdoZXJlIGFuZCBjbGFzc05hbWVcbiAgdmFyIGluUXVlcnlWYWx1ZSA9IGluUXVlcnlPYmplY3RbJyRpblF1ZXJ5J107XG4gIGlmICghaW5RdWVyeVZhbHVlLndoZXJlIHx8ICFpblF1ZXJ5VmFsdWUuY2xhc3NOYW1lKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLklOVkFMSURfUVVFUlksICdpbXByb3BlciB1c2FnZSBvZiAkaW5RdWVyeScpO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XG4gICAgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXk6IGluUXVlcnlWYWx1ZS5yZWRpcmVjdENsYXNzTmFtZUZvcktleSxcbiAgfTtcblxuICBpZiAodGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgYWRkaXRpb25hbE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2U7XG4gICAgYWRkaXRpb25hbE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgfSBlbHNlIGlmICh0aGlzLnJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlKSB7XG4gICAgYWRkaXRpb25hbE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSB0aGlzLnJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlO1xuICB9XG5cbiAgdmFyIHN1YnF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShcbiAgICB0aGlzLmNvbmZpZyxcbiAgICB0aGlzLmF1dGgsXG4gICAgaW5RdWVyeVZhbHVlLmNsYXNzTmFtZSxcbiAgICBpblF1ZXJ5VmFsdWUud2hlcmUsXG4gICAgYWRkaXRpb25hbE9wdGlvbnNcbiAgKTtcbiAgcmV0dXJuIHN1YnF1ZXJ5LmV4ZWN1dGUoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICB0cmFuc2Zvcm1JblF1ZXJ5KGluUXVlcnlPYmplY3QsIHN1YnF1ZXJ5LmNsYXNzTmFtZSwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgLy8gUmVjdXJzZSB0byByZXBlYXRcbiAgICByZXR1cm4gdGhpcy5yZXBsYWNlSW5RdWVyeSgpO1xuICB9KTtcbn07XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybU5vdEluUXVlcnkobm90SW5RdWVyeU9iamVjdCwgY2xhc3NOYW1lLCByZXN1bHRzKSB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICB2YWx1ZXMucHVzaCh7XG4gICAgICBfX3R5cGU6ICdQb2ludGVyJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgb2JqZWN0SWQ6IHJlc3VsdC5vYmplY3RJZCxcbiAgICB9KTtcbiAgfVxuICBkZWxldGUgbm90SW5RdWVyeU9iamVjdFsnJG5vdEluUXVlcnknXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkobm90SW5RdWVyeU9iamVjdFsnJG5pbiddKSkge1xuICAgIG5vdEluUXVlcnlPYmplY3RbJyRuaW4nXSA9IG5vdEluUXVlcnlPYmplY3RbJyRuaW4nXS5jb25jYXQodmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBub3RJblF1ZXJ5T2JqZWN0WyckbmluJ10gPSB2YWx1ZXM7XG4gIH1cbn1cblxuLy8gUmVwbGFjZXMgYSAkbm90SW5RdWVyeSBjbGF1c2UgYnkgcnVubmluZyB0aGUgc3VicXVlcnksIGlmIHRoZXJlIGlzIGFuXG4vLyAkbm90SW5RdWVyeSBjbGF1c2UuXG4vLyBUaGUgJG5vdEluUXVlcnkgY2xhdXNlIHR1cm5zIGludG8gYSAkbmluIHdpdGggdmFsdWVzIHRoYXQgYXJlIGp1c3Rcbi8vIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzIHJldHVybmVkIGluIHRoZSBzdWJxdWVyeS5cblJlc3RRdWVyeS5wcm90b3R5cGUucmVwbGFjZU5vdEluUXVlcnkgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBub3RJblF1ZXJ5T2JqZWN0ID0gZmluZE9iamVjdFdpdGhLZXkodGhpcy5yZXN0V2hlcmUsICckbm90SW5RdWVyeScpO1xuICBpZiAoIW5vdEluUXVlcnlPYmplY3QpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUaGUgbm90SW5RdWVyeSB2YWx1ZSBtdXN0IGhhdmUgcHJlY2lzZWx5IHR3byBrZXlzIC0gd2hlcmUgYW5kIGNsYXNzTmFtZVxuICB2YXIgbm90SW5RdWVyeVZhbHVlID0gbm90SW5RdWVyeU9iamVjdFsnJG5vdEluUXVlcnknXTtcbiAgaWYgKCFub3RJblF1ZXJ5VmFsdWUud2hlcmUgfHwgIW5vdEluUXVlcnlWYWx1ZS5jbGFzc05hbWUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuSU5WQUxJRF9RVUVSWSwgJ2ltcHJvcGVyIHVzYWdlIG9mICRub3RJblF1ZXJ5Jyk7XG4gIH1cblxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogbm90SW5RdWVyeVZhbHVlLnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5LFxuICB9O1xuXG4gIGlmICh0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICB9IGVsc2UgaWYgKHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLFxuICAgIHRoaXMuYXV0aCxcbiAgICBub3RJblF1ZXJ5VmFsdWUuY2xhc3NOYW1lLFxuICAgIG5vdEluUXVlcnlWYWx1ZS53aGVyZSxcbiAgICBhZGRpdGlvbmFsT3B0aW9uc1xuICApO1xuICByZXR1cm4gc3VicXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIHRyYW5zZm9ybU5vdEluUXVlcnkobm90SW5RdWVyeU9iamVjdCwgc3VicXVlcnkuY2xhc3NOYW1lLCByZXNwb25zZS5yZXN1bHRzKTtcbiAgICAvLyBSZWN1cnNlIHRvIHJlcGVhdFxuICAgIHJldHVybiB0aGlzLnJlcGxhY2VOb3RJblF1ZXJ5KCk7XG4gIH0pO1xufTtcblxuLy8gVXNlZCB0byBnZXQgdGhlIGRlZXBlc3Qgb2JqZWN0IGZyb20ganNvbiB1c2luZyBkb3Qgbm90YXRpb24uXG5jb25zdCBnZXREZWVwZXN0T2JqZWN0RnJvbUtleSA9IChqc29uLCBrZXksIGlkeCwgc3JjKSA9PiB7XG4gIGlmIChrZXkgaW4ganNvbikge1xuICAgIHJldHVybiBqc29uW2tleV07XG4gIH1cbiAgc3JjLnNwbGljZSgxKTsgLy8gRXhpdCBFYXJseVxufTtcblxuY29uc3QgdHJhbnNmb3JtU2VsZWN0ID0gKHNlbGVjdE9iamVjdCwga2V5LCBvYmplY3RzKSA9PiB7XG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZm9yICh2YXIgcmVzdWx0IG9mIG9iamVjdHMpIHtcbiAgICB2YWx1ZXMucHVzaChrZXkuc3BsaXQoJy4nKS5yZWR1Y2UoZ2V0RGVlcGVzdE9iamVjdEZyb21LZXksIHJlc3VsdCkpO1xuICB9XG4gIGRlbGV0ZSBzZWxlY3RPYmplY3RbJyRzZWxlY3QnXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0T2JqZWN0WyckaW4nXSkpIHtcbiAgICBzZWxlY3RPYmplY3RbJyRpbiddID0gc2VsZWN0T2JqZWN0WyckaW4nXS5jb25jYXQodmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxlY3RPYmplY3RbJyRpbiddID0gdmFsdWVzO1xuICB9XG59O1xuXG4vLyBSZXBsYWNlcyBhICRzZWxlY3QgY2xhdXNlIGJ5IHJ1bm5pbmcgdGhlIHN1YnF1ZXJ5LCBpZiB0aGVyZSBpcyBhXG4vLyAkc2VsZWN0IGNsYXVzZS5cbi8vIFRoZSAkc2VsZWN0IGNsYXVzZSB0dXJucyBpbnRvIGFuICRpbiB3aXRoIHZhbHVlcyBzZWxlY3RlZCBvdXQgb2Zcbi8vIHRoZSBzdWJxdWVyeS5cbi8vIFJldHVybnMgYSBwb3NzaWJsZS1wcm9taXNlLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlU2VsZWN0ID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc2VsZWN0T2JqZWN0ID0gZmluZE9iamVjdFdpdGhLZXkodGhpcy5yZXN0V2hlcmUsICckc2VsZWN0Jyk7XG4gIGlmICghc2VsZWN0T2JqZWN0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVGhlIHNlbGVjdCB2YWx1ZSBtdXN0IGhhdmUgcHJlY2lzZWx5IHR3byBrZXlzIC0gcXVlcnkgYW5kIGtleVxuICB2YXIgc2VsZWN0VmFsdWUgPSBzZWxlY3RPYmplY3RbJyRzZWxlY3QnXTtcbiAgLy8gaU9TIFNESyBkb24ndCBzZW5kIHdoZXJlIGlmIG5vdCBzZXQsIGxldCBpdCBwYXNzXG4gIGlmIChcbiAgICAhc2VsZWN0VmFsdWUucXVlcnkgfHxcbiAgICAhc2VsZWN0VmFsdWUua2V5IHx8XG4gICAgdHlwZW9mIHNlbGVjdFZhbHVlLnF1ZXJ5ICE9PSAnb2JqZWN0JyB8fFxuICAgICFzZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUgfHxcbiAgICBPYmplY3Qua2V5cyhzZWxlY3RWYWx1ZSkubGVuZ3RoICE9PSAyXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnaW1wcm9wZXIgdXNhZ2Ugb2YgJHNlbGVjdCcpO1xuICB9XG5cbiAgY29uc3QgYWRkaXRpb25hbE9wdGlvbnMgPSB7XG4gICAgcmVkaXJlY3RDbGFzc05hbWVGb3JLZXk6IHNlbGVjdFZhbHVlLnF1ZXJ5LnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5LFxuICB9O1xuXG4gIGlmICh0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICB9IGVsc2UgaWYgKHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLFxuICAgIHRoaXMuYXV0aCxcbiAgICBzZWxlY3RWYWx1ZS5xdWVyeS5jbGFzc05hbWUsXG4gICAgc2VsZWN0VmFsdWUucXVlcnkud2hlcmUsXG4gICAgYWRkaXRpb25hbE9wdGlvbnNcbiAgKTtcbiAgcmV0dXJuIHN1YnF1ZXJ5LmV4ZWN1dGUoKS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICB0cmFuc2Zvcm1TZWxlY3Qoc2VsZWN0T2JqZWN0LCBzZWxlY3RWYWx1ZS5rZXksIHJlc3BvbnNlLnJlc3VsdHMpO1xuICAgIC8vIEtlZXAgcmVwbGFjaW5nICRzZWxlY3QgY2xhdXNlc1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VTZWxlY3QoKTtcbiAgfSk7XG59O1xuXG5jb25zdCB0cmFuc2Zvcm1Eb250U2VsZWN0ID0gKGRvbnRTZWxlY3RPYmplY3QsIGtleSwgb2JqZWN0cykgPT4ge1xuICB2YXIgdmFsdWVzID0gW107XG4gIGZvciAodmFyIHJlc3VsdCBvZiBvYmplY3RzKSB7XG4gICAgdmFsdWVzLnB1c2goa2V5LnNwbGl0KCcuJykucmVkdWNlKGdldERlZXBlc3RPYmplY3RGcm9tS2V5LCByZXN1bHQpKTtcbiAgfVxuICBkZWxldGUgZG9udFNlbGVjdE9iamVjdFsnJGRvbnRTZWxlY3QnXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZG9udFNlbGVjdE9iamVjdFsnJG5pbiddKSkge1xuICAgIGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXSA9IGRvbnRTZWxlY3RPYmplY3RbJyRuaW4nXS5jb25jYXQodmFsdWVzKTtcbiAgfSBlbHNlIHtcbiAgICBkb250U2VsZWN0T2JqZWN0WyckbmluJ10gPSB2YWx1ZXM7XG4gIH1cbn07XG5cbi8vIFJlcGxhY2VzIGEgJGRvbnRTZWxlY3QgY2xhdXNlIGJ5IHJ1bm5pbmcgdGhlIHN1YnF1ZXJ5LCBpZiB0aGVyZSBpcyBhXG4vLyAkZG9udFNlbGVjdCBjbGF1c2UuXG4vLyBUaGUgJGRvbnRTZWxlY3QgY2xhdXNlIHR1cm5zIGludG8gYW4gJG5pbiB3aXRoIHZhbHVlcyBzZWxlY3RlZCBvdXQgb2Zcbi8vIHRoZSBzdWJxdWVyeS5cbi8vIFJldHVybnMgYSBwb3NzaWJsZS1wcm9taXNlLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5yZXBsYWNlRG9udFNlbGVjdCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGRvbnRTZWxlY3RPYmplY3QgPSBmaW5kT2JqZWN0V2l0aEtleSh0aGlzLnJlc3RXaGVyZSwgJyRkb250U2VsZWN0Jyk7XG4gIGlmICghZG9udFNlbGVjdE9iamVjdCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFRoZSBkb250U2VsZWN0IHZhbHVlIG11c3QgaGF2ZSBwcmVjaXNlbHkgdHdvIGtleXMgLSBxdWVyeSBhbmQga2V5XG4gIHZhciBkb250U2VsZWN0VmFsdWUgPSBkb250U2VsZWN0T2JqZWN0WyckZG9udFNlbGVjdCddO1xuICBpZiAoXG4gICAgIWRvbnRTZWxlY3RWYWx1ZS5xdWVyeSB8fFxuICAgICFkb250U2VsZWN0VmFsdWUua2V5IHx8XG4gICAgdHlwZW9mIGRvbnRTZWxlY3RWYWx1ZS5xdWVyeSAhPT0gJ29iamVjdCcgfHxcbiAgICAhZG9udFNlbGVjdFZhbHVlLnF1ZXJ5LmNsYXNzTmFtZSB8fFxuICAgIE9iamVjdC5rZXlzKGRvbnRTZWxlY3RWYWx1ZSkubGVuZ3RoICE9PSAyXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5JTlZBTElEX1FVRVJZLCAnaW1wcm9wZXIgdXNhZ2Ugb2YgJGRvbnRTZWxlY3QnKTtcbiAgfVxuICBjb25zdCBhZGRpdGlvbmFsT3B0aW9ucyA9IHtcbiAgICByZWRpcmVjdENsYXNzTmFtZUZvcktleTogZG9udFNlbGVjdFZhbHVlLnF1ZXJ5LnJlZGlyZWN0Q2xhc3NOYW1lRm9yS2V5LFxuICB9O1xuXG4gIGlmICh0aGlzLnJlc3RPcHRpb25zLnN1YnF1ZXJ5UmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMuc3VicXVlcnlSZWFkUHJlZmVyZW5jZTtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlID0gdGhpcy5yZXN0T3B0aW9ucy5zdWJxdWVyeVJlYWRQcmVmZXJlbmNlO1xuICB9IGVsc2UgaWYgKHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UpIHtcbiAgICBhZGRpdGlvbmFsT3B0aW9ucy5yZWFkUHJlZmVyZW5jZSA9IHRoaXMucmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2U7XG4gIH1cblxuICB2YXIgc3VicXVlcnkgPSBuZXcgUmVzdFF1ZXJ5KFxuICAgIHRoaXMuY29uZmlnLFxuICAgIHRoaXMuYXV0aCxcbiAgICBkb250U2VsZWN0VmFsdWUucXVlcnkuY2xhc3NOYW1lLFxuICAgIGRvbnRTZWxlY3RWYWx1ZS5xdWVyeS53aGVyZSxcbiAgICBhZGRpdGlvbmFsT3B0aW9uc1xuICApO1xuICByZXR1cm4gc3VicXVlcnkuZXhlY3V0ZSgpLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgIHRyYW5zZm9ybURvbnRTZWxlY3QoZG9udFNlbGVjdE9iamVjdCwgZG9udFNlbGVjdFZhbHVlLmtleSwgcmVzcG9uc2UucmVzdWx0cyk7XG4gICAgLy8gS2VlcCByZXBsYWNpbmcgJGRvbnRTZWxlY3QgY2xhdXNlc1xuICAgIHJldHVybiB0aGlzLnJlcGxhY2VEb250U2VsZWN0KCk7XG4gIH0pO1xufTtcblxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5jbGVhblJlc3VsdEF1dGhEYXRhID0gZnVuY3Rpb24gKHJlc3VsdCkge1xuICBkZWxldGUgcmVzdWx0LnBhc3N3b3JkO1xuICBpZiAocmVzdWx0LmF1dGhEYXRhKSB7XG4gICAgT2JqZWN0LmtleXMocmVzdWx0LmF1dGhEYXRhKS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICAgIGlmIChyZXN1bHQuYXV0aERhdGFbcHJvdmlkZXJdID09PSBudWxsKSB7XG4gICAgICAgIGRlbGV0ZSByZXN1bHQuYXV0aERhdGFbcHJvdmlkZXJdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKHJlc3VsdC5hdXRoRGF0YSkubGVuZ3RoID09IDApIHtcbiAgICAgIGRlbGV0ZSByZXN1bHQuYXV0aERhdGE7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCByZXBsYWNlRXF1YWxpdHlDb25zdHJhaW50ID0gY29uc3RyYWludCA9PiB7XG4gIGlmICh0eXBlb2YgY29uc3RyYWludCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuICBjb25zdCBlcXVhbFRvT2JqZWN0ID0ge307XG4gIGxldCBoYXNEaXJlY3RDb25zdHJhaW50ID0gZmFsc2U7XG4gIGxldCBoYXNPcGVyYXRvckNvbnN0cmFpbnQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gY29uc3RyYWludCkge1xuICAgIGlmIChrZXkuaW5kZXhPZignJCcpICE9PSAwKSB7XG4gICAgICBoYXNEaXJlY3RDb25zdHJhaW50ID0gdHJ1ZTtcbiAgICAgIGVxdWFsVG9PYmplY3Rba2V5XSA9IGNvbnN0cmFpbnRba2V5XTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGFzT3BlcmF0b3JDb25zdHJhaW50ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc0RpcmVjdENvbnN0cmFpbnQgJiYgaGFzT3BlcmF0b3JDb25zdHJhaW50KSB7XG4gICAgY29uc3RyYWludFsnJGVxJ10gPSBlcXVhbFRvT2JqZWN0O1xuICAgIE9iamVjdC5rZXlzKGVxdWFsVG9PYmplY3QpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGRlbGV0ZSBjb25zdHJhaW50W2tleV07XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGNvbnN0cmFpbnQ7XG59O1xuXG5SZXN0UXVlcnkucHJvdG90eXBlLnJlcGxhY2VFcXVhbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKHR5cGVvZiB0aGlzLnJlc3RXaGVyZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5yZXN0V2hlcmUpIHtcbiAgICB0aGlzLnJlc3RXaGVyZVtrZXldID0gcmVwbGFjZUVxdWFsaXR5Q29uc3RyYWludCh0aGlzLnJlc3RXaGVyZVtrZXldKTtcbiAgfVxufTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZXRoZXIgaXQgd2FzIHN1Y2Nlc3NmdWwuXG4vLyBQb3B1bGF0ZXMgdGhpcy5yZXNwb25zZSB3aXRoIGFuIG9iamVjdCB0aGF0IG9ubHkgaGFzICdyZXN1bHRzJy5cblJlc3RRdWVyeS5wcm90b3R5cGUucnVuRmluZCA9IGZ1bmN0aW9uIChvcHRpb25zID0ge30pIHtcbiAgaWYgKHRoaXMuZmluZE9wdGlvbnMubGltaXQgPT09IDApIHtcbiAgICB0aGlzLnJlc3BvbnNlID0geyByZXN1bHRzOiBbXSB9O1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICBjb25zdCBmaW5kT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZmluZE9wdGlvbnMpO1xuICBpZiAodGhpcy5rZXlzKSB7XG4gICAgZmluZE9wdGlvbnMua2V5cyA9IHRoaXMua2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgIHJldHVybiBrZXkuc3BsaXQoJy4nKVswXTtcbiAgICB9KTtcbiAgfVxuICBpZiAob3B0aW9ucy5vcCkge1xuICAgIGZpbmRPcHRpb25zLm9wID0gb3B0aW9ucy5vcDtcbiAgfVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAuZmluZCh0aGlzLmNsYXNzTmFtZSwgdGhpcy5yZXN0V2hlcmUsIGZpbmRPcHRpb25zLCB0aGlzLmF1dGgpXG4gICAgLnRoZW4ocmVzdWx0cyA9PiB7XG4gICAgICBpZiAodGhpcy5jbGFzc05hbWUgPT09ICdfVXNlcicgJiYgIWZpbmRPcHRpb25zLmV4cGxhaW4pIHtcbiAgICAgICAgZm9yICh2YXIgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICB0aGlzLmNsZWFuUmVzdWx0QXV0aERhdGEocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbmZpZy5maWxlc0NvbnRyb2xsZXIuZXhwYW5kRmlsZXNJbk9iamVjdCh0aGlzLmNvbmZpZywgcmVzdWx0cyk7XG5cbiAgICAgIGlmICh0aGlzLnJlZGlyZWN0Q2xhc3NOYW1lKSB7XG4gICAgICAgIGZvciAodmFyIHIgb2YgcmVzdWx0cykge1xuICAgICAgICAgIHIuY2xhc3NOYW1lID0gdGhpcy5yZWRpcmVjdENsYXNzTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZXNwb25zZSA9IHsgcmVzdWx0czogcmVzdWx0cyB9O1xuICAgIH0pO1xufTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgZm9yIHdoZXRoZXIgaXQgd2FzIHN1Y2Nlc3NmdWwuXG4vLyBQb3B1bGF0ZXMgdGhpcy5yZXNwb25zZS5jb3VudCB3aXRoIHRoZSBjb3VudFxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5ydW5Db3VudCA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLmRvQ291bnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5maW5kT3B0aW9ucy5jb3VudCA9IHRydWU7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLnNraXA7XG4gIGRlbGV0ZSB0aGlzLmZpbmRPcHRpb25zLmxpbWl0O1xuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UuZmluZCh0aGlzLmNsYXNzTmFtZSwgdGhpcy5yZXN0V2hlcmUsIHRoaXMuZmluZE9wdGlvbnMpLnRoZW4oYyA9PiB7XG4gICAgdGhpcy5yZXNwb25zZS5jb3VudCA9IGM7XG4gIH0pO1xufTtcblxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5kZW55UHJvdGVjdGVkRmllbGRzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5hdXRoLmlzTWFzdGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjaGVtYUNvbnRyb2xsZXIgPSBhd2FpdCB0aGlzLmNvbmZpZy5kYXRhYmFzZS5sb2FkU2NoZW1hKCk7XG4gIGNvbnN0IHByb3RlY3RlZEZpZWxkcyA9XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuYWRkUHJvdGVjdGVkRmllbGRzKFxuICAgICAgc2NoZW1hQ29udHJvbGxlcixcbiAgICAgIHRoaXMuY2xhc3NOYW1lLFxuICAgICAgdGhpcy5yZXN0V2hlcmUsXG4gICAgICB0aGlzLmZpbmRPcHRpb25zLmFjbCxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMuZmluZE9wdGlvbnNcbiAgICApIHx8IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBwcm90ZWN0ZWRGaWVsZHMpIHtcbiAgICBpZiAodGhpcy5yZXN0V2hlcmVba2V5XSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PUEVSQVRJT05fRk9SQklEREVOLFxuICAgICAgICBgVGhpcyB1c2VyIGlzIG5vdCBhbGxvd2VkIHRvIHF1ZXJ5ICR7a2V5fSBvbiBjbGFzcyAke3RoaXMuY2xhc3NOYW1lfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBBdWdtZW50cyB0aGlzLnJlc3BvbnNlIHdpdGggYWxsIHBvaW50ZXJzIG9uIGFuIG9iamVjdFxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5oYW5kbGVJbmNsdWRlQWxsID0gZnVuY3Rpb24gKCkge1xuICBpZiAoIXRoaXMuaW5jbHVkZUFsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAubG9hZFNjaGVtYSgpXG4gICAgLnRoZW4oc2NoZW1hQ29udHJvbGxlciA9PiBzY2hlbWFDb250cm9sbGVyLmdldE9uZVNjaGVtYSh0aGlzLmNsYXNzTmFtZSkpXG4gICAgLnRoZW4oc2NoZW1hID0+IHtcbiAgICAgIGNvbnN0IGluY2x1ZGVGaWVsZHMgPSBbXTtcbiAgICAgIGNvbnN0IGtleUZpZWxkcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiBzY2hlbWEuZmllbGRzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSAmJiBzY2hlbWEuZmllbGRzW2ZpZWxkXS50eXBlID09PSAnUG9pbnRlcicpIHx8XG4gICAgICAgICAgKHNjaGVtYS5maWVsZHNbZmllbGRdLnR5cGUgJiYgc2NoZW1hLmZpZWxkc1tmaWVsZF0udHlwZSA9PT0gJ0FycmF5JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgaW5jbHVkZUZpZWxkcy5wdXNoKFtmaWVsZF0pO1xuICAgICAgICAgIGtleUZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gQWRkIGZpZWxkcyB0byBpbmNsdWRlLCBrZXlzLCByZW1vdmUgZHVwc1xuICAgICAgdGhpcy5pbmNsdWRlID0gWy4uLm5ldyBTZXQoWy4uLnRoaXMuaW5jbHVkZSwgLi4uaW5jbHVkZUZpZWxkc10pXTtcbiAgICAgIC8vIGlmIHRoaXMua2V5cyBub3Qgc2V0LCB0aGVuIGFsbCBrZXlzIGFyZSBhbHJlYWR5IGluY2x1ZGVkXG4gICAgICBpZiAodGhpcy5rZXlzKSB7XG4gICAgICAgIHRoaXMua2V5cyA9IFsuLi5uZXcgU2V0KFsuLi50aGlzLmtleXMsIC4uLmtleUZpZWxkc10pXTtcbiAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8vIFVwZGF0ZXMgcHJvcGVydHkgYHRoaXMua2V5c2AgdG8gY29udGFpbiBhbGwga2V5cyBidXQgdGhlIG9uZXMgdW5zZWxlY3RlZC5cblJlc3RRdWVyeS5wcm90b3R5cGUuaGFuZGxlRXhjbHVkZUtleXMgPSBmdW5jdGlvbiAoKSB7XG4gIGlmICghdGhpcy5leGNsdWRlS2V5cykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5rZXlzKSB7XG4gICAgdGhpcy5rZXlzID0gdGhpcy5rZXlzLmZpbHRlcihrID0+ICF0aGlzLmV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICByZXR1cm47XG4gIH1cbiAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlXG4gICAgLmxvYWRTY2hlbWEoKVxuICAgIC50aGVuKHNjaGVtYUNvbnRyb2xsZXIgPT4gc2NoZW1hQ29udHJvbGxlci5nZXRPbmVTY2hlbWEodGhpcy5jbGFzc05hbWUpKVxuICAgIC50aGVuKHNjaGVtYSA9PiB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhzY2hlbWEuZmllbGRzKTtcbiAgICAgIHRoaXMua2V5cyA9IGZpZWxkcy5maWx0ZXIoayA9PiAhdGhpcy5leGNsdWRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgfSk7XG59O1xuXG4vLyBBdWdtZW50cyB0aGlzLnJlc3BvbnNlIHdpdGggZGF0YSBhdCB0aGUgcGF0aHMgcHJvdmlkZWQgaW4gdGhpcy5pbmNsdWRlLlxuUmVzdFF1ZXJ5LnByb3RvdHlwZS5oYW5kbGVJbmNsdWRlID0gZnVuY3Rpb24gKCkge1xuICBpZiAodGhpcy5pbmNsdWRlLmxlbmd0aCA9PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHBhdGhSZXNwb25zZSA9IGluY2x1ZGVQYXRoKFxuICAgIHRoaXMuY29uZmlnLFxuICAgIHRoaXMuYXV0aCxcbiAgICB0aGlzLnJlc3BvbnNlLFxuICAgIHRoaXMuaW5jbHVkZVswXSxcbiAgICB0aGlzLnJlc3RPcHRpb25zXG4gICk7XG4gIGlmIChwYXRoUmVzcG9uc2UudGhlbikge1xuICAgIHJldHVybiBwYXRoUmVzcG9uc2UudGhlbihuZXdSZXNwb25zZSA9PiB7XG4gICAgICB0aGlzLnJlc3BvbnNlID0gbmV3UmVzcG9uc2U7XG4gICAgICB0aGlzLmluY2x1ZGUgPSB0aGlzLmluY2x1ZGUuc2xpY2UoMSk7XG4gICAgICByZXR1cm4gdGhpcy5oYW5kbGVJbmNsdWRlKCk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAodGhpcy5pbmNsdWRlLmxlbmd0aCA+IDApIHtcbiAgICB0aGlzLmluY2x1ZGUgPSB0aGlzLmluY2x1ZGUuc2xpY2UoMSk7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jbHVkZSgpO1xuICB9XG5cbiAgcmV0dXJuIHBhdGhSZXNwb25zZTtcbn07XG5cbi8vUmV0dXJucyBhIHByb21pc2Ugb2YgYSBwcm9jZXNzZWQgc2V0IG9mIHJlc3VsdHNcblJlc3RRdWVyeS5wcm90b3R5cGUucnVuQWZ0ZXJGaW5kVHJpZ2dlciA9IGZ1bmN0aW9uICgpIHtcbiAgaWYgKCF0aGlzLnJlc3BvbnNlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghdGhpcy5ydW5BZnRlckZpbmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gQXZvaWQgZG9pbmcgYW55IHNldHVwIGZvciB0cmlnZ2VycyBpZiB0aGVyZSBpcyBubyAnYWZ0ZXJGaW5kJyB0cmlnZ2VyIGZvciB0aGlzIGNsYXNzLlxuICBjb25zdCBoYXNBZnRlckZpbmRIb29rID0gdHJpZ2dlcnMudHJpZ2dlckV4aXN0cyhcbiAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckZpbmQsXG4gICAgdGhpcy5jb25maWcuYXBwbGljYXRpb25JZFxuICApO1xuICBpZiAoIWhhc0FmdGVyRmluZEhvb2spIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgLy8gU2tpcCBBZ2dyZWdhdGUgYW5kIERpc3RpbmN0IFF1ZXJpZXNcbiAgaWYgKHRoaXMuZmluZE9wdGlvbnMucGlwZWxpbmUgfHwgdGhpcy5maW5kT3B0aW9ucy5kaXN0aW5jdCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIGNvbnN0IGpzb24gPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnJlc3RPcHRpb25zKTtcbiAganNvbi53aGVyZSA9IHRoaXMucmVzdFdoZXJlO1xuICBjb25zdCBwYXJzZVF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KHRoaXMuY2xhc3NOYW1lKTtcbiAgcGFyc2VRdWVyeS53aXRoSlNPTihqc29uKTtcbiAgLy8gUnVuIGFmdGVyRmluZCB0cmlnZ2VyIGFuZCBzZXQgdGhlIG5ldyByZXN1bHRzXG4gIHJldHVybiB0cmlnZ2Vyc1xuICAgIC5tYXliZVJ1bkFmdGVyRmluZFRyaWdnZXIoXG4gICAgICB0cmlnZ2Vycy5UeXBlcy5hZnRlckZpbmQsXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIHRoaXMucmVzcG9uc2UucmVzdWx0cyxcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgcGFyc2VRdWVyeSxcbiAgICAgIHRoaXMuY29udGV4dFxuICAgIClcbiAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIC8vIEVuc3VyZSB3ZSBwcm9wZXJseSBzZXQgdGhlIGNsYXNzTmFtZSBiYWNrXG4gICAgICBpZiAodGhpcy5yZWRpcmVjdENsYXNzTmFtZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3VsdHMgPSByZXN1bHRzLm1hcChvYmplY3QgPT4ge1xuICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBQYXJzZS5PYmplY3QpIHtcbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC50b0pTT04oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb2JqZWN0LmNsYXNzTmFtZSA9IHRoaXMucmVkaXJlY3RDbGFzc05hbWU7XG4gICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc3BvbnNlLnJlc3VsdHMgPSByZXN1bHRzO1xuICAgICAgfVxuICAgIH0pO1xufTtcblxuLy8gQWRkcyBpbmNsdWRlZCB2YWx1ZXMgdG8gdGhlIHJlc3BvbnNlLlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGQgbmFtZXMuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gYXVnbWVudGVkIHJlc3BvbnNlLlxuZnVuY3Rpb24gaW5jbHVkZVBhdGgoY29uZmlnLCBhdXRoLCByZXNwb25zZSwgcGF0aCwgcmVzdE9wdGlvbnMgPSB7fSkge1xuICB2YXIgcG9pbnRlcnMgPSBmaW5kUG9pbnRlcnMocmVzcG9uc2UucmVzdWx0cywgcGF0aCk7XG4gIGlmIChwb2ludGVycy5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuICBjb25zdCBwb2ludGVyc0hhc2ggPSB7fTtcbiAgZm9yICh2YXIgcG9pbnRlciBvZiBwb2ludGVycykge1xuICAgIGlmICghcG9pbnRlcikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBvaW50ZXIuY2xhc3NOYW1lO1xuICAgIC8vIG9ubHkgaW5jbHVkZSB0aGUgZ29vZCBwb2ludGVyc1xuICAgIGlmIChjbGFzc05hbWUpIHtcbiAgICAgIHBvaW50ZXJzSGFzaFtjbGFzc05hbWVdID0gcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0gfHwgbmV3IFNldCgpO1xuICAgICAgcG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0uYWRkKHBvaW50ZXIub2JqZWN0SWQpO1xuICAgIH1cbiAgfVxuICBjb25zdCBpbmNsdWRlUmVzdE9wdGlvbnMgPSB7fTtcbiAgaWYgKHJlc3RPcHRpb25zLmtleXMpIHtcbiAgICBjb25zdCBrZXlzID0gbmV3IFNldChyZXN0T3B0aW9ucy5rZXlzLnNwbGl0KCcsJykpO1xuICAgIGNvbnN0IGtleVNldCA9IEFycmF5LmZyb20oa2V5cykucmVkdWNlKChzZXQsIGtleSkgPT4ge1xuICAgICAgY29uc3Qga2V5UGF0aCA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgZm9yIChpOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAocGF0aFtpXSAhPSBrZXlQYXRoW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIHNldDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGkgPCBrZXlQYXRoLmxlbmd0aCkge1xuICAgICAgICBzZXQuYWRkKGtleVBhdGhbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldDtcbiAgICB9LCBuZXcgU2V0KCkpO1xuICAgIGlmIChrZXlTZXQuc2l6ZSA+IDApIHtcbiAgICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5rZXlzID0gQXJyYXkuZnJvbShrZXlTZXQpLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cblxuICBpZiAocmVzdE9wdGlvbnMuZXhjbHVkZUtleXMpIHtcbiAgICBjb25zdCBleGNsdWRlS2V5cyA9IG5ldyBTZXQocmVzdE9wdGlvbnMuZXhjbHVkZUtleXMuc3BsaXQoJywnKSk7XG4gICAgY29uc3QgZXhjbHVkZUtleVNldCA9IEFycmF5LmZyb20oZXhjbHVkZUtleXMpLnJlZHVjZSgoc2V0LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhdGggPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIGZvciAoaTsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHBhdGhbaV0gIT0ga2V5UGF0aFtpXSkge1xuICAgICAgICAgIHJldHVybiBzZXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpID09IGtleVBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICBzZXQuYWRkKGtleVBhdGhbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNldDtcbiAgICB9LCBuZXcgU2V0KCkpO1xuICAgIGlmIChleGNsdWRlS2V5U2V0LnNpemUgPiAwKSB7XG4gICAgICBpbmNsdWRlUmVzdE9wdGlvbnMuZXhjbHVkZUtleXMgPSBBcnJheS5mcm9tKGV4Y2x1ZGVLZXlTZXQpLmpvaW4oJywnKTtcbiAgICB9XG4gIH1cblxuICBpZiAocmVzdE9wdGlvbnMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlKSB7XG4gICAgaW5jbHVkZVJlc3RPcHRpb25zLnJlYWRQcmVmZXJlbmNlID0gcmVzdE9wdGlvbnMuaW5jbHVkZVJlYWRQcmVmZXJlbmNlO1xuICAgIGluY2x1ZGVSZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2UgPSByZXN0T3B0aW9ucy5pbmNsdWRlUmVhZFByZWZlcmVuY2U7XG4gIH0gZWxzZSBpZiAocmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UpIHtcbiAgICBpbmNsdWRlUmVzdE9wdGlvbnMucmVhZFByZWZlcmVuY2UgPSByZXN0T3B0aW9ucy5yZWFkUHJlZmVyZW5jZTtcbiAgfVxuXG4gIGNvbnN0IHF1ZXJ5UHJvbWlzZXMgPSBPYmplY3Qua2V5cyhwb2ludGVyc0hhc2gpLm1hcChjbGFzc05hbWUgPT4ge1xuICAgIGNvbnN0IG9iamVjdElkcyA9IEFycmF5LmZyb20ocG9pbnRlcnNIYXNoW2NsYXNzTmFtZV0pO1xuICAgIGxldCB3aGVyZTtcbiAgICBpZiAob2JqZWN0SWRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hlcmUgPSB7IG9iamVjdElkOiBvYmplY3RJZHNbMF0gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hlcmUgPSB7IG9iamVjdElkOiB7ICRpbjogb2JqZWN0SWRzIH0gfTtcbiAgICB9XG4gICAgdmFyIHF1ZXJ5ID0gbmV3IFJlc3RRdWVyeShjb25maWcsIGF1dGgsIGNsYXNzTmFtZSwgd2hlcmUsIGluY2x1ZGVSZXN0T3B0aW9ucyk7XG4gICAgcmV0dXJuIHF1ZXJ5LmV4ZWN1dGUoeyBvcDogJ2dldCcgfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICAgIHJlc3VsdHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gR2V0IHRoZSBvYmplY3RzIGZvciBhbGwgdGhlc2Ugb2JqZWN0IGlkc1xuICByZXR1cm4gUHJvbWlzZS5hbGwocXVlcnlQcm9taXNlcykudGhlbihyZXNwb25zZXMgPT4ge1xuICAgIHZhciByZXBsYWNlID0gcmVzcG9uc2VzLnJlZHVjZSgocmVwbGFjZSwgaW5jbHVkZVJlc3BvbnNlKSA9PiB7XG4gICAgICBmb3IgKHZhciBvYmogb2YgaW5jbHVkZVJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgb2JqLl9fdHlwZSA9ICdPYmplY3QnO1xuICAgICAgICBvYmouY2xhc3NOYW1lID0gaW5jbHVkZVJlc3BvbnNlLmNsYXNzTmFtZTtcblxuICAgICAgICBpZiAob2JqLmNsYXNzTmFtZSA9PSAnX1VzZXInICYmICFhdXRoLmlzTWFzdGVyKSB7XG4gICAgICAgICAgZGVsZXRlIG9iai5zZXNzaW9uVG9rZW47XG4gICAgICAgICAgZGVsZXRlIG9iai5hdXRoRGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXBsYWNlW29iai5vYmplY3RJZF0gPSBvYmo7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVwbGFjZTtcbiAgICB9LCB7fSk7XG5cbiAgICB2YXIgcmVzcCA9IHtcbiAgICAgIHJlc3VsdHM6IHJlcGxhY2VQb2ludGVycyhyZXNwb25zZS5yZXN1bHRzLCBwYXRoLCByZXBsYWNlKSxcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5jb3VudCkge1xuICAgICAgcmVzcC5jb3VudCA9IHJlc3BvbnNlLmNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gcmVzcDtcbiAgfSk7XG59XG5cbi8vIE9iamVjdCBtYXkgYmUgYSBsaXN0IG9mIFJFU1QtZm9ybWF0IG9iamVjdCB0byBmaW5kIHBvaW50ZXJzIGluLCBvclxuLy8gaXQgbWF5IGJlIGEgc2luZ2xlIG9iamVjdC5cbi8vIElmIHRoZSBwYXRoIHlpZWxkcyB0aGluZ3MgdGhhdCBhcmVuJ3QgcG9pbnRlcnMsIHRoaXMgdGhyb3dzIGFuIGVycm9yLlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGRzIHRvIHNlYXJjaCBpbnRvLlxuLy8gUmV0dXJucyBhIGxpc3Qgb2YgcG9pbnRlcnMgaW4gUkVTVCBmb3JtYXQuXG5mdW5jdGlvbiBmaW5kUG9pbnRlcnMob2JqZWN0LCBwYXRoKSB7XG4gIGlmIChvYmplY3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhciBhbnN3ZXIgPSBbXTtcbiAgICBmb3IgKHZhciB4IG9mIG9iamVjdCkge1xuICAgICAgYW5zd2VyID0gYW5zd2VyLmNvbmNhdChmaW5kUG9pbnRlcnMoeCwgcGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gYW5zd2VyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnIHx8ICFvYmplY3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBpZiAocGF0aC5sZW5ndGggPT0gMCkge1xuICAgIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0Ll9fdHlwZSA9PSAnUG9pbnRlcicpIHtcbiAgICAgIHJldHVybiBbb2JqZWN0XTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHN1Ym9iamVjdCA9IG9iamVjdFtwYXRoWzBdXTtcbiAgaWYgKCFzdWJvYmplY3QpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGZpbmRQb2ludGVycyhzdWJvYmplY3QsIHBhdGguc2xpY2UoMSkpO1xufVxuXG4vLyBPYmplY3QgbWF5IGJlIGEgbGlzdCBvZiBSRVNULWZvcm1hdCBvYmplY3RzIHRvIHJlcGxhY2UgcG9pbnRlcnNcbi8vIGluLCBvciBpdCBtYXkgYmUgYSBzaW5nbGUgb2JqZWN0LlxuLy8gUGF0aCBpcyBhIGxpc3Qgb2YgZmllbGRzIHRvIHNlYXJjaCBpbnRvLlxuLy8gcmVwbGFjZSBpcyBhIG1hcCBmcm9tIG9iamVjdCBpZCAtPiBvYmplY3QuXG4vLyBSZXR1cm5zIHNvbWV0aGluZyBhbmFsb2dvdXMgdG8gb2JqZWN0LCBidXQgd2l0aCB0aGUgYXBwcm9wcmlhdGVcbi8vIHBvaW50ZXJzIGluZmxhdGVkLlxuZnVuY3Rpb24gcmVwbGFjZVBvaW50ZXJzKG9iamVjdCwgcGF0aCwgcmVwbGFjZSkge1xuICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICByZXR1cm4gb2JqZWN0XG4gICAgICAubWFwKG9iaiA9PiByZXBsYWNlUG9pbnRlcnMob2JqLCBwYXRoLCByZXBsYWNlKSlcbiAgICAgIC5maWx0ZXIob2JqID0+IHR5cGVvZiBvYmogIT09ICd1bmRlZmluZWQnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JyB8fCAhb2JqZWN0KSB7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChvYmplY3QgJiYgb2JqZWN0Ll9fdHlwZSA9PT0gJ1BvaW50ZXInKSB7XG4gICAgICByZXR1cm4gcmVwbGFjZVtvYmplY3Qub2JqZWN0SWRdO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG5cbiAgdmFyIHN1Ym9iamVjdCA9IG9iamVjdFtwYXRoWzBdXTtcbiAgaWYgKCFzdWJvYmplY3QpIHtcbiAgICByZXR1cm4gb2JqZWN0O1xuICB9XG4gIHZhciBuZXdzdWIgPSByZXBsYWNlUG9pbnRlcnMoc3Vib2JqZWN0LCBwYXRoLnNsaWNlKDEpLCByZXBsYWNlKTtcbiAgdmFyIGFuc3dlciA9IHt9O1xuICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgaWYgKGtleSA9PSBwYXRoWzBdKSB7XG4gICAgICBhbnN3ZXJba2V5XSA9IG5ld3N1YjtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5zd2VyW2tleV0gPSBvYmplY3Rba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFuc3dlcjtcbn1cblxuLy8gRmluZHMgYSBzdWJvYmplY3QgdGhhdCBoYXMgdGhlIGdpdmVuIGtleSwgaWYgdGhlcmUgaXMgb25lLlxuLy8gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuZnVuY3Rpb24gZmluZE9iamVjdFdpdGhLZXkocm9vdCwga2V5KSB7XG4gIGlmICh0eXBlb2Ygcm9vdCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHJvb3QgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIGZvciAodmFyIGl0ZW0gb2Ygcm9vdCkge1xuICAgICAgY29uc3QgYW5zd2VyID0gZmluZE9iamVjdFdpdGhLZXkoaXRlbSwga2V5KTtcbiAgICAgIGlmIChhbnN3ZXIpIHtcbiAgICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHJvb3QgJiYgcm9vdFtrZXldKSB7XG4gICAgcmV0dXJuIHJvb3Q7XG4gIH1cbiAgZm9yICh2YXIgc3Via2V5IGluIHJvb3QpIHtcbiAgICBjb25zdCBhbnN3ZXIgPSBmaW5kT2JqZWN0V2l0aEtleShyb290W3N1YmtleV0sIGtleSk7XG4gICAgaWYgKGFuc3dlcikge1xuICAgICAgcmV0dXJuIGFuc3dlcjtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZXN0UXVlcnk7XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTs7QUFFQSxJQUFJQSxnQkFBZ0IsR0FBR0MsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO0FBQ2hFLElBQUlDLEtBQUssR0FBR0QsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDQyxLQUFLO0FBQ3ZDLE1BQU1DLFFBQVEsR0FBR0YsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN0QyxNQUFNO0VBQUVHO0FBQWMsQ0FBQyxHQUFHSCxPQUFPLENBQUMsNkJBQTZCLENBQUM7QUFDaEUsTUFBTUksa0JBQWtCLEdBQUcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsU0FBUyxDQUNoQkMsTUFBTSxFQUNOQyxJQUFJLEVBQ0pDLFNBQVMsRUFDVEMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUNkQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLEVBQ2hCQyxTQUFTLEVBQ1RDLFlBQVksR0FBRyxJQUFJLEVBQ25CQyxPQUFPLEVBQ1A7RUFDQSxJQUFJLENBQUNQLE1BQU0sR0FBR0EsTUFBTTtFQUNwQixJQUFJLENBQUNDLElBQUksR0FBR0EsSUFBSTtFQUNoQixJQUFJLENBQUNDLFNBQVMsR0FBR0EsU0FBUztFQUMxQixJQUFJLENBQUNDLFNBQVMsR0FBR0EsU0FBUztFQUMxQixJQUFJLENBQUNDLFdBQVcsR0FBR0EsV0FBVztFQUM5QixJ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
|