@verdaccio/canary 6.3.2-canary.404363f

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 (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/bin/verdaccio +3 -0
  4. package/bin/verdaccio-canary +3 -0
  5. package/build/api/debug/index.js +28 -0
  6. package/build/api/endpoint/api/dist-tags.js +77 -0
  7. package/build/api/endpoint/api/package.js +103 -0
  8. package/build/api/endpoint/api/ping.js +13 -0
  9. package/build/api/endpoint/api/publish.js +359 -0
  10. package/build/api/endpoint/api/search.js +107 -0
  11. package/build/api/endpoint/api/star.js +73 -0
  12. package/build/api/endpoint/api/stars.js +42 -0
  13. package/build/api/endpoint/api/user.js +84 -0
  14. package/build/api/endpoint/api/v1/profile.js +69 -0
  15. package/build/api/endpoint/api/v1/search.js +181 -0
  16. package/build/api/endpoint/api/v1/token.js +140 -0
  17. package/build/api/endpoint/api/whoami.js +15 -0
  18. package/build/api/endpoint/index.js +58 -0
  19. package/build/api/index.js +105 -0
  20. package/build/api/middleware.js +56 -0
  21. package/build/api/web/api/index.js +31 -0
  22. package/build/api/web/api/package.js +165 -0
  23. package/build/api/web/api/search.js +53 -0
  24. package/build/api/web/api/user.js +70 -0
  25. package/build/api/web/api/utils.js +14 -0
  26. package/build/api/web/html/favicon.ico +0 -0
  27. package/build/api/web/index.js +96 -0
  28. package/build/index.js +76 -0
  29. package/build/lib/auth-utils.js +16 -0
  30. package/build/lib/bootstrap.js +167 -0
  31. package/build/lib/cli/cli.js +26 -0
  32. package/build/lib/cli/commands/info.js +26 -0
  33. package/build/lib/cli/commands/init.js +78 -0
  34. package/build/lib/cli/commands/version.js +17 -0
  35. package/build/lib/cli/utils.js +14 -0
  36. package/build/lib/cli.js +16 -0
  37. package/build/lib/config.js +22 -0
  38. package/build/lib/constants.js +121 -0
  39. package/build/lib/experiments.js +29 -0
  40. package/build/lib/local-storage.js +760 -0
  41. package/build/lib/logger/index.js +21 -0
  42. package/build/lib/metadata-utils.js +39 -0
  43. package/build/lib/run-server.js +122 -0
  44. package/build/lib/storage-utils.js +282 -0
  45. package/build/lib/storage.js +676 -0
  46. package/build/lib/up-storage.js +605 -0
  47. package/build/lib/uplink-util.js +36 -0
  48. package/build/lib/utils.js +265 -0
  49. package/conf/.gitkeep +0 -0
  50. package/index.js +1 -0
  51. package/package.json +156 -0
  52. package/security.txt +5 -0
  53. package/systemd/verdaccio.service +11 -0
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addVersion = addVersion;
7
+ exports.default = publish;
8
+ exports.publishPackage = publishPackage;
9
+ exports.removeTarball = removeTarball;
10
+ exports.unPublishPackage = unPublishPackage;
11
+ exports.uploadPackageTarball = uploadPackageTarball;
12
+ var _debug = _interopRequireDefault(require("debug"));
13
+ var _lodash = _interopRequireDefault(require("lodash"));
14
+ var _mime = _interopRequireDefault(require("mime"));
15
+ var _path = _interopRequireDefault(require("path"));
16
+ var _core = require("@verdaccio/core");
17
+ var _hooks = require("@verdaccio/hooks");
18
+ var _middleware = require("@verdaccio/middleware");
19
+ var _constants = require("../../../lib/constants");
20
+ var _logger = require("../../../lib/logger");
21
+ var _storageUtils = require("../../../lib/storage-utils");
22
+ var _utils = require("../../../lib/utils");
23
+ var _star = _interopRequireDefault(require("./star"));
24
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
+ const debug = (0, _debug.default)('verdaccio:publish');
26
+ function publish(router, auth, storage, config) {
27
+ const can = (0, _middleware.allow)(auth, {
28
+ beforeAll: (params, message) => _logger.logger.trace(params, message),
29
+ afterAll: (params, message) => _logger.logger.trace(params, message)
30
+ });
31
+
32
+ /**
33
+ * Publish a package / update package / un/start a package
34
+ *
35
+ * There are multiples scenarios here to be considered:
36
+ *
37
+ * 1. Publish scenario
38
+ *
39
+ * Publish a package consist of at least 1 step (PUT) with a metadata payload.
40
+ * When a package is published, an _attachment property is present that contains the data
41
+ * of the tarball.
42
+ *
43
+ * Example flow of publish.
44
+ *
45
+ * npm http fetch PUT 201 http://localhost:4873/@scope%2ftest1 9627ms
46
+ npm info lifecycle @scope/test1@1.0.1~publish: @scope/test1@1.0.1
47
+ npm info lifecycle @scope/test1@1.0.1~postpublish: @scope/test1@1.0.1
48
+ + @scope/test1@1.0.1
49
+ npm verb exit [ 0, true ]
50
+ *
51
+ *
52
+ * 2. Unpublish scenario
53
+ *
54
+ * Unpublish consist in 3 steps.
55
+ * 1. Try to fetch metadata -> if it fails, return 404
56
+ * 2. Compute metadata locally (client side) and send a mutate payload excluding the version to be unpublished
57
+ * eg: if metadata reflects 1.0.1, 1.0.2 and 1.0.3, the computed metadata won't include 1.0.3.
58
+ * 3. Once the second step has been successfully finished, delete the tarball.
59
+ *
60
+ * All these steps are consecutive and required, there is no transacions here, if step 3 fails, metadata might
61
+ * get corrupted.
62
+ *
63
+ * Note the unpublish call will suffix in the url a /-rev/14-5d500cfce92f90fd revision number, this not
64
+ * used internally.
65
+ *
66
+ *
67
+ * Example flow of unpublish.
68
+ *
69
+ * npm http fetch GET 200 http://localhost:4873/@scope%2ftest1?write=true 1680ms
70
+ npm http fetch PUT 201 http://localhost:4873/@scope%2ftest1/-rev/14-5d500cfce92f90fd 956606ms attempt #2
71
+ npm http fetch GET 200 http://localhost:4873/@scope%2ftest1?write=true 1601ms
72
+ npm http fetch DELETE 201 http://localhost:4873/@scope%2ftest1/-/test1-1.0.3.tgz/-rev/16-e11c8db282b2d992 19ms
73
+ *
74
+ * 3. Star a package
75
+ *
76
+ * Permissions: start a package depends of the publish and unpublish permissions, there is no specific flag for star or un start.
77
+ * The URL for star is similar to the unpublish (change package format)
78
+ *
79
+ * npm has no enpoint for star a package, rather mutate the metadata and acts as, the difference is the
80
+ * users property which is part of the payload and the body only includes
81
+ *
82
+ * {
83
+ "_id": pkgName,
84
+ "_rev": "3-b0cdaefc9bdb77c8",
85
+ "users": {
86
+ [username]: boolean value (true, false)
87
+ }
88
+ }
89
+ *
90
+ */
91
+ router.put('/:package/:_rev?/:revision?', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, publishPackage(storage, config, auth));
92
+
93
+ /**
94
+ * Un-publishing an entire package.
95
+ *
96
+ * This scenario happens when the first call detect there is only one version remaining
97
+ * in the metadata, then the client decides to DELETE the resource
98
+ * npm http fetch GET 304 http://localhost:4873/@scope%2ftest1?write=true 1076ms (from cache)
99
+ npm http fetch DELETE 201 http://localhost:4873/@scope%2ftest1/-rev/18-d8ebe3020bd4ac9c 22ms
100
+ */
101
+ router.delete('/:package/-rev/*', can('unpublish'), unPublishPackage(storage));
102
+
103
+ // removing a tarball
104
+ router.delete('/:package/-/:filename/-rev/:revision', can('unpublish'), can('publish'), removeTarball(storage));
105
+
106
+ // uploading package tarball
107
+ router.put('/:package/-/:filename/*', can('publish'), (0, _middleware.media)(_constants.HEADERS.OCTET_STREAM), uploadPackageTarball(storage));
108
+
109
+ // only used for development
110
+ if (config._debug) {
111
+ // adding a version
112
+ router.put('/:package/:version/-tag/:tag', can('publish'), (0, _middleware.media)(_mime.default.getType('json')), _middleware.expectJson, addVersion(storage));
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Publish a package
118
+ */
119
+ function publishPackage(storage, config, auth) {
120
+ const starApi = (0, _star.default)(storage);
121
+ return function (req, res, next) {
122
+ const packageName = req.params.package;
123
+ debug('publishing or updating a new version for %o', packageName);
124
+ /**
125
+ * Write tarball of stream data from package clients.
126
+ */
127
+ const createTarball = function (filename, data, cb) {
128
+ const stream = storage.addTarball(packageName, filename);
129
+ stream.on('error', function (err) {
130
+ cb(err);
131
+ });
132
+ stream.on('success', function () {
133
+ cb();
134
+ });
135
+ // this is dumb and memory-consuming, but what choices do we have?
136
+ // flow: we need first refactor this file before decides which type use here
137
+ stream.end(Buffer.from(data.data, 'base64'));
138
+ stream.done();
139
+ };
140
+
141
+ /**
142
+ * Add new package version in storage
143
+ */
144
+ const createVersion = function (version, metadata, cb) {
145
+ storage.addVersion(packageName, version, metadata, null, cb);
146
+ };
147
+
148
+ /**
149
+ * Add new tags in storage
150
+ */
151
+ const addTags = function (tags, cb) {
152
+ storage.mergeTags(packageName, tags, cb);
153
+ };
154
+ const afterChange = function (error, okMessage, metadata) {
155
+ const metadataCopy = {
156
+ ...metadata
157
+ };
158
+ const {
159
+ _attachments,
160
+ versions
161
+ } = metadataCopy;
162
+
163
+ // `npm star` wouldn't have attachments
164
+ // and `npm deprecate` would have attachments as a empty object, i.e {}
165
+ if (_lodash.default.isNil(_attachments) || JSON.stringify(_attachments) === '{}') {
166
+ if (error) {
167
+ return next(error);
168
+ }
169
+ res.status(_constants.HTTP_STATUS.CREATED);
170
+ return next({
171
+ ok: okMessage,
172
+ success: true
173
+ });
174
+ }
175
+
176
+ // npm-registry-client 0.3+ embeds tarball into the json upload
177
+ // https://github.com/isaacs/npm-registry-client/commit/e9fbeb8b67f249394f735c74ef11fe4720d46ca0
178
+ // issue https://github.com/rlidwka/sinopia/issues/31, dealing with it here:
179
+ const isInvalidBodyFormat = (0, _utils.isObject)(_attachments) === false || (0, _utils.hasDiffOneKey)(_attachments) || (0, _utils.isObject)(versions) === false || (0, _utils.hasDiffOneKey)(versions);
180
+ if (isInvalidBodyFormat) {
181
+ // npm is doing something strange again
182
+ // if this happens in normal circumstances, report it as a bug
183
+ _logger.logger.info({
184
+ packageName
185
+ }, `wrong package format on publish a package @{packageName}`);
186
+ return next(_utils.ErrorCode.getBadRequest(_constants.API_ERROR.UNSUPORTED_REGISTRY_CALL));
187
+ }
188
+ if (error && error.status !== _constants.HTTP_STATUS.CONFLICT) {
189
+ return next(error);
190
+ }
191
+
192
+ // at this point document is either created or existed before
193
+ const [firstAttachmentKey] = Object.keys(_attachments);
194
+ createTarball(_path.default.basename(firstAttachmentKey), _attachments[firstAttachmentKey], function (error) {
195
+ if (error) {
196
+ return next(error);
197
+ }
198
+ const versionToPublish = Object.keys(versions)[0];
199
+ const versionMetadataToPublish = versions[versionToPublish];
200
+ versionMetadataToPublish.readme = _lodash.default.isNil(versionMetadataToPublish.readme) === false ? String(versionMetadataToPublish.readme) : '';
201
+ createVersion(versionToPublish, versionMetadataToPublish, function (error) {
202
+ if (error) {
203
+ return next(error);
204
+ }
205
+ addTags(metadataCopy[_constants.DIST_TAGS], async function (error) {
206
+ if (error) {
207
+ return next(error);
208
+ }
209
+ try {
210
+ await (0, _hooks.notify)(metadataCopy, config, req.remote_user, `${metadataCopy.name}@${versionToPublish}`);
211
+ } catch (error) {
212
+ _logger.logger.error({
213
+ error
214
+ }, 'notify batch service has failed: @{error}');
215
+ }
216
+ res.status(_constants.HTTP_STATUS.CREATED);
217
+ return next({
218
+ ok: okMessage,
219
+ success: true
220
+ });
221
+ });
222
+ });
223
+ });
224
+ };
225
+ if ((0, _storageUtils.isPublishablePackage)(req.body) === false && (0, _utils.isObject)(req.body.users)) {
226
+ return starApi(req, res, next);
227
+ }
228
+ try {
229
+ const metadata = _core.validationUtils.normalizeMetadata(req.body, packageName);
230
+ // check _attachments to distinguish publish and deprecate
231
+ if (req.params._rev || (0, _utils.isRelatedToDeprecation)(req.body) && _lodash.default.isEmpty(req.body._attachments)) {
232
+ debug('updating a new version for %o', packageName);
233
+ // we check unpublish permissions, an update is basically remove versions
234
+ const remote = req.remote_user;
235
+ auth.allow_unpublish({
236
+ packageName
237
+ }, remote, error => {
238
+ if (error) {
239
+ _logger.logger.error({
240
+ packageName
241
+ }, `not allowed to unpublish a version for @{packageName}`);
242
+ return next(error);
243
+ }
244
+ storage.changePackage(packageName, metadata, req.params.revision, function (error) {
245
+ afterChange(error, _constants.API_MESSAGE.PKG_CHANGED, metadata);
246
+ });
247
+ });
248
+ } else {
249
+ debug('adding a new version for %o', packageName);
250
+ storage.addPackage(packageName, metadata, function (error) {
251
+ afterChange(error, _constants.API_MESSAGE.PKG_CREATED, metadata);
252
+ });
253
+ }
254
+ } catch (error) {
255
+ debug('error on publish: %s', error.message);
256
+ _logger.logger.error({
257
+ packageName
258
+ }, 'error on publish, bad package data for @{packageName}');
259
+ return next(_utils.ErrorCode.getBadData(_constants.API_ERROR.BAD_PACKAGE_DATA));
260
+ }
261
+ };
262
+ }
263
+
264
+ /**
265
+ * un-publish a package
266
+ */
267
+ function unPublishPackage(storage) {
268
+ return function (req, res, next) {
269
+ const packageName = req.params.package;
270
+ debug('unpublishing %o', packageName);
271
+ storage.removePackage(packageName, function (err) {
272
+ if (err) {
273
+ return next(err);
274
+ }
275
+ res.status(_constants.HTTP_STATUS.CREATED);
276
+ return next({
277
+ ok: _constants.API_MESSAGE.PKG_REMOVED
278
+ });
279
+ });
280
+ };
281
+ }
282
+
283
+ /**
284
+ * Delete tarball
285
+ */
286
+ function removeTarball(storage) {
287
+ return function (req, res, next) {
288
+ const packageName = req.params.package;
289
+ const {
290
+ filename,
291
+ revision
292
+ } = req.params;
293
+ debug('removing a tarball for %o-%o-%o', packageName, filename, revision);
294
+ storage.removeTarball(packageName, filename, revision, function (err) {
295
+ if (err) {
296
+ return next(err);
297
+ }
298
+ res.status(_constants.HTTP_STATUS.CREATED);
299
+ debug('success remove tarball for %o-%o-%o', packageName, filename, revision);
300
+ return next({
301
+ ok: _constants.API_MESSAGE.TARBALL_REMOVED
302
+ });
303
+ });
304
+ };
305
+ }
306
+ /**
307
+ * Adds a new version
308
+ */
309
+ function addVersion(storage) {
310
+ return function (req, res, next) {
311
+ const {
312
+ version,
313
+ tag
314
+ } = req.params;
315
+ const packageName = req.params.package;
316
+ storage.addVersion(packageName, version, req.body, tag, function (error) {
317
+ if (error) {
318
+ return next(error);
319
+ }
320
+ res.status(_constants.HTTP_STATUS.CREATED);
321
+ return next({
322
+ ok: _constants.API_MESSAGE.PKG_PUBLISHED
323
+ });
324
+ });
325
+ };
326
+ }
327
+
328
+ /**
329
+ * uploadPackageTarball
330
+ */
331
+ function uploadPackageTarball(storage) {
332
+ return function (req, res, next) {
333
+ const packageName = req.params.package;
334
+ const stream = storage.addTarball(packageName, req.params.filename);
335
+ req.pipe(stream);
336
+
337
+ // checking if end event came before closing
338
+ let complete = false;
339
+ req.on('end', function () {
340
+ complete = true;
341
+ stream.done();
342
+ });
343
+ req.on('close', function () {
344
+ if (!complete) {
345
+ stream.abort();
346
+ }
347
+ });
348
+ stream.on('error', function (err) {
349
+ return res.locals.report_error(err);
350
+ });
351
+ stream.on('success', function () {
352
+ res.status(_constants.HTTP_STATUS.CREATED);
353
+ return next({
354
+ ok: _constants.API_MESSAGE.TARBALL_UPLOADED
355
+ });
356
+ });
357
+ };
358
+ }
359
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2Rhc2giLCJfbWltZSIsIl9wYXRoIiwiX2NvcmUiLCJfaG9va3MiLCJfbWlkZGxld2FyZSIsIl9jb25zdGFudHMiLCJfbG9nZ2VyIiwiX3N0b3JhZ2VVdGlscyIsIl91dGlscyIsIl9zdGFyIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZGVidWciLCJidWlsZERlYnVnIiwicHVibGlzaCIsInJvdXRlciIsImF1dGgiLCJzdG9yYWdlIiwiY29uZmlnIiwiY2FuIiwiYWxsb3ciLCJiZWZvcmVBbGwiLCJwYXJhbXMiLCJtZXNzYWdlIiwibG9nZ2VyIiwidHJhY2UiLCJhZnRlckFsbCIsInB1dCIsIm1lZGlhIiwibWltZSIsImdldFR5cGUiLCJleHBlY3RKc29uIiwicHVibGlzaFBhY2thZ2UiLCJkZWxldGUiLCJ1blB1Ymxpc2hQYWNrYWdlIiwicmVtb3ZlVGFyYmFsbCIsIkhFQURFUlMiLCJPQ1RFVF9TVFJFQU0iLCJ1cGxvYWRQYWNrYWdlVGFyYmFsbCIsImFkZFZlcnNpb24iLCJzdGFyQXBpIiwic3RhciIsInJlcSIsInJlcyIsIm5leHQiLCJwYWNrYWdlTmFtZSIsInBhY2thZ2UiLCJjcmVhdGVUYXJiYWxsIiwiZmlsZW5hbWUiLCJkYXRhIiwiY2IiLCJzdHJlYW0iLCJhZGRUYXJiYWxsIiwib24iLCJlcnIiLCJlbmQiLCJCdWZmZXIiLCJmcm9tIiwiZG9uZSIsImNyZWF0ZVZlcnNpb24iLCJ2ZXJzaW9uIiwibWV0YWRhdGEiLCJhZGRUYWdzIiwidGFncyIsIm1lcmdlVGFncyIsImFmdGVyQ2hhbmdlIiwiZXJyb3IiLCJva01lc3NhZ2UiLCJtZXRhZGF0YUNvcHkiLCJfYXR0YWNobWVudHMiLCJ2ZXJzaW9ucyIsIl8iLCJpc05pbCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdGF0dXMiLCJIVFRQX1NUQVRVUyIsIkNSRUFURUQiLCJvayIsInN1Y2Nlc3MiLCJpc0ludmFsaWRCb2R5Rm9ybWF0IiwiaXNPYmplY3QiLCJoYXNEaWZmT25lS2V5IiwiaW5mbyIsIkVycm9yQ29kZSIsImdldEJhZFJlcXVlc3QiLCJBUElfRVJST1IiLCJVTlNVUE9SVEVEX1JFR0lTVFJZX0NBTEwiLCJDT05GTElDVCIsImZpcnN0QXR0YWNobWVudEtleSIsIk9iamVjdCIsImtleXMiLCJQYXRoIiwiYmFzZW5hbWUiLCJ2ZXJzaW9uVG9QdWJsaXNoIiwidmVyc2lvbk1ldGFkYXRhVG9QdWJsaXNoIiwicmVhZG1lIiwiU3RyaW5nIiwiRElTVF9UQUdTIiwibm90aWZ5IiwicmVtb3RlX3VzZXIiLCJuYW1lIiwiaXNQdWJsaXNoYWJsZVBhY2thZ2UiLCJib2R5IiwidXNlcnMiLCJ2YWxpZGF0aW9uVXRpbHMiLCJub3JtYWxpemVNZXRhZGF0YSIsIl9yZXYiLCJpc1JlbGF0ZWRUb0RlcHJlY2F0aW9uIiwiaXNFbXB0eSIsInJlbW90ZSIsImFsbG93X3VucHVibGlzaCIsImNoYW5nZVBhY2thZ2UiLCJyZXZpc2lvbiIsIkFQSV9NRVNTQUdFIiwiUEtHX0NIQU5HRUQiLCJhZGRQYWNrYWdlIiwiUEtHX0NSRUFURUQiLCJnZXRCYWREYXRhIiwiQkFEX1BBQ0tBR0VfREFUQSIsInJlbW92ZVBhY2thZ2UiLCJQS0dfUkVNT1ZFRCIsIlRBUkJBTExfUkVNT1ZFRCIsInRhZyIsIlBLR19QVUJMSVNIRUQiLCJwaXBlIiwiY29tcGxldGUiLCJhYm9ydCIsImxvY2FscyIsInJlcG9ydF9lcnJvciIsIlRBUkJBTExfVVBMT0FERUQiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL2VuZHBvaW50L2FwaS9wdWJsaXNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBidWlsZERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB0eXBlIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1pbWUgZnJvbSAnbWltZSc7XG5pbXBvcnQgUGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSAnQHZlcmRhY2Npby9hdXRoJztcbmltcG9ydCB7IHZhbGlkYXRpb25VdGlscyB9IGZyb20gJ0B2ZXJkYWNjaW8vY29yZSc7XG5pbXBvcnQgeyBub3RpZnkgfSBmcm9tICdAdmVyZGFjY2lvL2hvb2tzJztcbmltcG9ydCB7IGFsbG93LCBleHBlY3RKc29uLCBtZWRpYSB9IGZyb20gJ0B2ZXJkYWNjaW8vbWlkZGxld2FyZSc7XG5pbXBvcnQgdHlwZSB7IENhbGxiYWNrLCBDb25maWcsIE1lcmdlVGFncywgUGFja2FnZSwgVmVyc2lvbiB9IGZyb20gJ0B2ZXJkYWNjaW8vdHlwZXMnO1xuXG5pbXBvcnQgeyBBUElfRVJST1IsIEFQSV9NRVNTQUdFLCBESVNUX1RBR1MsIEhFQURFUlMsIEhUVFBfU1RBVFVTIH0gZnJvbSAnLi4vLi4vLi4vbGliL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi8uLi9saWIvbG9nZ2VyJztcbmltcG9ydCB0eXBlIFN0b3JhZ2UgZnJvbSAnLi4vLi4vLi4vbGliL3N0b3JhZ2UnO1xuaW1wb3J0IHsgaXNQdWJsaXNoYWJsZVBhY2thZ2UgfSBmcm9tICcuLi8uLi8uLi9saWIvc3RvcmFnZS11dGlscyc7XG5pbXBvcnQgeyBFcnJvckNvZGUsIGhhc0RpZmZPbmVLZXksIGlzT2JqZWN0LCBpc1JlbGF0ZWRUb0RlcHJlY2F0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbGliL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgJE5leHRGdW5jdGlvblZlciwgJFJlcXVlc3RFeHRlbmQsICRSZXNwb25zZUV4dGVuZCB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCBzdGFyIGZyb20gJy4vc3Rhcic7XG5cbmNvbnN0IGRlYnVnID0gYnVpbGREZWJ1ZygndmVyZGFjY2lvOnB1Ymxpc2gnKTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcHVibGlzaChcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGF1dGg6IEF1dGgsXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIGNvbmZpZzogQ29uZmlnXG4pOiB2b2lkIHtcbiAgY29uc3QgY2FuID0gYWxsb3coYXV0aCwge1xuICAgIGJlZm9yZUFsbDogKHBhcmFtcywgbWVzc2FnZSkgPT4gbG9nZ2VyLnRyYWNlKHBhcmFtcywgbWVzc2FnZSksXG4gICAgYWZ0ZXJBbGw6IChwYXJhbXMsIG1lc3NhZ2UpID0+IGxvZ2dlci50cmFjZShwYXJhbXMsIG1lc3NhZ2UpLFxuICB9KTtcblxuICAvKipcbiAgICogUHVibGlzaCBhIHBhY2thZ2UgLyB1cGRhdGUgcGFja2FnZSAvIHVuL3N0YXJ0IGEgcGFja2FnZVxuICAgKlxuICAgKiBUaGVyZSBhcmUgbXVsdGlwbGVzIHNjZW5hcmlvcyBoZXJlIHRvIGJlIGNvbnNpZGVyZWQ6XG4gICAqXG4gICAqIDEuIFB1Ymxpc2ggc2NlbmFyaW9cbiAgICpcbiAgICogUHVibGlzaCBhIHBhY2thZ2UgY29uc2lzdCBvZiBhdCBsZWFzdCAxIHN0ZXAgKFBVVCkgd2l0aCBhIG1ldGFkYXRhIHBheWxvYWQuXG4gICAqIFdoZW4gYSBwYWNrYWdlIGlzIHB1Ymxpc2hlZCwgYW4gX2F0dGFjaG1lbnQgcHJvcGVydHkgaXMgcHJlc2VudCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhXG4gICAqIG9mIHRoZSB0YXJiYWxsLlxuICAgKlxuICAgKiBFeGFtcGxlIGZsb3cgb2YgcHVibGlzaC5cbiAgICpcbiAgICogIG5wbSBodHRwIGZldGNoIFBVVCAyMDEgaHR0cDovL2xvY2FsaG9zdDo0ODczL0BzY29wZSUyZnRlc3QxIDk2Mjdtc1xuICAgICAgbnBtIGluZm8gbGlmZWN5Y2xlIEBzY29wZS90ZXN0MUAxLjAuMX5wdWJsaXNoOiBAc2NvcGUvdGVzdDFAMS4wLjFcbiAgICAgIG5wbSBpbmZvIGxpZmVjeWNsZSBAc2NvcGUvdGVzdDFAMS4wLjF+cG9zdHB1Ymxpc2g6IEBzY29wZS90ZXN0MUAxLjAuMVxuICAgICAgKyBAc2NvcGUvdGVzdDFAMS4wLjFcbiAgICAgIG5wbSB2ZXJiIGV4aXQgWyAwLCB0cnVlIF1cbiAgICpcbiAgICpcbiAgICogMi4gVW5wdWJsaXNoIHNjZW5hcmlvXG4gICAqXG4gICAqIFVucHVibGlzaCBjb25zaXN0IGluIDMgc3RlcHMuXG4gICAqICAxLiBUcnkgdG8gZmV0Y2ggIG1ldGFkYXRhIC0+IGlmIGl0IGZhaWxzLCByZXR1cm4gNDA0XG4gICAqICAyLiBDb21wdXRlIG1ldGFkYXRhIGxvY2FsbHkgKGNsaWVudCBzaWRlKSBhbmQgc2VuZCBhIG11dGF0ZSBwYXlsb2FkIGV4Y2x1ZGluZyB0aGUgdmVyc2lvbiB0byBiZSB1bnB1Ymxpc2hlZFxuICAgKiAgICBlZzogaWYgbWV0YWRhdGEgcmVmbGVjdHMgMS4wLjEsIDEuMC4yIGFuZCAxLjAuMywgdGhlIGNvbXB1dGVkIG1ldGFkYXRhIHdvbid0IGluY2x1ZGUgMS4wLjMuXG4gICAqICAzLiBPbmNlIHRoZSBzZWNvbmQgc3RlcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIGRlbGV0ZSB0aGUgdGFyYmFsbC5cbiAgICpcbiAgICogIEFsbCB0aGVzZSBzdGVwcyBhcmUgY29uc2VjdXRpdmUgYW5kIHJlcXVpcmVkLCB0aGVyZSBpcyBubyB0cmFuc2FjaW9ucyBoZXJlLCBpZiBzdGVwIDMgZmFpbHMsIG1ldGFkYXRhIG1pZ2h0XG4gICAqICBnZXQgY29ycnVwdGVkLlxuICAgKlxuICAgKiAgTm90ZSB0aGUgdW5wdWJsaXNoIGNhbGwgd2lsbCBzdWZmaXggaW4gdGhlIHVybCBhIC8tcmV2LzE0LTVkNTAwY2ZjZTkyZjkwZmQgcmV2aXNpb24gbnVtYmVyLCB0aGlzIG5vdFxuICAgKiAgdXNlZCBpbnRlcm5hbGx5LlxuICAgKlxuICAgKlxuICAgKiBFeGFtcGxlIGZsb3cgb2YgdW5wdWJsaXNoLlxuICAgKlxuICAgKiBucG0gaHR0cCBmZXRjaCBHRVQgMjAwIGh0dHA6Ly9sb2NhbGhvc3Q6NDg3My9Ac2NvcGUlMmZ0ZXN0MT93cml0ZT10cnVlIDE2ODBtc1xuICAgICBucG0gaHR0cCBmZXRjaCBQVVQgMjAxIGh0dHA6Ly9sb2NhbGhvc3Q6NDg3My9Ac2NvcGUlMmZ0ZXN0MS8tcmV2LzE0LTVkNTAwY2ZjZTkyZjkwZmQgOTU2NjA2bXMgYXR0ZW1wdCAjMlxuICAgICBucG0gaHR0cCBmZXRjaCBHRVQgMjAwIGh0dHA6Ly9sb2NhbGhvc3Q6NDg3My9Ac2NvcGUlMmZ0ZXN0MT93cml0ZT10cnVlIDE2MDFtc1xuICAgICBucG0gaHR0cCBmZXRjaCBERUxFVEUgMjAxIGh0dHA6Ly9sb2NhbGhvc3Q6NDg3My9Ac2NvcGUlMmZ0ZXN0MS8tL3Rlc3QxLTEuMC4zLnRnei8tcmV2LzE2LWUxMWM4ZGIyODJiMmQ5OTIgMTltc1xuICAgKlxuICAgKiAzLiBTdGFyIGEgcGFja2FnZVxuICAgKlxuICAgKiBQZXJtaXNzaW9uczogc3RhcnQgYSBwYWNrYWdlIGRlcGVuZHMgb2YgdGhlIHB1Ymxpc2ggYW5kIHVucHVibGlzaCBwZXJtaXNzaW9ucywgdGhlcmUgaXMgbm8gc3BlY2lmaWMgZmxhZyBmb3Igc3RhciBvciB1biBzdGFydC5cbiAgICogVGhlIFVSTCBmb3Igc3RhciBpcyBzaW1pbGFyIHRvIHRoZSB1bnB1Ymxpc2ggKGNoYW5nZSBwYWNrYWdlIGZvcm1hdClcbiAgICpcbiAgICogbnBtIGhhcyBubyBlbnBvaW50IGZvciBzdGFyIGEgcGFja2FnZSwgcmF0aGVyIG11dGF0ZSB0aGUgbWV0YWRhdGEgYW5kIGFjdHMgYXMsIHRoZSBkaWZmZXJlbmNlIGlzIHRoZVxuICAgKiB1c2VycyBwcm9wZXJ0eSB3aGljaCBpcyBwYXJ0IG9mIHRoZSBwYXlsb2FkIGFuZCB0aGUgYm9keSBvbmx5IGluY2x1ZGVzXG4gICAqXG4gICAqIHtcblx0XHQgIFwiX2lkXCI6IHBrZ05hbWUsXG5cdCAgXHRcIl9yZXZcIjogXCIzLWIwY2RhZWZjOWJkYjc3YzhcIixcblx0XHQgIFwidXNlcnNcIjoge1xuXHRcdCAgICBbdXNlcm5hbWVdOiBib29sZWFuIHZhbHVlICh0cnVlLCBmYWxzZSlcblx0XHQgIH1cblx0fVxuICAgKlxuICAgKi9cbiAgcm91dGVyLnB1dChcbiAgICAnLzpwYWNrYWdlLzpfcmV2Py86cmV2aXNpb24/JyxcbiAgICBjYW4oJ3B1Ymxpc2gnKSxcbiAgICBtZWRpYShtaW1lLmdldFR5cGUoJ2pzb24nKSksXG4gICAgZXhwZWN0SnNvbixcbiAgICBwdWJsaXNoUGFja2FnZShzdG9yYWdlLCBjb25maWcsIGF1dGgpXG4gICk7XG5cbiAgLyoqXG4gICAqIFVuLXB1Ymxpc2hpbmcgYW4gZW50aXJlIHBhY2thZ2UuXG4gICAqXG4gICAqIFRoaXMgc2NlbmFyaW8gaGFwcGVucyB3aGVuIHRoZSBmaXJzdCBjYWxsIGRldGVjdCB0aGVyZSBpcyBvbmx5IG9uZSB2ZXJzaW9uIHJlbWFpbmluZ1xuICAgKiBpbiB0aGUgbWV0YWRhdGEsIHRoZW4gdGhlIGNsaWVudCBkZWNpZGVzIHRvIERFTEVURSB0aGUgcmVzb3VyY2VcbiAgICogbnBtIGh0dHAgZmV0Y2ggR0VUIDMwNCBodHRwOi8vbG9jYWxob3N0OjQ4NzMvQHNjb3BlJTJmdGVzdDE/d3JpdGU9dHJ1ZSAxMDc2bXMgKGZyb20gY2FjaGUpXG4gICAgIG5wbSBodHRwIGZldGNoIERFTEVURSAyMDEgaHR0cDovL2xvY2FsaG9zdDo0ODczL0BzY29wZSUyZnRlc3QxLy1yZXYvMTgtZDhlYmUzMDIwYmQ0YWM5YyAyMm1zXG4gICAqL1xuICByb3V0ZXIuZGVsZXRlKCcvOnBhY2thZ2UvLXJldi8qJywgY2FuKCd1bnB1Ymxpc2gnKSwgdW5QdWJsaXNoUGFja2FnZShzdG9yYWdlKSk7XG5cbiAgLy8gcmVtb3ZpbmcgYSB0YXJiYWxsXG4gIHJvdXRlci5kZWxldGUoXG4gICAgJy86cGFja2FnZS8tLzpmaWxlbmFtZS8tcmV2LzpyZXZpc2lvbicsXG4gICAgY2FuKCd1bnB1Ymxpc2gnKSxcbiAgICBjYW4oJ3B1Ymxpc2gnKSxcbiAgICByZW1vdmVUYXJiYWxsKHN0b3JhZ2UpXG4gICk7XG5cbiAgLy8gdXBsb2FkaW5nIHBhY2thZ2UgdGFyYmFsbFxuICByb3V0ZXIucHV0KFxuICAgICcvOnBhY2thZ2UvLS86ZmlsZW5hbWUvKicsXG4gICAgY2FuKCdwdWJsaXNoJyksXG4gICAgbWVkaWEoSEVBREVSUy5PQ1RFVF9TVFJFQU0pLFxuICAgIHVwbG9hZFBhY2thZ2VUYXJiYWxsKHN0b3JhZ2UpXG4gICk7XG5cbiAgLy8gb25seSB1c2VkIGZvciBkZXZlbG9wbWVudFxuICBpZiAoY29uZmlnLl9kZWJ1Zykge1xuICAgIC8vIGFkZGluZyBhIHZlcnNpb25cbiAgICByb3V0ZXIucHV0KFxuICAgICAgJy86cGFja2FnZS86dmVyc2lvbi8tdGFnLzp0YWcnLFxuICAgICAgY2FuKCdwdWJsaXNoJyksXG4gICAgICBtZWRpYShtaW1lLmdldFR5cGUoJ2pzb24nKSksXG4gICAgICBleHBlY3RKc29uLFxuICAgICAgYWRkVmVyc2lvbihzdG9yYWdlKVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoIGEgcGFja2FnZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFBhY2thZ2Uoc3RvcmFnZTogU3RvcmFnZSwgY29uZmlnOiBDb25maWcsIGF1dGg6IEF1dGgpOiBhbnkge1xuICBjb25zdCBzdGFyQXBpID0gc3RhcihzdG9yYWdlKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXE6ICRSZXF1ZXN0RXh0ZW5kLCByZXM6ICRSZXNwb25zZUV4dGVuZCwgbmV4dDogJE5leHRGdW5jdGlvblZlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gcmVxLnBhcmFtcy5wYWNrYWdlO1xuICAgIGRlYnVnKCdwdWJsaXNoaW5nIG9yIHVwZGF0aW5nIGEgbmV3IHZlcnNpb24gZm9yICVvJywgcGFja2FnZU5hbWUpO1xuICAgIC8qKlxuICAgICAqIFdyaXRlIHRhcmJhbGwgb2Ygc3RyZWFtIGRhdGEgZnJvbSBwYWNrYWdlIGNsaWVudHMuXG4gICAgICovXG4gICAgY29uc3QgY3JlYXRlVGFyYmFsbCA9IGZ1bmN0aW9uIChmaWxlbmFtZTogc3RyaW5nLCBkYXRhLCBjYjogQ2FsbGJhY2spOiB2b2lkIHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IHN0b3JhZ2UuYWRkVGFyYmFsbChwYWNrYWdlTmFtZSwgZmlsZW5hbWUpO1xuICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgY2IoZXJyKTtcbiAgICAgIH0pO1xuICAgICAgc3RyZWFtLm9uKCdzdWNjZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjYigpO1xuICAgICAgfSk7XG4gICAgICAvLyB0aGlzIGlzIGR1bWIgYW5kIG1lbW9yeS1jb25zdW1pbmcsIGJ1dCB3aGF0IGNob2ljZXMgZG8gd2UgaGF2ZT9cbiAgICAgIC8vIGZsb3c6IHdlIG5lZWQgZmlyc3QgcmVmYWN0b3IgdGhpcyBmaWxlIGJlZm9yZSBkZWNpZGVzIHdoaWNoIHR5cGUgdXNlIGhlcmVcbiAgICAgIHN0cmVhbS5lbmQoQnVmZmVyLmZyb20oZGF0YS5kYXRhLCAnYmFzZTY0JykpO1xuICAgICAgc3RyZWFtLmRvbmUoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIG5ldyBwYWNrYWdlIHZlcnNpb24gaW4gc3RvcmFnZVxuICAgICAqL1xuICAgIGNvbnN0IGNyZWF0ZVZlcnNpb24gPSBmdW5jdGlvbiAodmVyc2lvbjogc3RyaW5nLCBtZXRhZGF0YTogVmVyc2lvbiwgY2I6IENhbGxiYWNrKTogdm9pZCB7XG4gICAgICBzdG9yYWdlLmFkZFZlcnNpb24ocGFja2FnZU5hbWUsIHZlcnNpb24sIG1ldGFkYXRhLCBudWxsLCBjYik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZCBuZXcgdGFncyBpbiBzdG9yYWdlXG4gICAgICovXG4gICAgY29uc3QgYWRkVGFncyA9IGZ1bmN0aW9uICh0YWdzOiBNZXJnZVRhZ3MsIGNiOiBDYWxsYmFjayk6IHZvaWQge1xuICAgICAgc3RvcmFnZS5tZXJnZVRhZ3MocGFja2FnZU5hbWUsIHRhZ3MsIGNiKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWZ0ZXJDaGFuZ2UgPSBmdW5jdGlvbiAoZXJyb3IsIG9rTWVzc2FnZSwgbWV0YWRhdGEpOiB2b2lkIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhQ29weTogUGFja2FnZSA9IHsgLi4ubWV0YWRhdGEgfTtcblxuICAgICAgY29uc3QgeyBfYXR0YWNobWVudHMsIHZlcnNpb25zIH0gPSBtZXRhZGF0YUNvcHk7XG5cbiAgICAgIC8vIGBucG0gc3RhcmAgd291bGRuJ3QgaGF2ZSBhdHRhY2htZW50c1xuICAgICAgLy8gYW5kIGBucG0gZGVwcmVjYXRlYCB3b3VsZCBoYXZlIGF0dGFjaG1lbnRzIGFzIGEgZW1wdHkgb2JqZWN0LCBpLmUge31cbiAgICAgIGlmIChfLmlzTmlsKF9hdHRhY2htZW50cykgfHwgSlNPTi5zdHJpbmdpZnkoX2F0dGFjaG1lbnRzKSA9PT0gJ3t9Jykge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gbmV4dChlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmVzLnN0YXR1cyhIVFRQX1NUQVRVUy5DUkVBVEVEKTtcbiAgICAgICAgcmV0dXJuIG5leHQoe1xuICAgICAgICAgIG9rOiBva01lc3NhZ2UsXG4gICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIG5wbS1yZWdpc3RyeS1jbGllbnQgMC4zKyBlbWJlZHMgdGFyYmFsbCBpbnRvIHRoZSBqc29uIHVwbG9hZFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9ucG0tcmVnaXN0cnktY2xpZW50L2NvbW1pdC9lOWZiZWI4YjY3ZjI0OTM5NGY3MzVjNzRlZjExZmU0NzIwZDQ2Y2EwXG4gICAgICAvLyBpc3N1ZSBodHRwczovL2dpdGh1Yi5jb20vcmxpZHdrYS9zaW5vcGlhL2lzc3Vlcy8zMSwgZGVhbGluZyB3aXRoIGl0IGhlcmU6XG4gICAgICBjb25zdCBpc0ludmFsaWRCb2R5Rm9ybWF0ID1cbiAgICAgICAgaXNPYmplY3QoX2F0dGFjaG1lbnRzKSA9PT0gZmFsc2UgfHxcbiAgICAgICAgaGFzRGlmZk9uZUtleShfYXR0YWNobWVudHMpIHx8XG4gICAgICAgIGlzT2JqZWN0KHZlcnNpb25zKSA9PT0gZmFsc2UgfHxcbiAgICAgICAgaGFzRGlmZk9uZUtleSh2ZXJzaW9ucyk7XG5cbiAgICAgIGlmIChpc0ludmFsaWRCb2R5Rm9ybWF0KSB7XG4gICAgICAgIC8vIG5wbSBpcyBkb2luZyBzb21ldGhpbmcgc3RyYW5nZSBhZ2FpblxuICAgICAgICAvLyBpZiB0aGlzIGhhcHBlbnMgaW4gbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHJlcG9ydCBpdCBhcyBhIGJ1Z1xuICAgICAgICBsb2dnZXIuaW5mbyh7IHBhY2thZ2VOYW1lIH0sIGB3cm9uZyBwYWNrYWdlIGZvcm1hdCBvbiBwdWJsaXNoIGEgcGFja2FnZSBAe3BhY2thZ2VOYW1lfWApO1xuICAgICAgICByZXR1cm4gbmV4dChFcnJvckNvZGUuZ2V0QmFkUmVxdWVzdChBUElfRVJST1IuVU5TVVBPUlRFRF9SRUdJU1RSWV9DQUxMKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvciAmJiBlcnJvci5zdGF0dXMgIT09IEhUVFBfU1RBVFVTLkNPTkZMSUNUKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCBkb2N1bWVudCBpcyBlaXRoZXIgY3JlYXRlZCBvciBleGlzdGVkIGJlZm9yZVxuICAgICAgY29uc3QgW2ZpcnN0QXR0YWNobWVudEtleV0gPSBPYmplY3Qua2V5cyhfYXR0YWNobWVudHMpO1xuXG4gICAgICBjcmVhdGVUYXJiYWxsKFxuICAgICAgICBQYXRoLmJhc2VuYW1lKGZpcnN0QXR0YWNobWVudEtleSksXG4gICAgICAgIF9hdHRhY2htZW50c1tmaXJzdEF0dGFjaG1lbnRLZXldLFxuICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB2ZXJzaW9uVG9QdWJsaXNoID0gT2JqZWN0LmtleXModmVyc2lvbnMpWzBdO1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25NZXRhZGF0YVRvUHVibGlzaCA9IHZlcnNpb25zW3ZlcnNpb25Ub1B1Ymxpc2hdO1xuXG4gICAgICAgICAgdmVyc2lvbk1ldGFkYXRhVG9QdWJsaXNoLnJlYWRtZSA9XG4gICAgICAgICAgICBfLmlzTmlsKHZlcnNpb25NZXRhZGF0YVRvUHVibGlzaC5yZWFkbWUpID09PSBmYWxzZVxuICAgICAgICAgICAgICA/IFN0cmluZyh2ZXJzaW9uTWV0YWRhdGFUb1B1Ymxpc2gucmVhZG1lKVxuICAgICAgICAgICAgICA6ICcnO1xuXG4gICAgICAgICAgY3JlYXRlVmVyc2lvbih2ZXJzaW9uVG9QdWJsaXNoLCB2ZXJzaW9uTWV0YWRhdGFUb1B1Ymxpc2gsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYWRkVGFncyhtZXRhZGF0YUNvcHlbRElTVF9UQUdTXSwgYXN5bmMgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbm90aWZ5KFxuICAgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LFxuICAgICAgICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgICAgICAgcmVxLnJlbW90ZV91c2VyLFxuICAgICAgICAgICAgICAgICAgYCR7bWV0YWRhdGFDb3B5Lm5hbWV9QCR7dmVyc2lvblRvUHVibGlzaH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoeyBlcnJvciB9LCAnbm90aWZ5IGJhdGNoIHNlcnZpY2UgaGFzIGZhaWxlZDogQHtlcnJvcn0nKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJlcy5zdGF0dXMoSFRUUF9TVEFUVVMuQ1JFQVRFRCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KHsgb2s6IG9rTWVzc2FnZSwgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBpZiAoaXNQdWJsaXNoYWJsZVBhY2thZ2UocmVxLmJvZHkpID09PSBmYWxzZSAmJiBpc09iamVjdChyZXEuYm9keS51c2VycykpIHtcbiAgICAgIHJldHVybiBzdGFyQXBpKHJlcSwgcmVzLCBuZXh0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSB2YWxpZGF0aW9uVXRpbHMubm9ybWFsaXplTWV0YWRhdGEocmVxLmJvZHksIHBhY2thZ2VOYW1lKTtcbiAgICAgIC8vIGNoZWNrIF9hdHRhY2htZW50cyB0byBkaXN0aW5ndWlzaCBwdWJsaXNoIGFuZCBkZXByZWNhdGVcbiAgICAgIGlmIChcbiAgICAgICAgcmVxLnBhcmFtcy5fcmV2IHx8XG4gICAgICAgIChpc1JlbGF0ZWRUb0RlcHJlY2F0aW9uKHJlcS5ib2R5KSAmJiBfLmlzRW1wdHkocmVxLmJvZHkuX2F0dGFjaG1lbnRzKSlcbiAgICAgICkge1xuICAgICAgICBkZWJ1ZygndXBkYXRpbmcgYSBuZXcgdmVyc2lvbiBmb3IgJW8nLCBwYWNrYWdlTmFtZSk7XG4gICAgICAgIC8vIHdlIGNoZWNrIHVucHVibGlzaCBwZXJtaXNzaW9ucywgYW4gdXBkYXRlIGlzIGJhc2ljYWxseSByZW1vdmUgdmVyc2lvbnNcbiAgICAgICAgY29uc3QgcmVtb3RlID0gcmVxLnJlbW90ZV91c2VyO1xuICAgICAgICBhdXRoLmFsbG93X3VucHVibGlzaCh7IHBhY2thZ2VOYW1lIH0sIHJlbW90ZSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoeyBwYWNrYWdlTmFtZSB9LCBgbm90IGFsbG93ZWQgdG8gdW5wdWJsaXNoIGEgdmVyc2lvbiBmb3IgQHtwYWNrYWdlTmFtZX1gKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RvcmFnZS5jaGFuZ2VQYWNrYWdlKHBhY2thZ2VOYW1lLCBtZXRhZGF0YSwgcmVxLnBhcmFtcy5yZXZpc2lvbiwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBhZnRlckNoYW5nZShlcnJvciwgQVBJX01FU1NBR0UuUEtHX0NIQU5HRUQsIG1ldGFkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWJ1ZygnYWRkaW5nIGEgbmV3IHZlcnNpb24gZm9yICVvJywgcGFja2FnZU5hbWUpO1xuICAgICAgICBzdG9yYWdlLmFkZFBhY2thZ2UocGFja2FnZU5hbWUsIG1ldGFkYXRhLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICBhZnRlckNoYW5nZShlcnJvciwgQVBJX01FU1NBR0UuUEtHX0NSRUFURUQsIG1ldGFkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgZGVidWcoJ2Vycm9yIG9uIHB1Ymxpc2g6ICVzJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICBsb2dnZXIuZXJyb3IoeyBwYWNrYWdlTmFtZSB9LCAnZXJyb3Igb24gcHVibGlzaCwgYmFkIHBhY2thZ2UgZGF0YSBmb3IgQHtwYWNrYWdlTmFtZX0nKTtcbiAgICAgIHJldHVybiBuZXh0KEVycm9yQ29kZS5nZXRCYWREYXRhKEFQSV9FUlJPUi5CQURfUEFDS0FHRV9EQVRBKSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIHVuLXB1Ymxpc2ggYSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1blB1Ymxpc2hQYWNrYWdlKHN0b3JhZ2U6IFN0b3JhZ2UpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXE6ICRSZXF1ZXN0RXh0ZW5kLCByZXM6ICRSZXNwb25zZUV4dGVuZCwgbmV4dDogJE5leHRGdW5jdGlvblZlcik6IHZvaWQge1xuICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gcmVxLnBhcmFtcy5wYWNrYWdlO1xuICAgIGRlYnVnKCd1bnB1Ymxpc2hpbmcgJW8nLCBwYWNrYWdlTmFtZSk7XG4gICAgc3RvcmFnZS5yZW1vdmVQYWNrYWdlKHBhY2thZ2VOYW1lLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICB9XG4gICAgICByZXMuc3RhdHVzKEhUVFBfU1RBVFVTLkNSRUFURUQpO1xuICAgICAgcmV0dXJuIG5leHQoeyBvazogQVBJX01FU1NBR0UuUEtHX1JFTU9WRUQgfSk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogRGVsZXRlIHRhcmJhbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVRhcmJhbGwoc3RvcmFnZTogU3RvcmFnZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlcTogJFJlcXVlc3RFeHRlbmQsIHJlczogJFJlc3BvbnNlRXh0ZW5kLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSByZXEucGFyYW1zLnBhY2thZ2U7XG4gICAgY29uc3QgeyBmaWxlbmFtZSwgcmV2aXNpb24gfSA9IHJlcS5wYXJhbXM7XG4gICAgZGVidWcoJ3JlbW92aW5nIGEgdGFyYmFsbCBmb3IgJW8tJW8tJW8nLCBwYWNrYWdlTmFtZSwgZmlsZW5hbWUsIHJldmlzaW9uKTtcbiAgICBzdG9yYWdlLnJlbW92ZVRhcmJhbGwocGFja2FnZU5hbWUsIGZpbGVuYW1lLCByZXZpc2lvbiwgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZXR1cm4gbmV4dChlcnIpO1xuICAgICAgfVxuICAgICAgcmVzLnN0YXR1cyhIVFRQX1NUQVRVUy5DUkVBVEVEKTtcbiAgICAgIGRlYnVnKCdzdWNjZXNzIHJlbW92ZSB0YXJiYWxsIGZvciAlby0lby0lbycsIHBhY2thZ2VOYW1lLCBmaWxlbmFtZSwgcmV2aXNpb24pO1xuICAgICAgcmV0dXJuIG5leHQoeyBvazogQVBJX01FU1NBR0UuVEFSQkFMTF9SRU1PVkVEIH0pO1xuICAgIH0pO1xuICB9O1xufVxuLyoqXG4gKiBBZGRzIGEgbmV3IHZlcnNpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFZlcnNpb24oc3RvcmFnZTogU3RvcmFnZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlcTogJFJlcXVlc3RFeHRlbmQsIHJlczogJFJlc3BvbnNlRXh0ZW5kLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKTogdm9pZCB7XG4gICAgY29uc3QgeyB2ZXJzaW9uLCB0YWcgfSA9IHJlcS5wYXJhbXM7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSByZXEucGFyYW1zLnBhY2thZ2U7XG5cbiAgICBzdG9yYWdlLmFkZFZlcnNpb24ocGFja2FnZU5hbWUsIHZlcnNpb24sIHJlcS5ib2R5LCB0YWcsIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBuZXh0KGVycm9yKTtcbiAgICAgIH1cblxuICAgICAgcmVzLnN0YXR1cyhIVFRQX1NUQVRVUy5DUkVBVEVEKTtcbiAgICAgIHJldHVybiBuZXh0KHtcbiAgICAgICAgb2s6IEFQSV9NRVNTQUdFLlBLR19QVUJMSVNIRUQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiB1cGxvYWRQYWNrYWdlVGFyYmFsbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkUGFja2FnZVRhcmJhbGwoc3RvcmFnZTogU3RvcmFnZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHJlcTogJFJlcXVlc3RFeHRlbmQsIHJlczogJFJlc3BvbnNlRXh0ZW5kLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSByZXEucGFyYW1zLnBhY2thZ2U7XG4gICAgY29uc3Qgc3RyZWFtID0gc3RvcmFnZS5hZGRUYXJiYWxsKHBhY2thZ2VOYW1lLCByZXEucGFyYW1zLmZpbGVuYW1lKTtcbiAgICByZXEucGlwZShzdHJlYW0pO1xuXG4gICAgLy8gY2hlY2tpbmcgaWYgZW5kIGV2ZW50IGNhbWUgYmVmb3JlIGNsb3NpbmdcbiAgICBsZXQgY29tcGxldGUgPSBmYWxzZTtcbiAgICByZXEub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5kb25lKCk7XG4gICAgfSk7XG5cbiAgICByZXEub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFjb21wbGV0ZSkge1xuICAgICAgICBzdHJlYW0uYWJvcnQoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHN0cmVhbS5vbignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICByZXR1cm4gcmVzLmxvY2Fscy5yZXBvcnRfZXJyb3IoZXJyKTtcbiAgICB9KTtcblxuICAgIHN0cmVhbS5vbignc3VjY2VzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlcy5zdGF0dXMoSFRUUF9TVEFUVVMuQ1JFQVRFRCk7XG4gICAgICByZXR1cm4gbmV4dCh7XG4gICAgICAgIG9rOiBBUElfTUVTU0FHRS5UQVJCQUxMX1VQTE9BREVELFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMsT0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsS0FBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUcsS0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQUksS0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sV0FBQSxHQUFBTixPQUFBO0FBR0EsSUFBQU8sVUFBQSxHQUFBUCxPQUFBO0FBQ0EsSUFBQVEsT0FBQSxHQUFBUixPQUFBO0FBRUEsSUFBQVMsYUFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsTUFBQSxHQUFBVixPQUFBO0FBRUEsSUFBQVcsS0FBQSxHQUFBWixzQkFBQSxDQUFBQyxPQUFBO0FBQTBCLFNBQUFELHVCQUFBYSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBRTFCLE1BQU1HLEtBQUssR0FBRyxJQUFBQyxjQUFVLEVBQUMsbUJBQW1CLENBQUM7QUFFOUIsU0FBU0MsT0FBT0EsQ0FDN0JDLE1BQWMsRUFDZEMsSUFBVSxFQUNWQyxPQUFnQixFQUNoQkMsTUFBYyxFQUNSO0VBQ04sTUFBTUMsR0FBRyxHQUFHLElBQUFDLGlCQUFLLEVBQUNKLElBQUksRUFBRTtJQUN0QkssU0FBUyxFQUFFQSxDQUFDQyxNQUFNLEVBQUVDLE9BQU8sS0FBS0MsY0FBTSxDQUFDQyxLQUFLLENBQUNILE1BQU0sRUFBRUMsT0FBTyxDQUFDO0lBQzdERyxRQUFRLEVBQUVBLENBQUNKLE1BQU0sRUFBRUMsT0FBTyxLQUFLQyxjQUFNLENBQUNDLEtBQUssQ0FBQ0gsTUFBTSxFQUFFQyxPQUFPO0VBQzdELENBQUMsQ0FBQzs7RUFFRjtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VSLE1BQU0sQ0FBQ1ksR0FBRyxDQUNSLDZCQUE2QixFQUM3QlIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUNkLElBQUFTLGlCQUFLLEVBQUNDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzNCQyxzQkFBVSxFQUNWQyxjQUFjLENBQUNmLE9BQU8sRUFBRUMsTUFBTSxFQUFFRixJQUFJLENBQ3RDLENBQUM7O0VBRUQ7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFRCxNQUFNLENBQUNrQixNQUFNLENBQUMsa0JBQWtCLEVBQUVkLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRWUsZ0JBQWdCLENBQUNqQixPQUFPLENBQUMsQ0FBQzs7RUFFOUU7RUFDQUYsTUFBTSxDQUFDa0IsTUFBTSxDQUNYLHNDQUFzQyxFQUN0Q2QsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUNoQkEsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUNkZ0IsYUFBYSxDQUFDbEIsT0FBTyxDQUN2QixDQUFDOztFQUVEO0VBQ0FGLE1BQU0sQ0FBQ1ksR0FBRyxDQUNSLHlCQUF5QixFQUN6QlIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUNkLElBQUFTLGlCQUFLLEVBQUNRLGtCQUFPLENBQUNDLFlBQVksQ0FBQyxFQUMzQkMsb0JBQW9CLENBQUNyQixPQUFPLENBQzlCLENBQUM7O0VBRUQ7RUFDQSxJQUFJQyxNQUFNLENBQUN2QixNQUFNLEVBQUU7SUFDakI7SUFDQW9CLE1BQU0sQ0FBQ1ksR0FBRyxDQUNSLDhCQUE4QixFQUM5QlIsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUNkLElBQUFTLGlCQUFLLEVBQUNDLGFBQUksQ0FBQ0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQzNCQyxzQkFBVSxFQUNWUSxVQUFVLENBQUN0QixPQUFPLENBQ3BCLENBQUM7RUFDSDtBQUNGOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVNlLGNBQWNBLENBQUNmLE9BQWdCLEVBQUVDLE1BQWMsRUFBRUYsSUFBVSxFQUFPO0VBQ2hGLE1BQU13QixPQUFPLEdBQUcsSUFBQUMsYUFBSSxFQUFDeEIsT0FBTyxDQUFDO0VBQzdCLE9BQU8sVUFBVXlCLEdBQW1CLEVBQUVDLEdBQW9CLEVBQUVDLElBQXNCLEVBQVE7SUFDeEYsTUFBTUMsV0FBVyxHQUFHSCxHQUFHLENBQUNwQixNQUFNLENBQUN3QixPQUFPO0lBQ3RDbEMsS0FBSyxDQUFDLDZDQUE2QyxFQUFFaUMsV0FBVyxDQUFDO0lBQ2pFO0FBQ0o7QUFDQTtJQUNJLE1BQU1FLGFBQWEsR0FBRyxTQUFBQSxDQUFVQyxRQUFnQixFQUFFQyxJQUFJLEVBQUVDLEVBQVksRUFBUTtNQUMxRSxNQUFNQyxNQUFNLEdBQUdsQyxPQUFPLENBQUNtQyxVQUFVLENBQUNQLFdBQVcsRUFBRUcsUUFBUSxDQUFDO01BQ3hERyxNQUFNLENBQUNFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVUMsR0FBRyxFQUFFO1FBQ2hDSixFQUFFLENBQUNJLEdBQUcsQ0FBQztNQUNULENBQUMsQ0FBQztNQUNGSCxNQUFNLENBQUNFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWTtRQUMvQkgsRUFBRSxDQUFDLENBQUM7TUFDTixDQUFDLENBQUM7TUFDRjtNQUNBO01BQ0FDLE1BQU0sQ0FBQ0ksR0FBRyxDQUFDQyxNQUFNLENBQUNDLElBQUksQ0FBQ1IsSUFBSSxDQUFDQSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7TUFDNUNFLE1BQU0sQ0FBQ08sSUFBSSxDQUFDLENBQUM7SUFDZixDQUFDOztJQUVEO0FBQ0o7QUFDQTtJQUNJLE1BQU1DLGFBQWEsR0FBRyxTQUFBQSxDQUFVQyxPQUFlLEVBQUVDLFFBQWlCLEVBQUVYLEVBQVksRUFBUTtNQUN0RmpDLE9BQU8sQ0FBQ3NCLFVBQVUsQ0FBQ00sV0FBVyxFQUFFZSxPQUFPLEVBQUVDLFFBQVEsRUFBRSxJQUFJLEVBQUVYLEVBQUUsQ0FBQztJQUM5RCxDQUFDOztJQUVEO0FBQ0o7QUFDQTtJQUNJLE1BQU1ZLE9BQU8sR0FBRyxTQUFBQSxDQUFVQyxJQUFlLEVBQUViLEVBQVksRUFBUTtNQUM3RGpDLE9BQU8sQ0FBQytDLFNBQVMsQ0FBQ25CLFdBQVcsRUFBRWtCLElBQUksRUFBRWIsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRCxNQUFNZSxXQUFXLEdBQUcsU0FBQUEsQ0FBVUMsS0FBSyxFQUFFQyxTQUFTLEVBQUVOLFFBQVEsRUFBUTtNQUM5RCxNQUFNTyxZQUFxQixHQUFHO1FBQUUsR0FBR1A7TUFBUyxDQUFDO01BRTdDLE1BQU07UUFBRVEsWUFBWTtRQUFFQztNQUFTLENBQUMsR0FBR0YsWUFBWTs7TUFFL0M7TUFDQTtNQUNBLElBQUlHLGVBQUMsQ0FBQ0MsS0FBSyxDQUFDSCxZQUFZLENBQUMsSUFBSUksSUFBSSxDQUFDQyxTQUFTLENBQUNMLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNsRSxJQUFJSCxLQUFLLEVBQUU7VUFDVCxPQUFPdEIsSUFBSSxDQUFDc0IsS0FBSyxDQUFDO1FBQ3BCO1FBQ0F2QixHQUFHLENBQUNnQyxNQUFNLENBQUNDLHNCQUFXLENBQUNDLE9BQU8sQ0FBQztRQUMvQixPQUFPakMsSUFBSSxDQUFDO1VBQ1ZrQyxFQUFFLEVBQUVYLFNBQVM7VUFDYlksT0FBTyxFQUFFO1FBQ1gsQ0FBQyxDQUFDO01BQ0o7O01BRUE7TUFDQTtNQUNBO01BQ0EsTUFBTUMsbUJBQW1CLEdBQ3ZCLElBQUFDLGVBQVEsRUFBQ1osWUFBWSxDQUFDLEtBQUssS0FBSyxJQUNoQyxJQUFBYSxvQkFBYSxFQUFDYixZQUFZLENBQUMsSUFDM0IsSUFBQVksZUFBUSxFQUFDWCxRQUFRLENBQUMsS0FBSyxLQUFLLElBQzVCLElBQUFZLG9CQUFhLEVBQUNaLFFBQVEsQ0FBQztNQUV6QixJQUFJVSxtQkFBbUIsRUFBRTtRQUN2QjtRQUNBO1FBQ0F4RCxjQUFNLENBQUMyRCxJQUFJLENBQUM7VUFBRXRDO1FBQVksQ0FBQyxFQUFFLDBEQUEwRCxDQUFDO1FBQ3hGLE9BQU9ELElBQUksQ0FBQ3dDLGdCQUFTLENBQUNDLGFBQWEsQ0FBQ0Msb0JBQVMsQ0FBQ0Msd0JBQXdCLENBQUMsQ0FBQztNQUMxRTtNQUVBLElBQUlyQixLQUFLLElBQUlBLEtBQUssQ0FBQ1MsTUFBTSxLQUFLQyxzQkFBVyxDQUFDWSxRQUFRLEVBQUU7UUFDbEQsT0FBTzVDLElBQUksQ0FBQ3NCLEtBQUssQ0FBQztNQUNwQjs7TUFFQTtNQUNBLE1BQU0sQ0FBQ3VCLGtCQUFrQixDQUFDLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDdEIsWUFBWSxDQUFDO01BRXREdEIsYUFBYSxDQUNYNkMsYUFBSSxDQUFDQyxRQUFRLENBQUNKLGtCQUFrQixDQUFDLEVBQ2pDcEIsWUFBWSxDQUFDb0Isa0JBQWtCLENBQUMsRUFDaEMsVUFBVXZCLEtBQUssRUFBRTtRQUNmLElBQUlBLEtBQUssRUFBRTtVQUNULE9BQU90QixJQUFJLENBQUNzQixLQUFLLENBQUM7UUFDcEI7UUFFQSxNQUFNNEIsZ0JBQWdCLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDckIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pELE1BQU15Qix3QkFBd0IsR0FBR3pCLFFBQVEsQ0FBQ3dCLGdCQUFnQixDQUFDO1FBRTNEQyx3QkFBd0IsQ0FBQ0MsTUFBTSxHQUM3QnpCLGVBQUMsQ0FBQ0MsS0FBSyxDQUFDdUIsd0JBQXdCLENBQUNDLE1BQU0sQ0FBQyxLQUFLLEtBQUssR0FDOUNDLE1BQU0sQ0FBQ0Ysd0JBQXdCLENBQUNDLE1BQU0sQ0FBQyxHQUN2QyxFQUFFO1FBRVJyQyxhQUFhLENBQUNtQyxnQkFBZ0IsRUFBRUMsd0JBQXdCLEVBQUUsVUFBVTdCLEtBQUssRUFBRTtVQUN6RSxJQUFJQSxLQUFLLEVBQUU7WUFDVCxPQUFPdEIsSUFBSSxDQUFDc0IsS0FBSyxDQUFDO1VBQ3BCO1VBRUFKLE9BQU8sQ0FBQ00sWUFBWSxDQUFDOEIsb0JBQVMsQ0FBQyxFQUFFLGdCQUFnQmhDLEtBQUssRUFBRTtZQUN0RCxJQUFJQSxLQUFLLEVBQUU7Y0FDVCxPQUFPdEIsSUFBSSxDQUFDc0IsS0FBSyxDQUFDO1lBQ3BCO1lBRUEsSUFBSTtjQUNGLE1BQU0sSUFBQWlDLGFBQU0sRUFDVi9CLFlBQVksRUFDWmxELE1BQU0sRUFDTndCLEdBQUcsQ0FBQzBELFdBQVcsRUFDZixHQUFHaEMsWUFBWSxDQUFDaUMsSUFBSSxJQUFJUCxnQkFBZ0IsRUFDMUMsQ0FBQztZQUNILENBQUMsQ0FBQyxPQUFPNUIsS0FBSyxFQUFFO2NBQ2QxQyxjQUFNLENBQUMwQyxLQUFLLENBQUM7Z0JBQUVBO2NBQU0sQ0FBQyxFQUFFLDJDQUEyQyxDQUFDO1lBQ3RFO1lBRUF2QixHQUFHLENBQUNnQyxNQUFNLENBQUNDLHNCQUFXLENBQUNDLE9BQU8sQ0FBQztZQUMvQixPQUFPakMsSUFBSSxDQUFDO2NBQUVrQyxFQUFFLEVBQUVYLFNBQVM7Y0FBRVksT0FBTyxFQUFFO1lBQUssQ0FBQyxDQUFDO1VBQy9DLENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztNQUNKLENBQ0YsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLElBQUF1QixrQ0FBb0IsRUFBQzVELEdBQUcsQ0FBQzZELElBQUksQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFBdEIsZUFBUSxFQUFDdkMsR0FBRyxDQUFDNkQsSUFBSSxDQUFDQyxLQUFLLENBQUMsRUFBRTtNQUN4RSxPQUFPaEUsT0FBTyxDQUFDRSxHQUFHLEVBQUVDLEdBQUcsRUFBRUMsSUFBSSxDQUFDO0lBQ2hDO0lBRUEsSUFBSTtNQUNGLE1BQU1pQixRQUFRLEdBQUc0QyxxQkFBZSxDQUFDQyxpQkFBaUIsQ0FBQ2hFLEdBQUcsQ0FBQzZELElBQUksRUFBRTFELFdBQVcsQ0FBQztNQUN6RTtNQUNBLElBQ0VILEdBQUcsQ0FBQ3BCLE1BQU0sQ0FBQ3FGLElBQUksSUFDZCxJQUFBQyw2QkFBc0IsRUFBQ2xFLEdBQUcsQ0FBQzZELElBQUksQ0FBQyxJQUFJaEMsZUFBQyxDQUFDc0MsT0FBTyxDQUFDbkUsR0FBRyxDQUFDNkQsSUFBSSxDQUFDbEMsWUFBWSxDQUFFLEVBQ3RFO1FBQ0F6RCxLQUFLLENBQUMsK0JBQStCLEVBQUVpQyxXQUFXLENBQUM7UUFDbkQ7UUFDQSxNQUFNaUUsTUFBTSxHQUFHcEUsR0FBRyxDQUFDMEQsV0FBVztRQUM5QnBGLElBQUksQ0FBQytGLGVBQWUsQ0FBQztVQUFFbEU7UUFBWSxDQUFDLEVBQUVpRSxNQUFNLEVBQUc1QyxLQUFLLElBQUs7VUFDdkQsSUFBSUEsS0FBSyxFQUFFO1lBQ1QxQyxjQUFNLENBQUMwQyxLQUFLLENBQUM7Y0FBRXJCO1lBQVksQ0FBQyxFQUFFLHVEQUF1RCxDQUFDO1lBQ3RGLE9BQU9ELElBQUksQ0FBQ3NCLEtBQUssQ0FBQztVQUNwQjtVQUNBakQsT0FBTyxDQUFDK0YsYUFBYSxDQUFDbkUsV0FBVyxFQUFFZ0IsUUFBUSxFQUFFbkIsR0FBRyxDQUFDcEIsTUFBTSxDQUFDMkYsUUFBUSxFQUFFLFVBQVUvQyxLQUFLLEVBQUU7WUFDakZELFdBQVcsQ0FBQ0MsS0FBSyxFQUFFZ0Qsc0JBQVcsQ0FBQ0MsV0FBVyxFQUFFdEQsUUFBUSxDQUFDO1VBQ3ZELENBQUMsQ0FBQztRQUNKLENBQUMsQ0FBQztNQUNKLENBQUMsTUFBTTtRQUNMakQsS0FBSyxDQUFDLDZCQUE2QixFQUFFaUMsV0FBVyxDQUFDO1FBQ2pENUIsT0FBTyxDQUFDbUcsVUFBVSxDQUFDdkUsV0FBVyxFQUFFZ0IsUUFBUSxFQUFFLFVBQVVLLEtBQUssRUFBRTtVQUN6REQsV0FBVyxDQUFDQyxLQUFLLEVBQUVnRCxzQkFBVyxDQUFDRyxXQUFXLEVBQUV4RCxRQUFRLENBQUM7UUFDdkQsQ0FBQyxDQUFDO01BQ0o7SUFDRixDQUFDLENBQUMsT0FBT0ssS0FBVSxFQUFFO01BQ25CdEQsS0FBSyxDQUFDLHNCQUFzQixFQUFFc0QsS0FBSyxDQUFDM0MsT0FBTyxDQUFDO01BQzVDQyxjQUFNLENBQUMwQyxLQUFLLENBQUM7UUFBRXJCO01BQVksQ0FBQyxFQUFFLHVEQUF1RCxDQUFDO01BQ3RGLE9BQU9ELElBQUksQ0FBQ3dDLGdCQUFTLENBQUNrQyxVQUFVLENBQUNoQyxvQkFBUyxDQUFDaUMsZ0JBQWdCLENBQUMsQ0FBQztJQUMvRDtFQUNGLENBQUM7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDTyxTQUFTckYsZ0JBQWdCQSxDQUFDakIsT0FBZ0IsRUFBRTtFQUNqRCxPQUFPLFVBQVV5QixHQUFtQixFQUFFQyxHQUFvQixFQUFFQyxJQUFzQixFQUFRO0lBQ3hGLE1BQU1DLFdBQVcsR0FBR0gsR0FBRyxDQUFDcEIsTUFBTSxDQUFDd0IsT0FBTztJQUN0Q2xDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRWlDLFdBQVcsQ0FBQztJQUNyQzVCLE9BQU8sQ0FBQ3VHLGFBQWEsQ0FBQzNFLFdBQVcsRUFBRSxVQUFVUyxHQUFHLEVBQUU7TUFDaEQsSUFBSUEsR0FBRyxFQUFFO1FBQ1AsT0FBT1YsSUFBSSxDQUFDVSxHQUFHLENBQUM7TUFDbEI7TUFDQVgsR0FBRyxDQUFDZ0MsTUFBTSxDQUFDQyxzQkFBVyxDQUFDQyxPQUFPLENBQUM7TUFDL0IsT0FBT2pDLElBQUksQ0FBQztRQUFFa0MsRUFBRSxFQUFFb0Msc0JBQVcsQ0FBQ087TUFBWSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0VBQ0osQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVN0RixhQUFhQSxDQUFDbEIsT0FBZ0IsRUFBRTtFQUM5QyxPQUFPLFVBQVV5QixHQUFtQixFQUFFQyxHQUFvQixFQUFFQyxJQUFzQixFQUFRO0lBQ3hGLE1BQU1DLFdBQVcsR0FBR0gsR0FBRyxDQUFDcEIsTUFBTSxDQUFDd0IsT0FBTztJQUN0QyxNQUFNO01BQUVFLFFBQVE7TUFBRWlFO0lBQVMsQ0FBQyxHQUFHdkUsR0FBRyxDQUFDcEIsTUFBTTtJQUN6Q1YsS0FBSyxDQUFDLGlDQUFpQyxFQUFFaUMsV0FBVyxFQUFFRyxRQUFRLEVBQUVpRSxRQUFRLENBQUM7SUFDekVoRyxPQUFPLENBQUNrQixhQUFhLENBQUNVLFdBQVcsRUFBRUcsUUFBUSxFQUFFaUUsUUFBUSxFQUFFLFVBQVUzRCxHQUFHLEVBQUU7TUFDcEUsSUFBSUEsR0FBRyxFQUFFO1FBQ1AsT0FBT1YsSUFBSSxDQUFDVSxHQUFHLENBQUM7TUFDbEI7TUFDQVgsR0FBRyxDQUFDZ0MsTUFBTSxDQUFDQyxzQkFBVyxDQUFDQyxPQUFPLENBQUM7TUFDL0JqRSxLQUFLLENBQUMscUNBQXFDLEVBQUVpQyxXQUFXLEVBQUVHLFFBQVEsRUFBRWlFLFFBQVEsQ0FBQztNQUM3RSxPQUFPckUsSUFBSSxDQUFDO1FBQUVrQyxFQUFFLEVBQUVvQyxzQkFBVyxDQUFDUTtNQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDO0VBQ0osQ0FBQztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU25GLFVBQVVBLENBQUN0QixPQUFnQixFQUFFO0VBQzNDLE9BQU8sVUFBVXlCLEdBQW1CLEVBQUVDLEdBQW9CLEVBQUVDLElBQXNCLEVBQVE7SUFDeEYsTUFBTTtNQUFFZ0IsT0FBTztNQUFFK0Q7SUFBSSxDQUFDLEdBQUdqRixHQUFHLENBQUNwQixNQUFNO0lBQ25DLE1BQU11QixXQUFXLEdBQUdILEdBQUcsQ0FBQ3BCLE1BQU0sQ0FBQ3dCLE9BQU87SUFFdEM3QixPQUFPLENBQUNzQixVQUFVLENBQUNNLFdBQVcsRUFBRWUsT0FBTyxFQUFFbEIsR0FBRyxDQUFDNkQsSUFBSSxFQUFFb0IsR0FBRyxFQUFFLFVBQVV6RCxLQUFLLEVBQUU7TUFDdkUsSUFBSUEsS0FBSyxFQUFFO1FBQ1QsT0FBT3RCLElBQUksQ0FBQ3NCLEtBQUssQ0FBQztNQUNwQjtNQUVBdkIsR0FBRyxDQUFDZ0MsTUFBTSxDQUFDQyxzQkFBVyxDQUFDQyxPQUFPLENBQUM7TUFDL0IsT0FBT2pDLElBQUksQ0FBQztRQUNWa0MsRUFBRSxFQUFFb0Msc0JBQVcsQ0FBQ1U7TUFDbEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0VBQ0osQ0FBQztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNPLFNBQVN0RixvQkFBb0JBLENBQUNyQixPQUFnQixFQUFFO0VBQ3JELE9BQU8sVUFBVXlCLEdBQW1CLEVBQUVDLEdBQW9CLEVBQUVDLElBQXNCLEVBQVE7SUFDeEYsTUFBTUMsV0FBVyxHQUFHSCxHQUFHLENBQUNwQixNQUFNLENBQUN3QixPQUFPO0lBQ3RDLE1BQU1LLE1BQU0sR0FBR2xDLE9BQU8sQ0FBQ21DLFVBQVUsQ0FBQ1AsV0FBVyxFQUFFSCxHQUFHLENBQUNwQixNQUFNLENBQUMwQixRQUFRLENBQUM7SUFDbkVOLEdBQUcsQ0FBQ21GLElBQUksQ0FBQzFFLE1BQU0sQ0FBQzs7SUFFaEI7SUFDQSxJQUFJMkUsUUFBUSxHQUFHLEtBQUs7SUFDcEJwRixHQUFHLENBQUNXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsWUFBWTtNQUN4QnlFLFFBQVEsR0FBRyxJQUFJO01BQ2YzRSxNQUFNLENBQUNPLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBRUZoQixHQUFHLENBQUNXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsWUFBWTtNQUMxQixJQUFJLENBQUN5RSxRQUFRLEVBQUU7UUFDYjNFLE1BQU0sQ0FBQzRFLEtBQUssQ0FBQyxDQUFDO01BQ2hCO0lBQ0YsQ0FBQyxDQUFDO0lBRUY1RSxNQUFNLENBQUNFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVUMsR0FBRyxFQUFFO01BQ2hDLE9BQU9YLEdBQUcsQ0FBQ3FGLE1BQU0sQ0FBQ0MsWUFBWSxDQUFDM0UsR0FBRyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztJQUVGSCxNQUFNLENBQUNFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBWTtNQUMvQlYsR0FBRyxDQUFDZ0MsTUFBTSxDQUFDQyxzQkFBVyxDQUFDQyxPQUFPLENBQUM7TUFDL0IsT0FBT2pDLElBQUksQ0FBQztRQUNWa0MsRUFBRSxFQUFFb0Msc0JBQVcsQ0FBQ2dCO01BQ2xCLENBQUMsQ0FBQztJQUNKLENBQUMsQ0FBQztFQUNKLENBQUM7QUFDSCIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _middleware = require("@verdaccio/middleware");
8
+ var _constants = require("../../../lib/constants");
9
+ var _logger = require("../../../lib/logger");
10
+ function _default(route, auth, storage) {
11
+ // searching packages
12
+ route.get(_middleware.SEARCH_API_ENDPOINTS.deprecated_search, function (req, res) {
13
+ let received_end = false;
14
+ let response_finished = false;
15
+ let processing_pkgs = 0;
16
+ let firstPackage = true;
17
+ _logger.logger.warn('/-/all search endpoint is deprecated, might be removed in the next major release');
18
+ res.status(200);
19
+ res.set(_constants.HEADERS.CONTENT_TYPE, _constants.HEADERS.JSON_CHARSET);
20
+
21
+ /*
22
+ * Offical NPM registry (registry.npmjs.org) no longer return whole database,
23
+ * They only return packages matched with keyword in `referer: search pkg-name`,
24
+ * And NPM client will request server in every search.
25
+ *
26
+ * The magic number 99999 was sent by NPM registry. Modify it may caused strange
27
+ * behaviour in the future.
28
+ *
29
+ * BTW: NPM will not return result if user-agent does not contain string 'npm',
30
+ * See: method 'request' in up-storage.js
31
+ *
32
+ * If there is no cache in local, NPM will request /-/all, then get response with
33
+ * _updated: 99999, 'Date' in response header was Mon, 10 Oct 1983 00:12:48 GMT,
34
+ * this will make NPM always query from server
35
+ *
36
+ * Data structure also different, whel request /-/all, response is an object, but
37
+ * when request /-/all/since, response is an array
38
+ */
39
+ const respShouldBeArray = req.path.endsWith('/since');
40
+ if (!respShouldBeArray) {
41
+ res.set('Date', 'Mon, 10 Oct 1983 00:12:48 GMT');
42
+ }
43
+ const check_finish = function () {
44
+ if (!received_end) {
45
+ return;
46
+ }
47
+ if (processing_pkgs) {
48
+ return;
49
+ }
50
+ if (response_finished) {
51
+ return;
52
+ }
53
+ response_finished = true;
54
+ if (respShouldBeArray) {
55
+ res.end(']\n');
56
+ } else {
57
+ res.end('}\n');
58
+ }
59
+ };
60
+ if (respShouldBeArray) {
61
+ res.write('[');
62
+ } else {
63
+ res.write('{"_updated":' + 99999);
64
+ }
65
+ const stream = storage.search(req.query.startkey || 0, {
66
+ req: req
67
+ });
68
+ stream.on('data', function each(pkg) {
69
+ processing_pkgs++;
70
+ auth.allow_access({
71
+ packageName: pkg.name
72
+ }, req.remote_user, function (err, allowed) {
73
+ processing_pkgs--;
74
+ if (err) {
75
+ if (err.status && String(err.status).match(/^4\d\d$/)) {
76
+ // auth plugin returns 4xx user error,
77
+ // that's equivalent of !allowed basically
78
+ allowed = false;
79
+ } else {
80
+ stream.abort(err);
81
+ }
82
+ }
83
+ if (allowed) {
84
+ if (respShouldBeArray) {
85
+ res.write(`${firstPackage ? '' : ','}${JSON.stringify(pkg)}\n`);
86
+ if (firstPackage) {
87
+ firstPackage = false;
88
+ }
89
+ } else {
90
+ res.write(',\n' + JSON.stringify(pkg.name) + ':' + JSON.stringify(pkg));
91
+ }
92
+ }
93
+ check_finish();
94
+ });
95
+ });
96
+ stream.on('error', function (err) {
97
+ _logger.logger.error('search `/-/all endpoint has failed @{err}', err);
98
+ received_end = true;
99
+ check_finish();
100
+ });
101
+ stream.on('end', function () {
102
+ received_end = true;
103
+ check_finish();
104
+ });
105
+ });
106
+ }
107
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWlkZGxld2FyZSIsInJlcXVpcmUiLCJfY29uc3RhbnRzIiwiX2xvZ2dlciIsIl9kZWZhdWx0Iiwicm91dGUiLCJhdXRoIiwic3RvcmFnZSIsImdldCIsIlNFQVJDSF9BUElfRU5EUE9JTlRTIiwiZGVwcmVjYXRlZF9zZWFyY2giLCJyZXEiLCJyZXMiLCJyZWNlaXZlZF9lbmQiLCJyZXNwb25zZV9maW5pc2hlZCIsInByb2Nlc3NpbmdfcGtncyIsImZpcnN0UGFja2FnZSIsImxvZ2dlciIsIndhcm4iLCJzdGF0dXMiLCJzZXQiLCJIRUFERVJTIiwiQ09OVEVOVF9UWVBFIiwiSlNPTl9DSEFSU0VUIiwicmVzcFNob3VsZEJlQXJyYXkiLCJwYXRoIiwiZW5kc1dpdGgiLCJjaGVja19maW5pc2giLCJlbmQiLCJ3cml0ZSIsInN0cmVhbSIsInNlYXJjaCIsInF1ZXJ5Iiwic3RhcnRrZXkiLCJvbiIsImVhY2giLCJwa2ciLCJhbGxvd19hY2Nlc3MiLCJwYWNrYWdlTmFtZSIsIm5hbWUiLCJyZW1vdGVfdXNlciIsImVyciIsImFsbG93ZWQiLCJTdHJpbmciLCJtYXRjaCIsImFib3J0IiwiSlNPTiIsInN0cmluZ2lmeSIsImVycm9yIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9hcGkvc2VhcmNoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNFQVJDSF9BUElfRU5EUE9JTlRTIH0gZnJvbSAnQHZlcmRhY2Npby9taWRkbGV3YXJlJztcblxuaW1wb3J0IHsgSEVBREVSUyB9IGZyb20gJy4uLy4uLy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vLi4vbGliL2xvZ2dlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChyb3V0ZSwgYXV0aCwgc3RvcmFnZSk6IHZvaWQge1xuICAvLyBzZWFyY2hpbmcgcGFja2FnZXNcbiAgcm91dGUuZ2V0KFNFQVJDSF9BUElfRU5EUE9JTlRTLmRlcHJlY2F0ZWRfc2VhcmNoLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcbiAgICBsZXQgcmVjZWl2ZWRfZW5kID0gZmFsc2U7XG4gICAgbGV0IHJlc3BvbnNlX2ZpbmlzaGVkID0gZmFsc2U7XG4gICAgbGV0IHByb2Nlc3NpbmdfcGtncyA9IDA7XG4gICAgbGV0IGZpcnN0UGFja2FnZSA9IHRydWU7XG4gICAgbG9nZ2VyLndhcm4oJy8tL2FsbCBzZWFyY2ggZW5kcG9pbnQgaXMgZGVwcmVjYXRlZCwgbWlnaHQgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlJyk7XG4gICAgcmVzLnN0YXR1cygyMDApO1xuICAgIHJlcy5zZXQoSEVBREVSUy5DT05URU5UX1RZUEUsIEhFQURFUlMuSlNPTl9DSEFSU0VUKTtcblxuICAgIC8qXG4gICAgICogT2ZmaWNhbCBOUE0gcmVnaXN0cnkgKHJlZ2lzdHJ5Lm5wbWpzLm9yZykgbm8gbG9uZ2VyIHJldHVybiB3aG9sZSBkYXRhYmFzZSxcbiAgICAgKiBUaGV5IG9ubHkgcmV0dXJuIHBhY2thZ2VzIG1hdGNoZWQgd2l0aCBrZXl3b3JkIGluIGByZWZlcmVyOiBzZWFyY2ggcGtnLW5hbWVgLFxuICAgICAqIEFuZCBOUE0gY2xpZW50IHdpbGwgcmVxdWVzdCBzZXJ2ZXIgaW4gZXZlcnkgc2VhcmNoLlxuICAgICAqXG4gICAgICogVGhlIG1hZ2ljIG51bWJlciA5OTk5OSB3YXMgc2VudCBieSBOUE0gcmVnaXN0cnkuIE1vZGlmeSBpdCBtYXkgY2F1c2VkIHN0cmFuZ2VcbiAgICAgKiBiZWhhdmlvdXIgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKlxuICAgICAqIEJUVzogTlBNIHdpbGwgbm90IHJldHVybiByZXN1bHQgaWYgdXNlci1hZ2VudCBkb2VzIG5vdCBjb250YWluIHN0cmluZyAnbnBtJyxcbiAgICAgKiBTZWU6IG1ldGhvZCAncmVxdWVzdCcgaW4gdXAtc3RvcmFnZS5qc1xuICAgICAqXG4gICAgICogSWYgdGhlcmUgaXMgbm8gY2FjaGUgaW4gbG9jYWwsIE5QTSB3aWxsIHJlcXVlc3QgLy0vYWxsLCB0aGVuIGdldCByZXNwb25zZSB3aXRoXG4gICAgICogX3VwZGF0ZWQ6IDk5OTk5LCAnRGF0ZScgaW4gcmVzcG9uc2UgaGVhZGVyIHdhcyBNb24sIDEwIE9jdCAxOTgzIDAwOjEyOjQ4IEdNVCxcbiAgICAgKiB0aGlzIHdpbGwgbWFrZSBOUE0gYWx3YXlzIHF1ZXJ5IGZyb20gc2VydmVyXG4gICAgICpcbiAgICAgKiBEYXRhIHN0cnVjdHVyZSBhbHNvIGRpZmZlcmVudCwgd2hlbCByZXF1ZXN0IC8tL2FsbCwgcmVzcG9uc2UgaXMgYW4gb2JqZWN0LCBidXRcbiAgICAgKiB3aGVuIHJlcXVlc3QgLy0vYWxsL3NpbmNlLCByZXNwb25zZSBpcyBhbiBhcnJheVxuICAgICAqL1xuICAgIGNvbnN0IHJlc3BTaG91bGRCZUFycmF5ID0gcmVxLnBhdGguZW5kc1dpdGgoJy9zaW5jZScpO1xuICAgIGlmICghcmVzcFNob3VsZEJlQXJyYXkpIHtcbiAgICAgIHJlcy5zZXQoJ0RhdGUnLCAnTW9uLCAxMCBPY3QgMTk4MyAwMDoxMjo0OCBHTVQnKTtcbiAgICB9XG4gICAgY29uc3QgY2hlY2tfZmluaXNoID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuICAgICAgaWYgKCFyZWNlaXZlZF9lbmQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHByb2Nlc3NpbmdfcGtncykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmVzcG9uc2VfZmluaXNoZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzcG9uc2VfZmluaXNoZWQgPSB0cnVlO1xuICAgICAgaWYgKHJlc3BTaG91bGRCZUFycmF5KSB7XG4gICAgICAgIHJlcy5lbmQoJ11cXG4nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5lbmQoJ31cXG4nKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHJlc3BTaG91bGRCZUFycmF5KSB7XG4gICAgICByZXMud3JpdGUoJ1snKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLndyaXRlKCd7XCJfdXBkYXRlZFwiOicgKyA5OTk5OSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RyZWFtID0gc3RvcmFnZS5zZWFyY2gocmVxLnF1ZXJ5LnN0YXJ0a2V5IHx8IDAsIHsgcmVxOiByZXEgfSk7XG5cbiAgICBzdHJlYW0ub24oJ2RhdGEnLCBmdW5jdGlvbiBlYWNoKHBrZykge1xuICAgICAgcHJvY2Vzc2luZ19wa2dzKys7XG5cbiAgICAgIGF1dGguYWxsb3dfYWNjZXNzKHsgcGFja2FnZU5hbWU6IHBrZy5uYW1lIH0sIHJlcS5yZW1vdGVfdXNlciwgZnVuY3Rpb24gKGVyciwgYWxsb3dlZCkge1xuICAgICAgICBwcm9jZXNzaW5nX3BrZ3MtLTtcblxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyci5zdGF0dXMgJiYgU3RyaW5nKGVyci5zdGF0dXMpLm1hdGNoKC9eNFxcZFxcZCQvKSkge1xuICAgICAgICAgICAgLy8gYXV0aCBwbHVnaW4gcmV0dXJucyA0eHggdXNlciBlcnJvcixcbiAgICAgICAgICAgIC8vIHRoYXQncyBlcXVpdmFsZW50IG9mICFhbGxvd2VkIGJhc2ljYWxseVxuICAgICAgICAgICAgYWxsb3dlZCA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0uYWJvcnQoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgIGlmIChyZXNwU2hvdWxkQmVBcnJheSkge1xuICAgICAgICAgICAgcmVzLndyaXRlKGAke2ZpcnN0UGFja2FnZSA/ICcnIDogJywnfSR7SlNPTi5zdHJpbmdpZnkocGtnKX1cXG5gKTtcbiAgICAgICAgICAgIGlmIChmaXJzdFBhY2thZ2UpIHtcbiAgICAgICAgICAgICAgZmlyc3RQYWNrYWdlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcy53cml0ZSgnLFxcbicgKyBKU09OLnN0cmluZ2lmeShwa2cubmFtZSkgKyAnOicgKyBKU09OLnN0cmluZ2lmeShwa2cpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja19maW5pc2goKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgc3RyZWFtLm9uKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignc2VhcmNoIGAvLS9hbGwgZW5kcG9pbnQgaGFzIGZhaWxlZCBAe2Vycn0nLCBlcnIpO1xuICAgICAgcmVjZWl2ZWRfZW5kID0gdHJ1ZTtcbiAgICAgIGNoZWNrX2ZpbmlzaCgpO1xuICAgIH0pO1xuXG4gICAgc3RyZWFtLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZWNlaXZlZF9lbmQgPSB0cnVlO1xuICAgICAgY2hlY2tfZmluaXNoKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFZSxTQUFBRyxTQUFVQyxLQUFLLEVBQUVDLElBQUksRUFBRUMsT0FBTyxFQUFRO0VBQ25EO0VBQ0FGLEtBQUssQ0FBQ0csR0FBRyxDQUFDQyxnQ0FBb0IsQ0FBQ0MsaUJBQWlCLEVBQUUsVUFBVUMsR0FBRyxFQUFFQyxHQUFHLEVBQUU7SUFDcEUsSUFBSUMsWUFBWSxHQUFHLEtBQUs7SUFDeEIsSUFBSUMsaUJBQWlCLEdBQUcsS0FBSztJQUM3QixJQUFJQyxlQUFlLEdBQUcsQ0FBQztJQUN2QixJQUFJQyxZQUFZLEdBQUcsSUFBSTtJQUN2QkMsY0FBTSxDQUFDQyxJQUFJLENBQUMsa0ZBQWtGLENBQUM7SUFDL0ZOLEdBQUcsQ0FBQ08sTUFBTSxDQUFDLEdBQUcsQ0FBQztJQUNmUCxHQUFHLENBQUNRLEdBQUcsQ0FBQ0Msa0JBQU8sQ0FBQ0MsWUFBWSxFQUFFRCxrQkFBTyxDQUFDRSxZQUFZLENBQUM7O0lBRW5EO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtJQUNJLE1BQU1DLGlCQUFpQixHQUFHYixHQUFHLENBQUNjLElBQUksQ0FBQ0MsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNyRCxJQUFJLENBQUNGLGlCQUFpQixFQUFFO01BQ3RCWixHQUFHLENBQUNRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsK0JBQStCLENBQUM7SUFDbEQ7SUFDQSxNQUFNTyxZQUFZLEdBQUcsU0FBQUEsQ0FBQSxFQUFrQjtNQUNyQyxJQUFJLENBQUNkLFlBQVksRUFBRTtRQUNqQjtNQUNGO01BQ0EsSUFBSUUsZUFBZSxFQUFFO1FBQ25CO01BQ0Y7TUFDQSxJQUFJRCxpQkFBaUIsRUFBRTtRQUNyQjtNQUNGO01BQ0FBLGlCQUFpQixHQUFHLElBQUk7TUFDeEIsSUFBSVUsaUJBQWlCLEVBQUU7UUFDckJaLEdBQUcsQ0FBQ2dCLEdBQUcsQ0FBQyxLQUFLLENBQUM7TUFDaEIsQ0FBQyxNQUFNO1FBQ0xoQixHQUFHLENBQUNnQixHQUFHLENBQUMsS0FBSyxDQUFDO01BQ2hCO0lBQ0YsQ0FBQztJQUVELElBQUlKLGlCQUFpQixFQUFFO01BQ3JCWixHQUFHLENBQUNpQixLQUFLLENBQUMsR0FBRyxDQUFDO0lBQ2hCLENBQUMsTUFBTTtNQUNMakIsR0FBRyxDQUFDaUIsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDbkM7SUFFQSxNQUFNQyxNQUFNLEdBQUd2QixPQUFPLENBQUN3QixNQUFNLENBQUNwQixHQUFHLENBQUNxQixLQUFLLENBQUNDLFFBQVEsSUFBSSxDQUFDLEVBQUU7TUFBRXRCLEdBQUcsRUFBRUE7SUFBSSxDQUFDLENBQUM7SUFFcEVtQixNQUFNLENBQUNJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBU0MsSUFBSUEsQ0FBQ0MsR0FBRyxFQUFFO01BQ25DckIsZUFBZSxFQUFFO01BRWpCVCxJQUFJLENBQUMrQixZQUFZLENBQUM7UUFBRUMsV0FBVyxFQUFFRixHQUFHLENBQUNHO01BQUssQ0FBQyxFQUFFNUIsR0FBRyxDQUFDNkIsV0FBVyxFQUFFLFVBQVVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFO1FBQ3BGM0IsZUFBZSxFQUFFO1FBRWpCLElBQUkwQixHQUFHLEVBQUU7VUFDUCxJQUFJQSxHQUFHLENBQUN0QixNQUFNLElBQUl3QixNQUFNLENBQUNGLEdBQUcsQ0FBQ3RCLE1BQU0sQ0FBQyxDQUFDeUIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3JEO1lBQ0E7WUFDQUYsT0FBTyxHQUFHLEtBQUs7VUFDakIsQ0FBQyxNQUFNO1lBQ0xaLE1BQU0sQ0FBQ2UsS0FBSyxDQUFDSixHQUFHLENBQUM7VUFDbkI7UUFDRjtRQUVBLElBQUlDLE9BQU8sRUFBRTtVQUNYLElBQUlsQixpQkFBaUIsRUFBRTtZQUNyQlosR0FBRyxDQUFDaUIsS0FBSyxDQUFDLEdBQUdiLFlBQVksR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHOEIsSUFBSSxDQUFDQyxTQUFTLENBQUNYLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDL0QsSUFBSXBCLFlBQVksRUFBRTtjQUNoQkEsWUFBWSxHQUFHLEtBQUs7WUFDdEI7VUFDRixDQUFDLE1BQU07WUFDTEosR0FBRyxDQUFDaUIsS0FBSyxDQUFDLEtBQUssR0FBR2lCLElBQUksQ0FBQ0MsU0FBUyxDQUFDWCxHQUFHLENBQUNHLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBR08sSUFBSSxDQUFDQyxTQUFTLENBQUNYLEdBQUcsQ0FBQyxDQUFDO1VBQ3pFO1FBQ0Y7UUFFQVQsWUFBWSxDQUFDLENBQUM7TUFDaEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBRUZHLE1BQU0sQ0FBQ0ksRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVTyxHQUFHLEVBQUU7TUFDaEN4QixjQUFNLENBQUMrQixLQUFLLENBQUMsMkNBQTJDLEVBQUVQLEdBQUcsQ0FBQztNQUM5RDVCLFlBQVksR0FBRyxJQUFJO01BQ25CYyxZQUFZLENBQUMsQ0FBQztJQUNoQixDQUFDLENBQUM7SUFFRkcsTUFBTSxDQUFDSSxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVk7TUFDM0JyQixZQUFZLEdBQUcsSUFBSTtNQUNuQmMsWUFBWSxDQUFDLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDO0FBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+ var _debug = _interopRequireDefault(require("debug"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _constants = require("../../../lib/constants");
10
+ var _logger = require("../../../lib/logger");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const debug = (0, _debug.default)('verdaccio:star');
13
+ function _default(storage) {
14
+ const validateInputs = (newUsers, localUsers, username, isStar) => {
15
+ const isExistlocalUsers = _lodash.default.isNil(localUsers[username]) === false;
16
+ if (isStar && isExistlocalUsers && localUsers[username]) {
17
+ return true;
18
+ } else if (!isStar && isExistlocalUsers) {
19
+ return false;
20
+ } else if (!isStar && !isExistlocalUsers) {
21
+ return true;
22
+ }
23
+ return false;
24
+ };
25
+ return (req, res, next) => {
26
+ const name = req.params.package;
27
+ debug('starring a package for %o', name);
28
+ const afterChangePackage = function (err) {
29
+ if (err) {
30
+ return next(err);
31
+ }
32
+ _logger.logger.debug(`package ${name} starred by user ${req.remote_user?.name}`);
33
+ // we do not need
34
+ res.status(_constants.HTTP_STATUS.OK);
35
+ next({
36
+ success: true
37
+ });
38
+ };
39
+ storage.getPackage({
40
+ name,
41
+ req,
42
+ callback: function (err, info) {
43
+ if (err) {
44
+ return next(err);
45
+ }
46
+ const newStarUser = req.body[_constants.USERS];
47
+ const remoteUsername = req.remote_user.name;
48
+ const localStarUsers = info[_constants.USERS];
49
+ // Check is star or unstar
50
+ const isStar = Object.keys(newStarUser).includes(remoteUsername);
51
+ if (_lodash.default.isNil(localStarUsers) === false && validateInputs(newStarUser, localStarUsers, remoteUsername, isStar)) {
52
+ return afterChangePackage();
53
+ }
54
+ const users = isStar ? {
55
+ ...localStarUsers,
56
+ [remoteUsername]: true
57
+ } : _lodash.default.reduce(localStarUsers, (users, value, key) => {
58
+ if (key !== remoteUsername) {
59
+ users[key] = value;
60
+ }
61
+ return users;
62
+ }, {});
63
+ storage.changePackage(name, {
64
+ ...info,
65
+ users
66
+ }, req.body._rev, function (err) {
67
+ afterChangePackage(err);
68
+ });
69
+ }
70
+ });
71
+ };
72
+ }
73
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZGVidWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2Rhc2giLCJfY29uc3RhbnRzIiwiX2xvZ2dlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImRlYnVnIiwiYnVpbGREZWJ1ZyIsIl9kZWZhdWx0Iiwic3RvcmFnZSIsInZhbGlkYXRlSW5wdXRzIiwibmV3VXNlcnMiLCJsb2NhbFVzZXJzIiwidXNlcm5hbWUiLCJpc1N0YXIiLCJpc0V4aXN0bG9jYWxVc2VycyIsIl8iLCJpc05pbCIsInJlcSIsInJlcyIsIm5leHQiLCJuYW1lIiwicGFyYW1zIiwicGFja2FnZSIsImFmdGVyQ2hhbmdlUGFja2FnZSIsImVyciIsImxvZ2dlciIsInJlbW90ZV91c2VyIiwic3RhdHVzIiwiSFRUUF9TVEFUVVMiLCJPSyIsInN1Y2Nlc3MiLCJnZXRQYWNrYWdlIiwiY2FsbGJhY2siLCJpbmZvIiwibmV3U3RhclVzZXIiLCJib2R5IiwiVVNFUlMiLCJyZW1vdGVVc2VybmFtZSIsImxvY2FsU3RhclVzZXJzIiwiT2JqZWN0Iiwia2V5cyIsImluY2x1ZGVzIiwidXNlcnMiLCJyZWR1Y2UiLCJ2YWx1ZSIsImtleSIsImNoYW5nZVBhY2thZ2UiLCJfcmV2Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwaS9lbmRwb2ludC9hcGkvc3Rhci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYnVpbGREZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgdHlwZSB7IFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBIVFRQX1NUQVRVUywgVVNFUlMgfSBmcm9tICcuLi8uLi8uLi9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uLy4uL2xpYi9sb2dnZXInO1xuaW1wb3J0IHR5cGUgU3RvcmFnZSBmcm9tICcuLi8uLi8uLi9saWIvc3RvcmFnZSc7XG5pbXBvcnQgdHlwZSB7ICROZXh0RnVuY3Rpb25WZXIsICRSZXF1ZXN0RXh0ZW5kIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuXG5jb25zdCBkZWJ1ZyA9IGJ1aWxkRGVidWcoJ3ZlcmRhY2NpbzpzdGFyJyk7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoXG4gIHN0b3JhZ2U6IFN0b3JhZ2Vcbik6IChyZXE6ICRSZXF1ZXN0RXh0ZW5kLCByZXM6IFJlc3BvbnNlLCBuZXh0OiAkTmV4dEZ1bmN0aW9uVmVyKSA9PiB2b2lkIHtcbiAgY29uc3QgdmFsaWRhdGVJbnB1dHMgPSAobmV3VXNlcnMsIGxvY2FsVXNlcnMsIHVzZXJuYW1lLCBpc1N0YXIpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBpc0V4aXN0bG9jYWxVc2VycyA9IF8uaXNOaWwobG9jYWxVc2Vyc1t1c2VybmFtZV0pID09PSBmYWxzZTtcbiAgICBpZiAoaXNTdGFyICYmIGlzRXhpc3Rsb2NhbFVzZXJzICYmIGxvY2FsVXNlcnNbdXNlcm5hbWVdKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFpc1N0YXIgJiYgaXNFeGlzdGxvY2FsVXNlcnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFpc1N0YXIgJiYgIWlzRXhpc3Rsb2NhbFVzZXJzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIHJldHVybiAocmVxOiAkUmVxdWVzdEV4dGVuZCwgcmVzOiBSZXNwb25zZSwgbmV4dDogJE5leHRGdW5jdGlvblZlcik6IHZvaWQgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSByZXEucGFyYW1zLnBhY2thZ2U7XG4gICAgZGVidWcoJ3N0YXJyaW5nIGEgcGFja2FnZSBmb3IgJW8nLCBuYW1lKTtcbiAgICBjb25zdCBhZnRlckNoYW5nZVBhY2thZ2UgPSBmdW5jdGlvbiAoZXJyPzogRXJyb3IpIHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG5leHQoZXJyKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgcGFja2FnZSAke25hbWV9IHN0YXJyZWQgYnkgdXNlciAke3JlcS5yZW1vdGVfdXNlcj8ubmFtZX1gKTtcbiAgICAgIC8vIHdlIGRvIG5vdCBuZWVkXG4gICAgICByZXMuc3RhdHVzKEhUVFBfU1RBVFVTLk9LKTtcbiAgICAgIG5leHQoe1xuICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHN0b3JhZ2UuZ2V0UGFja2FnZSh7XG4gICAgICBuYW1lLFxuICAgICAgcmVxLFxuICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIChlcnIsIGluZm8pIHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBuZXh0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3U3RhclVzZXIgPSByZXEuYm9keVtVU0VSU107XG4gICAgICAgIGNvbnN0IHJlbW90ZVVzZXJuYW1lID0gcmVxLnJlbW90ZV91c2VyLm5hbWU7XG4gICAgICAgIGNvbnN0IGxvY2FsU3RhclVzZXJzID0gaW5mb1tVU0VSU107XG4gICAgICAgIC8vIENoZWNrIGlzIHN0YXIgb3IgdW5zdGFyXG4gICAgICAgIGNvbnN0IGlzU3RhciA9IE9iamVjdC5rZXlzKG5ld1N0YXJVc2VyKS5pbmNsdWRlcyhyZW1vdGVVc2VybmFtZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBfLmlzTmlsKGxvY2FsU3RhclVzZXJzKSA9PT0gZmFsc2UgJiZcbiAgICAgICAgICB2YWxpZGF0ZUlucHV0cyhuZXdTdGFyVXNlciwgbG9jYWxTdGFyVXNlcnMsIHJlbW90ZVVzZXJuYW1lLCBpc1N0YXIpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBhZnRlckNoYW5nZVBhY2thZ2UoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VycyA9IGlzU3RhclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5sb2NhbFN0YXJVc2VycyxcbiAgICAgICAgICAgICAgW3JlbW90ZVVzZXJuYW1lXTogdHJ1ZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IF8ucmVkdWNlKFxuICAgICAgICAgICAgICBsb2NhbFN0YXJVc2VycyxcbiAgICAgICAgICAgICAgKHVzZXJzLCB2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gcmVtb3RlVXNlcm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHVzZXJzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZXJzO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgc3RvcmFnZS5jaGFuZ2VQYWNrYWdlKG5hbWUsIHsgLi4uaW5mbywgdXNlcnMgfSwgcmVxLmJvZHkuX3JldiwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIGFmdGVyQ2hhbmdlUGFja2FnZShlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE9BQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUE2QyxTQUFBRCx1QkFBQUssQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUk3QyxNQUFNRyxLQUFLLEdBQUcsSUFBQUMsY0FBVSxFQUFDLGdCQUFnQixDQUFDO0FBQzNCLFNBQUFDLFNBQ2JDLE9BQWdCLEVBQ3NEO0VBQ3RFLE1BQU1DLGNBQWMsR0FBR0EsQ0FBQ0MsUUFBUSxFQUFFQyxVQUFVLEVBQUVD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