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.
Files changed (191) hide show
  1. package/README.md +45 -17
  2. package/lib/AccountLockout.js +11 -26
  3. package/lib/Adapters/AdapterLoader.js +8 -14
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
  5. package/lib/Adapters/Auth/AuthAdapter.js +7 -16
  6. package/lib/Adapters/Auth/OAuth1Client.js +32 -57
  7. package/lib/Adapters/Auth/apple.js +6 -22
  8. package/lib/Adapters/Auth/facebook.js +7 -37
  9. package/lib/Adapters/Auth/gcenter.js +8 -37
  10. package/lib/Adapters/Auth/github.js +7 -10
  11. package/lib/Adapters/Auth/google.js +11 -34
  12. package/lib/Adapters/Auth/gpgames.js +5 -8
  13. package/lib/Adapters/Auth/httpsRequest.js +1 -7
  14. package/lib/Adapters/Auth/index.js +20 -65
  15. package/lib/Adapters/Auth/instagram.js +5 -9
  16. package/lib/Adapters/Auth/janraincapture.js +8 -12
  17. package/lib/Adapters/Auth/janrainengage.js +7 -11
  18. package/lib/Adapters/Auth/keycloak.js +5 -19
  19. package/lib/Adapters/Auth/ldap.js +1 -15
  20. package/lib/Adapters/Auth/line.js +7 -10
  21. package/lib/Adapters/Auth/linkedin.js +7 -12
  22. package/lib/Adapters/Auth/meetup.js +7 -10
  23. package/lib/Adapters/Auth/microsoft.js +7 -10
  24. package/lib/Adapters/Auth/oauth2.js +6 -18
  25. package/lib/Adapters/Auth/phantauth.js +8 -10
  26. package/lib/Adapters/Auth/qq.js +7 -13
  27. package/lib/Adapters/Auth/spotify.js +7 -14
  28. package/lib/Adapters/Auth/twitter.js +5 -15
  29. package/lib/Adapters/Auth/vkontakte.js +9 -15
  30. package/lib/Adapters/Auth/wechat.js +7 -10
  31. package/lib/Adapters/Auth/weibo.js +7 -11
  32. package/lib/Adapters/Cache/CacheAdapter.js +4 -12
  33. package/lib/Adapters/Cache/InMemoryCache.js +5 -19
  34. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
  35. package/lib/Adapters/Cache/LRUCache.js +1 -11
  36. package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
  37. package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
  38. package/lib/Adapters/Cache/SchemaCache.js +1 -6
  39. package/lib/Adapters/Email/MailAdapter.js +2 -7
  40. package/lib/Adapters/Files/FilesAdapter.js +7 -21
  41. package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
  42. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  43. package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
  44. package/lib/Adapters/Logger/WinstonLogger.js +3 -30
  45. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
  46. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
  47. package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
  48. package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
  49. package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
  50. package/lib/Adapters/Push/PushAdapter.js +2 -8
  51. package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
  52. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
  53. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
  54. package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
  55. package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
  56. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
  57. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
  58. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
  59. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  60. package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
  61. package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
  62. package/lib/Auth.js +54 -121
  63. package/lib/ClientSDK.js +3 -11
  64. package/lib/Config.js +69 -113
  65. package/lib/Controllers/AdaptableController.js +6 -18
  66. package/lib/Controllers/AnalyticsController.js +1 -9
  67. package/lib/Controllers/CacheController.js +3 -23
  68. package/lib/Controllers/DatabaseController.js +147 -345
  69. package/lib/Controllers/FilesController.js +5 -34
  70. package/lib/Controllers/HooksController.js +1 -51
  71. package/lib/Controllers/LiveQueryController.js +4 -23
  72. package/lib/Controllers/LoggerController.js +15 -54
  73. package/lib/Controllers/ParseGraphQLController.js +49 -104
  74. package/lib/Controllers/PushController.js +20 -59
  75. package/lib/Controllers/SchemaController.js +154 -344
  76. package/lib/Controllers/UserController.js +11 -72
  77. package/lib/Controllers/index.js +19 -68
  78. package/lib/Controllers/types.js +1 -1
  79. package/lib/Deprecator/Deprecations.js +1 -8
  80. package/lib/Deprecator/Deprecator.js +9 -18
  81. package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
  82. package/lib/GraphQL/ParseGraphQLServer.js +2 -29
  83. package/lib/GraphQL/helpers/objectsMutations.js +2 -12
  84. package/lib/GraphQL/helpers/objectsQueries.js +18 -76
  85. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
  86. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
  87. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
  88. package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
  89. package/lib/GraphQL/loaders/filesMutations.js +2 -19
  90. package/lib/GraphQL/loaders/functionsMutations.js +6 -17
  91. package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
  92. package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
  93. package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
  94. package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
  95. package/lib/GraphQL/loaders/schemaMutations.js +1 -20
  96. package/lib/GraphQL/loaders/schemaQueries.js +1 -14
  97. package/lib/GraphQL/loaders/schemaTypes.js +2 -6
  98. package/lib/GraphQL/loaders/usersMutations.js +6 -28
  99. package/lib/GraphQL/loaders/usersQueries.js +4 -26
  100. package/lib/GraphQL/parseGraphQLUtils.js +6 -19
  101. package/lib/GraphQL/transformers/className.js +1 -4
  102. package/lib/GraphQL/transformers/constraintType.js +1 -20
  103. package/lib/GraphQL/transformers/inputType.js +1 -20
  104. package/lib/GraphQL/transformers/mutation.js +6 -51
  105. package/lib/GraphQL/transformers/outputType.js +1 -20
  106. package/lib/GraphQL/transformers/query.js +6 -42
  107. package/lib/GraphQL/transformers/schemaFields.js +7 -34
  108. package/lib/KeyPromiseQueue.js +1 -12
  109. package/lib/LiveQuery/Client.js +1 -25
  110. package/lib/LiveQuery/Id.js +1 -7
  111. package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
  112. package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
  113. package/lib/LiveQuery/ParsePubSub.js +1 -12
  114. package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
  115. package/lib/LiveQuery/QueryTools.js +14 -116
  116. package/lib/LiveQuery/RequestSchema.js +1 -1
  117. package/lib/LiveQuery/SessionTokenCache.js +1 -17
  118. package/lib/LiveQuery/Subscription.js +4 -18
  119. package/lib/LiveQuery/equalObjects.js +2 -14
  120. package/lib/Options/Definitions.js +79 -10
  121. package/lib/Options/docs.js +23 -3
  122. package/lib/Options/index.js +4 -12
  123. package/lib/Options/parsers.js +1 -18
  124. package/lib/Page.js +1 -9
  125. package/lib/ParseMessageQueue.js +1 -10
  126. package/lib/ParseServer.js +144 -182
  127. package/lib/ParseServerRESTController.js +6 -33
  128. package/lib/PromiseRouter.js +16 -50
  129. package/lib/Push/PushQueue.js +3 -15
  130. package/lib/Push/PushWorker.js +7 -32
  131. package/lib/Push/utils.js +9 -38
  132. package/lib/RestQuery.js +105 -242
  133. package/lib/RestWrite.js +212 -377
  134. package/lib/Routers/AggregateRouter.js +14 -51
  135. package/lib/Routers/AnalyticsRouter.js +2 -8
  136. package/lib/Routers/AudiencesRouter.js +1 -15
  137. package/lib/Routers/ClassesRouter.js +3 -53
  138. package/lib/Routers/CloudCodeRouter.js +1 -19
  139. package/lib/Routers/FeaturesRouter.js +1 -10
  140. package/lib/Routers/FilesRouter.js +29 -76
  141. package/lib/Routers/FunctionsRouter.js +5 -28
  142. package/lib/Routers/GlobalConfigRouter.js +4 -18
  143. package/lib/Routers/GraphQLRouter.js +1 -14
  144. package/lib/Routers/HooksRouter.js +1 -29
  145. package/lib/Routers/IAPValidationRouter.js +6 -29
  146. package/lib/Routers/InstallationsRouter.js +2 -12
  147. package/lib/Routers/LogsRouter.js +4 -16
  148. package/lib/Routers/PagesRouter.js +69 -129
  149. package/lib/Routers/PublicAPIRouter.js +3 -62
  150. package/lib/Routers/PurgeRouter.js +1 -15
  151. package/lib/Routers/PushRouter.js +2 -18
  152. package/lib/Routers/RolesRouter.js +1 -7
  153. package/lib/Routers/SchemasRouter.js +4 -34
  154. package/lib/Routers/SecurityRouter.js +1 -12
  155. package/lib/Routers/SessionsRouter.js +3 -19
  156. package/lib/Routers/UsersRouter.js +58 -155
  157. package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
  158. package/lib/SchemaMigrations/Migrations.js +2 -8
  159. package/lib/Security/Check.js +8 -16
  160. package/lib/Security/CheckGroup.js +4 -11
  161. package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
  162. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
  163. package/lib/Security/CheckGroups/CheckGroups.js +1 -4
  164. package/lib/Security/CheckRunner.js +22 -41
  165. package/lib/StatusHandler.js +12 -69
  166. package/lib/TestUtils.js +1 -6
  167. package/lib/Utils.js +27 -66
  168. package/lib/batch.js +17 -28
  169. package/lib/cache.js +1 -3
  170. package/lib/cli/definitions/parse-live-query-server.js +1 -3
  171. package/lib/cli/definitions/parse-server.js +1 -3
  172. package/lib/cli/parse-live-query-server.js +1 -6
  173. package/lib/cli/parse-server.js +11 -21
  174. package/lib/cli/utils/commander.js +13 -51
  175. package/lib/cli/utils/runner.js +1 -14
  176. package/lib/cloud-code/Parse.Cloud.js +71 -92
  177. package/lib/cryptoUtils.js +11 -19
  178. package/lib/defaults.js +2 -14
  179. package/lib/deprecated.js +1 -2
  180. package/lib/index.js +16 -34
  181. package/lib/logger.js +6 -13
  182. package/lib/middlewares.js +147 -151
  183. package/lib/password.js +6 -10
  184. package/lib/request.js +173 -2
  185. package/lib/requiredParameter.js +1 -3
  186. package/lib/rest.js +19 -41
  187. package/lib/triggers.js +54 -252
  188. package/lib/vendor/mongodbUrl.js +125 -305
  189. package/package.json +22 -19
  190. package/lib/cloud-code/HTTPResponse.js +0 -73
  191. package/lib/cloud-code/httpRequest.js +0 -192
