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
package/lib/Config.js CHANGED
@@ -4,42 +4,32 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = exports.Config = void 0;
7
-
7
+ var _lodash = require("lodash");
8
+ var _net = _interopRequireDefault(require("net"));
8
9
  var _cache = _interopRequireDefault(require("./cache"));
9
-
10
10
  var _DatabaseController = _interopRequireDefault(require("./Controllers/DatabaseController"));
11
-
12
- var _net = _interopRequireDefault(require("net"));
13
-
11
+ var _LoggerController = require("./Controllers/LoggerController");
14
12
  var _Definitions = require("./Options/Definitions");
15
-
16
- var _lodash = require("lodash");
17
-
18
13
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
14
  // A Config object provides information about how a specific app is
21
15
  // configured.
22
16
  // mount is the URL for the root of the API; includes http, domain, etc.
17
+
23
18
  function removeTrailingSlash(str) {
24
19
  if (!str) {
25
20
  return str;
26
21
  }
27
-
28
22
  if (str.endsWith('/')) {
29
23
  str = str.substr(0, str.length - 1);
30
24
  }
31
-
32
25
  return str;
33
26
  }
34
-
35
27
  class Config {
36
28
  static get(applicationId, mount) {
37
29
  const cacheInfo = _cache.default.get(applicationId);
38
-
39
30
  if (!cacheInfo) {
40
31
  return;
41
32
  }
42
-
43
33
  const config = new Config();
44
34
  config.applicationId = applicationId;
45
35
  Object.keys(cacheInfo).forEach(key => {
@@ -54,16 +44,12 @@ class Config {
54
44
  config.generateEmailVerifyTokenExpiresAt = config.generateEmailVerifyTokenExpiresAt.bind(config);
55
45
  return config;
56
46
  }
57
-
58
47
  static put(serverConfiguration) {
59
48
  Config.validate(serverConfiguration);
60
-
61
49
  _cache.default.put(serverConfiguration.appId, serverConfiguration);
62
-
63
50
  Config.setupPasswordValidator(serverConfiguration.passwordPolicy);
64
51
  return serverConfiguration;
65
52
  }
66
-
67
53
  static validate({
68
54
  verifyUserEmails,
69
55
  userController,
@@ -89,14 +75,14 @@ class Config {
89
75
  enforcePrivateUsers,
90
76
  schema,
91
77
  requestKeywordDenylist,
92
- allowExpiredAuthDataToken
78
+ allowExpiredAuthDataToken,
79
+ logLevels,
80
+ rateLimit
93
81
  }) {
94
82
  if (masterKey === readOnlyMasterKey) {
95
83
  throw new Error('masterKey and readOnlyMasterKey should be different');
96
84
  }
97
-
98
85
  const emailAdapter = userController.adapter;
99
-
100
86
  if (verifyUserEmails) {
101
87
  this.validateEmailConfiguration({
102
88
  emailAdapter,
@@ -106,21 +92,17 @@ class Config {
106
92
  emailVerifyTokenReuseIfValid
107
93
  });
108
94
  }
109
-
110
95
  this.validateAccountLockoutPolicy(accountLockout);
111
96
  this.validatePasswordPolicy(passwordPolicy);
112
97
  this.validateFileUploadOptions(fileUpload);
113
-
114
98
  if (typeof revokeSessionOnPasswordReset !== 'boolean') {
115
99
  throw 'revokeSessionOnPasswordReset must be a boolean value';
116
100
  }
117
-
118
101
  if (publicServerURL) {
119
102
  if (!publicServerURL.startsWith('http://') && !publicServerURL.startsWith('https://')) {
120
103
  throw 'publicServerURL should be a valid HTTPS URL starting with https://';
121
104
  }
122
105
  }
123
-
124
106
  this.validateSessionConfiguration(sessionLength, expireInactiveSessions);
125
107
  this.validateMasterKeyIps(masterKeyIps);
126
108
  this.validateDefaultLimit(defaultLimit);
@@ -133,8 +115,9 @@ class Config {
133
115
  this.validateEnforcePrivateUsers(enforcePrivateUsers);
134
116
  this.validateAllowExpiredAuthDataToken(allowExpiredAuthDataToken);
135
117
  this.validateRequestKeywordDenylist(requestKeywordDenylist);
118
+ this.validateRateLimit(rateLimit);
119
+ this.validateLogLevels(logLevels);
136
120
  }
137
-
138
121
  static validateRequestKeywordDenylist(requestKeywordDenylist) {
139
122
  if (requestKeywordDenylist === undefined) {
140
123
  requestKeywordDenylist = requestKeywordDenylist.default;
@@ -142,158 +125,131 @@ class Config {
142
125
  throw 'Parse Server option requestKeywordDenylist must be an array.';
143
126
  }
144
127
  }
145
-
146
128
  static validateEnforcePrivateUsers(enforcePrivateUsers) {
147
129
  if (typeof enforcePrivateUsers !== 'boolean') {
148
130
  throw 'Parse Server option enforcePrivateUsers must be a boolean.';
149
131
  }
150
132
  }
151
-
152
133
  static validateAllowExpiredAuthDataToken(allowExpiredAuthDataToken) {
153
134
  if (typeof allowExpiredAuthDataToken !== 'boolean') {
154
135
  throw 'Parse Server option allowExpiredAuthDataToken must be a boolean.';
155
136
  }
156
137
  }
157
-
158
138
  static validateSecurityOptions(security) {
159
139
  if (Object.prototype.toString.call(security) !== '[object Object]') {
160
140
  throw 'Parse Server option security must be an object.';
161
141
  }
162
-
163
142
  if (security.enableCheck === undefined) {
164
143
  security.enableCheck = _Definitions.SecurityOptions.enableCheck.default;
165
144
  } else if (!(0, _lodash.isBoolean)(security.enableCheck)) {
166
145
  throw 'Parse Server option security.enableCheck must be a boolean.';
167
146
  }
168
-
169
147
  if (security.enableCheckLog === undefined) {
170
148
  security.enableCheckLog = _Definitions.SecurityOptions.enableCheckLog.default;
171
149
  } else if (!(0, _lodash.isBoolean)(security.enableCheckLog)) {
172
150
  throw 'Parse Server option security.enableCheckLog must be a boolean.';
173
151
  }
174
152
  }
175
-
176
153
  static validateSchemaOptions(schema) {
177
154
  if (!schema) return;
178
-
179
155
  if (Object.prototype.toString.call(schema) !== '[object Object]') {
180
156
  throw 'Parse Server option schema must be an object.';
181
157
  }
182
-
183
158
  if (schema.definitions === undefined) {
184
159
  schema.definitions = _Definitions.SchemaOptions.definitions.default;
185
160
  } else if (!Array.isArray(schema.definitions)) {
186
161
  throw 'Parse Server option schema.definitions must be an array.';
187
162
  }
188
-
189
163
  if (schema.strict === undefined) {
190
164
  schema.strict = _Definitions.SchemaOptions.strict.default;
191
165
  } else if (!(0, _lodash.isBoolean)(schema.strict)) {
192
166
  throw 'Parse Server option schema.strict must be a boolean.';
193
167
  }
194
-
195
168
  if (schema.deleteExtraFields === undefined) {
196
169
  schema.deleteExtraFields = _Definitions.SchemaOptions.deleteExtraFields.default;
197
170
  } else if (!(0, _lodash.isBoolean)(schema.deleteExtraFields)) {
198
171
  throw 'Parse Server option schema.deleteExtraFields must be a boolean.';
199
172
  }
200
-
201
173
  if (schema.recreateModifiedFields === undefined) {
202
174
  schema.recreateModifiedFields = _Definitions.SchemaOptions.recreateModifiedFields.default;
203
175
  } else if (!(0, _lodash.isBoolean)(schema.recreateModifiedFields)) {
204
176
  throw 'Parse Server option schema.recreateModifiedFields must be a boolean.';
205
177
  }
206
-
207
178
  if (schema.lockSchemas === undefined) {
208
179
  schema.lockSchemas = _Definitions.SchemaOptions.lockSchemas.default;
209
180
  } else if (!(0, _lodash.isBoolean)(schema.lockSchemas)) {
210
181
  throw 'Parse Server option schema.lockSchemas must be a boolean.';
211
182
  }
212
-
213
183
  if (schema.beforeMigration === undefined) {
214
184
  schema.beforeMigration = null;
215
185
  } else if (schema.beforeMigration !== null && typeof schema.beforeMigration !== 'function') {
216
186
  throw 'Parse Server option schema.beforeMigration must be a function.';
217
187
  }
218
-
219
188
  if (schema.afterMigration === undefined) {
220
189
  schema.afterMigration = null;
221
190
  } else if (schema.afterMigration !== null && typeof schema.afterMigration !== 'function') {
222
191
  throw 'Parse Server option schema.afterMigration must be a function.';
223
192
  }
224
193
  }
225
-
226
194
  static validatePagesOptions(pages) {
227
195
  if (Object.prototype.toString.call(pages) !== '[object Object]') {
228
196
  throw 'Parse Server option pages must be an object.';
229
197
  }
230
-
231
198
  if (pages.enableRouter === undefined) {
232
199
  pages.enableRouter = _Definitions.PagesOptions.enableRouter.default;
233
200
  } else if (!(0, _lodash.isBoolean)(pages.enableRouter)) {
234
201
  throw 'Parse Server option pages.enableRouter must be a boolean.';
235
202
  }
236
-
237
203
  if (pages.enableLocalization === undefined) {
238
204
  pages.enableLocalization = _Definitions.PagesOptions.enableLocalization.default;
239
205
  } else if (!(0, _lodash.isBoolean)(pages.enableLocalization)) {
240
206
  throw 'Parse Server option pages.enableLocalization must be a boolean.';
241
207
  }
242
-
243
208
  if (pages.localizationJsonPath === undefined) {
244
209
  pages.localizationJsonPath = _Definitions.PagesOptions.localizationJsonPath.default;
245
210
  } else if (!(0, _lodash.isString)(pages.localizationJsonPath)) {
246
211
  throw 'Parse Server option pages.localizationJsonPath must be a string.';
247
212
  }
248
-
249
213
  if (pages.localizationFallbackLocale === undefined) {
250
214
  pages.localizationFallbackLocale = _Definitions.PagesOptions.localizationFallbackLocale.default;
251
215
  } else if (!(0, _lodash.isString)(pages.localizationFallbackLocale)) {
252
216
  throw 'Parse Server option pages.localizationFallbackLocale must be a string.';
253
217
  }
254
-
255
218
  if (pages.placeholders === undefined) {
256
219
  pages.placeholders = _Definitions.PagesOptions.placeholders.default;
257
220
  } else if (Object.prototype.toString.call(pages.placeholders) !== '[object Object]' && typeof pages.placeholders !== 'function') {
258
221
  throw 'Parse Server option pages.placeholders must be an object or a function.';
259
222
  }
260
-
261
223
  if (pages.forceRedirect === undefined) {
262
224
  pages.forceRedirect = _Definitions.PagesOptions.forceRedirect.default;
263
225
  } else if (!(0, _lodash.isBoolean)(pages.forceRedirect)) {
264
226
  throw 'Parse Server option pages.forceRedirect must be a boolean.';
265
227
  }
266
-
267
228
  if (pages.pagesPath === undefined) {
268
229
  pages.pagesPath = _Definitions.PagesOptions.pagesPath.default;
269
230
  } else if (!(0, _lodash.isString)(pages.pagesPath)) {
270
231
  throw 'Parse Server option pages.pagesPath must be a string.';
271
232
  }
272
-
273
233
  if (pages.pagesEndpoint === undefined) {
274
234
  pages.pagesEndpoint = _Definitions.PagesOptions.pagesEndpoint.default;
275
235
  } else if (!(0, _lodash.isString)(pages.pagesEndpoint)) {
276
236
  throw 'Parse Server option pages.pagesEndpoint must be a string.';
277
237
  }
278
-
279
238
  if (pages.customUrls === undefined) {
280
239
  pages.customUrls = _Definitions.PagesOptions.customUrls.default;
281
240
  } else if (Object.prototype.toString.call(pages.customUrls) !== '[object Object]') {
282
241
  throw 'Parse Server option pages.customUrls must be an object.';
283
242
  }
284
-
285
243
  if (pages.customRoutes === undefined) {
286
244
  pages.customRoutes = _Definitions.PagesOptions.customRoutes.default;
287
245
  } else if (!(pages.customRoutes instanceof Array)) {
288
246
  throw 'Parse Server option pages.customRoutes must be an array.';
289
247
  }
290
248
  }
291
-
292
249
  static validateIdempotencyOptions(idempotencyOptions) {
293
250
  if (!idempotencyOptions) {
294
251
  return;
295
252
  }
296
-
297
253
  if (idempotencyOptions.ttl === undefined) {
298
254
  idempotencyOptions.ttl = _Definitions.IdempotencyOptions.ttl.default;
299
255
  } else if (!isNaN(idempotencyOptions.ttl) && idempotencyOptions.ttl <= 0) {
@@ -301,24 +257,20 @@ class Config {
301
257
  } else if (isNaN(idempotencyOptions.ttl)) {
302
258
  throw 'idempotency TTL value must be a number';
303
259
  }
304
-
305
260
  if (!idempotencyOptions.paths) {
306
261
  idempotencyOptions.paths = _Definitions.IdempotencyOptions.paths.default;
307
262
  } else if (!(idempotencyOptions.paths instanceof Array)) {
308
263
  throw 'idempotency paths must be of an array of strings';
309
264
  }
310
265
  }
311
-
312
266
  static validateAccountLockoutPolicy(accountLockout) {
313
267
  if (accountLockout) {
314
268
  if (typeof accountLockout.duration !== 'number' || accountLockout.duration <= 0 || accountLockout.duration > 99999) {
315
269
  throw 'Account lockout duration should be greater than 0 and less than 100000';
316
270
  }
317
-
318
271
  if (!Number.isInteger(accountLockout.threshold) || accountLockout.threshold < 1 || accountLockout.threshold > 999) {
319
272
  throw 'Account lockout threshold should be an integer greater than 0 and less than 1000';
320
273
  }
321
-
322
274
  if (accountLockout.unlockOnPasswordReset === undefined) {
323
275
  accountLockout.unlockOnPasswordReset = _Definitions.AccountLockoutOptions.unlockOnPasswordReset.default;
324
276
  } else if (!(0, _lodash.isBoolean)(accountLockout.unlockOnPasswordReset)) {
@@ -326,17 +278,14 @@ class Config {
326
278
  }
327
279
  }
328
280
  }
329
-
330
281
  static validatePasswordPolicy(passwordPolicy) {
331
282
  if (passwordPolicy) {
332
283
  if (passwordPolicy.maxPasswordAge !== undefined && (typeof passwordPolicy.maxPasswordAge !== 'number' || passwordPolicy.maxPasswordAge < 0)) {
333
284
  throw 'passwordPolicy.maxPasswordAge must be a positive number';
334
285
  }
335
-
336
286
  if (passwordPolicy.resetTokenValidityDuration !== undefined && (typeof passwordPolicy.resetTokenValidityDuration !== 'number' || passwordPolicy.resetTokenValidityDuration <= 0)) {
337
287
  throw 'passwordPolicy.resetTokenValidityDuration must be a positive number';
338
288
  }
339
-
340
289
  if (passwordPolicy.validatorPattern) {
341
290
  if (typeof passwordPolicy.validatorPattern === 'string') {
342
291
  passwordPolicy.validatorPattern = new RegExp(passwordPolicy.validatorPattern);
@@ -344,30 +293,25 @@ class Config {
344
293
  throw 'passwordPolicy.validatorPattern must be a regex string or RegExp object.';
345
294
  }
346
295
  }
347
-
348
296
  if (passwordPolicy.validatorCallback && typeof passwordPolicy.validatorCallback !== 'function') {
349
297
  throw 'passwordPolicy.validatorCallback must be a function.';
350
298
  }
351
-
352
299
  if (passwordPolicy.doNotAllowUsername && typeof passwordPolicy.doNotAllowUsername !== 'boolean') {
353
300
  throw 'passwordPolicy.doNotAllowUsername must be a boolean value.';
354
301
  }
355
-
356
302
  if (passwordPolicy.maxPasswordHistory && (!Number.isInteger(passwordPolicy.maxPasswordHistory) || passwordPolicy.maxPasswordHistory <= 0 || passwordPolicy.maxPasswordHistory > 20)) {
357
303
  throw 'passwordPolicy.maxPasswordHistory must be an integer ranging 0 - 20';
358
304
  }
359
-
360
305
  if (passwordPolicy.resetTokenReuseIfValid && typeof passwordPolicy.resetTokenReuseIfValid !== 'boolean') {
361
306
  throw 'resetTokenReuseIfValid must be a boolean value';
362
307
  }
363
-
364
308
  if (passwordPolicy.resetTokenReuseIfValid && !passwordPolicy.resetTokenValidityDuration) {
365
309
  throw 'You cannot use resetTokenReuseIfValid without resetTokenValidityDuration';
366
310
  }
367
311
  }
368
- } // if the passwordPolicy.validatorPattern is configured then setup a callback to process the pattern
369
-
312
+ }
370
313
 
314
+ // if the passwordPolicy.validatorPattern is configured then setup a callback to process the pattern
371
315
  static setupPasswordValidator(passwordPolicy) {
372
316
  if (passwordPolicy && passwordPolicy.validatorPattern) {
373
317
  passwordPolicy.patternValidator = value => {
@@ -375,7 +319,6 @@ class Config {
375
319
  };
376
320
  }
377
321
  }
378
-
379
322
  static validateEmailConfiguration({
380
323
  emailAdapter,
381
324
  appName,
@@ -386,15 +329,12 @@ class Config {
386
329
  if (!emailAdapter) {
387
330
  throw 'An emailAdapter is required for e-mail verification and password resets.';
388
331
  }
389
-
390
332
  if (typeof appName !== 'string') {
391
333
  throw 'An app name is required for e-mail verification and password resets.';
392
334
  }
393
-
394
335
  if (typeof publicServerURL !== 'string') {
395
336
  throw 'A public server url is required for e-mail verification and password resets.';
396
337
  }
397
-
398
338
  if (emailVerifyTokenValidityDuration) {
399
339
  if (isNaN(emailVerifyTokenValidityDuration)) {
400
340
  throw 'Email verify token validity duration must be a valid number.';
@@ -402,16 +342,13 @@ class Config {
402
342
  throw 'Email verify token validity duration must be a value greater than 0.';
403
343
  }
404
344
  }
405
-
406
345
  if (emailVerifyTokenReuseIfValid && typeof emailVerifyTokenReuseIfValid !== 'boolean') {
407
346
  throw 'emailVerifyTokenReuseIfValid must be a boolean value';
408
347
  }
409
-
410
348
  if (emailVerifyTokenReuseIfValid && !emailVerifyTokenValidityDuration) {
411
349
  throw 'You cannot use emailVerifyTokenReuseIfValid without emailVerifyTokenValidityDuration';
412
350
  }
413
351
  }
414
-
415
352
  static validateFileUploadOptions(fileUpload) {
416
353
  try {
417
354
  if (fileUpload == null || typeof fileUpload !== 'object' || fileUpload instanceof Array) {
@@ -421,51 +358,44 @@ class Config {
421
358
  if (e instanceof ReferenceError) {
422
359
  return;
423
360
  }
424
-
425
361
  throw e;
426
362
  }
427
-
428
363
  if (fileUpload.enableForAnonymousUser === undefined) {
429
364
  fileUpload.enableForAnonymousUser = _Definitions.FileUploadOptions.enableForAnonymousUser.default;
430
365
  } else if (typeof fileUpload.enableForAnonymousUser !== 'boolean') {
431
366
  throw 'fileUpload.enableForAnonymousUser must be a boolean value.';
432
367
  }
433
-
434
368
  if (fileUpload.enableForPublic === undefined) {
435
369
  fileUpload.enableForPublic = _Definitions.FileUploadOptions.enableForPublic.default;
436
370
  } else if (typeof fileUpload.enableForPublic !== 'boolean') {
437
371
  throw 'fileUpload.enableForPublic must be a boolean value.';
438
372
  }
439
-
440
373
  if (fileUpload.enableForAuthenticatedUser === undefined) {
441
374
  fileUpload.enableForAuthenticatedUser = _Definitions.FileUploadOptions.enableForAuthenticatedUser.default;
442
375
  } else if (typeof fileUpload.enableForAuthenticatedUser !== 'boolean') {
443
376
  throw 'fileUpload.enableForAuthenticatedUser must be a boolean value.';
444
377
  }
445
378
  }
446
-
447
379
  static validateMasterKeyIps(masterKeyIps) {
448
- for (const ip of masterKeyIps) {
380
+ for (let ip of masterKeyIps) {
381
+ if (ip.includes('/')) {
382
+ ip = ip.split('/')[0];
383
+ }
449
384
  if (!_net.default.isIP(ip)) {
450
- throw `Invalid ip in masterKeyIps: ${ip}`;
385
+ throw `The Parse Server option "masterKeyIps" contains an invalid IP address "${ip}".`;
451
386
  }
452
387
  }
453
388
  }
454
-
455
389
  get mount() {
456
390
  var mount = this._mount;
457
-
458
391
  if (this.publicServerURL) {
459
392
  mount = this.publicServerURL;
460
393
  }
461
-
462
394
  return mount;
463
395
  }
464
-
465
396
  set mount(newValue) {
466
397
  this._mount = newValue;
467
398
  }
468
-
469
399
  static validateSessionConfiguration(sessionLength, expireInactiveSessions) {
470
400
  if (expireInactiveSessions) {
471
401
  if (isNaN(sessionLength)) {
@@ -475,27 +405,22 @@ class Config {
475
405
  }
476
406
  }
477
407
  }
478
-
479
408
  static validateDefaultLimit(defaultLimit) {
480
409
  if (defaultLimit == null) {
481
410
  defaultLimit = _Definitions.ParseServerOptions.defaultLimit.default;
482
411
  }
483
-
484
412
  if (typeof defaultLimit !== 'number') {
485
413
  throw 'Default limit must be a number.';
486
414
  }
487
-
488
415
  if (defaultLimit <= 0) {
489
416
  throw 'Default limit must be a value greater than 0.';
490
417
  }
491
418
  }
492
-
493
419
  static validateMaxLimit(maxLimit) {
494
420
  if (maxLimit <= 0) {
495
421
  throw 'Max limit must be a value greater than 0.';
496
422
  }
497
423
  }
498
-
499
424
  static validateAllowHeaders(allowHeaders) {
500
425
  if (![null, undefined].includes(allowHeaders)) {
501
426
  if (Array.isArray(allowHeaders)) {
@@ -511,84 +436,115 @@ class Config {
511
436
  }
512
437
  }
513
438
  }
514
-
439
+ static validateLogLevels(logLevels) {
440
+ for (const key of Object.keys(_Definitions.LogLevels)) {
441
+ if (logLevels[key]) {
442
+ if (_LoggerController.logLevels.indexOf(logLevels[key]) === -1) {
443
+ throw `'${key}' must be one of ${JSON.stringify(_LoggerController.logLevels)}`;
444
+ }
445
+ } else {
446
+ logLevels[key] = _Definitions.LogLevels[key].default;
447
+ }
448
+ }
449
+ }
450
+ static validateRateLimit(rateLimit) {
451
+ if (!rateLimit) {
452
+ return;
453
+ }
454
+ if (Object.prototype.toString.call(rateLimit) !== '[object Object]' && !Array.isArray(rateLimit)) {
455
+ throw `rateLimit must be an array or object`;
456
+ }
457
+ const options = Array.isArray(rateLimit) ? rateLimit : [rateLimit];
458
+ for (const option of options) {
459
+ if (Object.prototype.toString.call(option) !== '[object Object]') {
460
+ throw `rateLimit must be an array of objects`;
461
+ }
462
+ if (option.requestPath == null) {
463
+ throw `rateLimit.requestPath must be defined`;
464
+ }
465
+ if (typeof option.requestPath !== 'string') {
466
+ throw `rateLimit.requestPath must be a string`;
467
+ }
468
+ if (option.requestTimeWindow == null) {
469
+ throw `rateLimit.requestTimeWindow must be defined`;
470
+ }
471
+ if (typeof option.requestTimeWindow !== 'number') {
472
+ throw `rateLimit.requestTimeWindow must be a number`;
473
+ }
474
+ if (option.includeInternalRequests && typeof option.includeInternalRequests !== 'boolean') {
475
+ throw `rateLimit.includeInternalRequests must be a boolean`;
476
+ }
477
+ if (option.requestCount == null) {
478
+ throw `rateLimit.requestCount must be defined`;
479
+ }
480
+ if (typeof option.requestCount !== 'number') {
481
+ throw `rateLimit.requestCount must be a number`;
482
+ }
483
+ if (option.errorResponseMessage && typeof option.errorResponseMessage !== 'string') {
484
+ throw `rateLimit.errorResponseMessage must be a string`;
485
+ }
486
+ }
487
+ }
515
488
  generateEmailVerifyTokenExpiresAt() {
516
489
  if (!this.verifyUserEmails || !this.emailVerifyTokenValidityDuration) {
517
490
  return undefined;
518
491
  }
519
-
520
492
  var now = new Date();
521
493
  return new Date(now.getTime() + this.emailVerifyTokenValidityDuration * 1000);
522
494
  }
523
-
524
495
  generatePasswordResetTokenExpiresAt() {
525
496
  if (!this.passwordPolicy || !this.passwordPolicy.resetTokenValidityDuration) {
526
497
  return undefined;
527
498
  }
528
-
529
499
  const now = new Date();
530
500
  return new Date(now.getTime() + this.passwordPolicy.resetTokenValidityDuration * 1000);
531
501
  }
532
-
533
502
  generateSessionExpiresAt() {
534
503
  if (!this.expireInactiveSessions) {
535
504
  return undefined;
536
505
  }
537
-
538
506
  var now = new Date();
539
507
  return new Date(now.getTime() + this.sessionLength * 1000);
540
508
  }
541
-
542
509
  get invalidLinkURL() {
543
510
  return this.customPages.invalidLink || `${this.publicServerURL}/apps/invalid_link.html`;
544
511
  }
545
-
546
512
  get invalidVerificationLinkURL() {
547
513
  return this.customPages.invalidVerificationLink || `${this.publicServerURL}/apps/invalid_verification_link.html`;
548
514
  }
549
-
550
515
  get linkSendSuccessURL() {
551
516
  return this.customPages.linkSendSuccess || `${this.publicServerURL}/apps/link_send_success.html`;
552
517
  }
553
-
554
518
  get linkSendFailURL() {
555
519
  return this.customPages.linkSendFail || `${this.publicServerURL}/apps/link_send_fail.html`;
556
520
  }
557
-
558
521
  get verifyEmailSuccessURL() {
559
522
  return this.customPages.verifyEmailSuccess || `${this.publicServerURL}/apps/verify_email_success.html`;
560
523
  }
561
-
562
524
  get choosePasswordURL() {
563
525
  return this.customPages.choosePassword || `${this.publicServerURL}/apps/choose_password`;
564
526
  }
565
-
566
527
  get requestResetPasswordURL() {
567
528
  return `${this.publicServerURL}/${this.pagesEndpoint}/${this.applicationId}/request_password_reset`;
568
529
  }
569
-
570
530
  get passwordResetSuccessURL() {
571
531
  return this.customPages.passwordResetSuccess || `${this.publicServerURL}/apps/password_reset_success.html`;
572
532
  }
573
-
574
533
  get parseFrameURL() {
575
534
  return this.customPages.parseFrameURL;
576
535
  }
577
-
578
536
  get verifyEmailURL() {
579
537
  return `${this.publicServerURL}/${this.pagesEndpoint}/${this.applicationId}/verify_email`;
580
- } // TODO: Remove this function once PagesRouter replaces the PublicAPIRouter;
581
- // the (default) endpoint has to be defined in PagesRouter only.
582
-
538
+ }
583
539
 
540
+ // TODO: Remove this function once PagesRouter replaces the PublicAPIRouter;
541
+ // the (default) endpoint has to be defined in PagesRouter only.
584
542
  get pagesEndpoint() {
585
543
  return this.pages && this.pages.enableRouter && this.pages.pagesEndpoint ? this.pages.pagesEndpoint : 'apps';
586
544
  }
587
-
588
545
  }
589
-
590
546
  exports.Config = Config;
591
547
  var _default = Config;
592
548
  exports.default = _default;
593
549
  module.exports = Config;
594
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Db25maWcuanMiXSwibmFtZXMiOlsicmVtb3ZlVHJhaWxpbmdTbGFzaCIsInN0ciIsImVuZHNXaXRoIiwic3Vic3RyIiwibGVuZ3RoIiwiQ29uZmlnIiwiZ2V0IiwiYXBwbGljYXRpb25JZCIsIm1vdW50IiwiY2FjaGVJbmZvIiwiQXBwQ2FjaGUiLCJjb25maWciLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImRhdGFiYXNlIiwiRGF0YWJhc2VDb250cm9sbGVyIiwiZGF0YWJhc2VDb250cm9sbGVyIiwiYWRhcHRlciIsImdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdCIsImJpbmQiLCJnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQiLCJwdXQiLCJzZXJ2ZXJDb25maWd1cmF0aW9uIiwidmFsaWRhdGUiLCJhcHBJZCIsInNldHVwUGFzc3dvcmRWYWxpZGF0b3IiLCJwYXNzd29yZFBvbGljeSIsInZlcmlmeVVzZXJFbWFpbHMiLCJ1c2VyQ29udHJvbGxlciIsImFwcE5hbWUiLCJwdWJsaWNTZXJ2ZXJVUkwiLCJyZXZva2VTZXNzaW9uT25QYXNzd29yZFJlc2V0IiwiZXhwaXJlSW5hY3RpdmVTZXNzaW9ucyIsInNlc3Npb25MZW5ndGgiLCJkZWZhdWx0TGltaXQiLCJtYXhMaW1pdCIsImVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uIiwiYWNjb3VudExvY2tvdXQiLCJtYXN0ZXJLZXlJcHMiLCJtYXN0ZXJLZXkiLCJyZWFkT25seU1hc3RlcktleSIsImFsbG93SGVhZGVycyIsImlkZW1wb3RlbmN5T3B0aW9ucyIsImVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQiLCJmaWxlVXBsb2FkIiwicGFnZXMiLCJzZWN1cml0eSIsImVuZm9yY2VQcml2YXRlVXNlcnMiLCJzY2hlbWEiLCJyZXF1ZXN0S2V5d29yZERlbnlsaXN0IiwiYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbiIsIkVycm9yIiwiZW1haWxBZGFwdGVyIiwidmFsaWRhdGVFbWFpbENvbmZpZ3VyYXRpb24iLCJ2YWxpZGF0ZUFjY291bnRMb2Nrb3V0UG9saWN5IiwidmFsaWRhdGVQYXNzd29yZFBvbGljeSIsInZhbGlkYXRlRmlsZVVwbG9hZE9wdGlvbnMiLCJzdGFydHNXaXRoIiwidmFsaWRhdGVTZXNzaW9uQ29uZmlndXJhdGlvbiIsInZhbGlkYXRlTWFzdGVyS2V5SXBzIiwidmFsaWRhdGVEZWZhdWx0TGltaXQiLCJ2YWxpZGF0ZU1heExpbWl0IiwidmFsaWRhdGVBbGxvd0hlYWRlcnMiLCJ2YWxpZGF0ZUlkZW1wb3RlbmN5T3B0aW9ucyIsInZhbGlkYXRlUGFnZXNPcHRpb25zIiwidmFsaWRhdGVTZWN1cml0eU9wdGlvbnMiLCJ2YWxpZGF0ZVNjaGVtYU9wdGlvbnMiLCJ2YWxpZGF0ZUVuZm9yY2VQcml2YXRlVXNlcnMiLCJ2YWxpZGF0ZUFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4iLCJ2YWxpZGF0ZVJlcXVlc3RLZXl3b3JkRGVueWxpc3QiLCJ1bmRlZmluZWQiLCJkZWZhdWx0IiwiQXJyYXkiLCJpc0FycmF5IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiZW5hYmxlQ2hlY2siLCJTZWN1cml0eU9wdGlvbnMiLCJlbmFibGVDaGVja0xvZyIsImRlZmluaXRpb25zIiwiU2NoZW1hT3B0aW9ucyIsInN0cmljdCIsImRlbGV0ZUV4dHJhRmllbGRzIiwicmVjcmVhdGVNb2RpZmllZEZpZWxkcyIsImxvY2tTY2hlbWFzIiwiYmVmb3JlTWlncmF0aW9uIiwiYWZ0ZXJNaWdyYXRpb24iLCJlbmFibGVSb3V0ZXIiLCJQYWdlc09wdGlvbnMiLCJlbmFibGVMb2NhbGl6YXRpb24iLCJsb2NhbGl6YXRpb25Kc29uUGF0aCIsImxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlIiwicGxhY2Vob2xkZXJzIiwiZm9yY2VSZWRpcmVjdCIsInBhZ2VzUGF0aCIsInBhZ2VzRW5kcG9pbnQiLCJjdXN0b21VcmxzIiwiY3VzdG9tUm91dGVzIiwidHRsIiwiSWRlbXBvdGVuY3lPcHRpb25zIiwiaXNOYU4iLCJwYXRocyIsImR1cmF0aW9uIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwidGhyZXNob2xkIiwidW5sb2NrT25QYXNzd29yZFJlc2V0IiwiQWNjb3VudExvY2tvdXRPcHRpb25zIiwibWF4UGFzc3dvcmRBZ2UiLCJyZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbiIsInZhbGlkYXRvclBhdHRlcm4iLCJSZWdFeHAiLCJ2YWxpZGF0b3JDYWxsYmFjayIsImRvTm90QWxsb3dVc2VybmFtZSIsIm1heFBhc3N3b3JkSGlzdG9yeSIsInJlc2V0VG9rZW5SZXVzZUlmVmFsaWQiLCJwYXR0ZXJuVmFsaWRhdG9yIiwidmFsdWUiLCJ0ZXN0IiwiZSIsIlJlZmVyZW5jZUVycm9yIiwiZW5hYmxlRm9yQW5vbnltb3VzVXNlciIsIkZpbGVVcGxvYWRPcHRpb25zIiwiZW5hYmxlRm9yUHVibGljIiwiZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIiLCJpcCIsIm5ldCIsImlzSVAiLCJfbW91bnQiLCJuZXdWYWx1ZSIsIlBhcnNlU2VydmVyT3B0aW9ucyIsImluY2x1ZGVzIiwiaGVhZGVyIiwidHJpbSIsIm5vdyIsIkRhdGUiLCJnZXRUaW1lIiwiZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQiLCJpbnZhbGlkTGlua1VSTCIsImN1c3RvbVBhZ2VzIiwiaW52YWxpZExpbmsiLCJpbnZhbGlkVmVyaWZpY2F0aW9uTGlua1VSTCIsImludmFsaWRWZXJpZmljYXRpb25MaW5rIiwibGlua1NlbmRTdWNjZXNzVVJMIiwibGlua1NlbmRTdWNjZXNzIiwibGlua1NlbmRGYWlsVVJMIiwibGlua1NlbmRGYWlsIiwidmVyaWZ5RW1haWxTdWNjZXNzVVJMIiwidmVyaWZ5RW1haWxTdWNjZXNzIiwiY2hvb3NlUGFzc3dvcmRVUkwiLCJjaG9vc2VQYXNzd29yZCIsInJlcXVlc3RSZXNldFBhc3N3b3JkVVJMIiwicGFzc3dvcmRSZXNldFN1Y2Nlc3NVUkwiLCJwYXNzd29yZFJlc2V0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RSxLQUFLUixXQUFMLENBQWlCUyxrQkFBakIsSUFDQyxHQUFFLEtBQUt2SCxlQUFnQixpQ0FGMUI7QUFJRDs7QUFFb0IsTUFBakJ3SCxpQkFBaUIsR0FBRztBQUN0QixXQUFPLEtBQUtWLFdBQUwsQ0FBaUJXLGNBQWpCLElBQW9DLEdBQUUsS0FBS3pILGVBQWdCLHVCQUFsRTtBQUNEOztBQUUwQixNQUF2QjBILHVCQUF1QixHQUFHO0FBQzVCLFdBQVEsR0FBRSxLQUFLMUgsZUFBZ0IsSUFBRyxLQUFLa0UsYUFBYyxJQUFHLEtBQUszRixhQUFjLHlCQUEzRTtBQUNEOztBQUUwQixNQUF2Qm9KLHVCQUF1QixHQUFHO0FBQzVCLFdBQ0UsS0FBS2IsV0FBTCxDQUFpQmMsb0JBQWpCLElBQ0MsR0FBRSxLQUFLNUgsZUFBZ0IsbUNBRjFCO0FBSUQ7O0FBRWdCLE1BQWI2SCxhQUFhLEdBQUc7QUFDbEIsV0FBTyxLQUFLZixXQUFMLENBQWlCZSxhQUF4QjtBQUNEOztBQUVpQixNQUFkQyxjQUFjLEdBQUc7QUFDbkIsV0FBUSxHQUFFLEtBQUs5SCxlQUFnQixJQUFHLEtBQUtrRSxhQUFjLElBQUcsS0FBSzNGLGFBQWMsZUFBM0U7QUFDRCxHQWppQmlCLENBbWlCbEI7QUFDQTs7O0FBQ2lCLE1BQWIyRixhQUFhLEdBQUc7QUFDbEIsV0FBTyxLQUFLbkQsS0FBTCxJQUFjLEtBQUtBLEtBQUwsQ0FBVzJDLFlBQXpCLElBQXlDLEtBQUszQyxLQUFMLENBQVdtRCxhQUFwRCxHQUNILEtBQUtuRCxLQUFMLENBQVdtRCxhQURSLEdBRUgsTUFGSjtBQUdEOztBQXppQmlCOzs7ZUE0aUJMN0YsTTs7QUFDZjBKLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjNKLE1BQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBDb25maWcgb2JqZWN0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhIHNwZWNpZmljIGFwcCBpc1xuLy8gY29uZmlndXJlZC5cbi8vIG1vdW50IGlzIHRoZSBVUkwgZm9yIHRoZSByb290IG9mIHRoZSBBUEk7IGluY2x1ZGVzIGh0dHAsIGRvbWFpbiwgZXRjLlxuXG5pbXBvcnQgQXBwQ2FjaGUgZnJvbSAnLi9jYWNoZSc7XG5pbXBvcnQgRGF0YWJhc2VDb250cm9sbGVyIGZyb20gJy4vQ29udHJvbGxlcnMvRGF0YWJhc2VDb250cm9sbGVyJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCB7XG4gIElkZW1wb3RlbmN5T3B0aW9ucyxcbiAgRmlsZVVwbG9hZE9wdGlvbnMsXG4gIEFjY291bnRMb2Nrb3V0T3B0aW9ucyxcbiAgUGFnZXNPcHRpb25zLFxuICBTZWN1cml0eU9wdGlvbnMsXG4gIFNjaGVtYU9wdGlvbnMsXG4gIFBhcnNlU2VydmVyT3B0aW9ucyxcbn0gZnJvbSAnLi9PcHRpb25zL0RlZmluaXRpb25zJztcbmltcG9ydCB7IGlzQm9vbGVhbiwgaXNTdHJpbmcgfSBmcm9tICdsb2Rhc2gnO1xuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NsYXNoKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgaWYgKHN0ci5lbmRzV2l0aCgnLycpKSB7XG4gICAgc3RyID0gc3RyLnN1YnN0cigwLCBzdHIubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gIHN0YXRpYyBnZXQoYXBwbGljYXRpb25JZDogc3RyaW5nLCBtb3VudDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FjaGVJbmZvID0gQXBwQ2FjaGUuZ2V0KGFwcGxpY2F0aW9uSWQpO1xuICAgIGlmICghY2FjaGVJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWcoKTtcbiAgICBjb25maWcuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uSWQ7XG4gICAgT2JqZWN0LmtleXMoY2FjaGVJbmZvKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5ID09ICdkYXRhYmFzZUNvbnRyb2xsZXInKSB7XG4gICAgICAgIGNvbmZpZy5kYXRhYmFzZSA9IG5ldyBEYXRhYmFzZUNvbnRyb2xsZXIoY2FjaGVJbmZvLmRhdGFiYXNlQ29udHJvbGxlci5hZGFwdGVyLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSBjYWNoZUluZm9ba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25maWcubW91bnQgPSByZW1vdmVUcmFpbGluZ1NsYXNoKG1vdW50KTtcbiAgICBjb25maWcuZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0ID0gY29uZmlnLmdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdC5iaW5kKGNvbmZpZyk7XG4gICAgY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCA9IGNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQuYmluZChcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBwdXQoc2VydmVyQ29uZmlndXJhdGlvbikge1xuICAgIENvbmZpZy52YWxpZGF0ZShzZXJ2ZXJDb25maWd1cmF0aW9uKTtcbiAgICBBcHBDYWNoZS5wdXQoc2VydmVyQ29uZmlndXJhdGlvbi5hcHBJZCwgc2VydmVyQ29uZmlndXJhdGlvbik7XG4gICAgQ29uZmlnLnNldHVwUGFzc3dvcmRWYWxpZGF0b3Ioc2VydmVyQ29uZmlndXJhdGlvbi5wYXNzd29yZFBvbGljeSk7XG4gICAgcmV0dXJuIHNlcnZlckNvbmZpZ3VyYXRpb247XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGUoe1xuICAgIHZlcmlmeVVzZXJFbWFpbHMsXG4gICAgdXNlckNvbnRyb2xsZXIsXG4gICAgYXBwTmFtZSxcbiAgICBwdWJsaWNTZXJ2ZXJVUkwsXG4gICAgcmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCxcbiAgICBleHBpcmVJbmFjdGl2ZVNlc3Npb25zLFxuICAgIHNlc3Npb25MZW5ndGgsXG4gICAgZGVmYXVsdExpbWl0LFxuICAgIG1heExpbWl0LFxuICAgIGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uLFxuICAgIGFjY291bnRMb2Nrb3V0LFxuICAgIHBhc3N3b3JkUG9saWN5LFxuICAgIG1hc3RlcktleUlwcyxcbiAgICBtYXN0ZXJLZXksXG4gICAgcmVhZE9ubHlNYXN0ZXJLZXksXG4gICAgYWxsb3dIZWFkZXJzLFxuICAgIGlkZW1wb3RlbmN5T3B0aW9ucyxcbiAgICBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkLFxuICAgIGZpbGVVcGxvYWQsXG4gICAgcGFnZXMsXG4gICAgc2VjdXJpdHksXG4gICAgZW5mb3JjZVByaXZhdGVVc2VycyxcbiAgICBzY2hlbWEsXG4gICAgcmVxdWVzdEtleXdvcmREZW55bGlzdCxcbiAgICBhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuLFxuICB9KSB7XG4gICAgaWYgKG1hc3RlcktleSA9PT0gcmVhZE9ubHlNYXN0ZXJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFzdGVyS2V5IGFuZCByZWFkT25seU1hc3RlcktleSBzaG91bGQgYmUgZGlmZmVyZW50Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgZW1haWxBZGFwdGVyID0gdXNlckNvbnRyb2xsZXIuYWRhcHRlcjtcbiAgICBpZiAodmVyaWZ5VXNlckVtYWlscykge1xuICAgICAgdGhpcy52YWxpZGF0ZUVtYWlsQ29uZmlndXJhdGlvbih7XG4gICAgICAgIGVtYWlsQWRhcHRlcixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgcHVibGljU2VydmVyVVJMLFxuICAgICAgICBlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbixcbiAgICAgICAgZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudmFsaWRhdGVBY2NvdW50TG9ja291dFBvbGljeShhY2NvdW50TG9ja291dCk7XG4gICAgdGhpcy52YWxpZGF0ZVBhc3N3b3JkUG9saWN5KHBhc3N3b3JkUG9saWN5KTtcbiAgICB0aGlzLnZhbGlkYXRlRmlsZVVwbG9hZE9wdGlvbnMoZmlsZVVwbG9hZCk7XG5cbiAgICBpZiAodHlwZW9mIHJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgJ3Jldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnO1xuICAgIH1cblxuICAgIGlmIChwdWJsaWNTZXJ2ZXJVUkwpIHtcbiAgICAgIGlmICghcHVibGljU2VydmVyVVJMLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhcHVibGljU2VydmVyVVJMLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgICAgdGhyb3cgJ3B1YmxpY1NlcnZlclVSTCBzaG91bGQgYmUgYSB2YWxpZCBIVFRQUyBVUkwgc3RhcnRpbmcgd2l0aCBodHRwczovLyc7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVTZXNzaW9uQ29uZmlndXJhdGlvbihzZXNzaW9uTGVuZ3RoLCBleHBpcmVJbmFjdGl2ZVNlc3Npb25zKTtcbiAgICB0aGlzLnZhbGlkYXRlTWFzdGVyS2V5SXBzKG1hc3RlcktleUlwcyk7XG4gICAgdGhpcy52YWxpZGF0ZURlZmF1bHRMaW1pdChkZWZhdWx0TGltaXQpO1xuICAgIHRoaXMudmFsaWRhdGVNYXhMaW1pdChtYXhMaW1pdCk7XG4gICAgdGhpcy52YWxpZGF0ZUFsbG93SGVhZGVycyhhbGxvd0hlYWRlcnMpO1xuICAgIHRoaXMudmFsaWRhdGVJZGVtcG90ZW5jeU9wdGlvbnMoaWRlbXBvdGVuY3lPcHRpb25zKTtcbiAgICB0aGlzLnZhbGlkYXRlUGFnZXNPcHRpb25zKHBhZ2VzKTtcbiAgICB0aGlzLnZhbGlkYXRlU2VjdXJpdHlPcHRpb25zKHNlY3VyaXR5KTtcbiAgICB0aGlzLnZhbGlkYXRlU2NoZW1hT3B0aW9ucyhzY2hlbWEpO1xuICAgIHRoaXMudmFsaWRhdGVFbmZvcmNlUHJpdmF0ZVVzZXJzKGVuZm9yY2VQcml2YXRlVXNlcnMpO1xuICAgIHRoaXMudmFsaWRhdGVBbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuKGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4pO1xuICAgIHRoaXMudmFsaWRhdGVSZXF1ZXN0S2V5d29yZERlbnlsaXN0KHJlcXVlc3RLZXl3b3JkRGVueWxpc3QpO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlUmVxdWVzdEtleXdvcmREZW55bGlzdChyZXF1ZXN0S2V5d29yZERlbnlsaXN0KSB7XG4gICAgaWYgKHJlcXVlc3RLZXl3b3JkRGVueWxpc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVxdWVzdEtleXdvcmREZW55bGlzdCA9IHJlcXVlc3RLZXl3b3JkRGVueWxpc3QuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHJlcXVlc3RLZXl3b3JkRGVueWxpc3QpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiByZXF1ZXN0S2V5d29yZERlbnlsaXN0IG11c3QgYmUgYW4gYXJyYXkuJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVFbmZvcmNlUHJpdmF0ZVVzZXJzKGVuZm9yY2VQcml2YXRlVXNlcnMpIHtcbiAgICBpZiAodHlwZW9mIGVuZm9yY2VQcml2YXRlVXNlcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gZW5mb3JjZVByaXZhdGVVc2VycyBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4oYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbikge1xuICAgIGlmICh0eXBlb2YgYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuIG11c3QgYmUgYSBib29sZWFuLic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlU2VjdXJpdHlPcHRpb25zKHNlY3VyaXR5KSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzZWN1cml0eSkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzZWN1cml0eSBtdXN0IGJlIGFuIG9iamVjdC4nO1xuICAgIH1cbiAgICBpZiAoc2VjdXJpdHkuZW5hYmxlQ2hlY2sgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VjdXJpdHkuZW5hYmxlQ2hlY2sgPSBTZWN1cml0eU9wdGlvbnMuZW5hYmxlQ2hlY2suZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oc2VjdXJpdHkuZW5hYmxlQ2hlY2spKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzZWN1cml0eS5lbmFibGVDaGVjayBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAoc2VjdXJpdHkuZW5hYmxlQ2hlY2tMb2cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VjdXJpdHkuZW5hYmxlQ2hlY2tMb2cgPSBTZWN1cml0eU9wdGlvbnMuZW5hYmxlQ2hlY2tMb2cuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oc2VjdXJpdHkuZW5hYmxlQ2hlY2tMb2cpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzZWN1cml0eS5lbmFibGVDaGVja0xvZyBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVNjaGVtYU9wdGlvbnMoc2NoZW1hOiBTY2hlbWFPcHRpb25zKSB7XG4gICAgaWYgKCFzY2hlbWEpIHJldHVybjtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHNjaGVtYSkgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3QuJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5kZWZpbml0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuZGVmaW5pdGlvbnMgPSBTY2hlbWFPcHRpb25zLmRlZmluaXRpb25zLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShzY2hlbWEuZGVmaW5pdGlvbnMpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEuZGVmaW5pdGlvbnMgbXVzdCBiZSBhbiBhcnJheS4nO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnN0cmljdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuc3RyaWN0ID0gU2NoZW1hT3B0aW9ucy5zdHJpY3QuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oc2NoZW1hLnN0cmljdCkpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHNjaGVtYS5zdHJpY3QgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5kZWxldGVFeHRyYUZpZWxkcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuZGVsZXRlRXh0cmFGaWVsZHMgPSBTY2hlbWFPcHRpb25zLmRlbGV0ZUV4dHJhRmllbGRzLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNjaGVtYS5kZWxldGVFeHRyYUZpZWxkcykpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHNjaGVtYS5kZWxldGVFeHRyYUZpZWxkcyBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgPSBTY2hlbWFPcHRpb25zLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oc2NoZW1hLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEucmVjcmVhdGVNb2RpZmllZEZpZWxkcyBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLmxvY2tTY2hlbWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5sb2NrU2NoZW1hcyA9IFNjaGVtYU9wdGlvbnMubG9ja1NjaGVtYXMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oc2NoZW1hLmxvY2tTY2hlbWFzKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2NoZW1hLmxvY2tTY2hlbWFzIG11c3QgYmUgYSBib29sZWFuLic7XG4gICAgfVxuICAgIGlmIChzY2hlbWEuYmVmb3JlTWlncmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5iZWZvcmVNaWdyYXRpb24gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc2NoZW1hLmJlZm9yZU1pZ3JhdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygc2NoZW1hLmJlZm9yZU1pZ3JhdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2NoZW1hLmJlZm9yZU1pZ3JhdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5hZnRlck1pZ3JhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuYWZ0ZXJNaWdyYXRpb24gPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoc2NoZW1hLmFmdGVyTWlncmF0aW9uICE9PSBudWxsICYmIHR5cGVvZiBzY2hlbWEuYWZ0ZXJNaWdyYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHNjaGVtYS5hZnRlck1pZ3JhdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVQYWdlc09wdGlvbnMocGFnZXMpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBhZ2VzKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzIG11c3QgYmUgYW4gb2JqZWN0Lic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5lbmFibGVSb3V0ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFnZXMuZW5hYmxlUm91dGVyID0gUGFnZXNPcHRpb25zLmVuYWJsZVJvdXRlci5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzQm9vbGVhbihwYWdlcy5lbmFibGVSb3V0ZXIpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5lbmFibGVSb3V0ZXIgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLmVuYWJsZUxvY2FsaXphdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5lbmFibGVMb2NhbGl6YXRpb24gPSBQYWdlc09wdGlvbnMuZW5hYmxlTG9jYWxpemF0aW9uLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHBhZ2VzLmVuYWJsZUxvY2FsaXphdGlvbikpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLmVuYWJsZUxvY2FsaXphdGlvbiBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMubG9jYWxpemF0aW9uSnNvblBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFnZXMubG9jYWxpemF0aW9uSnNvblBhdGggPSBQYWdlc09wdGlvbnMubG9jYWxpemF0aW9uSnNvblBhdGguZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc1N0cmluZyhwYWdlcy5sb2NhbGl6YXRpb25Kc29uUGF0aCkpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLmxvY2FsaXphdGlvbkpzb25QYXRoIG11c3QgYmUgYSBzdHJpbmcuJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLmxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlID0gUGFnZXNPcHRpb25zLmxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNTdHJpbmcocGFnZXMubG9jYWxpemF0aW9uRmFsbGJhY2tMb2NhbGUpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5sb2NhbGl6YXRpb25GYWxsYmFja0xvY2FsZSBtdXN0IGJlIGEgc3RyaW5nLic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5wbGFjZWhvbGRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFnZXMucGxhY2Vob2xkZXJzID0gUGFnZXNPcHRpb25zLnBsYWNlaG9sZGVycy5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocGFnZXMucGxhY2Vob2xkZXJzKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScgJiZcbiAgICAgIHR5cGVvZiBwYWdlcy5wbGFjZWhvbGRlcnMgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLnBsYWNlaG9sZGVycyBtdXN0IGJlIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5mb3JjZVJlZGlyZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmZvcmNlUmVkaXJlY3QgPSBQYWdlc09wdGlvbnMuZm9yY2VSZWRpcmVjdC5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzQm9vbGVhbihwYWdlcy5mb3JjZVJlZGlyZWN0KSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMuZm9yY2VSZWRpcmVjdCBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMucGFnZXNQYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLnBhZ2VzUGF0aCA9IFBhZ2VzT3B0aW9ucy5wYWdlc1BhdGguZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc1N0cmluZyhwYWdlcy5wYWdlc1BhdGgpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5wYWdlc1BhdGggbXVzdCBiZSBhIHN0cmluZy4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMucGFnZXNFbmRwb2ludCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5wYWdlc0VuZHBvaW50ID0gUGFnZXNPcHRpb25zLnBhZ2VzRW5kcG9pbnQuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc1N0cmluZyhwYWdlcy5wYWdlc0VuZHBvaW50KSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMucGFnZXNFbmRwb2ludCBtdXN0IGJlIGEgc3RyaW5nLic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5jdXN0b21VcmxzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmN1c3RvbVVybHMgPSBQYWdlc09wdGlvbnMuY3VzdG9tVXJscy5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBhZ2VzLmN1c3RvbVVybHMpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMuY3VzdG9tVXJscyBtdXN0IGJlIGFuIG9iamVjdC4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMuY3VzdG9tUm91dGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmN1c3RvbVJvdXRlcyA9IFBhZ2VzT3B0aW9ucy5jdXN0b21Sb3V0ZXMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCEocGFnZXMuY3VzdG9tUm91dGVzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5jdXN0b21Sb3V0ZXMgbXVzdCBiZSBhbiBhcnJheS4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUlkZW1wb3RlbmN5T3B0aW9ucyhpZGVtcG90ZW5jeU9wdGlvbnMpIHtcbiAgICBpZiAoIWlkZW1wb3RlbmN5T3B0aW9ucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaWRlbXBvdGVuY3lPcHRpb25zLnR0bCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZGVtcG90ZW5jeU9wdGlvbnMudHRsID0gSWRlbXBvdGVuY3lPcHRpb25zLnR0bC5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzTmFOKGlkZW1wb3RlbmN5T3B0aW9ucy50dGwpICYmIGlkZW1wb3RlbmN5T3B0aW9ucy50dGwgPD0gMCkge1xuICAgICAgdGhyb3cgJ2lkZW1wb3RlbmN5IFRUTCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIHNlY29uZHMnO1xuICAgIH0gZWxzZSBpZiAoaXNOYU4oaWRlbXBvdGVuY3lPcHRpb25zLnR0bCkpIHtcbiAgICAgIHRocm93ICdpZGVtcG90ZW5jeSBUVEwgdmFsdWUgbXVzdCBiZSBhIG51bWJlcic7XG4gICAgfVxuICAgIGlmICghaWRlbXBvdGVuY3lPcHRpb25zLnBhdGhzKSB7XG4gICAgICBpZGVtcG90ZW5jeU9wdGlvbnMucGF0aHMgPSBJZGVtcG90ZW5jeU9wdGlvbnMucGF0aHMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCEoaWRlbXBvdGVuY3lPcHRpb25zLnBhdGhzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICB0aHJvdyAnaWRlbXBvdGVuY3kgcGF0aHMgbXVzdCBiZSBvZiBhbiBhcnJheSBvZiBzdHJpbmdzJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBY2NvdW50TG9ja291dFBvbGljeShhY2NvdW50TG9ja291dCkge1xuICAgIGlmIChhY2NvdW50TG9ja291dCkge1xuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWNjb3VudExvY2tvdXQuZHVyYXRpb24gIT09ICdudW1iZXInIHx8XG4gICAgICAgIGFjY291bnRMb2Nrb3V0LmR1cmF0aW9uIDw9IDAgfHxcbiAgICAgICAgYWNjb3VudExvY2tvdXQuZHVyYXRpb24gPiA5OTk5OVxuICAgICAgKSB7XG4gICAgICAgIHRocm93ICdBY2NvdW50IGxvY2tvdXQgZHVyYXRpb24gc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMTAwMDAwJztcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihhY2NvdW50TG9ja291dC50aHJlc2hvbGQpIHx8XG4gICAgICAgIGFjY291bnRMb2Nrb3V0LnRocmVzaG9sZCA8IDEgfHxcbiAgICAgICAgYWNjb3VudExvY2tvdXQudGhyZXNob2xkID4gOTk5XG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgJ0FjY291bnQgbG9ja291dCB0aHJlc2hvbGQgc2hvdWxkIGJlIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiAxMDAwJztcbiAgICAgIH1cblxuICAgICAgaWYgKGFjY291bnRMb2Nrb3V0LnVubG9ja09uUGFzc3dvcmRSZXNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFjY291bnRMb2Nrb3V0LnVubG9ja09uUGFzc3dvcmRSZXNldCA9IEFjY291bnRMb2Nrb3V0T3B0aW9ucy51bmxvY2tPblBhc3N3b3JkUmVzZXQuZGVmYXVsdDtcbiAgICAgIH0gZWxzZSBpZiAoIWlzQm9vbGVhbihhY2NvdW50TG9ja291dC51bmxvY2tPblBhc3N3b3JkUmVzZXQpKSB7XG4gICAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIGFjY291bnRMb2Nrb3V0LnVubG9ja09uUGFzc3dvcmRSZXNldCBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVBhc3N3b3JkUG9saWN5KHBhc3N3b3JkUG9saWN5KSB7XG4gICAgaWYgKHBhc3N3b3JkUG9saWN5KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkQWdlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgKHR5cGVvZiBwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSAhPT0gJ251bWJlcicgfHwgcGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2UgPCAwKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93ICdwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJztcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0eXBlb2YgcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24gIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24gPD0gMClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcic7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuKTtcbiAgICAgICAgfSBlbHNlIGlmICghKHBhc3N3b3JkUG9saWN5LnZhbGlkYXRvclBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgICAgdGhyb3cgJ3Bhc3N3b3JkUG9saWN5LnZhbGlkYXRvclBhdHRlcm4gbXVzdCBiZSBhIHJlZ2V4IHN0cmluZyBvciBSZWdFeHAgb2JqZWN0Lic7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZFBvbGljeS52YWxpZGF0b3JDYWxsYmFjayAmJlxuICAgICAgICB0eXBlb2YgcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yQ2FsbGJhY2sgIT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yQ2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uLic7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lICYmXG4gICAgICAgIHR5cGVvZiBwYXNzd29yZFBvbGljeS5kb05vdEFsbG93VXNlcm5hbWUgIT09ICdib29sZWFuJ1xuICAgICAgKSB7XG4gICAgICAgIHRocm93ICdwYXNzd29yZFBvbGljeS5kb05vdEFsbG93VXNlcm5hbWUgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUuJztcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkgJiZcbiAgICAgICAgKCFOdW1iZXIuaXNJbnRlZ2VyKHBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSkgfHxcbiAgICAgICAgICBwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkgPD0gMCB8fFxuICAgICAgICAgIHBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkSGlzdG9yeSA+IDIwKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93ICdwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkgbXVzdCBiZSBhbiBpbnRlZ2VyIHJhbmdpbmcgMCAtIDIwJztcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICYmXG4gICAgICAgIHR5cGVvZiBwYXNzd29yZFBvbGljeS5yZXNldFRva2VuUmV1c2VJZlZhbGlkICE9PSAnYm9vbGVhbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncmVzZXRUb2tlblJldXNlSWZWYWxpZCBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSc7XG4gICAgICB9XG4gICAgICBpZiAocGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblJldXNlSWZWYWxpZCAmJiAhcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgICAgdGhyb3cgJ1lvdSBjYW5ub3QgdXNlIHJlc2V0VG9rZW5SZXVzZUlmVmFsaWQgd2l0aG91dCByZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbic7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhc3N3b3JkUG9saWN5LnZhbGlkYXRvclBhdHRlcm4gaXMgY29uZmlndXJlZCB0aGVuIHNldHVwIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGUgcGF0dGVyblxuICBzdGF0aWMgc2V0dXBQYXNzd29yZFZhbGlkYXRvcihwYXNzd29yZFBvbGljeSkge1xuICAgIGlmIChwYXNzd29yZFBvbGljeSAmJiBwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuKSB7XG4gICAgICBwYXNzd29yZFBvbGljeS5wYXR0ZXJuVmFsaWRhdG9yID0gdmFsdWUgPT4ge1xuICAgICAgICByZXR1cm4gcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybi50ZXN0KHZhbHVlKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlRW1haWxDb25maWd1cmF0aW9uKHtcbiAgICBlbWFpbEFkYXB0ZXIsXG4gICAgYXBwTmFtZSxcbiAgICBwdWJsaWNTZXJ2ZXJVUkwsXG4gICAgZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24sXG4gICAgZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCxcbiAgfSkge1xuICAgIGlmICghZW1haWxBZGFwdGVyKSB7XG4gICAgICB0aHJvdyAnQW4gZW1haWxBZGFwdGVyIGlzIHJlcXVpcmVkIGZvciBlLW1haWwgdmVyaWZpY2F0aW9uIGFuZCBwYXNzd29yZCByZXNldHMuJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhcHBOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgJ0FuIGFwcCBuYW1lIGlzIHJlcXVpcmVkIGZvciBlLW1haWwgdmVyaWZpY2F0aW9uIGFuZCBwYXNzd29yZCByZXNldHMuJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwdWJsaWNTZXJ2ZXJVUkwgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyAnQSBwdWJsaWMgc2VydmVyIHVybCBpcyByZXF1aXJlZCBmb3IgZS1tYWlsIHZlcmlmaWNhdGlvbiBhbmQgcGFzc3dvcmQgcmVzZXRzLic7XG4gICAgfVxuICAgIGlmIChlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgaWYgKGlzTmFOKGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSkge1xuICAgICAgICB0aHJvdyAnRW1haWwgdmVyaWZ5IHRva2VuIHZhbGlkaXR5IGR1cmF0aW9uIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuJztcbiAgICAgIH0gZWxzZSBpZiAoZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24gPD0gMCkge1xuICAgICAgICB0aHJvdyAnRW1haWwgdmVyaWZ5IHRva2VuIHZhbGlkaXR5IGR1cmF0aW9uIG11c3QgYmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4nO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCAmJiB0eXBlb2YgZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSc7XG4gICAgfVxuICAgIGlmIChlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkICYmICFlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgdGhyb3cgJ1lvdSBjYW5ub3QgdXNlIGVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgd2l0aG91dCBlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlRmlsZVVwbG9hZE9wdGlvbnMoZmlsZVVwbG9hZCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZmlsZVVwbG9hZCA9PSBudWxsIHx8IHR5cGVvZiBmaWxlVXBsb2FkICE9PSAnb2JqZWN0JyB8fCBmaWxlVXBsb2FkIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgdGhyb3cgJ2ZpbGVVcGxvYWQgbXVzdCBiZSBhbiBvYmplY3QgdmFsdWUuJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGlmIChmaWxlVXBsb2FkLmVuYWJsZUZvckFub255bW91c1VzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlsZVVwbG9hZC5lbmFibGVGb3JBbm9ueW1vdXNVc2VyID0gRmlsZVVwbG9hZE9wdGlvbnMuZW5hYmxlRm9yQW5vbnltb3VzVXNlci5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbGVVcGxvYWQuZW5hYmxlRm9yQW5vbnltb3VzVXNlciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnZmlsZVVwbG9hZC5lbmFibGVGb3JBbm9ueW1vdXNVc2VyIG11c3QgYmUgYSBib29sZWFuIHZhbHVlLic7XG4gICAgfVxuICAgIGlmIChmaWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyA9IEZpbGVVcGxvYWRPcHRpb25zLmVuYWJsZUZvclB1YmxpYy5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbGVVcGxvYWQuZW5hYmxlRm9yUHVibGljICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93ICdmaWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZS4nO1xuICAgIH1cbiAgICBpZiAoZmlsZVVwbG9hZC5lbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaWxlVXBsb2FkLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyID0gRmlsZVVwbG9hZE9wdGlvbnMuZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWxlVXBsb2FkLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93ICdmaWxlVXBsb2FkLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyIG11c3QgYmUgYSBib29sZWFuIHZhbHVlLic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlTWFzdGVyS2V5SXBzKG1hc3RlcktleUlwcykge1xuICAgIGZvciAoY29uc3QgaXAgb2YgbWFzdGVyS2V5SXBzKSB7XG4gICAgICBpZiAoIW5ldC5pc0lQKGlwKSkge1xuICAgICAgICB0aHJvdyBgSW52YWxpZCBpcCBpbiBtYXN0ZXJLZXlJcHM6ICR7aXB9YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbW91bnQoKSB7XG4gICAgdmFyIG1vdW50ID0gdGhpcy5fbW91bnQ7XG4gICAgaWYgKHRoaXMucHVibGljU2VydmVyVVJMKSB7XG4gICAgICBtb3VudCA9IHRoaXMucHVibGljU2VydmVyVVJMO1xuICAgIH1cbiAgICByZXR1cm4gbW91bnQ7XG4gIH1cblxuICBzZXQgbW91bnQobmV3VmFsdWUpIHtcbiAgICB0aGlzLl9tb3VudCA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlU2Vzc2lvbkNvbmZpZ3VyYXRpb24oc2Vzc2lvbkxlbmd0aCwgZXhwaXJlSW5hY3RpdmVTZXNzaW9ucykge1xuICAgIGlmIChleHBpcmVJbmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICBpZiAoaXNOYU4oc2Vzc2lvbkxlbmd0aCkpIHtcbiAgICAgICAgdGhyb3cgJ1Nlc3Npb24gbGVuZ3RoIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuJztcbiAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbkxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHRocm93ICdTZXNzaW9uIGxlbmd0aCBtdXN0IGJlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVEZWZhdWx0TGltaXQoZGVmYXVsdExpbWl0KSB7XG4gICAgaWYgKGRlZmF1bHRMaW1pdCA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0TGltaXQgPSBQYXJzZVNlcnZlck9wdGlvbnMuZGVmYXVsdExpbWl0LmRlZmF1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGVmYXVsdExpbWl0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgJ0RlZmF1bHQgbGltaXQgbXVzdCBiZSBhIG51bWJlci4nO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdExpbWl0IDw9IDApIHtcbiAgICAgIHRocm93ICdEZWZhdWx0IGxpbWl0IG11c3QgYmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1heExpbWl0KG1heExpbWl0KSB7XG4gICAgaWYgKG1heExpbWl0IDw9IDApIHtcbiAgICAgIHRocm93ICdNYXggbGltaXQgbXVzdCBiZSBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWxsb3dIZWFkZXJzKGFsbG93SGVhZGVycykge1xuICAgIGlmICghW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYWxsb3dIZWFkZXJzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dIZWFkZXJzKSkge1xuICAgICAgICBhbGxvd0hlYWRlcnMuZm9yRWFjaChoZWFkZXIgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGVhZGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgJ0FsbG93IGhlYWRlcnMgbXVzdCBvbmx5IGNvbnRhaW4gc3RyaW5ncyc7XG4gICAgICAgICAgfSBlbHNlIGlmICghaGVhZGVyLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93ICdBbGxvdyBoZWFkZXJzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdBbGxvdyBoZWFkZXJzIG11c3QgYmUgYW4gYXJyYXknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCgpIHtcbiAgICBpZiAoIXRoaXMudmVyaWZ5VXNlckVtYWlscyB8fCAhdGhpcy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLmVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uICogMTAwMCk7XG4gIH1cblxuICBnZW5lcmF0ZVBhc3N3b3JkUmVzZXRUb2tlbkV4cGlyZXNBdCgpIHtcbiAgICBpZiAoIXRoaXMucGFzc3dvcmRQb2xpY3kgfHwgIXRoaXMucGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyB0aGlzLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uICogMTAwMCk7XG4gIH1cblxuICBnZW5lcmF0ZVNlc3Npb25FeHBpcmVzQXQoKSB7XG4gICAgaWYgKCF0aGlzLmV4cGlyZUluYWN0aXZlU2Vzc2lvbnMpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdGhpcy5zZXNzaW9uTGVuZ3RoICogMTAwMCk7XG4gIH1cblxuICBnZXQgaW52YWxpZExpbmtVUkwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUGFnZXMuaW52YWxpZExpbmsgfHwgYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9L2FwcHMvaW52YWxpZF9saW5rLmh0bWxgO1xuICB9XG5cbiAgZ2V0IGludmFsaWRWZXJpZmljYXRpb25MaW5rVVJMKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1c3RvbVBhZ2VzLmludmFsaWRWZXJpZmljYXRpb25MaW5rIHx8XG4gICAgICBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vYXBwcy9pbnZhbGlkX3ZlcmlmaWNhdGlvbl9saW5rLmh0bWxgXG4gICAgKTtcbiAgfVxuXG4gIGdldCBsaW5rU2VuZFN1Y2Nlc3NVUkwoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VzdG9tUGFnZXMubGlua1NlbmRTdWNjZXNzIHx8IGAke3RoaXMucHVibGljU2VydmVyVVJMfS9hcHBzL2xpbmtfc2VuZF9zdWNjZXNzLmh0bWxgXG4gICAgKTtcbiAgfVxuXG4gIGdldCBsaW5rU2VuZEZhaWxVUkwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUGFnZXMubGlua1NlbmRGYWlsIHx8IGAke3RoaXMucHVibGljU2VydmVyVVJMfS9hcHBzL2xpbmtfc2VuZF9mYWlsLmh0bWxgO1xuICB9XG5cbiAgZ2V0IHZlcmlmeUVtYWlsU3VjY2Vzc1VSTCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21QYWdlcy52ZXJpZnlFbWFpbFN1Y2Nlc3MgfHxcbiAgICAgIGAke3RoaXMucHVibGljU2VydmVyVVJMfS9hcHBzL3ZlcmlmeV9lbWFpbF9zdWNjZXNzLmh0bWxgXG4gICAgKTtcbiAgfVxuXG4gIGdldCBjaG9vc2VQYXNzd29yZFVSTCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21QYWdlcy5jaG9vc2VQYXNzd29yZCB8fCBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vYXBwcy9jaG9vc2VfcGFzc3dvcmRgO1xuICB9XG5cbiAgZ2V0IHJlcXVlc3RSZXNldFBhc3N3b3JkVVJMKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vJHt0aGlzLnBhZ2VzRW5kcG9pbnR9LyR7dGhpcy5hcHBsaWNhdGlvbklkfS9yZXF1ZXN0X3Bhc3N3b3JkX3Jlc2V0YDtcbiAgfVxuXG4gIGdldCBwYXNzd29yZFJlc2V0U3VjY2Vzc1VSTCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21QYWdlcy5wYXNzd29yZFJlc2V0U3VjY2VzcyB8fFxuICAgICAgYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9L2FwcHMvcGFzc3dvcmRfcmVzZXRfc3VjY2Vzcy5odG1sYFxuICAgICk7XG4gIH1cblxuICBnZXQgcGFyc2VGcmFtZVVSTCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXN0b21QYWdlcy5wYXJzZUZyYW1lVVJMO1xuICB9XG5cbiAgZ2V0IHZlcmlmeUVtYWlsVVJMKCkge1xuICAgIHJldHVybiBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vJHt0aGlzLnBhZ2VzRW5kcG9pbnR9LyR7dGhpcy5hcHBsaWNhdGlvbklkfS92ZXJpZnlfZW1haWxgO1xuICB9XG5cbiAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgZnVuY3Rpb24gb25jZSBQYWdlc1JvdXRlciByZXBsYWNlcyB0aGUgUHVibGljQVBJUm91dGVyO1xuICAvLyB0aGUgKGRlZmF1bHQpIGVuZHBvaW50IGhhcyB0byBiZSBkZWZpbmVkIGluIFBhZ2VzUm91dGVyIG9ubHkuXG4gIGdldCBwYWdlc0VuZHBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnBhZ2VzICYmIHRoaXMucGFnZXMuZW5hYmxlUm91dGVyICYmIHRoaXMucGFnZXMucGFnZXNFbmRwb2ludFxuICAgICAgPyB0aGlzLnBhZ2VzLnBhZ2VzRW5kcG9pbnRcbiAgICAgIDogJ2FwcHMnO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZztcbm1vZHVsZS5leHBvcnRzID0gQ29uZmlnO1xuIl19
550
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZW1vdmVUcmFpbGluZ1NsYXNoIiwic3RyIiwiZW5kc1dpdGgiLCJzdWJzdHIiLCJsZW5ndGgiLCJDb25maWciLCJnZXQiLCJhcHBsaWNhdGlvbklkIiwibW91bnQiLCJjYWNoZUluZm8iLCJBcHBDYWNoZSIsImNvbmZpZyIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwia2V5IiwiZGF0YWJhc2UiLCJEYXRhYmFzZUNvbnRyb2xsZXIiLCJkYXRhYmFzZUNvbnRyb2xsZXIiLCJhZGFwdGVyIiwiZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0IiwiYmluZCIsImdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCIsInB1dCIsInNlcnZlckNvbmZpZ3VyYXRpb24iLCJ2YWxpZGF0ZSIsImFwcElkIiwic2V0dXBQYXNzd29yZFZhbGlkYXRvciIsInBhc3N3b3JkUG9saWN5IiwidmVyaWZ5VXNlckVtYWlscyIsInVzZXJDb250cm9sbGVyIiwiYXBwTmFtZSIsInB1YmxpY1NlcnZlclVSTCIsInJldm9rZVNlc3Npb25PblBhc3N3b3JkUmVzZXQiLCJleHBpcmVJbmFjdGl2ZVNlc3Npb25zIiwic2Vzc2lvbkxlbmd0aCIsImRlZmF1bHRMaW1pdCIsIm1heExpbWl0IiwiZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24iLCJhY2NvdW50TG9ja291dCIsIm1hc3RlcktleUlwcyIsIm1hc3RlcktleSIsInJlYWRPbmx5TWFzdGVyS2V5IiwiYWxsb3dIZWFkZXJzIiwiaWRlbXBvdGVuY3lPcHRpb25zIiwiZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCIsImZpbGVVcGxvYWQiLCJwYWdlcyIsInNlY3VyaXR5IiwiZW5mb3JjZVByaXZhdGVVc2VycyIsInNjaGVtYSIsInJlcXVlc3RLZXl3b3JkRGVueWxpc3QiLCJhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuIiwibG9nTGV2ZWxzIiwicmF0ZUxpbWl0IiwiRXJyb3IiLCJlbWFpbEFkYXB0ZXIiLCJ2YWxpZGF0ZUVtYWlsQ29uZmlndXJhdGlvbiIsInZhbGlkYXRlQWNjb3VudExvY2tvdXRQb2xpY3kiLCJ2YWxpZGF0ZVBhc3N3b3JkUG9saWN5IiwidmFsaWRhdGVGaWxlVXBsb2FkT3B0aW9ucyIsInN0YXJ0c1dpdGgiLCJ2YWxpZGF0ZVNlc3Npb25Db25maWd1cmF0aW9uIiwidmFsaWRhdGVNYXN0ZXJLZXlJcHMiLCJ2YWxpZGF0ZURlZmF1bHRMaW1pdCIsInZhbGlkYXRlTWF4TGltaXQiLCJ2YWxpZGF0ZUFsbG93SGVhZGVycyIsInZhbGlkYXRlSWRlbXBvdGVuY3lPcHRpb25zIiwidmFsaWRhdGVQYWdlc09wdGlvbnMiLCJ2YWxpZGF0ZVNlY3VyaXR5T3B0aW9ucyIsInZhbGlkYXRlU2NoZW1hT3B0aW9ucyIsInZhbGlkYXRlRW5mb3JjZVByaXZhdGVVc2VycyIsInZhbGlkYXRlQWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbiIsInZhbGlkYXRlUmVxdWVzdEtleXdvcmREZW55bGlzdCIsInZhbGlkYXRlUmF0ZUxpbWl0IiwidmFsaWRhdGVMb2dMZXZlbHMiLCJ1bmRlZmluZWQiLCJkZWZhdWx0IiwiQXJyYXkiLCJpc0FycmF5IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiZW5hYmxlQ2hlY2siLCJTZWN1cml0eU9wdGlvbnMiLCJpc0Jvb2xlYW4iLCJlbmFibGVDaGVja0xvZyIsImRlZmluaXRpb25zIiwiU2NoZW1hT3B0aW9ucyIsInN0cmljdCIsImRlbGV0ZUV4dHJhRmllbGRzIiwicmVjcmVhdGVNb2RpZmllZEZpZWxkcyIsImxvY2tTY2hlbWFzIiwiYmVmb3JlTWlncmF0aW9uIiwiYWZ0ZXJNaWdyYXRpb24iLCJlbmFibGVSb3V0ZXIiLCJQYWdlc09wdGlvbnMiLCJlbmFibGVMb2NhbGl6YXRpb24iLCJsb2NhbGl6YXRpb25Kc29uUGF0aCIsImlzU3RyaW5nIiwibG9jYWxpemF0aW9uRmFsbGJhY2tMb2NhbGUiLCJwbGFjZWhvbGRlcnMiLCJmb3JjZVJlZGlyZWN0IiwicGFnZXNQYXRoIiwicGFnZXNFbmRwb2ludCIsImN1c3RvbVVybHMiLCJjdXN0b21Sb3V0ZXMiLCJ0dGwiLCJJZGVtcG90ZW5jeU9wdGlvbnMiLCJpc05hTiIsInBhdGhzIiwiZHVyYXRpb24iLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJ0aHJlc2hvbGQiLCJ1bmxvY2tPblBhc3N3b3JkUmVzZXQiLCJBY2NvdW50TG9ja291dE9wdGlvbnMiLCJtYXhQYXNzd29yZEFnZSIsInJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIiwidmFsaWRhdG9yUGF0dGVybiIsIlJlZ0V4cCIsInZhbGlkYXRvckNhbGxiYWNrIiwiZG9Ob3RBbGxvd1VzZXJuYW1lIiwibWF4UGFzc3dvcmRIaXN0b3J5IiwicmVzZXRUb2tlblJldXNlSWZWYWxpZCIsInBhdHRlcm5WYWxpZGF0b3IiLCJ2YWx1ZSIsInRlc3QiLCJlIiwiUmVmZXJlbmNlRXJyb3IiLCJlbmFibGVGb3JBbm9ueW1vdXNVc2VyIiwiRmlsZVVwbG9hZE9wdGlvbnMiLCJlbmFibGVGb3JQdWJsaWMiLCJlbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciIsImlwIiwiaW5jbHVkZXMiLCJzcGxpdCIsIm5ldCIsImlzSVAiLCJfbW91bnQiLCJuZXdWYWx1ZSIsIlBhcnNlU2VydmVyT3B0aW9ucyIsImhlYWRlciIsInRyaW0iLCJMb2dMZXZlbHMiLCJ2YWxpZExvZ0xldmVscyIsImluZGV4T2YiLCJKU09OIiwic3RyaW5naWZ5Iiwib3B0aW9ucyIsIm9wdGlvbiIsInJlcXVlc3RQYXRoIiwicmVxdWVzdFRpbWVXaW5kb3ciLCJpbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyIsInJlcXVlc3RDb3VudCIsImVycm9yUmVzcG9uc2VNZXNzYWdlIiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJnZW5lcmF0ZVBhc3N3b3JkUmVzZXRUb2tlbkV4cGlyZXNBdCIsImludmFsaWRMaW5rVVJMIiwiY3VzdG9tUGFnZXMiLCJpbnZhbGlkTGluayIsImludmFsaWRWZXJpZmljYXRpb25MaW5rVVJMIiwiaW52YWxpZFZlcmlmaWNhdGlvbkxpbmsiLCJsaW5rU2VuZFN1Y2Nlc3NVUkwiLCJsaW5rU2VuZFN1Y2Nlc3MiLCJsaW5rU2VuZEZhaWxVUkwiLCJsaW5rU2VuZEZhaWwiLCJ2ZXJpZnlFbWFpbFN1Y2Nlc3NVUkwiLCJ2ZXJpZnlFbWFpbFN1Y2Nlc3MiLCJjaG9vc2VQYXNzd29yZFVSTCIsImNob29zZVBhc3N3b3JkIiwicmVxdWVzdFJlc2V0UGFzc3dvcmRVUkwiLCJwYXNzd29yZFJlc2V0U3VjY2Vzc1VSTCIsInBhc3N3b3JkUmVzZXRTdWNjZXNzIiwicGFyc2VGcmFtZVVSTCIsInZlcmlmeUVtYWlsVVJMIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9Db25maWcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gQSBDb25maWcgb2JqZWN0IHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGhvdyBhIHNwZWNpZmljIGFwcCBpc1xuLy8gY29uZmlndXJlZC5cbi8vIG1vdW50IGlzIHRoZSBVUkwgZm9yIHRoZSByb290IG9mIHRoZSBBUEk7IGluY2x1ZGVzIGh0dHAsIGRvbWFpbiwgZXRjLlxuXG5pbXBvcnQgeyBpc0Jvb2xlYW4sIGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBBcHBDYWNoZSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCBEYXRhYmFzZUNvbnRyb2xsZXIgZnJvbSAnLi9Db250cm9sbGVycy9EYXRhYmFzZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgbG9nTGV2ZWxzIGFzIHZhbGlkTG9nTGV2ZWxzIH0gZnJvbSAnLi9Db250cm9sbGVycy9Mb2dnZXJDb250cm9sbGVyJztcbmltcG9ydCB7XG4gIEFjY291bnRMb2Nrb3V0T3B0aW9ucyxcbiAgRmlsZVVwbG9hZE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5T3B0aW9ucyxcbiAgTG9nTGV2ZWxzLFxuICBQYWdlc09wdGlvbnMsXG4gIFBhcnNlU2VydmVyT3B0aW9ucyxcbiAgU2NoZW1hT3B0aW9ucyxcbiAgU2VjdXJpdHlPcHRpb25zLFxufSBmcm9tICcuL09wdGlvbnMvRGVmaW5pdGlvbnMnO1xuXG5mdW5jdGlvbiByZW1vdmVUcmFpbGluZ1NsYXNoKHN0cikge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgaWYgKHN0ci5lbmRzV2l0aCgnLycpKSB7XG4gICAgc3RyID0gc3RyLnN1YnN0cigwLCBzdHIubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmZpZyB7XG4gIHN0YXRpYyBnZXQoYXBwbGljYXRpb25JZDogc3RyaW5nLCBtb3VudDogc3RyaW5nKSB7XG4gICAgY29uc3QgY2FjaGVJbmZvID0gQXBwQ2FjaGUuZ2V0KGFwcGxpY2F0aW9uSWQpO1xuICAgIGlmICghY2FjaGVJbmZvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBDb25maWcoKTtcbiAgICBjb25maWcuYXBwbGljYXRpb25JZCA9IGFwcGxpY2F0aW9uSWQ7XG4gICAgT2JqZWN0LmtleXMoY2FjaGVJbmZvKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoa2V5ID09ICdkYXRhYmFzZUNvbnRyb2xsZXInKSB7XG4gICAgICAgIGNvbmZpZy5kYXRhYmFzZSA9IG5ldyBEYXRhYmFzZUNvbnRyb2xsZXIoY2FjaGVJbmZvLmRhdGFiYXNlQ29udHJvbGxlci5hZGFwdGVyLCBjb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSBjYWNoZUluZm9ba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25maWcubW91bnQgPSByZW1vdmVUcmFpbGluZ1NsYXNoKG1vdW50KTtcbiAgICBjb25maWcuZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0ID0gY29uZmlnLmdlbmVyYXRlU2Vzc2lvbkV4cGlyZXNBdC5iaW5kKGNvbmZpZyk7XG4gICAgY29uZmlnLmdlbmVyYXRlRW1haWxWZXJpZnlUb2tlbkV4cGlyZXNBdCA9IGNvbmZpZy5nZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQuYmluZChcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIHN0YXRpYyBwdXQoc2VydmVyQ29uZmlndXJhdGlvbikge1xuICAgIENvbmZpZy52YWxpZGF0ZShzZXJ2ZXJDb25maWd1cmF0aW9uKTtcbiAgICBBcHBDYWNoZS5wdXQoc2VydmVyQ29uZmlndXJhdGlvbi5hcHBJZCwgc2VydmVyQ29uZmlndXJhdGlvbik7XG4gICAgQ29uZmlnLnNldHVwUGFzc3dvcmRWYWxpZGF0b3Ioc2VydmVyQ29uZmlndXJhdGlvbi5wYXNzd29yZFBvbGljeSk7XG4gICAgcmV0dXJuIHNlcnZlckNvbmZpZ3VyYXRpb247XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGUoe1xuICAgIHZlcmlmeVVzZXJFbWFpbHMsXG4gICAgdXNlckNvbnRyb2xsZXIsXG4gICAgYXBwTmFtZSxcbiAgICBwdWJsaWNTZXJ2ZXJVUkwsXG4gICAgcmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCxcbiAgICBleHBpcmVJbmFjdGl2ZVNlc3Npb25zLFxuICAgIHNlc3Npb25MZW5ndGgsXG4gICAgZGVmYXVsdExpbWl0LFxuICAgIG1heExpbWl0LFxuICAgIGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uLFxuICAgIGFjY291bnRMb2Nrb3V0LFxuICAgIHBhc3N3b3JkUG9saWN5LFxuICAgIG1hc3RlcktleUlwcyxcbiAgICBtYXN0ZXJLZXksXG4gICAgcmVhZE9ubHlNYXN0ZXJLZXksXG4gICAgYWxsb3dIZWFkZXJzLFxuICAgIGlkZW1wb3RlbmN5T3B0aW9ucyxcbiAgICBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkLFxuICAgIGZpbGVVcGxvYWQsXG4gICAgcGFnZXMsXG4gICAgc2VjdXJpdHksXG4gICAgZW5mb3JjZVByaXZhdGVVc2VycyxcbiAgICBzY2hlbWEsXG4gICAgcmVxdWVzdEtleXdvcmREZW55bGlzdCxcbiAgICBhbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuLFxuICAgIGxvZ0xldmVscyxcbiAgICByYXRlTGltaXQsXG4gIH0pIHtcbiAgICBpZiAobWFzdGVyS2V5ID09PSByZWFkT25seU1hc3RlcktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtYXN0ZXJLZXkgYW5kIHJlYWRPbmx5TWFzdGVyS2V5IHNob3VsZCBiZSBkaWZmZXJlbnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbWFpbEFkYXB0ZXIgPSB1c2VyQ29udHJvbGxlci5hZGFwdGVyO1xuICAgIGlmICh2ZXJpZnlVc2VyRW1haWxzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlRW1haWxDb25maWd1cmF0aW9uKHtcbiAgICAgICAgZW1haWxBZGFwdGVyLFxuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBwdWJsaWNTZXJ2ZXJVUkwsXG4gICAgICAgIGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uLFxuICAgICAgICBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy52YWxpZGF0ZUFjY291bnRMb2Nrb3V0UG9saWN5KGFjY291bnRMb2Nrb3V0KTtcbiAgICB0aGlzLnZhbGlkYXRlUGFzc3dvcmRQb2xpY3kocGFzc3dvcmRQb2xpY3kpO1xuICAgIHRoaXMudmFsaWRhdGVGaWxlVXBsb2FkT3B0aW9ucyhmaWxlVXBsb2FkKTtcblxuICAgIGlmICh0eXBlb2YgcmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAncmV2b2tlU2Vzc2lvbk9uUGFzc3dvcmRSZXNldCBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSc7XG4gICAgfVxuXG4gICAgaWYgKHB1YmxpY1NlcnZlclVSTCkge1xuICAgICAgaWYgKCFwdWJsaWNTZXJ2ZXJVUkwuc3RhcnRzV2l0aCgnaHR0cDovLycpICYmICFwdWJsaWNTZXJ2ZXJVUkwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgICB0aHJvdyAncHVibGljU2VydmVyVVJMIHNob3VsZCBiZSBhIHZhbGlkIEhUVFBTIFVSTCBzdGFydGluZyB3aXRoIGh0dHBzOi8vJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWxpZGF0ZVNlc3Npb25Db25maWd1cmF0aW9uKHNlc3Npb25MZW5ndGgsIGV4cGlyZUluYWN0aXZlU2Vzc2lvbnMpO1xuICAgIHRoaXMudmFsaWRhdGVNYXN0ZXJLZXlJcHMobWFzdGVyS2V5SXBzKTtcbiAgICB0aGlzLnZhbGlkYXRlRGVmYXVsdExpbWl0KGRlZmF1bHRMaW1pdCk7XG4gICAgdGhpcy52YWxpZGF0ZU1heExpbWl0KG1heExpbWl0KTtcbiAgICB0aGlzLnZhbGlkYXRlQWxsb3dIZWFkZXJzKGFsbG93SGVhZGVycyk7XG4gICAgdGhpcy52YWxpZGF0ZUlkZW1wb3RlbmN5T3B0aW9ucyhpZGVtcG90ZW5jeU9wdGlvbnMpO1xuICAgIHRoaXMudmFsaWRhdGVQYWdlc09wdGlvbnMocGFnZXMpO1xuICAgIHRoaXMudmFsaWRhdGVTZWN1cml0eU9wdGlvbnMoc2VjdXJpdHkpO1xuICAgIHRoaXMudmFsaWRhdGVTY2hlbWFPcHRpb25zKHNjaGVtYSk7XG4gICAgdGhpcy52YWxpZGF0ZUVuZm9yY2VQcml2YXRlVXNlcnMoZW5mb3JjZVByaXZhdGVVc2Vycyk7XG4gICAgdGhpcy52YWxpZGF0ZUFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4oYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbik7XG4gICAgdGhpcy52YWxpZGF0ZVJlcXVlc3RLZXl3b3JkRGVueWxpc3QocmVxdWVzdEtleXdvcmREZW55bGlzdCk7XG4gICAgdGhpcy52YWxpZGF0ZVJhdGVMaW1pdChyYXRlTGltaXQpO1xuICAgIHRoaXMudmFsaWRhdGVMb2dMZXZlbHMobG9nTGV2ZWxzKTtcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVJlcXVlc3RLZXl3b3JkRGVueWxpc3QocmVxdWVzdEtleXdvcmREZW55bGlzdCkge1xuICAgIGlmIChyZXF1ZXN0S2V5d29yZERlbnlsaXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlcXVlc3RLZXl3b3JkRGVueWxpc3QgPSByZXF1ZXN0S2V5d29yZERlbnlsaXN0LmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShyZXF1ZXN0S2V5d29yZERlbnlsaXN0KSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcmVxdWVzdEtleXdvcmREZW55bGlzdCBtdXN0IGJlIGFuIGFycmF5Lic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlRW5mb3JjZVByaXZhdGVVc2VycyhlbmZvcmNlUHJpdmF0ZVVzZXJzKSB7XG4gICAgaWYgKHR5cGVvZiBlbmZvcmNlUHJpdmF0ZVVzZXJzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIGVuZm9yY2VQcml2YXRlVXNlcnMgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVBbGxvd0V4cGlyZWRBdXRoRGF0YVRva2VuKGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4pIHtcbiAgICBpZiAodHlwZW9mIGFsbG93RXhwaXJlZEF1dGhEYXRhVG9rZW4gIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gYWxsb3dFeHBpcmVkQXV0aERhdGFUb2tlbiBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZVNlY3VyaXR5T3B0aW9ucyhzZWN1cml0eSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoc2VjdXJpdHkpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2VjdXJpdHkgbXVzdCBiZSBhbiBvYmplY3QuJztcbiAgICB9XG4gICAgaWYgKHNlY3VyaXR5LmVuYWJsZUNoZWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlY3VyaXR5LmVuYWJsZUNoZWNrID0gU2VjdXJpdHlPcHRpb25zLmVuYWJsZUNoZWNrLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNlY3VyaXR5LmVuYWJsZUNoZWNrKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2VjdXJpdHkuZW5hYmxlQ2hlY2sgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHNlY3VyaXR5LmVuYWJsZUNoZWNrTG9nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlY3VyaXR5LmVuYWJsZUNoZWNrTG9nID0gU2VjdXJpdHlPcHRpb25zLmVuYWJsZUNoZWNrTG9nLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNlY3VyaXR5LmVuYWJsZUNoZWNrTG9nKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2VjdXJpdHkuZW5hYmxlQ2hlY2tMb2cgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVTY2hlbWFPcHRpb25zKHNjaGVtYTogU2NoZW1hT3B0aW9ucykge1xuICAgIGlmICghc2NoZW1hKSByZXR1cm47XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzY2hlbWEpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2NoZW1hIG11c3QgYmUgYW4gb2JqZWN0Lic7XG4gICAgfVxuICAgIGlmIChzY2hlbWEuZGVmaW5pdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLmRlZmluaXRpb25zID0gU2NoZW1hT3B0aW9ucy5kZWZpbml0aW9ucy5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hLmRlZmluaXRpb25zKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2NoZW1hLmRlZmluaXRpb25zIG11c3QgYmUgYW4gYXJyYXkuJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5zdHJpY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLnN0cmljdCA9IFNjaGVtYU9wdGlvbnMuc3RyaWN0LmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNjaGVtYS5zdHJpY3QpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEuc3RyaWN0IG11c3QgYmUgYSBib29sZWFuLic7XG4gICAgfVxuICAgIGlmIChzY2hlbWEuZGVsZXRlRXh0cmFGaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLmRlbGV0ZUV4dHJhRmllbGRzID0gU2NoZW1hT3B0aW9ucy5kZWxldGVFeHRyYUZpZWxkcy5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzQm9vbGVhbihzY2hlbWEuZGVsZXRlRXh0cmFGaWVsZHMpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEuZGVsZXRlRXh0cmFGaWVsZHMgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5yZWNyZWF0ZU1vZGlmaWVkRmllbGRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNjaGVtYS5yZWNyZWF0ZU1vZGlmaWVkRmllbGRzID0gU2NoZW1hT3B0aW9ucy5yZWNyZWF0ZU1vZGlmaWVkRmllbGRzLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNjaGVtYS5yZWNyZWF0ZU1vZGlmaWVkRmllbGRzKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gc2NoZW1hLnJlY3JlYXRlTW9kaWZpZWRGaWVsZHMgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHNjaGVtYS5sb2NrU2NoZW1hcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEubG9ja1NjaGVtYXMgPSBTY2hlbWFPcHRpb25zLmxvY2tTY2hlbWFzLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNCb29sZWFuKHNjaGVtYS5sb2NrU2NoZW1hcykpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHNjaGVtYS5sb2NrU2NoZW1hcyBtdXN0IGJlIGEgYm9vbGVhbi4nO1xuICAgIH1cbiAgICBpZiAoc2NoZW1hLmJlZm9yZU1pZ3JhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzY2hlbWEuYmVmb3JlTWlncmF0aW9uID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5iZWZvcmVNaWdyYXRpb24gIT09IG51bGwgJiYgdHlwZW9mIHNjaGVtYS5iZWZvcmVNaWdyYXRpb24gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHNjaGVtYS5iZWZvcmVNaWdyYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLic7XG4gICAgfVxuICAgIGlmIChzY2hlbWEuYWZ0ZXJNaWdyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgc2NoZW1hLmFmdGVyTWlncmF0aW9uID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5hZnRlck1pZ3JhdGlvbiAhPT0gbnVsbCAmJiB0eXBlb2Ygc2NoZW1hLmFmdGVyTWlncmF0aW9uICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBzY2hlbWEuYWZ0ZXJNaWdyYXRpb24gbXVzdCBiZSBhIGZ1bmN0aW9uLic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlUGFnZXNPcHRpb25zKHBhZ2VzKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYWdlcykgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcyBtdXN0IGJlIGFuIG9iamVjdC4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMuZW5hYmxlUm91dGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmVuYWJsZVJvdXRlciA9IFBhZ2VzT3B0aW9ucy5lbmFibGVSb3V0ZXIuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4ocGFnZXMuZW5hYmxlUm91dGVyKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMuZW5hYmxlUm91dGVyIG11c3QgYmUgYSBib29sZWFuLic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5lbmFibGVMb2NhbGl6YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFnZXMuZW5hYmxlTG9jYWxpemF0aW9uID0gUGFnZXNPcHRpb25zLmVuYWJsZUxvY2FsaXphdGlvbi5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzQm9vbGVhbihwYWdlcy5lbmFibGVMb2NhbGl6YXRpb24pKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5lbmFibGVMb2NhbGl6YXRpb24gbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLmxvY2FsaXphdGlvbkpzb25QYXRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLmxvY2FsaXphdGlvbkpzb25QYXRoID0gUGFnZXNPcHRpb25zLmxvY2FsaXphdGlvbkpzb25QYXRoLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNTdHJpbmcocGFnZXMubG9jYWxpemF0aW9uSnNvblBhdGgpKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5sb2NhbGl6YXRpb25Kc29uUGF0aCBtdXN0IGJlIGEgc3RyaW5nLic7XG4gICAgfVxuICAgIGlmIChwYWdlcy5sb2NhbGl6YXRpb25GYWxsYmFja0xvY2FsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5sb2NhbGl6YXRpb25GYWxsYmFja0xvY2FsZSA9IFBhZ2VzT3B0aW9ucy5sb2NhbGl6YXRpb25GYWxsYmFja0xvY2FsZS5kZWZhdWx0O1xuICAgIH0gZWxzZSBpZiAoIWlzU3RyaW5nKHBhZ2VzLmxvY2FsaXphdGlvbkZhbGxiYWNrTG9jYWxlKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMubG9jYWxpemF0aW9uRmFsbGJhY2tMb2NhbGUgbXVzdCBiZSBhIHN0cmluZy4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMucGxhY2Vob2xkZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhZ2VzLnBsYWNlaG9sZGVycyA9IFBhZ2VzT3B0aW9ucy5wbGFjZWhvbGRlcnMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBhZ2VzLnBsYWNlaG9sZGVycykgIT09ICdbb2JqZWN0IE9iamVjdF0nICYmXG4gICAgICB0eXBlb2YgcGFnZXMucGxhY2Vob2xkZXJzICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBwYWdlcy5wbGFjZWhvbGRlcnMgbXVzdCBiZSBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbi4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMuZm9yY2VSZWRpcmVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5mb3JjZVJlZGlyZWN0ID0gUGFnZXNPcHRpb25zLmZvcmNlUmVkaXJlY3QuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4ocGFnZXMuZm9yY2VSZWRpcmVjdCkpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLmZvcmNlUmVkaXJlY3QgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLnBhZ2VzUGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5wYWdlc1BhdGggPSBQYWdlc09wdGlvbnMucGFnZXNQYXRoLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNTdHJpbmcocGFnZXMucGFnZXNQYXRoKSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMucGFnZXNQYXRoIG11c3QgYmUgYSBzdHJpbmcuJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLnBhZ2VzRW5kcG9pbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFnZXMucGFnZXNFbmRwb2ludCA9IFBhZ2VzT3B0aW9ucy5wYWdlc0VuZHBvaW50LmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghaXNTdHJpbmcocGFnZXMucGFnZXNFbmRwb2ludCkpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLnBhZ2VzRW5kcG9pbnQgbXVzdCBiZSBhIHN0cmluZy4nO1xuICAgIH1cbiAgICBpZiAocGFnZXMuY3VzdG9tVXJscyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5jdXN0b21VcmxzID0gUGFnZXNPcHRpb25zLmN1c3RvbVVybHMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwYWdlcy5jdXN0b21VcmxzKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHRocm93ICdQYXJzZSBTZXJ2ZXIgb3B0aW9uIHBhZ2VzLmN1c3RvbVVybHMgbXVzdCBiZSBhbiBvYmplY3QuJztcbiAgICB9XG4gICAgaWYgKHBhZ2VzLmN1c3RvbVJvdXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYWdlcy5jdXN0b21Sb3V0ZXMgPSBQYWdlc09wdGlvbnMuY3VzdG9tUm91dGVzLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghKHBhZ2VzLmN1c3RvbVJvdXRlcyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgdGhyb3cgJ1BhcnNlIFNlcnZlciBvcHRpb24gcGFnZXMuY3VzdG9tUm91dGVzIG11c3QgYmUgYW4gYXJyYXkuJztcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVJZGVtcG90ZW5jeU9wdGlvbnMoaWRlbXBvdGVuY3lPcHRpb25zKSB7XG4gICAgaWYgKCFpZGVtcG90ZW5jeU9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGlkZW1wb3RlbmN5T3B0aW9ucy50dGwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWRlbXBvdGVuY3lPcHRpb25zLnR0bCA9IElkZW1wb3RlbmN5T3B0aW9ucy50dGwuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKCFpc05hTihpZGVtcG90ZW5jeU9wdGlvbnMudHRsKSAmJiBpZGVtcG90ZW5jeU9wdGlvbnMudHRsIDw9IDApIHtcbiAgICAgIHRocm93ICdpZGVtcG90ZW5jeSBUVEwgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCBzZWNvbmRzJztcbiAgICB9IGVsc2UgaWYgKGlzTmFOKGlkZW1wb3RlbmN5T3B0aW9ucy50dGwpKSB7XG4gICAgICB0aHJvdyAnaWRlbXBvdGVuY3kgVFRMIHZhbHVlIG11c3QgYmUgYSBudW1iZXInO1xuICAgIH1cbiAgICBpZiAoIWlkZW1wb3RlbmN5T3B0aW9ucy5wYXRocykge1xuICAgICAgaWRlbXBvdGVuY3lPcHRpb25zLnBhdGhzID0gSWRlbXBvdGVuY3lPcHRpb25zLnBhdGhzLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICghKGlkZW1wb3RlbmN5T3B0aW9ucy5wYXRocyBpbnN0YW5jZW9mIEFycmF5KSkge1xuICAgICAgdGhyb3cgJ2lkZW1wb3RlbmN5IHBhdGhzIG11c3QgYmUgb2YgYW4gYXJyYXkgb2Ygc3RyaW5ncyc7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWNjb3VudExvY2tvdXRQb2xpY3koYWNjb3VudExvY2tvdXQpIHtcbiAgICBpZiAoYWNjb3VudExvY2tvdXQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGFjY291bnRMb2Nrb3V0LmR1cmF0aW9uICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICBhY2NvdW50TG9ja291dC5kdXJhdGlvbiA8PSAwIHx8XG4gICAgICAgIGFjY291bnRMb2Nrb3V0LmR1cmF0aW9uID4gOTk5OTlcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAnQWNjb3VudCBsb2Nrb3V0IGR1cmF0aW9uIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCBhbmQgbGVzcyB0aGFuIDEwMDAwMCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIU51bWJlci5pc0ludGVnZXIoYWNjb3VudExvY2tvdXQudGhyZXNob2xkKSB8fFxuICAgICAgICBhY2NvdW50TG9ja291dC50aHJlc2hvbGQgPCAxIHx8XG4gICAgICAgIGFjY291bnRMb2Nrb3V0LnRocmVzaG9sZCA+IDk5OVxuICAgICAgKSB7XG4gICAgICAgIHRocm93ICdBY2NvdW50IGxvY2tvdXQgdGhyZXNob2xkIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwIGFuZCBsZXNzIHRoYW4gMTAwMCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY2NvdW50TG9ja291dC51bmxvY2tPblBhc3N3b3JkUmVzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2NvdW50TG9ja291dC51bmxvY2tPblBhc3N3b3JkUmVzZXQgPSBBY2NvdW50TG9ja291dE9wdGlvbnMudW5sb2NrT25QYXNzd29yZFJlc2V0LmRlZmF1bHQ7XG4gICAgICB9IGVsc2UgaWYgKCFpc0Jvb2xlYW4oYWNjb3VudExvY2tvdXQudW5sb2NrT25QYXNzd29yZFJlc2V0KSkge1xuICAgICAgICB0aHJvdyAnUGFyc2UgU2VydmVyIG9wdGlvbiBhY2NvdW50TG9ja291dC51bmxvY2tPblBhc3N3b3JkUmVzZXQgbXVzdCBiZSBhIGJvb2xlYW4uJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVQYXNzd29yZFBvbGljeShwYXNzd29yZFBvbGljeSkge1xuICAgIGlmIChwYXNzd29yZFBvbGljeSkge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEFnZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0eXBlb2YgcGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2UgIT09ICdudW1iZXInIHx8IHBhc3N3b3JkUG9saWN5Lm1heFBhc3N3b3JkQWdlIDwgMClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRBZ2UgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcic7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodHlwZW9mIHBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgIHBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIDw9IDApXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgJ3Bhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybikge1xuICAgICAgICBpZiAodHlwZW9mIHBhc3N3b3JkUG9saWN5LnZhbGlkYXRvclBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybiA9IG5ldyBSZWdFeHAocGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybik7XG4gICAgICAgIH0gZWxzZSBpZiAoIShwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgICAgIHRocm93ICdwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuIG11c3QgYmUgYSByZWdleCBzdHJpbmcgb3IgUmVnRXhwIG9iamVjdC4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yQ2FsbGJhY2sgJiZcbiAgICAgICAgdHlwZW9mIHBhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrICE9PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgJ3Bhc3N3b3JkUG9saWN5LnZhbGlkYXRvckNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbi4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHBhc3N3b3JkUG9saWN5LmRvTm90QWxsb3dVc2VybmFtZSAmJlxuICAgICAgICB0eXBlb2YgcGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lICE9PSAnYm9vbGVhbidcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncGFzc3dvcmRQb2xpY3kuZG9Ob3RBbGxvd1VzZXJuYW1lIG11c3QgYmUgYSBib29sZWFuIHZhbHVlLic7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5ICYmXG4gICAgICAgICghTnVtYmVyLmlzSW50ZWdlcihwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkpIHx8XG4gICAgICAgICAgcGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IDw9IDAgfHxcbiAgICAgICAgICBwYXNzd29yZFBvbGljeS5tYXhQYXNzd29yZEhpc3RvcnkgPiAyMClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyAncGFzc3dvcmRQb2xpY3kubWF4UGFzc3dvcmRIaXN0b3J5IG11c3QgYmUgYW4gaW50ZWdlciByYW5naW5nIDAgLSAyMCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblJldXNlSWZWYWxpZCAmJlxuICAgICAgICB0eXBlb2YgcGFzc3dvcmRQb2xpY3kucmVzZXRUb2tlblJldXNlSWZWYWxpZCAhPT0gJ2Jvb2xlYW4nXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgJ3Jlc2V0VG9rZW5SZXVzZUlmVmFsaWQgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnO1xuICAgICAgfVxuICAgICAgaWYgKHBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5SZXVzZUlmVmFsaWQgJiYgIXBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICAgIHRocm93ICdZb3UgY2Fubm90IHVzZSByZXNldFRva2VuUmV1c2VJZlZhbGlkIHdpdGhvdXQgcmVzZXRUb2tlblZhbGlkaXR5RHVyYXRpb24nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXNzd29yZFBvbGljeS52YWxpZGF0b3JQYXR0ZXJuIGlzIGNvbmZpZ3VyZWQgdGhlbiBzZXR1cCBhIGNhbGxiYWNrIHRvIHByb2Nlc3MgdGhlIHBhdHRlcm5cbiAgc3RhdGljIHNldHVwUGFzc3dvcmRWYWxpZGF0b3IocGFzc3dvcmRQb2xpY3kpIHtcbiAgICBpZiAocGFzc3dvcmRQb2xpY3kgJiYgcGFzc3dvcmRQb2xpY3kudmFsaWRhdG9yUGF0dGVybikge1xuICAgICAgcGFzc3dvcmRQb2xpY3kucGF0dGVyblZhbGlkYXRvciA9IHZhbHVlID0+IHtcbiAgICAgICAgcmV0dXJuIHBhc3N3b3JkUG9saWN5LnZhbGlkYXRvclBhdHRlcm4udGVzdCh2YWx1ZSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUVtYWlsQ29uZmlndXJhdGlvbih7XG4gICAgZW1haWxBZGFwdGVyLFxuICAgIGFwcE5hbWUsXG4gICAgcHVibGljU2VydmVyVVJMLFxuICAgIGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uLFxuICAgIGVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQsXG4gIH0pIHtcbiAgICBpZiAoIWVtYWlsQWRhcHRlcikge1xuICAgICAgdGhyb3cgJ0FuIGVtYWlsQWRhcHRlciBpcyByZXF1aXJlZCBmb3IgZS1tYWlsIHZlcmlmaWNhdGlvbiBhbmQgcGFzc3dvcmQgcmVzZXRzLic7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYXBwTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93ICdBbiBhcHAgbmFtZSBpcyByZXF1aXJlZCBmb3IgZS1tYWlsIHZlcmlmaWNhdGlvbiBhbmQgcGFzc3dvcmQgcmVzZXRzLic7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcHVibGljU2VydmVyVVJMICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgJ0EgcHVibGljIHNlcnZlciB1cmwgaXMgcmVxdWlyZWQgZm9yIGUtbWFpbCB2ZXJpZmljYXRpb24gYW5kIHBhc3N3b3JkIHJlc2V0cy4nO1xuICAgIH1cbiAgICBpZiAoZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgIGlmIChpc05hTihlbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgJ0VtYWlsIHZlcmlmeSB0b2tlbiB2YWxpZGl0eSBkdXJhdGlvbiBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLic7XG4gICAgICB9IGVsc2UgaWYgKGVtYWlsVmVyaWZ5VG9rZW5WYWxpZGl0eUR1cmF0aW9uIDw9IDApIHtcbiAgICAgICAgdGhyb3cgJ0VtYWlsIHZlcmlmeSB0b2tlbiB2YWxpZGl0eSBkdXJhdGlvbiBtdXN0IGJlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuJztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgJiYgdHlwZW9mIGVtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgJ2VtYWlsVmVyaWZ5VG9rZW5SZXVzZUlmVmFsaWQgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUnO1xuICAgIH1cbiAgICBpZiAoZW1haWxWZXJpZnlUb2tlblJldXNlSWZWYWxpZCAmJiAhZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgIHRocm93ICdZb3UgY2Fubm90IHVzZSBlbWFpbFZlcmlmeVRva2VuUmV1c2VJZlZhbGlkIHdpdGhvdXQgZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUZpbGVVcGxvYWRPcHRpb25zKGZpbGVVcGxvYWQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGZpbGVVcGxvYWQgPT0gbnVsbCB8fCB0eXBlb2YgZmlsZVVwbG9hZCAhPT0gJ29iamVjdCcgfHwgZmlsZVVwbG9hZCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIHRocm93ICdmaWxlVXBsb2FkIG11c3QgYmUgYW4gb2JqZWN0IHZhbHVlLic7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBpZiAoZmlsZVVwbG9hZC5lbmFibGVGb3JBbm9ueW1vdXNVc2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbGVVcGxvYWQuZW5hYmxlRm9yQW5vbnltb3VzVXNlciA9IEZpbGVVcGxvYWRPcHRpb25zLmVuYWJsZUZvckFub255bW91c1VzZXIuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWxlVXBsb2FkLmVuYWJsZUZvckFub255bW91c1VzZXIgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgJ2ZpbGVVcGxvYWQuZW5hYmxlRm9yQW5vbnltb3VzVXNlciBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZS4nO1xuICAgIH1cbiAgICBpZiAoZmlsZVVwbG9hZC5lbmFibGVGb3JQdWJsaWMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlsZVVwbG9hZC5lbmFibGVGb3JQdWJsaWMgPSBGaWxlVXBsb2FkT3B0aW9ucy5lbmFibGVGb3JQdWJsaWMuZGVmYXVsdDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWxlVXBsb2FkLmVuYWJsZUZvclB1YmxpYyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnZmlsZVVwbG9hZC5lbmFibGVGb3JQdWJsaWMgbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUuJztcbiAgICB9XG4gICAgaWYgKGZpbGVVcGxvYWQuZW5hYmxlRm9yQXV0aGVudGljYXRlZFVzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlsZVVwbG9hZC5lbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciA9IEZpbGVVcGxvYWRPcHRpb25zLmVuYWJsZUZvckF1dGhlbnRpY2F0ZWRVc2VyLmRlZmF1bHQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmlsZVVwbG9hZC5lbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyAnZmlsZVVwbG9hZC5lbmFibGVGb3JBdXRoZW50aWNhdGVkVXNlciBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZS4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1hc3RlcktleUlwcyhtYXN0ZXJLZXlJcHMpIHtcbiAgICBmb3IgKGxldCBpcCBvZiBtYXN0ZXJLZXlJcHMpIHtcbiAgICAgIGlmIChpcC5pbmNsdWRlcygnLycpKSB7XG4gICAgICAgIGlwID0gaXAuc3BsaXQoJy8nKVswXTtcbiAgICAgIH1cbiAgICAgIGlmICghbmV0LmlzSVAoaXApKSB7XG4gICAgICAgIHRocm93IGBUaGUgUGFyc2UgU2VydmVyIG9wdGlvbiBcIm1hc3RlcktleUlwc1wiIGNvbnRhaW5zIGFuIGludmFsaWQgSVAgYWRkcmVzcyBcIiR7aXB9XCIuYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbW91bnQoKSB7XG4gICAgdmFyIG1vdW50ID0gdGhpcy5fbW91bnQ7XG4gICAgaWYgKHRoaXMucHVibGljU2VydmVyVVJMKSB7XG4gICAgICBtb3VudCA9IHRoaXMucHVibGljU2VydmVyVVJMO1xuICAgIH1cbiAgICByZXR1cm4gbW91bnQ7XG4gIH1cblxuICBzZXQgbW91bnQobmV3VmFsdWUpIHtcbiAgICB0aGlzLl9tb3VudCA9IG5ld1ZhbHVlO1xuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlU2Vzc2lvbkNvbmZpZ3VyYXRpb24oc2Vzc2lvbkxlbmd0aCwgZXhwaXJlSW5hY3RpdmVTZXNzaW9ucykge1xuICAgIGlmIChleHBpcmVJbmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICBpZiAoaXNOYU4oc2Vzc2lvbkxlbmd0aCkpIHtcbiAgICAgICAgdGhyb3cgJ1Nlc3Npb24gbGVuZ3RoIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuJztcbiAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbkxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHRocm93ICdTZXNzaW9uIGxlbmd0aCBtdXN0IGJlIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDAuJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVEZWZhdWx0TGltaXQoZGVmYXVsdExpbWl0KSB7XG4gICAgaWYgKGRlZmF1bHRMaW1pdCA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0TGltaXQgPSBQYXJzZVNlcnZlck9wdGlvbnMuZGVmYXVsdExpbWl0LmRlZmF1bHQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGVmYXVsdExpbWl0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgJ0RlZmF1bHQgbGltaXQgbXVzdCBiZSBhIG51bWJlci4nO1xuICAgIH1cbiAgICBpZiAoZGVmYXVsdExpbWl0IDw9IDApIHtcbiAgICAgIHRocm93ICdEZWZhdWx0IGxpbWl0IG11c3QgYmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4nO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZU1heExpbWl0KG1heExpbWl0KSB7XG4gICAgaWYgKG1heExpbWl0IDw9IDApIHtcbiAgICAgIHRocm93ICdNYXggbGltaXQgbXVzdCBiZSBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwLic7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlQWxsb3dIZWFkZXJzKGFsbG93SGVhZGVycykge1xuICAgIGlmICghW251bGwsIHVuZGVmaW5lZF0uaW5jbHVkZXMoYWxsb3dIZWFkZXJzKSkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYWxsb3dIZWFkZXJzKSkge1xuICAgICAgICBhbGxvd0hlYWRlcnMuZm9yRWFjaChoZWFkZXIgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgaGVhZGVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgJ0FsbG93IGhlYWRlcnMgbXVzdCBvbmx5IGNvbnRhaW4gc3RyaW5ncyc7XG4gICAgICAgICAgfSBlbHNlIGlmICghaGVhZGVyLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93ICdBbGxvdyBoZWFkZXJzIG11c3Qgbm90IGNvbnRhaW4gZW1wdHkgc3RyaW5ncyc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdBbGxvdyBoZWFkZXJzIG11c3QgYmUgYW4gYXJyYXknO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUxvZ0xldmVscyhsb2dMZXZlbHMpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhMb2dMZXZlbHMpKSB7XG4gICAgICBpZiAobG9nTGV2ZWxzW2tleV0pIHtcbiAgICAgICAgaWYgKHZhbGlkTG9nTGV2ZWxzLmluZGV4T2YobG9nTGV2ZWxzW2tleV0pID09PSAtMSkge1xuICAgICAgICAgIHRocm93IGAnJHtrZXl9JyBtdXN0IGJlIG9uZSBvZiAke0pTT04uc3RyaW5naWZ5KHZhbGlkTG9nTGV2ZWxzKX1gO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dMZXZlbHNba2V5XSA9IExvZ0xldmVsc1trZXldLmRlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHZhbGlkYXRlUmF0ZUxpbWl0KHJhdGVMaW1pdCkge1xuICAgIGlmICghcmF0ZUxpbWl0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyYXRlTGltaXQpICE9PSAnW29iamVjdCBPYmplY3RdJyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkocmF0ZUxpbWl0KVxuICAgICkge1xuICAgICAgdGhyb3cgYHJhdGVMaW1pdCBtdXN0IGJlIGFuIGFycmF5IG9yIG9iamVjdGA7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheS5pc0FycmF5KHJhdGVMaW1pdCkgPyByYXRlTGltaXQgOiBbcmF0ZUxpbWl0XTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9wdGlvbikgIT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICAgIHRocm93IGByYXRlTGltaXQgbXVzdCBiZSBhbiBhcnJheSBvZiBvYmplY3RzYDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb24ucmVxdWVzdFBhdGggPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBgcmF0ZUxpbWl0LnJlcXVlc3RQYXRoIG11c3QgYmUgZGVmaW5lZGA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbi5yZXF1ZXN0UGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgYHJhdGVMaW1pdC5yZXF1ZXN0UGF0aCBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb24ucmVxdWVzdFRpbWVXaW5kb3cgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBgcmF0ZUxpbWl0LnJlcXVlc3RUaW1lV2luZG93IG11c3QgYmUgZGVmaW5lZGA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbi5yZXF1ZXN0VGltZVdpbmRvdyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgYHJhdGVMaW1pdC5yZXF1ZXN0VGltZVdpbmRvdyBtdXN0IGJlIGEgbnVtYmVyYDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb24uaW5jbHVkZUludGVybmFsUmVxdWVzdHMgJiYgdHlwZW9mIG9wdGlvbi5pbmNsdWRlSW50ZXJuYWxSZXF1ZXN0cyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRocm93IGByYXRlTGltaXQuaW5jbHVkZUludGVybmFsUmVxdWVzdHMgbXVzdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbi5yZXF1ZXN0Q291bnQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBgcmF0ZUxpbWl0LnJlcXVlc3RDb3VudCBtdXN0IGJlIGRlZmluZWRgO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24ucmVxdWVzdENvdW50ICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBgcmF0ZUxpbWl0LnJlcXVlc3RDb3VudCBtdXN0IGJlIGEgbnVtYmVyYDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb24uZXJyb3JSZXNwb25zZU1lc3NhZ2UgJiYgdHlwZW9mIG9wdGlvbi5lcnJvclJlc3BvbnNlTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgYHJhdGVMaW1pdC5lcnJvclJlc3BvbnNlTWVzc2FnZSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUVtYWlsVmVyaWZ5VG9rZW5FeHBpcmVzQXQoKSB7XG4gICAgaWYgKCF0aGlzLnZlcmlmeVVzZXJFbWFpbHMgfHwgIXRoaXMuZW1haWxWZXJpZnlUb2tlblZhbGlkaXR5RHVyYXRpb24pIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdGhpcy5lbWFpbFZlcmlmeVRva2VuVmFsaWRpdHlEdXJhdGlvbiAqIDEwMDApO1xuICB9XG5cbiAgZ2VuZXJhdGVQYXNzd29yZFJlc2V0VG9rZW5FeHBpcmVzQXQoKSB7XG4gICAgaWYgKCF0aGlzLnBhc3N3b3JkUG9saWN5IHx8ICF0aGlzLnBhc3N3b3JkUG9saWN5LnJlc2V0VG9rZW5WYWxpZGl0eUR1cmF0aW9uKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIHJldHVybiBuZXcgRGF0ZShub3cuZ2V0VGltZSgpICsgdGhpcy5wYXNzd29yZFBvbGljeS5yZXNldFRva2VuVmFsaWRpdHlEdXJhdGlvbiAqIDEwMDApO1xuICB9XG5cbiAgZ2VuZXJhdGVTZXNzaW9uRXhwaXJlc0F0KCkge1xuICAgIGlmICghdGhpcy5leHBpcmVJbmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB2YXIgbm93ID0gbmV3IERhdGUoKTtcbiAgICByZXR1cm4gbmV3IERhdGUobm93LmdldFRpbWUoKSArIHRoaXMuc2Vzc2lvbkxlbmd0aCAqIDEwMDApO1xuICB9XG5cbiAgZ2V0IGludmFsaWRMaW5rVVJMKCkge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVBhZ2VzLmludmFsaWRMaW5rIHx8IGAke3RoaXMucHVibGljU2VydmVyVVJMfS9hcHBzL2ludmFsaWRfbGluay5odG1sYDtcbiAgfVxuXG4gIGdldCBpbnZhbGlkVmVyaWZpY2F0aW9uTGlua1VSTCgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21QYWdlcy5pbnZhbGlkVmVyaWZpY2F0aW9uTGluayB8fFxuICAgICAgYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9L2FwcHMvaW52YWxpZF92ZXJpZmljYXRpb25fbGluay5odG1sYFxuICAgICk7XG4gIH1cblxuICBnZXQgbGlua1NlbmRTdWNjZXNzVVJMKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmN1c3RvbVBhZ2VzLmxpbmtTZW5kU3VjY2VzcyB8fCBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vYXBwcy9saW5rX3NlbmRfc3VjY2Vzcy5odG1sYFxuICAgICk7XG4gIH1cblxuICBnZXQgbGlua1NlbmRGYWlsVVJMKCkge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVBhZ2VzLmxpbmtTZW5kRmFpbCB8fCBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vYXBwcy9saW5rX3NlbmRfZmFpbC5odG1sYDtcbiAgfVxuXG4gIGdldCB2ZXJpZnlFbWFpbFN1Y2Nlc3NVUkwoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VzdG9tUGFnZXMudmVyaWZ5RW1haWxTdWNjZXNzIHx8XG4gICAgICBgJHt0aGlzLnB1YmxpY1NlcnZlclVSTH0vYXBwcy92ZXJpZnlfZW1haWxfc3VjY2Vzcy5odG1sYFxuICAgICk7XG4gIH1cblxuICBnZXQgY2hvb3NlUGFzc3dvcmRVUkwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUGFnZXMuY2hvb3NlUGFzc3dvcmQgfHwgYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9L2FwcHMvY2hvb3NlX3Bhc3N3b3JkYDtcbiAgfVxuXG4gIGdldCByZXF1ZXN0UmVzZXRQYXNzd29yZFVSTCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9LyR7dGhpcy5wYWdlc0VuZHBvaW50fS8ke3RoaXMuYXBwbGljYXRpb25JZH0vcmVxdWVzdF9wYXNzd29yZF9yZXNldGA7XG4gIH1cblxuICBnZXQgcGFzc3dvcmRSZXNldFN1Y2Nlc3NVUkwoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY3VzdG9tUGFnZXMucGFzc3dvcmRSZXNldFN1Y2Nlc3MgfHxcbiAgICAgIGAke3RoaXMucHVibGljU2VydmVyVVJMfS9hcHBzL3Bhc3N3b3JkX3Jlc2V0X3N1Y2Nlc3MuaHRtbGBcbiAgICApO1xuICB9XG5cbiAgZ2V0IHBhcnNlRnJhbWVVUkwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tUGFnZXMucGFyc2VGcmFtZVVSTDtcbiAgfVxuXG4gIGdldCB2ZXJpZnlFbWFpbFVSTCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5wdWJsaWNTZXJ2ZXJVUkx9LyR7dGhpcy5wYWdlc0VuZHBvaW50fS8ke3RoaXMuYXBwbGljYXRpb25JZH0vdmVyaWZ5X2VtYWlsYDtcbiAgfVxuXG4gIC8vIFRPRE86IFJlbW92ZSB0aGlzIGZ1bmN0aW9uIG9uY2UgUGFnZXNSb3V0ZXIgcmVwbGFjZXMgdGhlIFB1YmxpY0FQSVJvdXRlcjtcbiAgLy8gdGhlIChkZWZhdWx0KSBlbmRwb2ludCBoYXMgdG8gYmUgZGVmaW5lZCBpbiBQYWdlc1JvdXRlciBvbmx5LlxuICBnZXQgcGFnZXNFbmRwb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlcyAmJiB0aGlzLnBhZ2VzLmVuYWJsZVJvdXRlciAmJiB0aGlzLnBhZ2VzLnBhZ2VzRW5kcG9pbnRcbiAgICAgID8gdGhpcy5wYWdlcy5wYWdlc0VuZHBvaW50XG4gICAgICA6ICdhcHBzJztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb25maWc7XG5tb2R1bGUuZXhwb3J0cyA9IENvbmZpZztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUytCO0FBbEIvQjtBQUNBO0FBQ0E7O0FBa0JBLFNBQVNBLG1CQUFtQixDQUFDQyxHQUFHLEVBQUU7RUFDaEMsSUFBSSxDQUFDQSxHQUFHLEVBQUU7SUFDUixPQUFPQSxHQUFHO0VBQ1o7RUFDQSxJQUFJQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUNyQkQsR0FBRyxHQUFHQSxHQUFHLENBQUNFLE1BQU0sQ0FBQyxDQUFDLEVB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