@@ -4,73 +4,52 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.UserController = void 0;
7
-
8
7
  var _cryptoUtils = require("../cryptoUtils");
9
-
10
8
  var _triggers = require("../triggers");
11
-
12
9
  var _AdaptableController = _interopRequireDefault(require("./AdaptableController"));
13
-
14
10
  var _MailAdapter = _interopRequireDefault(require("../Adapters/Email/MailAdapter"));
15
-
16
11
  var _rest = _interopRequireDefault(require("../rest"));
17
-
18
12
  var _node = _interopRequireDefault(require("parse/node"));
19
-
20
13
  var _AccountLockout = _interopRequireDefault(require("../AccountLockout"));
21
-
22
14
  var _Config = _interopRequireDefault(require("../Config"));
23
-
24
15
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
26
16
  var RestQuery = require('../RestQuery');
27
-
28
17
  var Auth = require('../Auth');
29
-
30
18
  class UserController extends _AdaptableController.default {
31
19
  constructor(adapter, appId, options = {}) {
32
20
  super(adapter, appId, options);
33
21
  }
34
-
35
22
  get config() {
36
23
  return _Config.default.get(this.appId);
37
24
  }
38
-
39
25
  validateAdapter(adapter) {
40
26
  // Allow no adapter
41
27
  if (!adapter && !this.shouldVerifyEmails) {
42
28
  return;
43
29
  }
44
-
45
30
  super.validateAdapter(adapter);
46
31
  }
47
-
48
32
  expectedAdapterType() {
49
33
  return _MailAdapter.default;
50
34
  }
51
-
52
35
  get shouldVerifyEmails() {
53
36
  return this.options.verifyUserEmails;
54
37
  }
55
-
56
38
  setEmailVerifyToken(user) {
57
39
  if (this.shouldVerifyEmails) {
58
40
  user._email_verify_token = (0, _cryptoUtils.randomString)(25);
59
41
  user.emailVerified = false;
60
-
61
42
  if (this.config.emailVerifyTokenValidityDuration) {
62
43
  user._email_verify_token_expires_at = _node.default._encode(this.config.generateEmailVerifyTokenExpiresAt());
63
44
  }
64
45
  }
65
46
  }
66
-
67
47
  verifyEmail(username, token) {
68
48
  if (!this.shouldVerifyEmails) {
69
49
  // Trying to verify email when not enabled
70
50
  // TODO: Better error here.
71
51
  throw undefined;
72
52
  }
73
-
74
53
  const query = {
75
54
  username: username,
76
55
  _email_verify_token: token
@@ -80,9 +59,10 @@ class UserController extends _AdaptableController.default {
80
59
  _email_verify_token: {
81
60
  __op: 'Delete'
82
61
  }
83
- }; // if the email verify token needs to be validated then
84
- // add additional query params and additional fields that need to be updated
62
+ };
85
63
 
64
+ // if the email verify token needs to be validated then
65
+ // add additional query params and additional fields that need to be updated
86
66
  if (this.config.emailVerifyTokenValidityDuration) {
87
67
  query.emailVerified = false;
88
68
  query._email_verify_token_expires_at = {
@@ -92,7 +72,6 @@ class UserController extends _AdaptableController.default {
92
72
  __op: 'Delete'
93
73
  };
94
74
  }
95
-
96
75
  const masterAuth = Auth.master(this.config);
97
76
  var findUserForEmailVerification = new RestQuery(this.config, Auth.master(this.config), '_User', {
98
77
  username: username
@@ -103,11 +82,9 @@ class UserController extends _AdaptableController.default {
103
82
  } else if (result.results.length) {
104
83
  query.objectId = result.results[0].objectId;
105
84
  }
106
-
107
85
  return _rest.default.update(this.config, masterAuth, '_User', query, updateFields);
108
86
  });
109
87
  }
110
-
111
88
  checkResetTokenValidity(username, token) {
112
89
  return this.config.database.find('_User', {
113
90
  username: username,
@@ -118,53 +95,41 @@ class UserController extends _AdaptableController.default {
118
95
  if (results.length != 1) {
119
96
  throw 'Failed to reset password: username / email / token is invalid';
120
97
  }
121
-
122
98
  if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
123
99
  let expiresDate = results[0]._perishable_token_expires_at;
124
-
125
100
  if (expiresDate && expiresDate.__type == 'Date') {
126
101
  expiresDate = new Date(expiresDate.iso);
127
102
  }
128
-
129
103
  if (expiresDate < new Date()) throw 'The password reset link has expired';
130
104
  }
131
-
132
105
  return results[0];
133
106
  });
134
107
  }
135
-
136
108
  getUserIfNeeded(user) {
137
109
  if (user.username && user.email) {
138
110
  return Promise.resolve(user);
139
111
  }
140
-
141
112
  var where = {};
142
-
143
113
  if (user.username) {
144
114
  where.username = user.username;
145
115
  }
146
-
147
116
  if (user.email) {
148
117
  where.email = user.email;
149
118
  }
150
-
151
119
  var query = new RestQuery(this.config, Auth.master(this.config), '_User', where);
152
120
  return query.execute().then(function (result) {
153
121
  if (result.results.length != 1) {
154
122
  throw undefined;
155
123
  }
156
-
157
124
  return result.results[0];
158
125
  });
159
126
  }
160
-
161
127
  sendVerificationEmail(user) {
162
128
  if (!this.shouldVerifyEmails) {
163
129
  return;
164
130
  }
165
-
166
- const token = encodeURIComponent(user._email_verify_token); // We may need to fetch the user in case of update email
167
-
131
+ const token = encodeURIComponent(user._email_verify_token);
132
+ // We may need to fetch the user in case of update email
168
133
  this.getUserIfNeeded(user).then(user => {
169
134
  const username = encodeURIComponent(user.username);
170
135
  const link = buildEmailLink(this.config.verifyEmailURL, username, token, this.config);
@@ -173,7 +138,6 @@ class UserController extends _AdaptableController.default {
173
138
  link: link,
174
139
  user: (0, _triggers.inflate)('_User', user)
175
140
  };
176
-
177
141
  if (this.adapter.sendVerificationEmail) {
178
142
  this.adapter.sendVerificationEmail(options);
179
143
  } else {
@@ -181,14 +145,13 @@ class UserController extends _AdaptableController.default {
181
145
  }
182
146
  });
183
147
  }
148
+
184
149
  /**
185
150
  * Regenerates the given user's email verification token
186
151
  *
187
152
  * @param user
188
153
  * @returns {*}
189
154
  */
190
-
191
-
192
155
  regenerateEmailVerifyToken(user) {
193
156
  const {
194
157
  _email_verify_token
@@ -196,21 +159,17 @@ class UserController extends _AdaptableController.default {
196
159
  let {
197
160
  _email_verify_token_expires_at
198
161
  } = user;
199
-
200
162
  if (_email_verify_token_expires_at && _email_verify_token_expires_at.__type === 'Date') {
201
163
  _email_verify_token_expires_at = _email_verify_token_expires_at.iso;
202
164
  }
203
-
204
165
  if (this.config.emailVerifyTokenReuseIfValid && this.config.emailVerifyTokenValidityDuration && _email_verify_token && new Date() < new Date(_email_verify_token_expires_at)) {
205
166
  return Promise.resolve();
206
167
  }
207
-
208
168
  this.setEmailVerifyToken(user);
209
169
  return this.config.database.update('_User', {
210
170
  username: user.username
211
171
  }, user);
212
172
  }
213
-
214
173
  resendVerificationEmail(username) {
215
174
  return this.getUserIfNeeded({
216
175
  username: username
@@ -218,22 +177,18 @@ class UserController extends _AdaptableController.default {
218
177
  if (!aUser || aUser.emailVerified) {
219
178
  throw undefined;
220
179
  }
221
-
222
180
  return this.regenerateEmailVerifyToken(aUser).then(() => {
223
181
  this.sendVerificationEmail(aUser);
224
182
  });
225
183
  });
226
184
  }
227
-
228
185
  setPasswordResetToken(email) {
229
186
  const token = {
230
187
  _perishable_token: (0, _cryptoUtils.randomString)(25)
231
188
  };
232
-
233
189
  if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenValidityDuration) {
234
190
  token._perishable_token_expires_at = _node.default._encode(this.config.generatePasswordResetTokenExpiresAt());
235
191
  }
236
-
237
192
  return this.config.database.update('_User', {
238
193
  $or: [{
239
194
  email
@@ -245,14 +200,13 @@ class UserController extends _AdaptableController.default {
245
200
  }]
246
201
  }, token, {}, true);
247
202
  }
248
-
249
203
  async sendPasswordResetEmail(email) {
250
204
  if (!this.adapter) {
251
- throw 'Trying to send a reset password but no adapter is set'; // TODO: No adapter?
205
+ throw 'Trying to send a reset password but no adapter is set';
206
+ // TODO: No adapter?
252
207
  }
253
208
 
254
209
  let user;
255
-
256
210
  if (this.config.passwordPolicy && this.config.passwordPolicy.resetTokenReuseIfValid && this.config.passwordPolicy.resetTokenValidityDuration) {
257
211
  const results = await this.config.database.find('_User', {
258
212
  $or: [{
@@ -272,24 +226,19 @@ class UserController extends _AdaptableController.default {
272
226
  }, {
273
227
  limit: 1
274
228
  });
275
-
276
229
  if (results.length == 1) {
277
230
  let expiresDate = results[0]._perishable_token_expires_at;
278
-
279
231
  if (expiresDate && expiresDate.__type == 'Date') {
280
232
  expiresDate = new Date(expiresDate.iso);
281
233
  }
282
-
283
234
  if (expiresDate > new Date()) {
284
235
  user = results[0];
285
236
  }
286
237
  }
287
238
  }
288
-
289
239
  if (!user || !user._perishable_token) {
290
240
  user = await this.setPasswordResetToken(email);
291
241
  }
292
-
293
242
  const token = encodeURIComponent(user._perishable_token);
294
243
  const username = encodeURIComponent(user.username);
295
244
  const link = buildEmailLink(this.config.requestResetPasswordURL, username, token, this.config);
@@ -298,16 +247,13 @@ class UserController extends _AdaptableController.default {
298
247
  link: link,
299
248
  user: (0, _triggers.inflate)('_User', user)
300
249
  };
301
-
302
250
  if (this.adapter.sendPasswordResetEmail) {
303
251
  this.adapter.sendPasswordResetEmail(options);
304
252
  } else {
305
253
  this.adapter.sendMail(this.defaultResetPasswordEmail(options));
306
254
  }
307
-
308
255
  return Promise.resolve(user);
309
256
  }
310
-
311
257
  updatePassword(username, token, password) {
312
258
  return this.checkResetTokenValidity(username, token).then(user => updateUserPassword(user, password, this.config)).then(user => {
313
259
  const accountLockoutPolicy = new _AccountLockout.default(user, this.config);
@@ -321,7 +267,6 @@ class UserController extends _AdaptableController.default {
321
267
  }
322
268
  });
323
269
  }
324
-
325
270
  defaultVerificationEmail({
326
271
  link,
327
272
  user,
@@ -336,7 +281,6 @@ class UserController extends _AdaptableController.default {
336
281
  subject
337
282
  };
338
283
  }
339
-
340
284
  defaultResetPasswordEmail({
341
285
  link,
342
286
  user,
@@ -351,12 +295,10 @@ class UserController extends _AdaptableController.default {
351
295
  subject
352
296
  };
353
297
  }
298
+ }
354
299
 
355
- } // Mark this private
356
-
357
-
300
+ // Mark this private
358
301
  exports.UserController = UserController;
359
-
360
302
  function updateUserPassword(user, password, config) {
361
303
  return _rest.default.update(config, Auth.master(config), '_User', {
362
304
  objectId: user.objectId
@@ -364,10 +306,8 @@ function updateUserPassword(user, password, config) {
364
306
  password: password
365
307
  }).then(() => user);
366
308
  }
367
-
368
309
  function buildEmailLink(destination, username, token, config) {
369
310
  const usernameAndToken = `token=${token}&username=${username}`;
370
-
371
311
  if (config.parseFrameURL) {
372
312
  const destinationWithoutHost = destination.replace(config.publicServerURL, '');
373
313
  return `${config.parseFrameURL}?link=${encodeURIComponent(destinationWithoutHost)}&${usernameAndToken}`;
@@ -375,7 +315,6 @@ function buildEmailLink(destination, username, token, config) {
375
315
  return `${destination}?${usernameAndToken}`;
376
316
  }
377
317
  }
378
-
379
318
  var _default = UserController;
380
319
  exports.default = _default;
381
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9Vc2VyQ29udHJvbGxlci5qcyJdLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwic2VuZE1haWwiLCJkZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwiLCJyZWdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbiIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXNlbmRWZXJpZmljYXRpb25FbWFpbCIsImFVc2VyIiwic2V0UGFzc3dvcmRSZXNldFRva2VuIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCIkb3IiLCIkZXhpc3RzIiwic2VuZFBhc3N3b3JkUmVzZXRFbWFpbCIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJyZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCIsImRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwiLCJ1cGRhdGVQYXNzd29yZCIsInBhc3N3b3JkIiwidXBkYXRlVXNlclBhc3N3b3JkIiwiYWNjb3VudExvY2tvdXRQb2xpY3kiLCJBY2NvdW50TG9ja291dCIsInVubG9ja0FjY291bnQiLCJjYXRjaCIsImVycm9yIiwibWVzc2FnZSIsInJlamVjdCIsInRleHQiLCJ0byIsInN1YmplY3QiLCJkZXN0aW5hdGlvbiIsInVzZXJuYW1lQW5kVG9rZW4iLCJwYXJzZUZyYW1lVVJMIiwiZGVzdGluYXRpb25XaXRob3V0SG9zdCIsInJlcGxhY2UiLCJwdWJsaWNTZXJ2ZXJVUkwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQUQsQ0FBdkI7O0FBQ0EsSUFBSUMsSUFBSSxHQUFHRCxPQUFPLENBQUMsU0FBRCxDQUFsQjs7QUFFTyxNQUFNRSxjQUFOLFNBQTZCQyw0QkFBN0Is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RUFLSDtBQUFFb0MsSUFBQUEsUUFBUSxFQUFFM0IsSUFBSSxDQUFDMkI7QUFBakIsR0FMRyxFQU1IO0FBQ0VzQyxJQUFBQSxRQUFRLEVBQUVBO0FBRFosR0FORyxFQVVKNUMsSUFWSSxDQVVDLE1BQU1yQixJQVZQLENBQVA7QUFXRDs7QUFFRCxTQUFTK0MsY0FBVCxDQUF3QjhCLFdBQXhCLEVBQXFDcEUsUUFBckMsRUFBK0NDLEtBQS9DLEVBQXNEbkIsTUFBdEQsRUFBOEQ7QUFDNUQsUUFBTXVGLGdCQUFnQixHQUFJLFNBQVFwRSxLQUFNLGFBQVlELFFBQVMsRUFBN0Q7O0FBRUEsTUFBSWxCLE1BQU0sQ0FBQ3dGLGFBQVgsRUFBMEI7QUFDeEIsVUFBTUMsc0JBQXNCLEdBQUdILFdBQVcsQ0FBQ0ksT0FBWixDQUFvQjFGLE1BQU0sQ0FBQzJGLGVBQTNCLEVBQTRDLEVBQTVDLENBQS9CO0FBRUEsV0FBUSxHQUFFM0YsTUFBTSxDQUFDd0YsYUFBYyxTQUFRbEMsa0JBQWtCLENBQ3ZEbUMsc0JBRHVELENBRXZELElBQUdGLGdCQUFpQixFQUZ0QjtBQUdELEdBTkQsTUFNTztBQUNMLFdBQVEsR0FBRUQsV0FBWSxJQUFHQyxnQkFBaUIsRUFBMUM7QUFDRDtBQUNGOztlQUVjN0YsYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl19
320
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXN0UXVlcnkiLCJyZXF1aXJlIiwiQXV0aCIsIlVzZXJDb250cm9sbGVyIiwiQWRhcHRhYmxlQ29udHJvbGxlciIsImNvbnN0cnVjdG9yIiwiYWRhcHRlciIsImFwcElkIiwib3B0aW9ucyIsImNvbmZpZyIsIkNvbmZpZyIsImdldCIsInZhbGlkYXRlQWRhcHRlciIsInNob3VsZFZlcmlmeUVtYWlscyIsImV4cGVjdGVkQWRhcHRlclR5cGUiLCJNYWlsQWRhcHRlciIsInZlcmlmeVVzZXJFbWFpbHMiLCJzZXRFbWFpbFZlcmlmeVRva2VuIiwidXNlciIsIl9lbWFpbF92ZXJpZnlfdG9rZW4iLCJyYW5kb21TdHJpbmciLCJlbWFpbFZlcmlmaWVkIiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQiLCJQYXJzZSIsIl9lbmNvZGUiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJ2ZXJpZnlFbWFpbCIsInVzZXJuYW1lIiwidG9rZW4iLCJ1bmRlZmluZWQiLCJxdWVyeSIsInVwZGF0ZUZpZWxkcyIsIl9fb3AiLCIkZ3QiLCJEYXRlIiwibWFzdGVyQXV0aCIsIm1hc3RlciIsImZpbmRVc2VyRm9yRW1haWxWZXJpZmljYXRpb24iLCJleGVjdXRlIiwidGhlbiIsInJlc3VsdCIsInJlc3VsdHMiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsIm9iamVjdElkIiwicmVzdCIsInVwZGF0ZSIsImNoZWNrUmVzZXRUb2tlblZhbGlkaXR5IiwiZGF0YWJhc2UiLCJmaW5kIiwiX3BlcmlzaGFibGVfdG9rZW4iLCJsaW1pdCIsInBhc3N3b3JkUG9saWN5IiwicmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJleHBpcmVzRGF0ZSIsIl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQiLCJfX3R5cGUiLCJpc28iLCJnZXRVc2VySWZOZWVkZWQiLCJlbWFpbCIsIndoZXJlIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwibGluayIsImJ1aWxkRW1haWxMaW5rIiwidmVyaWZ5RW1haWxVUkwiLCJhcHBOYW1lIiwiaW5mbGF0ZSIsInNlbmRNYWlsIiwiZGVmYXVsdFZlcmlmaWNhdGlvbkVtYWlsIiwicmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4iLCJlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIiwicmVzZW5kVmVyaWZpY2F0aW9uRW1haWwiLCJhVXNlciIsInNldFBhc3N3b3JkUmVzZXRUb2tlbiIsImdlbmVyYXRlUGFzc3dvcmRSZXNldFRva2VuRXhwaXJlc0F0IiwiJG9yIiwiJGV4aXN0cyIsInNlbmRQYXNzd29yZFJlc2V0RW1haWwiLCJyZXNldFRva2VuUmV1c2VJZlZhbGlkIiwicmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwiLCJkZWZhdWx0UmVzZXRQYXNzd29yZEVtYWlsIiwidXBkYXRlUGFzc3dvcmQiLCJwYXNzd29yZCIsInVwZGF0ZVVzZXJQYXNzd29yZCIsImFjY291bnRMb2Nrb3V0UG9saWN5IiwiQWNjb3VudExvY2tvdXQiLCJ1bmxvY2tBY2NvdW50IiwiY2F0Y2giLCJlcnJvciIsIm1lc3NhZ2UiLCJyZWplY3QiLCJ0ZXh0IiwidG8iLCJzdWJqZWN0IiwiZGVzdGluYXRpb24iLCJ1c2VybmFtZUFuZFRva2VuIiwicGFyc2VGcmFtZVVSTCIsImRlc3RpbmF0aW9uV2l0aG91dEhvc3QiLCJyZXBsYWNlIiwicHVibGljU2VydmVyVVJMIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL1VzZXJDb250cm9sbGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJhbmRvbVN0cmluZyB9IGZyb20gJy4uL2NyeXB0b1V0aWxzJztcbmltcG9ydCB7IGluZmxhdGUgfSBmcm9tICcuLi90cmlnZ2Vycyc7XG5pbXBvcnQgQWRhcHRhYmxlQ29udHJvbGxlciBmcm9tICcuL0FkYXB0YWJsZUNvbnRyb2xsZXInO1xuaW1wb3J0IE1haWxBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL0VtYWlsL01haWxBZGFwdGVyJztcbmltcG9ydCByZXN0IGZyb20gJy4uL3Jlc3QnO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuaW1wb3J0IEFjY291bnRMb2Nrb3V0IGZyb20gJy4uL0FjY291bnRMb2Nrb3V0JztcbmltcG9ydCBDb25maWcgZnJvbSAnLi4vQ29uZmlnJztcblxudmFyIFJlc3RRdWVyeSA9IHJlcXVpcmUoJy4uL1Jlc3RRdWVyeScpO1xudmFyIEF1dGggPSByZXF1aXJlKCcuLi9BdXRoJyk7XG5cbmV4cG9ydCBjbGFzcyBVc2VyQ29udHJvbGxlciBleHRlbmRzIEFkYXB0YWJsZUNvbnRyb2xsZXIge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyLCBhcHBJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgYXBwSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gQ29uZmlnLmdldCh0aGlzLmFwcElkKTtcbiAgfVxuXG4gIHZhbGlkYXRlQWRhcHRlcihhZGFwdGVyKSB7XG4gICAgLy8gQWxsb3cgbm8gYWRhcHRlclxuICAgIGlmICghYWRhcHRlciAmJiAhdGhpcy5zaG91bGRWZXJpZnlFbWFpbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVBZGFwdGVyKGFkYXB0ZXIpO1xuICB9XG5cbiAgZXhwZWN0ZWRBZGFwdGVyVHlwZSgpIHtcbiAgICByZXR1cm4gTWFpbEFkYXB0ZXI7XG4gIH1cblxuICBnZXQgc2hvdWxkVmVyaWZ5RW1haWxzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmVyaWZ5VXNlckVtYWlscztcbiAgfVxuXG4gIHNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGlmICh0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuID0gcmFuZG9tU3RyaW5nKDI1KTtcbiAgICAgIHVzZXIuZW1haWxWZXJpZmllZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdXNlci5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSBQYXJzZS5fZW5jb2RlKFxuICAgICAgICAgIHRoaXMuY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5RW1haWwodXNlcm5hbWUsIHRva2VuKSB7XG4gICAgaWYgKCF0aGlzLnNob3VsZFZlcmlmeUVtYWlscykge1xuICAgICAgLy8gVHJ5aW5nIHRvIHZlcmlmeSBlbWFpbCB3aGVuIG5vdCBlbmFibGVkXG4gICAgICAvLyBUT0RPOiBCZXR0ZXIgZXJyb3IgaGVyZS5cbiAgICAgIHRocm93IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeSA9IHsgdXNlcm5hbWU6IHVzZXJuYW1lLCBfZW1haWxfdmVyaWZ5X3Rva2VuOiB0b2tlbiB9O1xuICAgIGNvbnN0IHVwZGF0ZUZpZWxkcyA9IHtcbiAgICAgIGVtYWlsVmVyaWZpZWQ6IHRydWUsXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuOiB7IF9fb3A6ICdEZWxldGUnIH0sXG4gICAgfTtcblxuICAgIC8vIGlmIHRoZSBlbWFpbCB2ZXJpZnkgdG9rZW4gbmVlZHMgdG8gYmUgdmFsaWRhdGVkIHRoZW5cbiAgICAvLyBhZGQgYWRkaXRpb25hbCBxdWVyeSBwYXJhbXMgYW5kIGFkZGl0aW9uYWwgZmllbGRzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkXG4gICAgaWYgKHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICBxdWVyeS5lbWFpbFZlcmlmaWVkID0gZmFsc2U7XG4gICAgICBxdWVyeS5fZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgPSB7ICRndDogUGFyc2UuX2VuY29kZShuZXcgRGF0ZSgpKSB9O1xuXG4gICAgICB1cGRhdGVGaWVsZHMuX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0ID0geyBfX29wOiAnRGVsZXRlJyB9O1xuICAgIH1cbiAgICBjb25zdCBtYXN0ZXJBdXRoID0gQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpO1xuICAgIHZhciBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uID0gbmV3IFJlc3RRdWVyeShcbiAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgQXV0aC5tYXN0ZXIodGhpcy5jb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgdXNlcm5hbWU6IHVzZXJuYW1lIH1cbiAgICApO1xuICAgIHJldHVybiBmaW5kVXNlckZvckVtYWlsVmVyaWZpY2F0aW9uLmV4ZWN1dGUoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICYmIHJlc3VsdC5yZXN1bHRzWzBdLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQucmVzdWx0cy5sZW5ndGhbMF0pO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQucmVzdWx0cy5sZW5ndGgpIHtcbiAgICAgICAgcXVlcnkub2JqZWN0SWQgPSByZXN1bHQucmVzdWx0c1swXS5vYmplY3RJZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN0LnVwZGF0ZSh0aGlzLmNvbmZpZywgbWFzdGVyQXV0aCwgJ19Vc2VyJywgcXVlcnksIHVwZGF0ZUZpZWxkcyk7XG4gICAgfSk7XG4gIH1cblxuICBjaGVja1Jlc2V0VG9rZW5WYWxpZGl0eSh1c2VybmFtZSwgdG9rZW4pIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2VcbiAgICAgIC5maW5kKFxuICAgICAgICAnX1VzZXInLFxuICAgICAgICB7XG4gICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgIF9wZXJpc2hhYmxlX3Rva2VuOiB0b2tlbixcbiAgICAgICAgfSxcbiAgICAgICAgeyBsaW1pdDogMSB9XG4gICAgICApXG4gICAgICAudGhlbihyZXN1bHRzID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgICB0aHJvdyAnRmFpbGVkIHRvIHJlc2V0IHBhc3N3b3JkOiB1c2VybmFtZSAvIGVtYWlsIC8gdG9rZW4gaXMgaW52YWxpZCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kgJiYgdGhpcy5jb25maWcucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgICBsZXQgZXhwaXJlc0RhdGUgPSByZXN1bHRzWzBdLl9wZXJpc2hhYmxlX3Rva2VuX2V4cGlyZXNfYXQ7XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICAgIGV4cGlyZXNEYXRlID0gbmV3IERhdGUoZXhwaXJlc0RhdGUuaXNvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGV4cGlyZXNEYXRlIDwgbmV3IERhdGUoKSkgdGhyb3cgJ1RoZSBwYXNzd29yZCByZXNldCBsaW5rIGhhcyBleHBpcmVkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0c1swXTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0VXNlcklmTmVlZGVkKHVzZXIpIHtcbiAgICBpZiAodXNlci51c2VybmFtZSAmJiB1c2VyLmVtYWlsKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVzZXIpO1xuICAgIH1cbiAgICB2YXIgd2hlcmUgPSB7fTtcbiAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgd2hlcmUudXNlcm5hbWUgPSB1c2VyLnVzZXJuYW1lO1xuICAgIH1cbiAgICBpZiAodXNlci5lbWFpbCkge1xuICAgICAgd2hlcmUuZW1haWwgPSB1c2VyLmVtYWlsO1xuICAgIH1cblxuICAgIHZhciBxdWVyeSA9IG5ldyBSZXN0UXVlcnkodGhpcy5jb25maWcsIEF1dGgubWFzdGVyKHRoaXMuY29uZmlnKSwgJ19Vc2VyJywgd2hlcmUpO1xuICAgIHJldHVybiBxdWVyeS5leGVjdXRlKCkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICBpZiAocmVzdWx0LnJlc3VsdHMubGVuZ3RoICE9IDEpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHRzWzBdO1xuICAgIH0pO1xuICB9XG5cbiAgc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHVzZXIpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkVmVyaWZ5RW1haWxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIuX2VtYWlsX3ZlcmlmeV90b2tlbik7XG4gICAgLy8gV2UgbWF5IG5lZWQgdG8gZmV0Y2ggdGhlIHVzZXIgaW4gY2FzZSBvZiB1cGRhdGUgZW1haWxcbiAgICB0aGlzLmdldFVzZXJJZk5lZWRlZCh1c2VyKS50aGVuKHVzZXIgPT4ge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICAgIGNvbnN0IGxpbmsgPSBidWlsZEVtYWlsTGluayh0aGlzLmNvbmZpZy52ZXJpZnlFbWFpbFVSTCwgdXNlcm5hbWUsIHRva2VuLCB0aGlzLmNvbmZpZyk7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICB1c2VyOiBpbmZsYXRlKCdfVXNlcicsIHVzZXIpLFxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKSB7XG4gICAgICAgIHRoaXMuYWRhcHRlci5zZW5kVmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFkYXB0ZXIuc2VuZE1haWwodGhpcy5kZWZhdWx0VmVyaWZpY2F0aW9uRW1haWwob3B0aW9ucykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2VuZXJhdGVzIHRoZSBnaXZlbiB1c2VyJ3MgZW1haWwgdmVyaWZpY2F0aW9uIHRva2VuXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgcmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4odXNlcikge1xuICAgIGNvbnN0IHsgX2VtYWlsX3ZlcmlmeV90b2tlbiB9ID0gdXNlcjtcbiAgICBsZXQgeyBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQgfSA9IHVzZXI7XG4gICAgaWYgKF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCAmJiBfZW1haWxfdmVyaWZ5X3Rva2VuX2V4cGlyZXNfYXQuX190eXBlID09PSAnRGF0ZScpIHtcbiAgICAgIF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdCA9IF9lbWFpbF92ZXJpZnlfdG9rZW5fZXhwaXJlc19hdC5pc287XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiZcbiAgICAgIHRoaXMuY29uZmlnLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICYmXG4gICAgICBfZW1haWxfdmVyaWZ5X3Rva2VuICYmXG4gICAgICBuZXcgRGF0ZSgpIDwgbmV3IERhdGUoX2VtYWlsX3ZlcmlmeV90b2tlbl9leHBpcmVzX2F0KVxuICAgICkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICB0aGlzLnNldEVtYWlsVmVyaWZ5VG9rZW4odXNlcik7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmRhdGFiYXNlLnVwZGF0ZSgnX1VzZXInLCB7IHVzZXJuYW1lOiB1c2VyLnVzZXJuYW1lIH0sIHVzZXIpO1xuICB9XG5cbiAgcmVzZW5kVmVyaWZpY2F0aW9uRW1haWwodXNlcm5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVc2VySWZOZWVkZWQoeyB1c2VybmFtZTogdXNlcm5hbWUgfSkudGhlbihhVXNlciA9PiB7XG4gICAgICBpZiAoIWFVc2VyIHx8IGFVc2VyLmVtYWlsVmVyaWZpZWQpIHtcbiAgICAgICAgdGhyb3cgdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucmVnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW4oYVVzZXIpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnNlbmRWZXJpZmljYXRpb25FbWFpbChhVXNlcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhc3N3b3JkUmVzZXRUb2tlbihlbWFpbCkge1xuICAgIGNvbnN0IHRva2VuID0geyBfcGVyaXNoYWJsZV90b2tlbjogcmFuZG9tU3RyaW5nKDI1KSB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICB0b2tlbi5fcGVyaXNoYWJsZV90b2tlbl9leHBpcmVzX2F0ID0gUGFyc2UuX2VuY29kZShcbiAgICAgICAgdGhpcy5jb25maWcuZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb25maWcuZGF0YWJhc2UudXBkYXRlKFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgJG9yOiBbeyBlbWFpbCB9LCB7IHVzZXJuYW1lOiBlbWFpbCwgZW1haWw6IHsgJGV4aXN0czogZmFsc2UgfSB9XSB9LFxuICAgICAgdG9rZW4sXG4gICAgICB7fSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChlbWFpbCkge1xuICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnVHJ5aW5nIHRvIHNlbmQgYSByZXNldCBwYXNzd29yZCBidXQgbm8gYWRhcHRlciBpcyBzZXQnO1xuICAgICAgLy8gIFRPRE86IE5vIGFkYXB0ZXI/XG4gICAgfVxuICAgIGxldCB1c2VyO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnBhc3N3b3JkUG9saWN5ICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICB0aGlzLmNvbmZpZy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvblxuICAgICkge1xuICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY29uZmlnLmRhdGFiYXNlLmZpbmQoXG4gICAgICAgICdfVXNlcicsXG4gICAgICAgIHtcbiAgICAgICAgICAkb3I6IFtcbiAgICAgICAgICAgIHsgZW1haWwsIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgICAgeyB1c2VybmFtZTogZW1haWwsIGVtYWlsOiB7ICRleGlzdHM6IGZhbHNlIH0sIF9wZXJpc2hhYmxlX3Rva2VuOiB7ICRleGlzdHM6IHRydWUgfSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbGltaXQ6IDEgfVxuICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIGxldCBleHBpcmVzRGF0ZSA9IHJlc3VsdHNbMF0uX3BlcmlzaGFibGVfdG9rZW5fZXhwaXJlc19hdDtcbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlICYmIGV4cGlyZXNEYXRlLl9fdHlwZSA9PSAnRGF0ZScpIHtcbiAgICAgICAgICBleHBpcmVzRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXNEYXRlLmlzbyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGlyZXNEYXRlID4gbmV3IERhdGUoKSkge1xuICAgICAgICAgIHVzZXIgPSByZXN1bHRzWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdXNlciB8fCAhdXNlci5fcGVyaXNoYWJsZV90b2tlbikge1xuICAgICAgdXNlciA9IGF3YWl0IHRoaXMuc2V0UGFzc3dvcmRSZXNldFRva2VuKGVtYWlsKTtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBlbmNvZGVVUklDb21wb25lbnQodXNlci5fcGVyaXNoYWJsZV90b2tlbik7XG4gICAgY29uc3QgdXNlcm5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSk7XG5cbiAgICBjb25zdCBsaW5rID0gYnVpbGRFbWFpbExpbmsodGhpcy5jb25maWcucmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwsIHVzZXJuYW1lLCB0b2tlbiwgdGhpcy5jb25maWcpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhcHBOYW1lOiB0aGlzLmNvbmZpZy5hcHBOYW1lLFxuICAgICAgbGluazogbGluayxcbiAgICAgIHVzZXI6IGluZmxhdGUoJ19Vc2VyJywgdXNlciksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFkYXB0ZXIuc2VuZFBhc3N3b3JkUmVzZXRFbWFpbCkge1xuICAgICAgdGhpcy5hZGFwdGVyLnNlbmRQYXNzd29yZFJlc2V0RW1haWwob3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRhcHRlci5zZW5kTWFpbCh0aGlzLmRlZmF1bHRSZXNldFBhc3N3b3JkRW1haWwob3B0aW9ucykpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodXNlcik7XG4gIH1cblxuICB1cGRhdGVQYXNzd29yZCh1c2VybmFtZSwgdG9rZW4sIHBhc3N3b3JkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tSZXNldFRva2VuVmFsaWRpdHkodXNlcm5hbWUsIHRva2VuKVxuICAgICAgLnRoZW4odXNlciA9PiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIHRoaXMuY29uZmlnKSlcbiAgICAgIC50aGVuKHVzZXIgPT4ge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9ja291dFBvbGljeSA9IG5ldyBBY2NvdW50TG9ja291dCh1c2VyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBhY2NvdW50TG9ja291dFBvbGljeS51bmxvY2tBY2NvdW50KCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAvLyBpbiBjYXNlIG9mIFBhcnNlLkVycm9yLCBmYWlsIHdpdGggdGhlIGVycm9yIG1lc3NhZ2Ugb25seVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGRlZmF1bHRWZXJpZmljYXRpb25FbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSBhcmUgYmVpbmcgYXNrZWQgdG8gY29uZmlybSB0aGUgZS1tYWlsIGFkZHJlc3MgJyArXG4gICAgICB1c2VyLmdldCgnZW1haWwnKSArXG4gICAgICAnIHdpdGggJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICdcXG5cXG4nICtcbiAgICAgICcnICtcbiAgICAgICdDbGljayBoZXJlIHRvIGNvbmZpcm0gaXQ6XFxuJyArXG4gICAgICBsaW5rO1xuICAgIGNvbnN0IHRvID0gdXNlci5nZXQoJ2VtYWlsJyk7XG4gICAgY29uc3Qgc3ViamVjdCA9ICdQbGVhc2UgdmVyaWZ5IHlvdXIgZS1tYWlsIGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG5cbiAgZGVmYXVsdFJlc2V0UGFzc3dvcmRFbWFpbCh7IGxpbmssIHVzZXIsIGFwcE5hbWUgfSkge1xuICAgIGNvbnN0IHRleHQgPVxuICAgICAgJ0hpLFxcblxcbicgK1xuICAgICAgJ1lvdSByZXF1ZXN0ZWQgdG8gcmVzZXQgeW91ciBwYXNzd29yZCBmb3IgJyArXG4gICAgICBhcHBOYW1lICtcbiAgICAgICh1c2VyLmdldCgndXNlcm5hbWUnKSA/IFwiICh5b3VyIHVzZXJuYW1lIGlzICdcIiArIHVzZXIuZ2V0KCd1c2VybmFtZScpICsgXCInKVwiIDogJycpICtcbiAgICAgICcuXFxuXFxuJyArXG4gICAgICAnJyArXG4gICAgICAnQ2xpY2sgaGVyZSB0byByZXNldCBpdDpcXG4nICtcbiAgICAgIGxpbms7XG4gICAgY29uc3QgdG8gPSB1c2VyLmdldCgnZW1haWwnKSB8fCB1c2VyLmdldCgndXNlcm5hbWUnKTtcbiAgICBjb25zdCBzdWJqZWN0ID0gJ1Bhc3N3b3JkIFJlc2V0IGZvciAnICsgYXBwTmFtZTtcbiAgICByZXR1cm4geyB0ZXh0LCB0bywgc3ViamVjdCB9O1xuICB9XG59XG5cbi8vIE1hcmsgdGhpcyBwcml2YXRlXG5mdW5jdGlvbiB1cGRhdGVVc2VyUGFzc3dvcmQodXNlciwgcGFzc3dvcmQsIGNvbmZpZykge1xuICByZXR1cm4gcmVzdFxuICAgIC51cGRhdGUoXG4gICAgICBjb25maWcsXG4gICAgICBBdXRoLm1hc3Rlcihjb25maWcpLFxuICAgICAgJ19Vc2VyJyxcbiAgICAgIHsgb2JqZWN0SWQ6IHVzZXIub2JqZWN0SWQgfSxcbiAgICAgIHtcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB1c2VyKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRFbWFpbExpbmsoZGVzdGluYXRpb24sIHVzZXJuYW1lLCB0b2tlbiwgY29uZmlnKSB7XG4gIGNvbnN0IHVzZXJuYW1lQW5kVG9rZW4gPSBgdG9rZW49JHt0b2tlbn0mdXNlcm5hbWU9JHt1c2VybmFtZX1gO1xuXG4gIGlmIChjb25maWcucGFyc2VGcmFtZVVSTCkge1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uV2l0aG91dEhvc3QgPSBkZXN0aW5hdGlvbi5yZXBsYWNlKGNvbmZpZy5wdWJsaWNTZXJ2ZXJVUkwsICcnKTtcblxuICAgIHJldHVybiBgJHtjb25maWcucGFyc2VGcmFtZVVSTH0/bGluaz0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgIGRlc3RpbmF0aW9uV2l0aG91dEhvc3RcbiAgICApfSYke3VzZXJuYW1lQW5kVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7ZGVzdGluYXRpb259PyR7dXNlcm5hbWVBbmRUb2tlbn1gO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJDb250cm9sbGVyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQStCO0FBRS9CLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUN2QyxJQUFJQyxJQUFJLEdBQUdELE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFFdEIsTUFBTUUsY0FBYyxTQUFTQyw0QkFBbUIsQ0FBQztFQUN0REMsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFO0lBQ3hDLEtBQUssQ0FBQ0YsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLE9BQU8sQ0FBQztFQUNoQztFQUVBLElBQUlDLE1BQU0sR0FBRztJQUNYLE9BQU9DLGVBQU0sQ0FBQ0MsR0FBRyxDQUFDLElBQUksQ0FBQ0osS0FBSyxDQUFDO0VBQy9CO0VBRUFLLGVBQWUsQ0FBQ04sT0FBTyxFQUFFO0lBQ3ZCO0lB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