parse-server 2.8.4 → 8.6.2

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 (240) hide show
  1. package/LICENSE +167 -25
  2. package/NOTICE +10 -0
  3. package/README.md +929 -278
  4. package/lib/AccountLockout.js +47 -30
  5. package/lib/Adapters/AdapterLoader.js +21 -6
  6. package/lib/Adapters/Analytics/AnalyticsAdapter.js +15 -12
  7. package/lib/Adapters/Auth/AuthAdapter.js +116 -13
  8. package/lib/Adapters/Auth/BaseCodeAuthAdapter.js +99 -0
  9. package/lib/Adapters/Auth/OAuth1Client.js +27 -46
  10. package/lib/Adapters/Auth/apple.js +123 -0
  11. package/lib/Adapters/Auth/facebook.js +162 -35
  12. package/lib/Adapters/Auth/gcenter.js +217 -0
  13. package/lib/Adapters/Auth/github.js +118 -48
  14. package/lib/Adapters/Auth/google.js +160 -51
  15. package/lib/Adapters/Auth/gpgames.js +125 -0
  16. package/lib/Adapters/Auth/httpsRequest.js +6 -7
  17. package/lib/Adapters/Auth/index.js +170 -62
  18. package/lib/Adapters/Auth/instagram.js +114 -40
  19. package/lib/Adapters/Auth/janraincapture.js +52 -23
  20. package/lib/Adapters/Auth/janrainengage.js +19 -36
  21. package/lib/Adapters/Auth/keycloak.js +148 -0
  22. package/lib/Adapters/Auth/ldap.js +167 -0
  23. package/lib/Adapters/Auth/line.js +125 -0
  24. package/lib/Adapters/Auth/linkedin.js +111 -55
  25. package/lib/Adapters/Auth/meetup.js +24 -34
  26. package/lib/Adapters/Auth/mfa.js +324 -0
  27. package/lib/Adapters/Auth/microsoft.js +111 -0
  28. package/lib/Adapters/Auth/oauth2.js +97 -162
  29. package/lib/Adapters/Auth/phantauth.js +53 -0
  30. package/lib/Adapters/Auth/qq.js +108 -49
  31. package/lib/Adapters/Auth/spotify.js +107 -55
  32. package/lib/Adapters/Auth/twitter.js +188 -48
  33. package/lib/Adapters/Auth/utils.js +28 -0
  34. package/lib/Adapters/Auth/vkontakte.js +26 -39
  35. package/lib/Adapters/Auth/wechat.js +106 -44
  36. package/lib/Adapters/Auth/weibo.js +132 -58
  37. package/lib/Adapters/Cache/CacheAdapter.js +13 -8
  38. package/lib/Adapters/Cache/InMemoryCache.js +3 -13
  39. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +5 -13
  40. package/lib/Adapters/Cache/LRUCache.js +13 -27
  41. package/lib/Adapters/Cache/NullCacheAdapter.js +3 -8
  42. package/lib/Adapters/Cache/RedisCacheAdapter.js +85 -76
  43. package/lib/Adapters/Cache/SchemaCache.js +25 -0
  44. package/lib/Adapters/Email/MailAdapter.js +10 -8
  45. package/lib/Adapters/Files/FilesAdapter.js +83 -25
  46. package/lib/Adapters/Files/GridFSBucketAdapter.js +231 -0
  47. package/lib/Adapters/Files/GridStoreAdapter.js +4 -91
  48. package/lib/Adapters/Logger/LoggerAdapter.js +18 -14
  49. package/lib/Adapters/Logger/WinstonLogger.js +69 -88
  50. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +7 -16
  51. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +8 -26
  52. package/lib/Adapters/PubSub/EventEmitterPubSub.js +12 -25
  53. package/lib/Adapters/PubSub/PubSubAdapter.js +34 -0
  54. package/lib/Adapters/PubSub/RedisPubSub.js +42 -19
  55. package/lib/Adapters/Push/PushAdapter.js +14 -7
  56. package/lib/Adapters/Storage/Mongo/MongoCollection.js +137 -45
  57. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +158 -63
  58. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +320 -168
  59. package/lib/Adapters/Storage/Mongo/MongoTransform.js +279 -306
  60. package/lib/Adapters/Storage/Postgres/PostgresClient.js +14 -10
  61. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +47 -21
  62. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +854 -468
  63. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -6
  64. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  65. package/lib/Adapters/WebSocketServer/WSAdapter.js +35 -0
  66. package/lib/Adapters/WebSocketServer/WSSAdapter.js +66 -0
  67. package/lib/Auth.js +488 -125
  68. package/lib/ClientSDK.js +2 -6
  69. package/lib/Config.js +525 -94
  70. package/lib/Controllers/AdaptableController.js +5 -25
  71. package/lib/Controllers/AnalyticsController.js +22 -23
  72. package/lib/Controllers/CacheController.js +10 -31
  73. package/lib/Controllers/DatabaseController.js +767 -313
  74. package/lib/Controllers/FilesController.js +49 -54
  75. package/lib/Controllers/HooksController.js +80 -84
  76. package/lib/Controllers/LiveQueryController.js +35 -22
  77. package/lib/Controllers/LoggerController.js +22 -58
  78. package/lib/Controllers/ParseGraphQLController.js +293 -0
  79. package/lib/Controllers/PushController.js +58 -49
  80. package/lib/Controllers/SchemaController.js +916 -422
  81. package/lib/Controllers/UserController.js +265 -180
  82. package/lib/Controllers/index.js +90 -125
  83. package/lib/Controllers/types.js +1 -1
  84. package/lib/Deprecator/Deprecations.js +30 -0
  85. package/lib/Deprecator/Deprecator.js +127 -0
  86. package/lib/Error.js +48 -0
  87. package/lib/GraphQL/ParseGraphQLSchema.js +375 -0
  88. package/lib/GraphQL/ParseGraphQLServer.js +214 -0
  89. package/lib/GraphQL/helpers/objectsMutations.js +30 -0
  90. package/lib/GraphQL/helpers/objectsQueries.js +246 -0
  91. package/lib/GraphQL/loaders/configMutations.js +87 -0
  92. package/lib/GraphQL/loaders/configQueries.js +79 -0
  93. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +21 -0
  94. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +23 -0
  95. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +1098 -0
  96. package/lib/GraphQL/loaders/defaultRelaySchema.js +53 -0
  97. package/lib/GraphQL/loaders/filesMutations.js +107 -0
  98. package/lib/GraphQL/loaders/functionsMutations.js +78 -0
  99. package/lib/GraphQL/loaders/parseClassMutations.js +268 -0
  100. package/lib/GraphQL/loaders/parseClassQueries.js +127 -0
  101. package/lib/GraphQL/loaders/parseClassTypes.js +493 -0
  102. package/lib/GraphQL/loaders/schemaDirectives.js +62 -0
  103. package/lib/GraphQL/loaders/schemaMutations.js +162 -0
  104. package/lib/GraphQL/loaders/schemaQueries.js +81 -0
  105. package/lib/GraphQL/loaders/schemaTypes.js +341 -0
  106. package/lib/GraphQL/loaders/usersMutations.js +433 -0
  107. package/lib/GraphQL/loaders/usersQueries.js +90 -0
  108. package/lib/GraphQL/parseGraphQLUtils.js +63 -0
  109. package/lib/GraphQL/transformers/className.js +14 -0
  110. package/lib/GraphQL/transformers/constraintType.js +53 -0
  111. package/lib/GraphQL/transformers/inputType.js +51 -0
  112. package/lib/GraphQL/transformers/mutation.js +274 -0
  113. package/lib/GraphQL/transformers/outputType.js +51 -0
  114. package/lib/GraphQL/transformers/query.js +237 -0
  115. package/lib/GraphQL/transformers/schemaFields.js +99 -0
  116. package/lib/KeyPromiseQueue.js +48 -0
  117. package/lib/LiveQuery/Client.js +25 -33
  118. package/lib/LiveQuery/Id.js +2 -5
  119. package/lib/LiveQuery/ParseCloudCodePublisher.js +26 -23
  120. package/lib/LiveQuery/ParseLiveQueryServer.js +560 -285
  121. package/lib/LiveQuery/ParsePubSub.js +7 -16
  122. package/lib/LiveQuery/ParseWebSocketServer.js +42 -39
  123. package/lib/LiveQuery/QueryTools.js +76 -15
  124. package/lib/LiveQuery/RequestSchema.js +111 -97
  125. package/lib/LiveQuery/SessionTokenCache.js +23 -36
  126. package/lib/LiveQuery/Subscription.js +8 -17
  127. package/lib/LiveQuery/equalObjects.js +2 -3
  128. package/lib/Options/Definitions.js +1355 -382
  129. package/lib/Options/docs.js +301 -62
  130. package/lib/Options/index.js +11 -1
  131. package/lib/Options/parsers.js +14 -10
  132. package/lib/Page.js +44 -0
  133. package/lib/ParseMessageQueue.js +6 -13
  134. package/lib/ParseServer.js +474 -235
  135. package/lib/ParseServerRESTController.js +102 -40
  136. package/lib/PromiseRouter.js +39 -50
  137. package/lib/Push/PushQueue.js +24 -30
  138. package/lib/Push/PushWorker.js +32 -56
  139. package/lib/Push/utils.js +22 -35
  140. package/lib/RestQuery.js +361 -139
  141. package/lib/RestWrite.js +713 -344
  142. package/lib/Routers/AggregateRouter.js +97 -71
  143. package/lib/Routers/AnalyticsRouter.js +8 -14
  144. package/lib/Routers/AudiencesRouter.js +16 -35
  145. package/lib/Routers/ClassesRouter.js +86 -72
  146. package/lib/Routers/CloudCodeRouter.js +28 -37
  147. package/lib/Routers/FeaturesRouter.js +22 -25
  148. package/lib/Routers/FilesRouter.js +266 -171
  149. package/lib/Routers/FunctionsRouter.js +87 -103
  150. package/lib/Routers/GlobalConfigRouter.js +94 -33
  151. package/lib/Routers/GraphQLRouter.js +41 -0
  152. package/lib/Routers/HooksRouter.js +43 -47
  153. package/lib/Routers/IAPValidationRouter.js +57 -70
  154. package/lib/Routers/InstallationsRouter.js +17 -25
  155. package/lib/Routers/LogsRouter.js +10 -25
  156. package/lib/Routers/PagesRouter.js +647 -0
  157. package/lib/Routers/PublicAPIRouter.js +104 -112
  158. package/lib/Routers/PurgeRouter.js +19 -29
  159. package/lib/Routers/PushRouter.js +14 -28
  160. package/lib/Routers/RolesRouter.js +7 -14
  161. package/lib/Routers/SchemasRouter.js +63 -42
  162. package/lib/Routers/SecurityRouter.js +34 -0
  163. package/lib/Routers/SessionsRouter.js +25 -38
  164. package/lib/Routers/UsersRouter.js +463 -190
  165. package/lib/SchemaMigrations/DefinedSchemas.js +379 -0
  166. package/lib/SchemaMigrations/Migrations.js +30 -0
  167. package/lib/Security/Check.js +109 -0
  168. package/lib/Security/CheckGroup.js +44 -0
  169. package/lib/Security/CheckGroups/CheckGroupDatabase.js +44 -0
  170. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +96 -0
  171. package/lib/Security/CheckGroups/CheckGroups.js +21 -0
  172. package/lib/Security/CheckRunner.js +213 -0
  173. package/lib/SharedRest.js +29 -0
  174. package/lib/StatusHandler.js +96 -93
  175. package/lib/TestUtils.js +70 -14
  176. package/lib/Utils.js +468 -0
  177. package/lib/batch.js +74 -40
  178. package/lib/cache.js +8 -8
  179. package/lib/cli/definitions/parse-live-query-server.js +4 -3
  180. package/lib/cli/definitions/parse-server.js +4 -3
  181. package/lib/cli/parse-live-query-server.js +9 -17
  182. package/lib/cli/parse-server.js +49 -47
  183. package/lib/cli/utils/commander.js +20 -29
  184. package/lib/cli/utils/runner.js +31 -32
  185. package/lib/cloud-code/Parse.Cloud.js +711 -36
  186. package/lib/cloud-code/Parse.Server.js +21 -0
  187. package/lib/cryptoUtils.js +6 -11
  188. package/lib/defaults.js +21 -15
  189. package/lib/deprecated.js +1 -1
  190. package/lib/index.js +78 -67
  191. package/lib/logger.js +12 -20
  192. package/lib/middlewares.js +484 -160
  193. package/lib/password.js +10 -6
  194. package/lib/request.js +175 -0
  195. package/lib/requiredParameter.js +4 -3
  196. package/lib/rest.js +157 -82
  197. package/lib/triggers.js +627 -185
  198. package/lib/vendor/README.md +3 -3
  199. package/lib/vendor/mongodbUrl.js +224 -137
  200. package/package.json +135 -57
  201. package/postinstall.js +38 -50
  202. package/public_html/invalid_verification_link.html +3 -3
  203. package/types/@types/@parse/fs-files-adapter/index.d.ts +5 -0
  204. package/types/@types/deepcopy/index.d.ts +5 -0
  205. package/types/LiveQuery/ParseLiveQueryServer.d.ts +40 -0
  206. package/types/Options/index.d.ts +301 -0
  207. package/types/ParseServer.d.ts +65 -0
  208. package/types/eslint.config.mjs +30 -0
  209. package/types/index.d.ts +21 -0
  210. package/types/logger.d.ts +2 -0
  211. package/types/tests.ts +44 -0
  212. package/types/tsconfig.json +24 -0
  213. package/CHANGELOG.md +0 -1246
  214. package/PATENTS +0 -37
  215. package/bin/dev +0 -37
  216. package/lib/.DS_Store +0 -0
  217. package/lib/Adapters/Auth/common.js +0 -2
  218. package/lib/Adapters/Auth/facebookaccountkit.js +0 -69
  219. package/lib/Controllers/SchemaCache.js +0 -97
  220. package/lib/LiveQuery/.DS_Store +0 -0
  221. package/lib/cli/utils/parsers.js +0 -77
  222. package/lib/cloud-code/.DS_Store +0 -0
  223. package/lib/cloud-code/HTTPResponse.js +0 -57
  224. package/lib/cloud-code/Untitled-1 +0 -123
  225. package/lib/cloud-code/httpRequest.js +0 -102
  226. package/lib/cloud-code/team.html +0 -123
  227. package/lib/graphql/ParseClass.js +0 -234
  228. package/lib/graphql/Schema.js +0 -197
  229. package/lib/graphql/index.js +0 -1
  230. package/lib/graphql/types/ACL.js +0 -35
  231. package/lib/graphql/types/Date.js +0 -25
  232. package/lib/graphql/types/File.js +0 -24
  233. package/lib/graphql/types/GeoPoint.js +0 -35
  234. package/lib/graphql/types/JSONObject.js +0 -30
  235. package/lib/graphql/types/NumberInput.js +0 -43
  236. package/lib/graphql/types/NumberQuery.js +0 -42
  237. package/lib/graphql/types/Pointer.js +0 -35
  238. package/lib/graphql/types/QueryConstraint.js +0 -61
  239. package/lib/graphql/types/StringQuery.js +0 -39
  240. package/lib/graphql/types/index.js +0 -110
@@ -1,125 +1,77 @@
1
- 'use strict';
1
+ "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getControllers = getControllers;
7
- exports.getLoggerController = getLoggerController;
8
- exports.getFilesController = getFilesController;
9
- exports.getUserController = getUserController;
10
- exports.getCacheController = getCacheController;
11
6
  exports.getAnalyticsController = getAnalyticsController;
12
- exports.getLiveQueryController = getLiveQueryController;
7
+ exports.getAuthDataManager = getAuthDataManager;
8
+ exports.getCacheController = getCacheController;
9
+ exports.getControllers = getControllers;
10
+ exports.getDatabaseAdapter = getDatabaseAdapter;
13
11
  exports.getDatabaseController = getDatabaseController;
12
+ exports.getFilesController = getFilesController;
14
13
  exports.getHooksController = getHooksController;
14
+ exports.getLiveQueryController = getLiveQueryController;
15
+ exports.getLoggerController = getLoggerController;
16
+ exports.getParseGraphQLController = getParseGraphQLController;
15
17
  exports.getPushController = getPushController;
16
- exports.getAuthDataManager = getAuthDataManager;
17
- exports.getDatabaseAdapter = getDatabaseAdapter;
18
-
19
- var _Auth = require('../Adapters/Auth');
20
-
21
- var _Auth2 = _interopRequireDefault(_Auth);
22
-
23
- var _Options = require('../Options');
24
-
25
- var _AdapterLoader = require('../Adapters/AdapterLoader');
26
-
27
- var _defaults = require('../defaults');
28
-
29
- var _defaults2 = _interopRequireDefault(_defaults);
30
-
31
- var _url = require('url');
32
-
33
- var _url2 = _interopRequireDefault(_url);
34
-
35
- var _LoggerController = require('./LoggerController');
36
-
37
- var _FilesController = require('./FilesController');
38
-
39
- var _HooksController = require('./HooksController');
40
-
41
- var _UserController = require('./UserController');
42
-
43
- var _CacheController = require('./CacheController');
44
-
45
- var _LiveQueryController = require('./LiveQueryController');
46
-
47
- var _AnalyticsController = require('./AnalyticsController');
48
-
49
- var _PushController = require('./PushController');
50
-
51
- var _PushQueue = require('../Push/PushQueue');
52
-
53
- var _PushWorker = require('../Push/PushWorker');
54
-
55
- var _DatabaseController = require('./DatabaseController');
56
-
57
- var _DatabaseController2 = _interopRequireDefault(_DatabaseController);
58
-
59
- var _SchemaCache = require('./SchemaCache');
60
-
61
- var _SchemaCache2 = _interopRequireDefault(_SchemaCache);
62
-
63
- var _GridStoreAdapter = require('../Adapters/Files/GridStoreAdapter');
64
-
65
- var _WinstonLoggerAdapter = require('../Adapters/Logger/WinstonLoggerAdapter');
66
-
67
- var _InMemoryCacheAdapter = require('../Adapters/Cache/InMemoryCacheAdapter');
68
-
69
- var _AnalyticsAdapter = require('../Adapters/Analytics/AnalyticsAdapter');
70
-
71
- var _MongoStorageAdapter = require('../Adapters/Storage/Mongo/MongoStorageAdapter');
72
-
73
- var _MongoStorageAdapter2 = _interopRequireDefault(_MongoStorageAdapter);
74
-
75
- var _PostgresStorageAdapter = require('../Adapters/Storage/Postgres/PostgresStorageAdapter');
76
-
77
- var _PostgresStorageAdapter2 = _interopRequireDefault(_PostgresStorageAdapter);
78
-
79
- var _pushAdapter = require('@parse/push-adapter');
80
-
81
- var _pushAdapter2 = _interopRequireDefault(_pushAdapter);
18
+ exports.getUserController = getUserController;
19
+ var _Auth = _interopRequireDefault(require("../Adapters/Auth"));
20
+ var _Options = require("../Options");
21
+ var _AdapterLoader = require("../Adapters/AdapterLoader");
22
+ var _defaults = _interopRequireDefault(require("../defaults"));
23
+ var _LoggerController = require("./LoggerController");
24
+ var _FilesController = require("./FilesController");
25
+ var _HooksController = require("./HooksController");
26
+ var _UserController = require("./UserController");
27
+ var _CacheController = require("./CacheController");
28
+ var _LiveQueryController = require("./LiveQueryController");
29
+ var _AnalyticsController = require("./AnalyticsController");
30
+ var _PushController = require("./PushController");
31
+ var _PushQueue = require("../Push/PushQueue");
32
+ var _PushWorker = require("../Push/PushWorker");
33
+ var _DatabaseController = _interopRequireDefault(require("./DatabaseController"));
34
+ var _GridFSBucketAdapter = require("../Adapters/Files/GridFSBucketAdapter");
35
+ var _WinstonLoggerAdapter = require("../Adapters/Logger/WinstonLoggerAdapter");
36
+ var _InMemoryCacheAdapter = require("../Adapters/Cache/InMemoryCacheAdapter");
37
+ var _AnalyticsAdapter = require("../Adapters/Analytics/AnalyticsAdapter");
38
+ var _MongoStorageAdapter = _interopRequireDefault(require("../Adapters/Storage/Mongo/MongoStorageAdapter"));
39
+ var _PostgresStorageAdapter = _interopRequireDefault(require("../Adapters/Storage/Postgres/PostgresStorageAdapter"));
40
+ var _ParseGraphQLController = _interopRequireDefault(require("./ParseGraphQLController"));
41
+ var _SchemaCache = _interopRequireDefault(require("../Adapters/Cache/SchemaCache"));
42
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
43
+ // Controllers
82
44
 
83
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
45
+ // Adapters
84
46
 
85
47
  function getControllers(options) {
86
48
  const loggerController = getLoggerController(options);
87
49
  const filesController = getFilesController(options);
88
50
  const userController = getUserController(options);
89
- const {
90
- pushController,
91
- hasPushScheduledSupport,
92
- hasPushSupport,
93
- pushControllerQueue,
94
- pushWorker
95
- } = getPushController(options);
96
51
  const cacheController = getCacheController(options);
97
52
  const analyticsController = getAnalyticsController(options);
98
53
  const liveQueryController = getLiveQueryController(options);
99
- const databaseController = getDatabaseController(options, cacheController);
54
+ const databaseController = getDatabaseController(options);
100
55
  const hooksController = getHooksController(options, databaseController);
101
56
  const authDataManager = getAuthDataManager(options);
57
+ const parseGraphQLController = getParseGraphQLController(options, {
58
+ databaseController,
59
+ cacheController
60
+ });
102
61
  return {
103
62
  loggerController,
104
63
  filesController,
105
64
  userController,
106
- pushController,
107
- hasPushScheduledSupport,
108
- hasPushSupport,
109
- pushWorker,
110
- pushControllerQueue,
111
65
  analyticsController,
112
66
  cacheController,
67
+ parseGraphQLController,
113
68
  liveQueryController,
114
69
  databaseController,
115
70
  hooksController,
116
- authDataManager
71
+ authDataManager,
72
+ schemaCache: _SchemaCache.default
117
73
  };
118
74
  }
119
-
120
- // Adapters
121
-
122
- // Controllers
123
75
  function getLoggerController(options) {
124
76
  const {
125
77
  appId,
@@ -127,31 +79,41 @@ function getLoggerController(options) {
127
79
  logsFolder,
128
80
  verbose,
129
81
  logLevel,
82
+ maxLogFiles,
130
83
  silent,
131
84
  loggerAdapter
132
85
  } = options;
133
- const loggerOptions = { jsonLogs, logsFolder, verbose, logLevel, silent };
86
+ const loggerOptions = {
87
+ jsonLogs,
88
+ logsFolder,
89
+ verbose,
90
+ logLevel,
91
+ silent,
92
+ maxLogFiles
93
+ };
134
94
  const loggerControllerAdapter = (0, _AdapterLoader.loadAdapter)(loggerAdapter, _WinstonLoggerAdapter.WinstonLoggerAdapter, loggerOptions);
135
95
  return new _LoggerController.LoggerController(loggerControllerAdapter, appId, loggerOptions);
136
96
  }
137
-
138
97
  function getFilesController(options) {
139
98
  const {
140
99
  appId,
141
100
  databaseURI,
101
+ databaseOptions = {},
142
102
  filesAdapter,
143
103
  databaseAdapter,
144
- preserveFileName
104
+ preserveFileName,
105
+ fileKey
145
106
  } = options;
146
107
  if (!filesAdapter && databaseAdapter) {
147
108
  throw 'When using an explicit database adapter, you must also use an explicit filesAdapter.';
148
109
  }
149
110
  const filesControllerAdapter = (0, _AdapterLoader.loadAdapter)(filesAdapter, () => {
150
- return new _GridStoreAdapter.GridStoreAdapter(databaseURI);
111
+ return new _GridFSBucketAdapter.GridFSBucketAdapter(databaseURI, databaseOptions, fileKey);
112
+ });
113
+ return new _FilesController.FilesController(filesControllerAdapter, appId, {
114
+ preserveFileName
151
115
  });
152
- return new _FilesController.FilesController(filesControllerAdapter, appId, { preserveFileName });
153
116
  }
154
-
155
117
  function getUserController(options) {
156
118
  const {
157
119
  appId,
@@ -159,9 +121,10 @@ function getUserController(options) {
159
121
  verifyUserEmails
160
122
  } = options;
161
123
  const emailControllerAdapter = (0, _AdapterLoader.loadAdapter)(emailAdapter);
162
- return new _UserController.UserController(emailControllerAdapter, appId, { verifyUserEmails });
124
+ return new _UserController.UserController(emailControllerAdapter, appId, {
125
+ verifyUserEmails
126
+ });
163
127
  }
164
-
165
128
  function getCacheController(options) {
166
129
  const {
167
130
  appId,
@@ -169,10 +132,19 @@ function getCacheController(options) {
169
132
  cacheTTL,
170
133
  cacheMaxSize
171
134
  } = options;
172
- const cacheControllerAdapter = (0, _AdapterLoader.loadAdapter)(cacheAdapter, _InMemoryCacheAdapter.InMemoryCacheAdapter, { appId: appId, ttl: cacheTTL, maxSize: cacheMaxSize });
135
+ const cacheControllerAdapter = (0, _AdapterLoader.loadAdapter)(cacheAdapter, _InMemoryCacheAdapter.InMemoryCacheAdapter, {
136
+ appId: appId,
137
+ ttl: cacheTTL,
138
+ maxSize: cacheMaxSize
139
+ });
173
140
  return new _CacheController.CacheController(cacheControllerAdapter, appId);
174
141
  }
175
-
142
+ function getParseGraphQLController(options, controllerDeps) {
143
+ return new _ParseGraphQLController.default({
144
+ mountGraphQL: options.mountGraphQL,
145
+ ...controllerDeps
146
+ });
147
+ }
176
148
  function getAnalyticsController(options) {
177
149
  const {
178
150
  analyticsAdapter
@@ -180,32 +152,27 @@ function getAnalyticsController(options) {
180
152
  const analyticsControllerAdapter = (0, _AdapterLoader.loadAdapter)(analyticsAdapter, _AnalyticsAdapter.AnalyticsAdapter);
181
153
  return new _AnalyticsController.AnalyticsController(analyticsControllerAdapter);
182
154
  }
183
-
184
155
  function getLiveQueryController(options) {
185
156
  return new _LiveQueryController.LiveQueryController(options.liveQuery);
186
157
  }
187
-
188
- function getDatabaseController(options, cacheController) {
158
+ function getDatabaseController(options) {
189
159
  const {
190
160
  databaseURI,
191
- databaseOptions,
192
161
  collectionPrefix,
193
- schemaCacheTTL,
194
- enableSingleSchemaCache
162
+ databaseOptions
195
163
  } = options;
196
164
  let {
197
165
  databaseAdapter
198
166
  } = options;
199
- if ((databaseOptions || databaseURI && databaseURI !== _defaults2.default.databaseURI || collectionPrefix !== _defaults2.default.collectionPrefix) && databaseAdapter) {
167
+ if ((databaseOptions || databaseURI && databaseURI !== _defaults.default.databaseURI || collectionPrefix !== _defaults.default.collectionPrefix) && databaseAdapter) {
200
168
  throw 'You cannot specify both a databaseAdapter and a databaseURI/databaseOptions/collectionPrefix.';
201
169
  } else if (!databaseAdapter) {
202
170
  databaseAdapter = getDatabaseAdapter(databaseURI, collectionPrefix, databaseOptions);
203
171
  } else {
204
172
  databaseAdapter = (0, _AdapterLoader.loadAdapter)(databaseAdapter);
205
173
  }
206
- return new _DatabaseController2.default(databaseAdapter, new _SchemaCache2.default(cacheController, schemaCacheTTL, enableSingleSchemaCache));
174
+ return new _DatabaseController.default(databaseAdapter, options);
207
175
  }
208
-
209
176
  function getHooksController(options, databaseController) {
210
177
  const {
211
178
  appId,
@@ -213,13 +180,11 @@ function getHooksController(options, databaseController) {
213
180
  } = options;
214
181
  return new _HooksController.HooksController(appId, databaseController, webhookKey);
215
182
  }
216
-
217
- function getPushController(options) {
183
+ async function getPushController(options) {
218
184
  const {
219
185
  scheduledPush,
220
186
  push
221
187
  } = options;
222
-
223
188
  const pushOptions = Object.assign({}, push);
224
189
  const pushQueueOptions = pushOptions.queueOptions || {};
225
190
  if (pushOptions.queueOptions) {
@@ -227,17 +192,16 @@ function getPushController(options) {
227
192
  }
228
193
 
229
194
  // Pass the push options too as it works with the default
230
- const pushAdapter = (0, _AdapterLoader.loadAdapter)(pushOptions && pushOptions.adapter, _pushAdapter2.default, pushOptions);
195
+ const ParsePushAdapter = await (0, _AdapterLoader.loadModule)('@parse/push-adapter');
196
+ const pushAdapter = (0, _AdapterLoader.loadAdapter)(pushOptions && pushOptions.adapter, ParsePushAdapter, pushOptions);
231
197
  // We pass the options and the base class for the adatper,
232
198
  // Note that passing an instance would work too
233
199
  const pushController = new _PushController.PushController();
234
200
  const hasPushSupport = !!(pushAdapter && push);
235
201
  const hasPushScheduledSupport = hasPushSupport && scheduledPush === true;
236
-
237
202
  const {
238
203
  disablePushWorker
239
204
  } = pushQueueOptions;
240
-
241
205
  const pushControllerQueue = new _PushQueue.PushQueue(pushQueueOptions);
242
206
  let pushWorker;
243
207
  if (!disablePushWorker) {
@@ -251,34 +215,35 @@ function getPushController(options) {
251
215
  pushWorker
252
216
  };
253
217
  }
254
-
255
218
  function getAuthDataManager(options) {
256
219
  const {
257
220
  auth,
258
221
  enableAnonymousUsers
259
222
  } = options;
260
- return (0, _Auth2.default)(auth, enableAnonymousUsers);
223
+ return (0, _Auth.default)(auth, enableAnonymousUsers);
261
224
  }
262
-
263
225
  function getDatabaseAdapter(databaseURI, collectionPrefix, databaseOptions) {
264
226
  let protocol;
265
227
  try {
266
- const parsedURI = _url2.default.parse(databaseURI);
228
+ const parsedURI = new URL(databaseURI);
267
229
  protocol = parsedURI.protocol ? parsedURI.protocol.toLowerCase() : null;
268
- } catch (e) {/* */}
230
+ } catch {
231
+ /* */
232
+ }
269
233
  switch (protocol) {
270
234
  case 'postgres:':
271
- return new _PostgresStorageAdapter2.default({
235
+ case 'postgresql:':
236
+ return new _PostgresStorageAdapter.default({
272
237
  uri: databaseURI,
273
238
  collectionPrefix,
274
239
  databaseOptions
275
240
  });
276
241
  default:
277
- return new _MongoStorageAdapter2.default({
242
+ return new _MongoStorageAdapter.default({
278
243
  uri: databaseURI,
279
244
  collectionPrefix,
280
245
  mongoOptions: databaseOptions
281
246
  });
282
247
  }
283
248
  }
284
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9Db250cm9sbGVycy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRDb250cm9sbGVycyIsImdldExvZ2dlckNvbnRyb2xsZXIiLCJnZXRGaWxlc0NvbnRyb2xsZXIiLCJnZXRVc2VyQ29udHJvbGxlciIsImdldENhY2hlQ29udHJvbGxlciIsImdldEFuYWx5dGljc0NvbnRyb2xsZXIiLCJnZXRMaXZlUXVlcnlDb250cm9sbGVyIiwiZ2V0RGF0YWJhc2VDb250cm9sbGVyIiwiZ2V0SG9va3NDb250cm9sbGVyIiwiZ2V0UHVzaENvbnRyb2xsZXIiLCJnZXRBdXRoRGF0YU1hbmFnZXIiLCJnZXREYXRhYmFzZUFkYXB0ZXIiLCJvcHRpb25zIiwibG9nZ2VyQ29udHJvbGxlciIsImZpbGVzQ29udHJvbGxlciIsInVzZXJDb250cm9sbGVyIiwicHVzaENvbnRyb2xsZXIiLCJoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCIsImhhc1B1c2hTdXBwb3J0IiwicHVzaENvbnRyb2xsZXJRdWV1ZSIsInB1c2hXb3JrZXIiLCJjYWNoZUNvbnRyb2xsZXIiLCJhbmFseXRpY3NDb250cm9sbGVyIiwibGl2ZVF1ZXJ5Q29udHJvbGxlciIsImRhdGFiYXNlQ29udHJvbGxlciIsImhvb2tzQ29udHJvbGxlciIsImF1dGhEYXRhTWFuYWdlciIsImFwcElkIiwianNvbkxvZ3MiLCJsb2dzRm9sZGVyIiwidmVyYm9zZSIsImxvZ0xldmVsIiwic2lsZW50IiwibG9nZ2VyQWRhcHRlciIsImxvZ2dlck9wdGlvbnMiLCJsb2dnZXJDb250cm9sbGVyQWRhcHRlciIsIldpbnN0b25Mb2dnZXJBZGFwdGVyIiwiTG9nZ2VyQ29udHJvbGxlciIsImRhdGFiYXNlVVJJIiwiZmlsZXNBZGFwdGVyIiwiZGF0YWJhc2VBZGFwdGVyIiwicHJlc2VydmVGaWxlTmFtZSIsImZpbGVzQ29udHJvbGxlckFkYXB0ZXIiLCJHcmlkU3RvcmVBZGFwdGVyIiwiRmlsZXNDb250cm9sbGVyIiwiZW1haWxBZGFwdGVyIiwidmVyaWZ5VXNlckVtYWlscyIsImVtYWlsQ29udHJvbGxlckFkYXB0ZXIiLCJVc2VyQ29udHJvbGxlciIsImNhY2hlQWRhcHRlciIsImNhY2hlVFRMIiwiY2FjaGVNYXhTaXplIiwiY2FjaGVDb250cm9sbGVyQWRhcHRlciIsIkluTWVtb3J5Q2FjaGVBZGFwdGVyIiwidHRsIiwibWF4U2l6ZSIsIkNhY2hlQ29udHJvbGxlciIsImFuYWx5dGljc0FkYXB0ZXIiLCJhbmFseXRpY3NDb250cm9sbGVyQWRhcHRlciIsIkFuYWx5dGljc0FkYXB0ZXIiLCJBbmFseXRpY3NDb250cm9sbGVyIiwiTGl2ZVF1ZXJ5Q29udHJvbGxlciIsImxpdmVRdWVyeSIsImRhdGFiYXNlT3B0aW9ucyIsImNvbGxlY3Rpb25QcmVmaXgiLCJzY2hlbWFDYWNoZVRUTCIsImVuYWJsZVNpbmdsZVNjaGVtYUNhY2hlIiwiZGVmYXVsdHMiLCJEYXRhYmFzZUNvbnRyb2xsZXIiLCJTY2hlbWFDYWNoZSIsIndlYmhvb2tLZXkiLCJIb29rc0NvbnRyb2xsZXIiLCJzY2hlZHVsZWRQdXNoIiwicHVzaCIsInB1c2hPcHRpb25zIiwiT2JqZWN0IiwiYXNzaWduIiwicHVzaFF1ZXVlT3B0aW9ucyIsInF1ZXVlT3B0aW9ucyIsInB1c2hBZGFwdGVyIiwiYWRhcHRlciIsIlBhcnNlUHVzaEFkYXB0ZXIiLCJQdXNoQ29udHJvbGxlciIsImRpc2FibGVQdXNoV29ya2VyIiwiUHVzaFF1ZXVlIiwiUHVzaFdvcmtlciIsImF1dGgiLCJlbmFibGVBbm9ueW1vdXNVc2VycyIsInByb3RvY29sIiwicGFyc2VkVVJJIiwidXJsIiwicGFyc2UiLCJ0b0xvd2VyQ2FzZSIsImUiLCJQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIiwidXJpIiwiTW9uZ29TdG9yYWdlQWRhcHRlciIsIm1vbmdvT3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7UUE0QmdCQSxjLEdBQUFBLGM7UUFtQ0FDLG1CLEdBQUFBLG1CO1FBZUFDLGtCLEdBQUFBLGtCO1FBaUJBQyxp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QUtGO0FBQ0UsYUFBTyxJQUFJaUMsNkJBQUosQ0FBd0I7QUFDN0JELGFBQUt6RCxXQUR3QjtBQUU3QjBCLHdCQUY2QjtBQUc3QmlDLHNCQUFjbEM7QUFIZSxPQUF4QixDQUFQO0FBUkY7QUFjRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhdXRoRGF0YU1hbmFnZXIgICAgICAgICAgZnJvbSAnLi4vQWRhcHRlcnMvQXV0aCc7XG5pbXBvcnQgeyBQYXJzZVNlcnZlck9wdGlvbnMgfSAgIGZyb20gJy4uL09wdGlvbnMnO1xuaW1wb3J0IHsgbG9hZEFkYXB0ZXIgfSAgICAgICAgICBmcm9tICcuLi9BZGFwdGVycy9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCBkZWZhdWx0cyAgICAgICAgICAgICAgICAgZnJvbSAnLi4vZGVmYXVsdHMnO1xuaW1wb3J0IHVybCAgICAgICAgICAgICAgICAgICAgICBmcm9tICd1cmwnO1xuLy8gQ29udHJvbGxlcnNcbmltcG9ydCB7IExvZ2dlckNvbnRyb2xsZXIgfSAgICAgZnJvbSAnLi9Mb2dnZXJDb250cm9sbGVyJztcbmltcG9ydCB7IEZpbGVzQ29udHJvbGxlciB9ICAgICAgZnJvbSAnLi9GaWxlc0NvbnRyb2xsZXInO1xuaW1wb3J0IHsgSG9va3NDb250cm9sbGVyIH0gICAgICBmcm9tICcuL0hvb2tzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBVc2VyQ29udHJvbGxlciB9ICAgICAgIGZyb20gJy4vVXNlckNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2FjaGVDb250cm9sbGVyIH0gICAgICBmcm9tICcuL0NhY2hlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBMaXZlUXVlcnlDb250cm9sbGVyIH0gIGZyb20gJy4vTGl2ZVF1ZXJ5Q29udHJvbGxlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NDb250cm9sbGVyIH0gIGZyb20gJy4vQW5hbHl0aWNzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQdXNoQ29udHJvbGxlciB9ICAgICAgIGZyb20gJy4vUHVzaENvbnRyb2xsZXInO1xuaW1wb3J0IHsgUHVzaFF1ZXVlIH0gICAgICAgICAgICBmcm9tICcuLi9QdXNoL1B1c2hRdWV1ZSc7XG5pbXBvcnQgeyBQdXNoV29ya2VyIH0gICAgICAgICAgIGZyb20gJy4uL1B1c2gvUHVzaFdvcmtlcic7XG5pbXBvcnQgRGF0YWJhc2VDb250cm9sbGVyICAgICAgIGZyb20gJy4vRGF0YWJhc2VDb250cm9sbGVyJztcbmltcG9ydCBTY2hlbWFDYWNoZSAgICAgICAgICAgICAgZnJvbSAnLi9TY2hlbWFDYWNoZSc7XG5cbi8vIEFkYXB0ZXJzXG5pbXBvcnQgeyBHcmlkU3RvcmVBZGFwdGVyIH0gICAgIGZyb20gJy4uL0FkYXB0ZXJzL0ZpbGVzL0dyaWRTdG9yZUFkYXB0ZXInO1xuaW1wb3J0IHsgV2luc3RvbkxvZ2dlckFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9Mb2dnZXIvV2luc3RvbkxvZ2dlckFkYXB0ZXInO1xuaW1wb3J0IHsgSW5NZW1vcnlDYWNoZUFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9DYWNoZS9Jbk1lbW9yeUNhY2hlQWRhcHRlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NBZGFwdGVyIH0gICAgIGZyb20gJy4uL0FkYXB0ZXJzL0FuYWx5dGljcy9BbmFseXRpY3NBZGFwdGVyJztcbmltcG9ydCBNb25nb1N0b3JhZ2VBZGFwdGVyICAgICAgZnJvbSAnLi4vQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyICAgZnJvbSAnLi4vQWRhcHRlcnMvU3RvcmFnZS9Qb3N0Z3Jlcy9Qb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBQYXJzZVB1c2hBZGFwdGVyICAgICAgICAgZnJvbSAnQHBhcnNlL3B1c2gtYWRhcHRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVycyhvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpIHtcbiAgY29uc3QgbG9nZ2VyQ29udHJvbGxlciA9IGdldExvZ2dlckNvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGZpbGVzQ29udHJvbGxlciA9IGdldEZpbGVzQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgdXNlckNvbnRyb2xsZXIgPSBnZXRVc2VyQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3Qge1xuICAgIHB1c2hDb250cm9sbGVyLFxuICAgIGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0LFxuICAgIGhhc1B1c2hTdXBwb3J0LFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgcHVzaFdvcmtlclxuICB9ID0gZ2V0UHVzaENvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGNhY2hlQ29udHJvbGxlciA9IGdldENhY2hlQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgYW5hbHl0aWNzQ29udHJvbGxlciA9IGdldEFuYWx5dGljc0NvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGxpdmVRdWVyeUNvbnRyb2xsZXIgPSBnZXRMaXZlUXVlcnlDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBkYXRhYmFzZUNvbnRyb2xsZXIgPSBnZXREYXRhYmFzZUNvbnRyb2xsZXIob3B0aW9ucywgY2FjaGVDb250cm9sbGVyKTtcbiAgY29uc3QgaG9va3NDb250cm9sbGVyID0gZ2V0SG9va3NDb250cm9sbGVyKG9wdGlvbnMsIGRhdGFiYXNlQ29udHJvbGxlcik7XG4gIGNvbnN0IGF1dGhEYXRhTWFuYWdlciA9IGdldEF1dGhEYXRhTWFuYWdlcihvcHRpb25zKTtcbiAgcmV0dXJuIHtcbiAgICBsb2dnZXJDb250cm9sbGVyLFxuICAgIGZpbGVzQ29udHJvbGxlcixcbiAgICB1c2VyQ29udHJvbGxlcixcbiAgICBwdXNoQ29udHJvbGxlcixcbiAgICBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydCxcbiAgICBoYXNQdXNoU3VwcG9ydCxcbiAgICBwdXNoV29ya2VyLFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgYW5hbHl0aWNzQ29udHJvbGxlcixcbiAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgbGl2ZVF1ZXJ5Q29udHJvbGxlcixcbiAgICBkYXRhYmFzZUNvbnRyb2xsZXIsXG4gICAgaG9va3NDb250cm9sbGVyLFxuICAgIGF1dGhEYXRhTWFuYWdlcixcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlckNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTG9nZ2VyQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBhcHBJZCxcbiAgICBqc29uTG9ncyxcbiAgICBsb2dzRm9sZGVyLFxuICAgIHZlcmJvc2UsXG4gICAgbG9nTGV2ZWwsXG4gICAgc2lsZW50LFxuICAgIGxvZ2dlckFkYXB0ZXIsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsb2dnZXJPcHRpb25zID0geyBqc29uTG9ncywgbG9nc0ZvbGRlciwgdmVyYm9zZSwgbG9nTGV2ZWwsIHNpbGVudCB9O1xuICBjb25zdCBsb2dnZXJDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGxvZ2dlckFkYXB0ZXIsIFdpbnN0b25Mb2dnZXJBZGFwdGVyLCBsb2dnZXJPcHRpb25zKTtcbiAgcmV0dXJuIG5ldyBMb2dnZXJDb250cm9sbGVyKGxvZ2dlckNvbnRyb2xsZXJBZGFwdGVyLCBhcHBJZCwgbG9nZ2VyT3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWxlc0NvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogRmlsZXNDb250cm9sbGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcElkLFxuICAgIGRhdGFiYXNlVVJJLFxuICAgIGZpbGVzQWRhcHRlcixcbiAgICBkYXRhYmFzZUFkYXB0ZXIsXG4gICAgcHJlc2VydmVGaWxlTmFtZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICghZmlsZXNBZGFwdGVyICYmIGRhdGFiYXNlQWRhcHRlcikge1xuICAgIHRocm93ICdXaGVuIHVzaW5nIGFuIGV4cGxpY2l0IGRhdGFiYXNlIGFkYXB0ZXIsIHlvdSBtdXN0IGFsc28gdXNlIGFuIGV4cGxpY2l0IGZpbGVzQWRhcHRlci4nO1xuICB9XG4gIGNvbnN0IGZpbGVzQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihmaWxlc0FkYXB0ZXIsICgpID0+IHtcbiAgICByZXR1cm4gbmV3IEdyaWRTdG9yZUFkYXB0ZXIoZGF0YWJhc2VVUkkpO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBGaWxlc0NvbnRyb2xsZXIoZmlsZXNDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIHsgcHJlc2VydmVGaWxlTmFtZSB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IFVzZXJDb250cm9sbGVyIHtcbiAgY29uc3Qge1xuICAgIGFwcElkLFxuICAgIGVtYWlsQWRhcHRlcixcbiAgICB2ZXJpZnlVc2VyRW1haWxzLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW1haWxDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGVtYWlsQWRhcHRlcik7XG4gIHJldHVybiBuZXcgVXNlckNvbnRyb2xsZXIoZW1haWxDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIHsgdmVyaWZ5VXNlckVtYWlscyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhY2hlQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBDYWNoZUNvbnRyb2xsZXIge1xuICBjb25zdCB7XG4gICAgYXBwSWQsXG4gICAgY2FjaGVBZGFwdGVyLFxuICAgIGNhY2hlVFRMLFxuICAgIGNhY2hlTWF4U2l6ZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNhY2hlQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihjYWNoZUFkYXB0ZXIsIEluTWVtb3J5Q2FjaGVBZGFwdGVyLCB7YXBwSWQ6IGFwcElkLCB0dGw6IGNhY2hlVFRMLCBtYXhTaXplOiBjYWNoZU1heFNpemUgfSk7XG4gIHJldHVybiBuZXcgQ2FjaGVDb250cm9sbGVyKGNhY2hlQ29udHJvbGxlckFkYXB0ZXIsIGFwcElkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljc0NvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogQW5hbHl0aWNzQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBhbmFseXRpY3NBZGFwdGVyLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgYW5hbHl0aWNzQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihhbmFseXRpY3NBZGFwdGVyLCBBbmFseXRpY3NBZGFwdGVyKTtcbiAgcmV0dXJuIG5ldyBBbmFseXRpY3NDb250cm9sbGVyKGFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpdmVRdWVyeUNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTGl2ZVF1ZXJ5Q29udHJvbGxlciB7XG4gIHJldHVybiBuZXcgTGl2ZVF1ZXJ5Q29udHJvbGxlcihvcHRpb25zLmxpdmVRdWVyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zLCBjYWNoZUNvbnRyb2xsZXI6IENhY2hlQ29udHJvbGxlcik6IERhdGFiYXNlQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBkYXRhYmFzZVVSSSxcbiAgICBkYXRhYmFzZU9wdGlvbnMsXG4gICAgY29sbGVjdGlvblByZWZpeCxcbiAgICBzY2hlbWFDYWNoZVRUTCxcbiAgICBlbmFibGVTaW5nbGVTY2hlbWFDYWNoZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGxldCB7XG4gICAgZGF0YWJhc2VBZGFwdGVyXG4gIH0gPSBvcHRpb25zO1xuICBpZiAoKGRhdGFiYXNlT3B0aW9ucyB8fCAoZGF0YWJhc2VVUkkgJiYgZGF0YWJhc2VVUkkgIT09IGRlZmF1bHRzLmRhdGFiYXNlVVJJKSB8fCBjb2xsZWN0aW9uUHJlZml4ICE9PSBkZWZhdWx0cy5jb2xsZWN0aW9uUHJlZml4KSAmJiBkYXRhYmFzZUFkYXB0ZXIpIHtcbiAgICB0aHJvdyAnWW91IGNhbm5vdCBzcGVjaWZ5IGJvdGggYSBkYXRhYmFzZUFkYXB0ZXIgYW5kIGEgZGF0YWJhc2VVUkkvZGF0YWJhc2VPcHRpb25zL2NvbGxlY3Rpb25QcmVmaXguJztcbiAgfSBlbHNlIGlmICghZGF0YWJhc2VBZGFwdGVyKSB7XG4gICAgZGF0YWJhc2VBZGFwdGVyID0gZ2V0RGF0YWJhc2VBZGFwdGVyKGRhdGFiYXNlVVJJLCBjb2xsZWN0aW9uUHJlZml4LCBkYXRhYmFzZU9wdGlvbnMpXG4gIH0gZWxzZSB7XG4gICAgZGF0YWJhc2VBZGFwdGVyID0gbG9hZEFkYXB0ZXIoZGF0YWJhc2VBZGFwdGVyKVxuICB9XG4gIHJldHVybiBuZXcgRGF0YWJhc2VDb250cm9sbGVyKGRhdGFiYXNlQWRhcHRlciwgbmV3IFNjaGVtYUNhY2hlKGNhY2hlQ29udHJvbGxlciwgc2NoZW1hQ2FjaGVUVEwsIGVuYWJsZVNpbmdsZVNjaGVtYUNhY2hlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb29rc0NvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zLCBkYXRhYmFzZUNvbnRyb2xsZXI6IERhdGFiYXNlQ29udHJvbGxlcik6IEhvb2tzQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBhcHBJZCxcbiAgICB3ZWJob29rS2V5LFxuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIG5ldyBIb29rc0NvbnRyb2xsZXIoYXBwSWQsIGRhdGFiYXNlQ29udHJvbGxlciwgd2ViaG9va0tleSk7XG59XG5cbmludGVyZmFjZSBQdXNoQ29udHJvbGxpbmcge1xuICBwdXNoQ29udHJvbGxlcjogUHVzaENvbnRyb2xsZXIsXG4gIGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0OiBib29sZWFuLFxuICBwdXNoQ29udHJvbGxlclF1ZXVlOiBQdXNoUXVldWUsXG4gIHB1c2hXb3JrZXI6IFB1c2hXb3JrZXJcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFB1c2hDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IFB1c2hDb250cm9sbGluZyB7XG4gIGNvbnN0IHtcbiAgICBzY2hlZHVsZWRQdXNoLFxuICAgIHB1c2gsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHB1c2hPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHVzaCk7XG4gIGNvbnN0IHB1c2hRdWV1ZU9wdGlvbnMgPSBwdXNoT3B0aW9ucy5xdWV1ZU9wdGlvbnMgfHwge307XG4gIGlmIChwdXNoT3B0aW9ucy5xdWV1ZU9wdGlvbnMpIHtcbiAgICBkZWxldGUgcHVzaE9wdGlvbnMucXVldWVPcHRpb25zO1xuICB9XG5cbiAgLy8gUGFzcyB0aGUgcHVzaCBvcHRpb25zIHRvbyBhcyBpdCB3b3JrcyB3aXRoIHRoZSBkZWZhdWx0XG4gIGNvbnN0IHB1c2hBZGFwdGVyID0gbG9hZEFkYXB0ZXIocHVzaE9wdGlvbnMgJiYgcHVzaE9wdGlvbnMuYWRhcHRlciwgUGFyc2VQdXNoQWRhcHRlciwgcHVzaE9wdGlvbnMpO1xuICAvLyBXZSBwYXNzIHRoZSBvcHRpb25zIGFuZCB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGFkYXRwZXIsXG4gIC8vIE5vdGUgdGhhdCBwYXNzaW5nIGFuIGluc3RhbmNlIHdvdWxkIHdvcmsgdG9vXG4gIGNvbnN0IHB1c2hDb250cm9sbGVyID0gbmV3IFB1c2hDb250cm9sbGVyKCk7XG4gIGNvbnN0IGhhc1B1c2hTdXBwb3J0ID0gISEocHVzaEFkYXB0ZXIgJiYgcHVzaCk7XG4gIGNvbnN0IGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0ID0gaGFzUHVzaFN1cHBvcnQgJiYgKHNjaGVkdWxlZFB1c2ggPT09IHRydWUpO1xuXG4gIGNvbnN0IHtcbiAgICBkaXNhYmxlUHVzaFdvcmtlclxuICB9ID0gcHVzaFF1ZXVlT3B0aW9ucztcblxuICBjb25zdCBwdXNoQ29udHJvbGxlclF1ZXVlID0gbmV3IFB1c2hRdWV1ZShwdXNoUXVldWVPcHRpb25zKTtcbiAgbGV0IHB1c2hXb3JrZXI7XG4gIGlmICghZGlzYWJsZVB1c2hXb3JrZXIpIHtcbiAgICBwdXNoV29ya2VyID0gbmV3IFB1c2hXb3JrZXIocHVzaEFkYXB0ZXIsIHB1c2hRdWV1ZU9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHVzaENvbnRyb2xsZXIsXG4gICAgaGFzUHVzaFN1cHBvcnQsXG4gICAgaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQsXG4gICAgcHVzaENvbnRyb2xsZXJRdWV1ZSxcbiAgICBwdXNoV29ya2VyXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1dGhEYXRhTWFuYWdlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpIHtcbiAgY29uc3Qge1xuICAgIGF1dGgsXG4gICAgZW5hYmxlQW5vbnltb3VzVXNlcnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBhdXRoRGF0YU1hbmFnZXIoYXV0aCwgZW5hYmxlQW5vbnltb3VzVXNlcnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUFkYXB0ZXIoZGF0YWJhc2VVUkksIGNvbGxlY3Rpb25QcmVmaXgsIGRhdGFiYXNlT3B0aW9ucykge1xuICBsZXQgcHJvdG9jb2w7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVVJJID0gdXJsLnBhcnNlKGRhdGFiYXNlVVJJKTtcbiAgICBwcm90b2NvbCA9IHBhcnNlZFVSSS5wcm90b2NvbCA/IHBhcnNlZFVSSS5wcm90b2NvbC50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgfSBjYXRjaChlKSB7IC8qICovIH1cbiAgc3dpdGNoIChwcm90b2NvbCkge1xuICBjYXNlICdwb3N0Z3JlczonOlxuICAgIHJldHVybiBuZXcgUG9zdGdyZXNTdG9yYWdlQWRhcHRlcih7XG4gICAgICB1cmk6IGRhdGFiYXNlVVJJLFxuICAgICAgY29sbGVjdGlvblByZWZpeCxcbiAgICAgIGRhdGFiYXNlT3B0aW9uc1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIHJldHVybiBuZXcgTW9uZ29TdG9yYWdlQWRhcHRlcih7XG4gICAgICB1cmk6IGRhdGFiYXNlVVJJLFxuICAgICAgY29sbGVjdGlvblByZWZpeCxcbiAgICAgIG1vbmdvT3B0aW9uczogZGF0YWJhc2VPcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
249
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfQXV0aCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX09wdGlvbnMiLCJfQWRhcHRlckxvYWRlciIsIl9kZWZhdWx0cyIsIl9Mb2dnZXJDb250cm9sbGVyIiwiX0ZpbGVzQ29udHJvbGxlciIsIl9Ib29rc0NvbnRyb2xsZXIiLCJfVXNlckNvbnRyb2xsZXIiLCJfQ2FjaGVDb250cm9sbGVyIiwiX0xpdmVRdWVyeUNvbnRyb2xsZXIiLCJfQW5hbHl0aWNzQ29udHJvbGxlciIsIl9QdXNoQ29udHJvbGxlciIsIl9QdXNoUXVldWUiLCJfUHVzaFdvcmtlciIsIl9EYXRhYmFzZUNvbnRyb2xsZXIiLCJfR3JpZEZTQnVja2V0QWRhcHRlciIsIl9XaW5zdG9uTG9nZ2VyQWRhcHRlciIsIl9Jbk1lbW9yeUNhY2hlQWRhcHRlciIsIl9BbmFseXRpY3NBZGFwdGVyIiwiX01vbmdvU3RvcmFnZUFkYXB0ZXIiLCJfUG9zdGdyZXNTdG9yYWdlQWRhcHRlciIsIl9QYXJzZUdyYXBoUUxDb250cm9sbGVyIiwiX1NjaGVtYUNhY2hlIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZ2V0Q29udHJvbGxlcnMiLCJvcHRpb25zIiwibG9nZ2VyQ29udHJvbGxlciIsImdldExvZ2dlckNvbnRyb2xsZXIiLCJmaWxlc0NvbnRyb2xsZXIiLCJnZXRGaWxlc0NvbnRyb2xsZXIiLCJ1c2VyQ29udHJvbGxlciIsImdldFVzZXJDb250cm9sbGVyIiwiY2FjaGVDb250cm9sbGVyIiwiZ2V0Q2FjaGVDb250cm9sbGVyIiwiYW5hbHl0aWNzQ29udHJvbGxlciIsImdldEFuYWx5dGljc0NvbnRyb2xsZXIiLCJsaXZlUXVlcnlDb250cm9sbGVyIiwiZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlciIsImRhdGFiYXNlQ29udHJvbGxlciIsImdldERhdGFiYXNlQ29udHJvbGxlciIsImhvb2tzQ29udHJvbGxlciIsImdldEhvb2tzQ29udHJvbGxlciIsImF1dGhEYXRhTWFuYWdlciIsImdldEF1dGhEYXRhTWFuYWdlciIsInBhcnNlR3JhcGhRTENvbnRyb2xsZXIiLCJnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyIiwic2NoZW1hQ2FjaGUiLCJTY2hlbWFDYWNoZSIsImFwcElkIiwianNvbkxvZ3MiLCJsb2dzRm9sZGVyIiwidmVyYm9zZSIsImxvZ0xldmVsIiwibWF4TG9nRmlsZXMiLCJzaWxlbnQiLCJsb2dnZXJBZGFwdGVyIiwibG9nZ2VyT3B0aW9ucyIsImxvZ2dlckNvbnRyb2xsZXJBZGFwdGVyIiwibG9hZEFkYXB0ZXIiLCJXaW5zdG9uTG9nZ2VyQWRhcHRlciIsIkxvZ2dlckNvbnRyb2xsZXIiLCJkYXRhYmFzZVVSSSIsImRhdGFiYXNlT3B0aW9ucyIsImZpbGVzQWRhcHRlciIsImRhdGFiYXNlQWRhcHRlciIsInByZXNlcnZlRmlsZU5hbWUiLCJmaWxlS2V5IiwiZmlsZXNDb250cm9sbGVyQWRhcHRlciIsIkdyaWRGU0J1Y2tldEFkYXB0ZXIiLCJGaWxlc0NvbnRyb2xsZXIiLCJlbWFpbEFkYXB0ZXIiLCJ2ZXJpZnlVc2VyRW1haWxzIiwiZW1haWxDb250cm9sbGVyQWRhcHRlciIsIlVzZXJDb250cm9sbGVyIiwiY2FjaGVBZGFwdGVyIiwiY2FjaGVUVEwiLCJjYWNoZU1heFNpemUiLCJjYWNoZUNvbnRyb2xsZXJBZGFwdGVyIiwiSW5NZW1vcnlDYWNoZUFkYXB0ZXIiLCJ0dGwiLCJtYXhTaXplIiwiQ2FjaGVDb250cm9sbGVyIiwiY29udHJvbGxlckRlcHMiLCJQYXJzZUdyYXBoUUxDb250cm9sbGVyIiwibW91bnRHcmFwaFFMIiwiYW5hbHl0aWNzQWRhcHRlciIsImFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyIiwiQW5hbHl0aWNzQWRhcHRlciIsIkFuYWx5dGljc0NvbnRyb2xsZXIiLCJMaXZlUXVlcnlDb250cm9sbGVyIiwibGl2ZVF1ZXJ5IiwiY29sbGVjdGlvblByZWZpeCIsImRlZmF1bHRzIiwiZ2V0RGF0YWJhc2VBZGFwdGVyIiwiRGF0YWJhc2VDb250cm9sbGVyIiwid2ViaG9va0tleSIsIkhvb2tzQ29udHJvbGxlciIsImdldFB1c2hDb250cm9sbGVyIiwic2NoZWR1bGVkUHVzaCIsInB1c2giLCJwdXNoT3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsInB1c2hRdWV1ZU9wdGlvbnMiLCJxdWV1ZU9wdGlvbnMiLCJQYXJzZVB1c2hBZGFwdGVyIiwibG9hZE1vZHVsZSIsInB1c2hBZGFwdGVyIiwiYWRhcHRlciIsInB1c2hDb250cm9sbGVyIiwiUHVzaENvbnRyb2xsZXIiLCJoYXNQdXNoU3VwcG9ydCIsImhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0IiwiZGlzYWJsZVB1c2hXb3JrZXIiLCJwdXNoQ29udHJvbGxlclF1ZXVlIiwiUHVzaFF1ZXVlIiwicHVzaFdvcmtlciIsIlB1c2hXb3JrZXIiLCJhdXRoIiwiZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJwcm90b2NvbCIsInBhcnNlZFVSSSIsIlVSTCIsInRvTG93ZXJDYXNlIiwiUG9zdGdyZXNTdG9yYWdlQWRhcHRlciIsInVyaSIsIk1vbmdvU3RvcmFnZUFkYXB0ZXIiLCJtb25nb09wdGlvbnMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvQ29udHJvbGxlcnMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGF1dGhEYXRhTWFuYWdlciBmcm9tICcuLi9BZGFwdGVycy9BdXRoJztcbmltcG9ydCB7IFBhcnNlU2VydmVyT3B0aW9ucyB9IGZyb20gJy4uL09wdGlvbnMnO1xuaW1wb3J0IHsgbG9hZEFkYXB0ZXIsIGxvYWRNb2R1bGUgfSBmcm9tICcuLi9BZGFwdGVycy9BZGFwdGVyTG9hZGVyJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuLi9kZWZhdWx0cyc7XG4vLyBDb250cm9sbGVyc1xuaW1wb3J0IHsgTG9nZ2VyQ29udHJvbGxlciB9IGZyb20gJy4vTG9nZ2VyQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGaWxlc0NvbnRyb2xsZXIgfSBmcm9tICcuL0ZpbGVzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBIb29rc0NvbnRyb2xsZXIgfSBmcm9tICcuL0hvb2tzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBVc2VyQ29udHJvbGxlciB9IGZyb20gJy4vVXNlckNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQ2FjaGVDb250cm9sbGVyIH0gZnJvbSAnLi9DYWNoZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgTGl2ZVF1ZXJ5Q29udHJvbGxlciB9IGZyb20gJy4vTGl2ZVF1ZXJ5Q29udHJvbGxlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NDb250cm9sbGVyIH0gZnJvbSAnLi9BbmFseXRpY3NDb250cm9sbGVyJztcbmltcG9ydCB7IFB1c2hDb250cm9sbGVyIH0gZnJvbSAnLi9QdXNoQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQdXNoUXVldWUgfSBmcm9tICcuLi9QdXNoL1B1c2hRdWV1ZSc7XG5pbXBvcnQgeyBQdXNoV29ya2VyIH0gZnJvbSAnLi4vUHVzaC9QdXNoV29ya2VyJztcbmltcG9ydCBEYXRhYmFzZUNvbnRyb2xsZXIgZnJvbSAnLi9EYXRhYmFzZUNvbnRyb2xsZXInO1xuXG4vLyBBZGFwdGVyc1xuaW1wb3J0IHsgR3JpZEZTQnVja2V0QWRhcHRlciB9IGZyb20gJy4uL0FkYXB0ZXJzL0ZpbGVzL0dyaWRGU0J1Y2tldEFkYXB0ZXInO1xuaW1wb3J0IHsgV2luc3RvbkxvZ2dlckFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9Mb2dnZXIvV2luc3RvbkxvZ2dlckFkYXB0ZXInO1xuaW1wb3J0IHsgSW5NZW1vcnlDYWNoZUFkYXB0ZXIgfSBmcm9tICcuLi9BZGFwdGVycy9DYWNoZS9Jbk1lbW9yeUNhY2hlQWRhcHRlcic7XG5pbXBvcnQgeyBBbmFseXRpY3NBZGFwdGVyIH0gZnJvbSAnLi4vQWRhcHRlcnMvQW5hbHl0aWNzL0FuYWx5dGljc0FkYXB0ZXInO1xuaW1wb3J0IE1vbmdvU3RvcmFnZUFkYXB0ZXIgZnJvbSAnLi4vQWRhcHRlcnMvU3RvcmFnZS9Nb25nby9Nb25nb1N0b3JhZ2VBZGFwdGVyJztcbmltcG9ydCBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJzL1N0b3JhZ2UvUG9zdGdyZXMvUG9zdGdyZXNTdG9yYWdlQWRhcHRlcic7XG5pbXBvcnQgUGFyc2VHcmFwaFFMQ29udHJvbGxlciBmcm9tICcuL1BhcnNlR3JhcGhRTENvbnRyb2xsZXInO1xuaW1wb3J0IFNjaGVtYUNhY2hlIGZyb20gJy4uL0FkYXB0ZXJzL0NhY2hlL1NjaGVtYUNhY2hlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXJzKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucykge1xuICBjb25zdCBsb2dnZXJDb250cm9sbGVyID0gZ2V0TG9nZ2VyQ29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgZmlsZXNDb250cm9sbGVyID0gZ2V0RmlsZXNDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCB1c2VyQ29udHJvbGxlciA9IGdldFVzZXJDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBjYWNoZUNvbnRyb2xsZXIgPSBnZXRDYWNoZUNvbnRyb2xsZXIob3B0aW9ucyk7XG4gIGNvbnN0IGFuYWx5dGljc0NvbnRyb2xsZXIgPSBnZXRBbmFseXRpY3NDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBsaXZlUXVlcnlDb250cm9sbGVyID0gZ2V0TGl2ZVF1ZXJ5Q29udHJvbGxlcihvcHRpb25zKTtcbiAgY29uc3QgZGF0YWJhc2VDb250cm9sbGVyID0gZ2V0RGF0YWJhc2VDb250cm9sbGVyKG9wdGlvbnMpO1xuICBjb25zdCBob29rc0NvbnRyb2xsZXIgPSBnZXRIb29rc0NvbnRyb2xsZXIob3B0aW9ucywgZGF0YWJhc2VDb250cm9sbGVyKTtcbiAgY29uc3QgYXV0aERhdGFNYW5hZ2VyID0gZ2V0QXV0aERhdGFNYW5hZ2VyKG9wdGlvbnMpO1xuICBjb25zdCBwYXJzZUdyYXBoUUxDb250cm9sbGVyID0gZ2V0UGFyc2VHcmFwaFFMQ29udHJvbGxlcihvcHRpb25zLCB7XG4gICAgZGF0YWJhc2VDb250cm9sbGVyLFxuICAgIGNhY2hlQ29udHJvbGxlcixcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbG9nZ2VyQ29udHJvbGxlcixcbiAgICBmaWxlc0NvbnRyb2xsZXIsXG4gICAgdXNlckNvbnRyb2xsZXIsXG4gICAgYW5hbHl0aWNzQ29udHJvbGxlcixcbiAgICBjYWNoZUNvbnRyb2xsZXIsXG4gICAgcGFyc2VHcmFwaFFMQ29udHJvbGxlcixcbiAgICBsaXZlUXVlcnlDb250cm9sbGVyLFxuICAgIGRhdGFiYXNlQ29udHJvbGxlcixcbiAgICBob29rc0NvbnRyb2xsZXIsXG4gICAgYXV0aERhdGFNYW5hZ2VyLFxuICAgIHNjaGVtYUNhY2hlOiBTY2hlbWFDYWNoZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvZ2dlckNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTG9nZ2VyQ29udHJvbGxlciB7XG4gIGNvbnN0IHtcbiAgICBhcHBJZCxcbiAgICBqc29uTG9ncyxcbiAgICBsb2dzRm9sZGVyLFxuICAgIHZlcmJvc2UsXG4gICAgbG9nTGV2ZWwsXG4gICAgbWF4TG9nRmlsZXMsXG4gICAgc2lsZW50LFxuICAgIGxvZ2dlckFkYXB0ZXIsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBsb2dnZXJPcHRpb25zID0ge1xuICAgIGpzb25Mb2dzLFxuICAgIGxvZ3NGb2xkZXIsXG4gICAgdmVyYm9zZSxcbiAgICBsb2dMZXZlbCxcbiAgICBzaWxlbnQsXG4gICAgbWF4TG9nRmlsZXMsXG4gIH07XG4gIGNvbnN0IGxvZ2dlckNvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIobG9nZ2VyQWRhcHRlciwgV2luc3RvbkxvZ2dlckFkYXB0ZXIsIGxvZ2dlck9wdGlvbnMpO1xuICByZXR1cm4gbmV3IExvZ2dlckNvbnRyb2xsZXIobG9nZ2VyQ29udHJvbGxlckFkYXB0ZXIsIGFwcElkLCBsb2dnZXJPcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVzQ29udHJvbGxlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpOiBGaWxlc0NvbnRyb2xsZXIge1xuICBjb25zdCB7XG4gICAgYXBwSWQsXG4gICAgZGF0YWJhc2VVUkksXG4gICAgZGF0YWJhc2VPcHRpb25zID0ge30sXG4gICAgZmlsZXNBZGFwdGVyLFxuICAgIGRhdGFiYXNlQWRhcHRlcixcbiAgICBwcmVzZXJ2ZUZpbGVOYW1lLFxuICAgIGZpbGVLZXksXG4gIH0gPSBvcHRpb25zO1xuICBpZiAoIWZpbGVzQWRhcHRlciAmJiBkYXRhYmFzZUFkYXB0ZXIpIHtcbiAgICB0aHJvdyAnV2hlbiB1c2luZyBhbiBleHBsaWNpdCBkYXRhYmFzZSBhZGFwdGVyLCB5b3UgbXVzdCBhbHNvIHVzZSBhbiBleHBsaWNpdCBmaWxlc0FkYXB0ZXIuJztcbiAgfVxuICBjb25zdCBmaWxlc0NvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIoZmlsZXNBZGFwdGVyLCAoKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBHcmlkRlNCdWNrZXRBZGFwdGVyKGRhdGFiYXNlVVJJLCBkYXRhYmFzZU9wdGlvbnMsIGZpbGVLZXkpO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBGaWxlc0NvbnRyb2xsZXIoZmlsZXNDb250cm9sbGVyQWRhcHRlciwgYXBwSWQsIHtcbiAgICBwcmVzZXJ2ZUZpbGVOYW1lLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IFVzZXJDb250cm9sbGVyIHtcbiAgY29uc3QgeyBhcHBJZCwgZW1haWxBZGFwdGVyLCB2ZXJpZnlVc2VyRW1haWxzIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbWFpbENvbnRyb2xsZXJBZGFwdGVyID0gbG9hZEFkYXB0ZXIoZW1haWxBZGFwdGVyKTtcbiAgcmV0dXJuIG5ldyBVc2VyQ29udHJvbGxlcihlbWFpbENvbnRyb2xsZXJBZGFwdGVyLCBhcHBJZCwge1xuICAgIHZlcmlmeVVzZXJFbWFpbHMsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVDb250cm9sbGVyKG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyk6IENhY2hlQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYXBwSWQsIGNhY2hlQWRhcHRlciwgY2FjaGVUVEwsIGNhY2hlTWF4U2l6ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2FjaGVDb250cm9sbGVyQWRhcHRlciA9IGxvYWRBZGFwdGVyKGNhY2hlQWRhcHRlciwgSW5NZW1vcnlDYWNoZUFkYXB0ZXIsIHtcbiAgICBhcHBJZDogYXBwSWQsXG4gICAgdHRsOiBjYWNoZVRUTCxcbiAgICBtYXhTaXplOiBjYWNoZU1heFNpemUsXG4gIH0pO1xuICByZXR1cm4gbmV3IENhY2hlQ29udHJvbGxlcihjYWNoZUNvbnRyb2xsZXJBZGFwdGVyLCBhcHBJZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJzZUdyYXBoUUxDb250cm9sbGVyKFxuICBvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMsXG4gIGNvbnRyb2xsZXJEZXBzXG4pOiBQYXJzZUdyYXBoUUxDb250cm9sbGVyIHtcbiAgcmV0dXJuIG5ldyBQYXJzZUdyYXBoUUxDb250cm9sbGVyKHtcbiAgICBtb3VudEdyYXBoUUw6IG9wdGlvbnMubW91bnRHcmFwaFFMLFxuICAgIC4uLmNvbnRyb2xsZXJEZXBzLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljc0NvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogQW5hbHl0aWNzQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYW5hbHl0aWNzQWRhcHRlciB9ID0gb3B0aW9ucztcbiAgY29uc3QgYW5hbHl0aWNzQ29udHJvbGxlckFkYXB0ZXIgPSBsb2FkQWRhcHRlcihhbmFseXRpY3NBZGFwdGVyLCBBbmFseXRpY3NBZGFwdGVyKTtcbiAgcmV0dXJuIG5ldyBBbmFseXRpY3NDb250cm9sbGVyKGFuYWx5dGljc0NvbnRyb2xsZXJBZGFwdGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExpdmVRdWVyeUNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogTGl2ZVF1ZXJ5Q29udHJvbGxlciB7XG4gIHJldHVybiBuZXcgTGl2ZVF1ZXJ5Q29udHJvbGxlcihvcHRpb25zLmxpdmVRdWVyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUNvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogRGF0YWJhc2VDb250cm9sbGVyIHtcbiAgY29uc3QgeyBkYXRhYmFzZVVSSSwgY29sbGVjdGlvblByZWZpeCwgZGF0YWJhc2VPcHRpb25zIH0gPSBvcHRpb25zO1xuICBsZXQgeyBkYXRhYmFzZUFkYXB0ZXIgfSA9IG9wdGlvbnM7XG4gIGlmIChcbiAgICAoZGF0YWJhc2VPcHRpb25zIHx8XG4gICAgICAoZGF0YWJhc2VVUkkgJiYgZGF0YWJhc2VVUkkgIT09IGRlZmF1bHRzLmRhdGFiYXNlVVJJKSB8fFxuICAgICAgY29sbGVjdGlvblByZWZpeCAhPT0gZGVmYXVsdHMuY29sbGVjdGlvblByZWZpeCkgJiZcbiAgICBkYXRhYmFzZUFkYXB0ZXJcbiAgKSB7XG4gICAgdGhyb3cgJ1lvdSBjYW5ub3Qgc3BlY2lmeSBib3RoIGEgZGF0YWJhc2VBZGFwdGVyIGFuZCBhIGRhdGFiYXNlVVJJL2RhdGFiYXNlT3B0aW9ucy9jb2xsZWN0aW9uUHJlZml4Lic7XG4gIH0gZWxzZSBpZiAoIWRhdGFiYXNlQWRhcHRlcikge1xuICAgIGRhdGFiYXNlQWRhcHRlciA9IGdldERhdGFiYXNlQWRhcHRlcihkYXRhYmFzZVVSSSwgY29sbGVjdGlvblByZWZpeCwgZGF0YWJhc2VPcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhYmFzZUFkYXB0ZXIgPSBsb2FkQWRhcHRlcihkYXRhYmFzZUFkYXB0ZXIpO1xuICB9XG4gIHJldHVybiBuZXcgRGF0YWJhc2VDb250cm9sbGVyKGRhdGFiYXNlQWRhcHRlciwgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIb29rc0NvbnRyb2xsZXIoXG4gIG9wdGlvbnM6IFBhcnNlU2VydmVyT3B0aW9ucyxcbiAgZGF0YWJhc2VDb250cm9sbGVyOiBEYXRhYmFzZUNvbnRyb2xsZXJcbik6IEhvb2tzQ29udHJvbGxlciB7XG4gIGNvbnN0IHsgYXBwSWQsIHdlYmhvb2tLZXkgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBuZXcgSG9va3NDb250cm9sbGVyKGFwcElkLCBkYXRhYmFzZUNvbnRyb2xsZXIsIHdlYmhvb2tLZXkpO1xufVxuXG5pbnRlcmZhY2UgUHVzaENvbnRyb2xsaW5nIHtcbiAgcHVzaENvbnRyb2xsZXI6IFB1c2hDb250cm9sbGVyO1xuICBoYXNQdXNoU2NoZWR1bGVkU3VwcG9ydDogYm9vbGVhbjtcbiAgcHVzaENvbnRyb2xsZXJRdWV1ZTogUHVzaFF1ZXVlO1xuICBwdXNoV29ya2VyOiBQdXNoV29ya2VyO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHVzaENvbnRyb2xsZXIob3B0aW9uczogUGFyc2VTZXJ2ZXJPcHRpb25zKTogUHVzaENvbnRyb2xsaW5nIHtcbiAgY29uc3QgeyBzY2hlZHVsZWRQdXNoLCBwdXNoIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHB1c2hPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgcHVzaCk7XG4gIGNvbnN0IHB1c2hRdWV1ZU9wdGlvbnMgPSBwdXNoT3B0aW9ucy5xdWV1ZU9wdGlvbnMgfHwge307XG4gIGlmIChwdXNoT3B0aW9ucy5xdWV1ZU9wdGlvbnMpIHtcbiAgICBkZWxldGUgcHVzaE9wdGlvbnMucXVldWVPcHRpb25zO1xuICB9XG5cbiAgLy8gUGFzcyB0aGUgcHVzaCBvcHRpb25zIHRvbyBhcyBpdCB3b3JrcyB3aXRoIHRoZSBkZWZhdWx0XG4gIGNvbnN0IFBhcnNlUHVzaEFkYXB0ZXIgPSBhd2FpdCBsb2FkTW9kdWxlKCdAcGFyc2UvcHVzaC1hZGFwdGVyJyk7XG4gIGNvbnN0IHB1c2hBZGFwdGVyID0gbG9hZEFkYXB0ZXIoXG4gICAgcHVzaE9wdGlvbnMgJiYgcHVzaE9wdGlvbnMuYWRhcHRlcixcbiAgICBQYXJzZVB1c2hBZGFwdGVyLFxuICAgIHB1c2hPcHRpb25zXG4gICk7XG4gIC8vIFdlIHBhc3MgdGhlIG9wdGlvbnMgYW5kIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgYWRhdHBlcixcbiAgLy8gTm90ZSB0aGF0IHBhc3NpbmcgYW4gaW5zdGFuY2Ugd291bGQgd29yayB0b29cbiAgY29uc3QgcHVzaENvbnRyb2xsZXIgPSBuZXcgUHVzaENvbnRyb2xsZXIoKTtcbiAgY29uc3QgaGFzUHVzaFN1cHBvcnQgPSAhIShwdXNoQWRhcHRlciAmJiBwdXNoKTtcbiAgY29uc3QgaGFzUHVzaFNjaGVkdWxlZFN1cHBvcnQgPSBoYXNQdXNoU3VwcG9ydCAmJiBzY2hlZHVsZWRQdXNoID09PSB0cnVlO1xuXG4gIGNvbnN0IHsgZGlzYWJsZVB1c2hXb3JrZXIgfSA9IHB1c2hRdWV1ZU9wdGlvbnM7XG5cbiAgY29uc3QgcHVzaENvbnRyb2xsZXJRdWV1ZSA9IG5ldyBQdXNoUXVldWUocHVzaFF1ZXVlT3B0aW9ucyk7XG4gIGxldCBwdXNoV29ya2VyO1xuICBpZiAoIWRpc2FibGVQdXNoV29ya2VyKSB7XG4gICAgcHVzaFdvcmtlciA9IG5ldyBQdXNoV29ya2VyKHB1c2hBZGFwdGVyLCBwdXNoUXVldWVPcHRpb25zKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHB1c2hDb250cm9sbGVyLFxuICAgIGhhc1B1c2hTdXBwb3J0LFxuICAgIGhhc1B1c2hTY2hlZHVsZWRTdXBwb3J0LFxuICAgIHB1c2hDb250cm9sbGVyUXVldWUsXG4gICAgcHVzaFdvcmtlcixcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF1dGhEYXRhTWFuYWdlcihvcHRpb25zOiBQYXJzZVNlcnZlck9wdGlvbnMpIHtcbiAgY29uc3QgeyBhdXRoLCBlbmFibGVBbm9ueW1vdXNVc2VycyB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIGF1dGhEYXRhTWFuYWdlcihhdXRoLCBlbmFibGVBbm9ueW1vdXNVc2Vycyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXRhYmFzZUFkYXB0ZXIoZGF0YWJhc2VVUkksIGNvbGxlY3Rpb25QcmVmaXgsIGRhdGFiYXNlT3B0aW9ucykge1xuICBsZXQgcHJvdG9jb2w7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkVVJJID0gbmV3IFVSTChkYXRhYmFzZVVSSSk7XG4gICAgcHJvdG9jb2wgPSBwYXJzZWRVUkkucHJvdG9jb2wgPyBwYXJzZWRVUkkucHJvdG9jb2wudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gIH0gY2F0Y2gge1xuICAgIC8qICovXG4gIH1cbiAgc3dpdGNoIChwcm90b2NvbCkge1xuICAgIGNhc2UgJ3Bvc3RncmVzOic6XG4gICAgY2FzZSAncG9zdGdyZXNxbDonOlxuICAgICAgcmV0dXJuIG5ldyBQb3N0Z3Jlc1N0b3JhZ2VBZGFwdGVyKHtcbiAgICAgICAgdXJpOiBkYXRhYmFzZVVSSSxcbiAgICAgICAgY29sbGVjdGlvblByZWZpeCxcbiAgICAgICAgZGF0YWJhc2VPcHRpb25zLFxuICAgICAgfSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgTW9uZ29TdG9yYWdlQWRhcHRlcih7XG4gICAgICAgIHVyaTogZGF0YWJhc2VVUkksXG4gICAgICAgIGNvbGxlY3Rpb25QcmVmaXgsXG4gICAgICAgIG1vbmdvT3B0aW9uczogZGF0YWJhc2VPcHRpb25zLFxuICAgICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsY0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUksaUJBQUEsR0FBQUosT0FBQTtBQUNB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
@@ -1,2 +1,2 @@
1
1
  "use strict";
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJ0eXBlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbXX0=
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbnRyb2xsZXJzL3R5cGVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIExvYWRTY2hlbWFPcHRpb25zID0ge1xuICBjbGVhckNhY2hlOiBib29sZWFuLFxufTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hRmllbGQgPSB7XG4gIHR5cGU6IHN0cmluZyxcbiAgdGFyZ2V0Q2xhc3M/OiA/c3RyaW5nLFxuICByZXF1aXJlZD86ID9ib29sZWFuLFxuICBkZWZhdWx0VmFsdWU/OiA/YW55LFxufTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hRmllbGRzID0geyBbc3RyaW5nXTogU2NoZW1hRmllbGQgfTtcblxuZXhwb3J0IHR5cGUgU2NoZW1hID0ge1xuICBjbGFzc05hbWU6IHN0cmluZyxcbiAgZmllbGRzOiBTY2hlbWFGaWVsZHMsXG4gIGNsYXNzTGV2ZWxQZXJtaXNzaW9uczogQ2xhc3NMZXZlbFBlcm1pc3Npb25zLFxuICBpbmRleGVzPzogP2FueSxcbn07XG5cbmV4cG9ydCB0eXBlIENsYXNzTGV2ZWxQZXJtaXNzaW9ucyA9IHtcbiAgQUNMPzoge1xuICAgIFtzdHJpbmddOiB7XG4gICAgICBbc3RyaW5nXTogYm9vbGVhbixcbiAgICB9LFxuICB9LFxuICBmaW5kPzogeyBbc3RyaW5nXTogYm9vbGVhbiB9LFxuICBjb3VudD86IHsgW3N0cmluZ106IGJvb2xlYW4gfSxcbiAgZ2V0PzogeyBbc3RyaW5nXTogYm9vbGVhbiB9LFxuICBjcmVhdGU/OiB7IFtzdHJpbmddOiBib29sZWFuIH0sXG4gIHVwZGF0ZT86IHsgW3N0cmluZ106IGJvb2xlYW4gfSxcbiAgZGVsZXRlPzogeyBbc3RyaW5nXTogYm9vbGVhbiB9LFxuICBhZGRGaWVsZD86IHsgW3N0cmluZ106IGJvb2xlYW4gfSxcbiAgcmVhZFVzZXJGaWVsZHM/OiBzdHJpbmdbXSxcbiAgd3JpdGVVc2VyRmllbGRzPzogc3RyaW5nW10sXG4gIHByb3RlY3RlZEZpZWxkcz86IHsgW3N0cmluZ106IHN0cmluZ1tdIH0sXG59O1xuIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * The deprecations.
5
+ *
6
+ * Add deprecations to the array using the following keys:
7
+ * - `optionKey` {String}: The option key incl. its path, e.g. `security.enableCheck`.
8
+ * - `envKey` {String}: The environment key, e.g. `PARSE_SERVER_SECURITY`.
9
+ * - `changeNewKey` {String}: Set the new key name if the current key will be replaced,
10
+ * or set to an empty string if the current key will be removed without replacement.
11
+ * - `changeNewDefault` {String}: Set the new default value if the key's default value
12
+ * will change in a future version.
13
+ * - `solution`: The instruction to resolve this deprecation warning. Optional. This
14
+ * instruction must not include the deprecation warning which is auto-generated.
15
+ * It should only contain additional instruction regarding the deprecation if
16
+ * necessary.
17
+ *
18
+ * If there are no deprecations, this must return an empty array.
19
+ */
20
+ module.exports = [{
21
+ optionKey: 'encodeParseObjectInCloudFunction',
22
+ changeNewDefault: 'true'
23
+ }, {
24
+ optionKey: 'enableInsecureAuthAdapters',
25
+ changeNewDefault: 'false'
26
+ }, {
27
+ optionKey: 'databaseOptions.allowPublicExplain',
28
+ changeNewDefault: 'false'
29
+ }];
30
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwib3B0aW9uS2V5IiwiY2hhbmdlTmV3RGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9EZXByZWNhdG9yL0RlcHJlY2F0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBkZXByZWNhdGlvbnMuXG4gKlxuICogQWRkIGRlcHJlY2F0aW9ucyB0byB0aGUgYXJyYXkgdXNpbmcgdGhlIGZvbGxvd2luZyBrZXlzOlxuICogLSBgb3B0aW9uS2V5YCB7U3RyaW5nfTogVGhlIG9wdGlvbiBrZXkgaW5jbC4gaXRzIHBhdGgsIGUuZy4gYHNlY3VyaXR5LmVuYWJsZUNoZWNrYC5cbiAqIC0gYGVudktleWAge1N0cmluZ306IFRoZSBlbnZpcm9ubWVudCBrZXksIGUuZy4gYFBBUlNFX1NFUlZFUl9TRUNVUklUWWAuXG4gKiAtIGBjaGFuZ2VOZXdLZXlgIHtTdHJpbmd9OiBTZXQgdGhlIG5ldyBrZXkgbmFtZSBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZXBsYWNlZCxcbiAqIG9yIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGN1cnJlbnQga2V5IHdpbGwgYmUgcmVtb3ZlZCB3aXRob3V0IHJlcGxhY2VtZW50LlxuICogLSBgY2hhbmdlTmV3RGVmYXVsdGAge1N0cmluZ306IFNldCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSdzIGRlZmF1bHQgdmFsdWVcbiAqIHdpbGwgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gKiAtIGBzb2x1dGlvbmA6IFRoZSBpbnN0cnVjdGlvbiB0byByZXNvbHZlIHRoaXMgZGVwcmVjYXRpb24gd2FybmluZy4gT3B0aW9uYWwuIFRoaXNcbiAqIGluc3RydWN0aW9uIG11c3Qgbm90IGluY2x1ZGUgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hpY2ggaXMgYXV0by1nZW5lcmF0ZWQuXG4gKiBJdCBzaG91bGQgb25seSBjb250YWluIGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gcmVnYXJkaW5nIHRoZSBkZXByZWNhdGlvbiBpZlxuICogbmVjZXNzYXJ5LlxuICpcbiAqIElmIHRoZXJlIGFyZSBubyBkZXByZWNhdGlvbnMsIHRoaXMgbXVzdCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gW1xuICB7IG9wdGlvbktleTogJ2VuY29kZVBhcnNlT2JqZWN0SW5DbG91ZEZ1bmN0aW9uJywgY2hhbmdlTmV3RGVmYXVsdDogJ3RydWUnIH0sXG4gIHsgb3B0aW9uS2V5OiAnZW5hYmxlSW5zZWN1cmVBdXRoQWRhcHRlcnMnLCBjaGFuZ2VOZXdEZWZhdWx0OiAnZmFsc2UnIH0sXG4gIHsgb3B0aW9uS2V5OiAnZGF0YWJhc2VPcHRpb25zLmFsbG93UHVibGljRXhwbGFpbicsIGNoYW5nZU5ld0RlZmF1bHQ6ICdmYWxzZScgfSxcbl07XG4iXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxDQUNmO0VBQUVDLFNBQVMsRUFBRSxrQ0FBa0M7RUFBRUMsZ0JBQWdCLEVBQUU7QUFBTyxDQUFDLEVBQzNFO0VBQUVELFNBQVMsRUFBRSw0QkFBNEI7RUFBRUMsZ0JBQWdCLEVBQUU7QUFBUSxDQUFDLEVBQ3RFO0VBQUVELFNBQVMsRUFBRSxvQ0FBb0M7RUFBRUMsZ0JBQWdCLEVBQUU7QUFBUSxDQUFDLENBQy9FIiwiaWdub3JlTGlzdCI6W119
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+
3
+ var _logger = _interopRequireDefault(require("../logger"));
4
+ var _Deprecations = _interopRequireDefault(require("./Deprecations"));
5
+ var _Utils = _interopRequireDefault(require("../Utils"));
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
7
+ /**
8
+ * The deprecator class.
9
+ */
10
+ class Deprecator {
11
+ /**
12
+ * Scans the Parse Server for deprecated options.
13
+ * This needs to be called before setting option defaults, otherwise it
14
+ * becomes indistinguishable whether an option has been set manually or
15
+ * by default.
16
+ * @param {any} options The Parse Server options.
17
+ */
18
+ static scanParseServerOptions(options) {
19
+ // Scan for deprecations
20
+ for (const deprecation of Deprecator._getDeprecations()) {
21
+ // Get deprecation properties
22
+ const solution = deprecation.solution;
23
+ const optionKey = deprecation.optionKey;
24
+ const changeNewDefault = deprecation.changeNewDefault;
25
+
26
+ // If default will change, only throw a warning if option is not set
27
+ if (changeNewDefault != null && _Utils.default.getNestedProperty(options, optionKey) == null) {
28
+ Deprecator._logOption({
29
+ optionKey,
30
+ changeNewDefault,
31
+ solution
32
+ });
33
+ }
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Logs a deprecation warning for a parameter that can only be determined dynamically
39
+ * during runtime.
40
+ *
41
+ * Note: Do not use this to log deprecations of Parse Server options, but add such
42
+ * deprecations to `Deprecations.js` instead. See the contribution docs for more
43
+ * details.
44
+ *
45
+ * For consistency, the deprecation warning is composed of the following parts:
46
+ *
47
+ * > DeprecationWarning: `usage` is deprecated and will be removed in a future version.
48
+ * `solution`.
49
+ *
50
+ * - `usage`: The deprecated usage.
51
+ * - `solution`: The instruction to resolve this deprecation warning.
52
+ *
53
+ * For example:
54
+ * > DeprecationWarning: `Prefixing field names with dollar sign ($) in aggregation query`
55
+ * is deprecated and will be removed in a future version. `Reference field names without
56
+ * dollar sign prefix.`
57
+ *
58
+ * @param {Object} options The deprecation options.
59
+ * @param {String} options.usage The usage that is deprecated.
60
+ * @param {String} [options.solution] The instruction to resolve this deprecation warning.
61
+ * Optional. It is recommended to add an instruction for the convenience of the developer.
62
+ */
63
+ static logRuntimeDeprecation(options) {
64
+ Deprecator._logGeneric(options);
65
+ }
66
+
67
+ /**
68
+ * Returns the deprecation definitions.
69
+ * @returns {Array<Object>} The deprecations.
70
+ */
71
+ static _getDeprecations() {
72
+ return _Deprecations.default;
73
+ }
74
+
75
+ /**
76
+ * Logs a generic deprecation warning.
77
+ *
78
+ * @param {Object} options The deprecation options.
79
+ * @param {String} options.usage The usage that is deprecated.
80
+ * @param {String} [options.solution] The instruction to resolve this deprecation warning.
81
+ * Optional. It is recommended to add an instruction for the convenience of the developer.
82
+ */
83
+ static _logGeneric({
84
+ usage,
85
+ solution
86
+ }) {
87
+ // Compose message
88
+ let output = `DeprecationWarning: ${usage} is deprecated and will be removed in a future version.`;
89
+ output += solution ? ` ${solution}` : '';
90
+ _logger.default.warn(output);
91
+ }
92
+
93
+ /**
94
+ * Logs a deprecation warning for a Parse Server option.
95
+ *
96
+ * @param {String} optionKey The option key incl. its path, e.g. `security.enableCheck`.
97
+ * @param {String} envKey The environment key, e.g. `PARSE_SERVER_SECURITY`.
98
+ * @param {String} changeNewKey Set the new key name if the current key will be replaced,
99
+ * or set to an empty string if the current key will be removed without replacement.
100
+ * @param {String} changeNewDefault Set the new default value if the key's default value
101
+ * will change in a future version.
102
+ * @param {String} [solution] The instruction to resolve this deprecation warning. This
103
+ * message must not include the warning that the parameter is deprecated, that is
104
+ * automatically added to the message. It should only contain the instruction on how
105
+ * to resolve this warning.
106
+ */
107
+ static _logOption({
108
+ optionKey,
109
+ envKey,
110
+ changeNewKey,
111
+ changeNewDefault,
112
+ solution
113
+ }) {
114
+ const type = optionKey ? 'option' : 'environment key';
115
+ const key = optionKey ? optionKey : envKey;
116
+ const keyAction = changeNewKey == null ? undefined : changeNewKey.length > 0 ? `renamed to '${changeNewKey}'` : `removed`;
117
+
118
+ // Compose message
119
+ let output = `DeprecationWarning: The Parse Server ${type} '${key}' `;
120
+ output += changeNewKey ? `is deprecated and will be ${keyAction} in a future version.` : '';
121
+ output += changeNewDefault ? `default will change to '${changeNewDefault}' in a future version.` : '';
122
+ output += solution ? ` ${solution}` : '';
123
+ _logger.default.warn(output);
124
+ }
125
+ }
126
+ module.exports = Deprecator;
127
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfRGVwcmVjYXRpb25zIiwiX1V0aWxzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRGVwcmVjYXRvciIsInNjYW5QYXJzZVNlcnZlck9wdGlvbnMiLCJvcHRpb25zIiwiZGVwcmVjYXRpb24iLCJfZ2V0RGVwcmVjYXRpb25zIiwic29sdXRpb24iLCJvcHRpb25LZXkiLCJjaGFuZ2VOZXdEZWZhdWx0IiwiVXRpbHMiLCJnZXROZXN0ZWRQcm9wZXJ0eSIsIl9sb2dPcHRpb24iLCJsb2dSdW50aW1lRGVwcmVjYXRpb24iLCJfbG9nR2VuZXJpYyIsIkRlcHJlY2F0aW9ucyIsInVzYWdlIiwib3V0cHV0IiwibG9nZ2VyIiwid2FybiIsImVudktleSIsImNoYW5nZU5ld0tleSIsInR5cGUiLCJrZXkiLCJrZXlBY3Rpb24iLCJ1bmRlZmluZWQiLCJsZW5ndGgiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL0RlcHJlY2F0b3IvRGVwcmVjYXRvci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xvZ2dlcic7XG5pbXBvcnQgRGVwcmVjYXRpb25zIGZyb20gJy4vRGVwcmVjYXRpb25zJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi9VdGlscyc7XG5cbi8qKlxuICogVGhlIGRlcHJlY2F0b3IgY2xhc3MuXG4gKi9cbmNsYXNzIERlcHJlY2F0b3Ige1xuICAvKipcbiAgICogU2NhbnMgdGhlIFBhcnNlIFNlcnZlciBmb3IgZGVwcmVjYXRlZCBvcHRpb25zLlxuICAgKiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyBvcHRpb24gZGVmYXVsdHMsIG90aGVyd2lzZSBpdFxuICAgKiBiZWNvbWVzIGluZGlzdGluZ3Vpc2hhYmxlIHdoZXRoZXIgYW4gb3B0aW9uIGhhcyBiZWVuIHNldCBtYW51YWxseSBvclxuICAgKiBieSBkZWZhdWx0LlxuICAgKiBAcGFyYW0ge2FueX0gb3B0aW9ucyBUaGUgUGFyc2UgU2VydmVyIG9wdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgc2NhblBhcnNlU2VydmVyT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgLy8gU2NhbiBmb3IgZGVwcmVjYXRpb25zXG4gICAgZm9yIChjb25zdCBkZXByZWNhdGlvbiBvZiBEZXByZWNhdG9yLl9nZXREZXByZWNhdGlvbnMoKSkge1xuICAgICAgLy8gR2V0IGRlcHJlY2F0aW9uIHByb3BlcnRpZXNcbiAgICAgIGNvbnN0IHNvbHV0aW9uID0gZGVwcmVjYXRpb24uc29sdXRpb247XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBkZXByZWNhdGlvbi5vcHRpb25LZXk7XG4gICAgICBjb25zdCBjaGFuZ2VOZXdEZWZhdWx0ID0gZGVwcmVjYXRpb24uY2hhbmdlTmV3RGVmYXVsdDtcblxuICAgICAgLy8gSWYgZGVmYXVsdCB3aWxsIGNoYW5nZSwgb25seSB0aHJvdyBhIHdhcm5pbmcgaWYgb3B0aW9uIGlzIG5vdCBzZXRcbiAgICAgIGlmIChjaGFuZ2VOZXdEZWZhdWx0ICE9IG51bGwgJiYgVXRpbHMuZ2V0TmVzdGVkUHJvcGVydHkob3B0aW9ucywgb3B0aW9uS2V5KSA9PSBudWxsKSB7XG4gICAgICAgIERlcHJlY2F0b3IuX2xvZ09wdGlvbih7IG9wdGlvbktleSwgY2hhbmdlTmV3RGVmYXVsdCwgc29sdXRpb24gfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciBhIHBhcmFtZXRlciB0aGF0IGNhbiBvbmx5IGJlIGRldGVybWluZWQgZHluYW1pY2FsbHlcbiAgICogZHVyaW5nIHJ1bnRpbWUuXG4gICAqXG4gICAqIE5vdGU6IERvIG5vdCB1c2UgdGhpcyB0byBsb2cgZGVwcmVjYXRpb25zIG9mIFBhcnNlIFNlcnZlciBvcHRpb25zLCBidXQgYWRkIHN1Y2hcbiAgICogZGVwcmVjYXRpb25zIHRvIGBEZXByZWNhdGlvbnMuanNgIGluc3RlYWQuIFNlZSB0aGUgY29udHJpYnV0aW9uIGRvY3MgZm9yIG1vcmVcbiAgICogZGV0YWlscy5cbiAgICpcbiAgICogRm9yIGNvbnNpc3RlbmN5LCB0aGUgZGVwcmVjYXRpb24gd2FybmluZyBpcyBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIHBhcnRzOlxuICAgKlxuICAgKiA+IERlcHJlY2F0aW9uV2FybmluZzogYHVzYWdlYCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogYHNvbHV0aW9uYC5cbiAgICpcbiAgICogLSBgdXNhZ2VgOiBUaGUgZGVwcmVjYXRlZCB1c2FnZS5cbiAgICogLSBgc29sdXRpb25gOiBUaGUgaW5zdHJ1Y3Rpb24gdG8gcmVzb2x2ZSB0aGlzIGRlcHJlY2F0aW9uIHdhcm5pbmcuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiA+IERlcHJlY2F0aW9uV2FybmluZzogYFByZWZpeGluZyBmaWVsZCBuYW1lcyB3aXRoIGRvbGxhciBzaWduICgkKSBpbiBhZ2dyZWdhdGlvbiBxdWVyeWBcbiAgICogaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIGBSZWZlcmVuY2UgZmllbGQgbmFtZXMgd2l0aG91dFxuICAgKiBkb2xsYXIgc2lnbiBwcmVmaXguYFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgZGVwcmVjYXRpb24gb3B0aW9ucy5cbiAgICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvbnMudXNhZ2UgVGhlIHVzYWdlIHRoYXQgaXMgZGVwcmVjYXRlZC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNvbHV0aW9uXSBUaGUgaW5zdHJ1Y3Rpb24gdG8gcmVzb2x2ZSB0aGlzIGRlcHJlY2F0aW9uIHdhcm5pbmcuXG4gICAqIE9wdGlvbmFsLiBJdCBpcyByZWNvbW1lbmRlZCB0byBhZGQgYW4gaW5zdHJ1Y3Rpb24gZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgZGV2ZWxvcGVyLlxuICAgKi9cbiAgc3RhdGljIGxvZ1J1bnRpbWVEZXByZWNhdGlvbihvcHRpb25zKSB7XG4gICAgRGVwcmVjYXRvci5fbG9nR2VuZXJpYyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZXByZWNhdGlvbiBkZWZpbml0aW9ucy5cbiAgICogQHJldHVybnMge0FycmF5PE9iamVjdD59IFRoZSBkZXByZWNhdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgX2dldERlcHJlY2F0aW9ucygpIHtcbiAgICByZXR1cm4gRGVwcmVjYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBnZW5lcmljIGRlcHJlY2F0aW9uIHdhcm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBkZXByZWNhdGlvbiBvcHRpb25zLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9ucy51c2FnZSBUaGUgdXNhZ2UgdGhhdCBpcyBkZXByZWNhdGVkLlxuICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuc29sdXRpb25dIFRoZSBpbnN0cnVjdGlvbiB0byByZXNvbHZlIHRoaXMgZGVwcmVjYXRpb24gd2FybmluZy5cbiAgICogT3B0aW9uYWwuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGFkZCBhbiBpbnN0cnVjdGlvbiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBkZXZlbG9wZXIuXG4gICAqL1xuICBzdGF0aWMgX2xvZ0dlbmVyaWMoeyB1c2FnZSwgc29sdXRpb24gfSkge1xuICAgIC8vIENvbXBvc2UgbWVzc2FnZVxuICAgIGxldCBvdXRwdXQgPSBgRGVwcmVjYXRpb25XYXJuaW5nOiAke3VzYWdlfSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5gO1xuICAgIG91dHB1dCArPSBzb2x1dGlvbiA/IGAgJHtzb2x1dGlvbn1gIDogJyc7XG4gICAgbG9nZ2VyLndhcm4ob3V0cHV0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGEgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgYSBQYXJzZSBTZXJ2ZXIgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9uS2V5IFRoZSBvcHRpb24ga2V5IGluY2wuIGl0cyBwYXRoLCBlLmcuIGBzZWN1cml0eS5lbmFibGVDaGVja2AuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBlbnZLZXkgVGhlIGVudmlyb25tZW50IGtleSwgZS5nLiBgUEFSU0VfU0VSVkVSX1NFQ1VSSVRZYC5cbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5nZU5ld0tleSBTZXQgdGhlIG5ldyBrZXkgbmFtZSBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZXBsYWNlZCxcbiAgICogb3Igc2V0IHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSByZW1vdmVkIHdpdGhvdXQgcmVwbGFjZW1lbnQuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFuZ2VOZXdEZWZhdWx0IFNldCB0aGUgbmV3IGRlZmF1bHQgdmFsdWUgaWYgdGhlIGtleSdzIGRlZmF1bHQgdmFsdWVcbiAgICogd2lsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtzb2x1dGlvbl0gVGhlIGluc3RydWN0aW9uIHRvIHJlc29sdmUgdGhpcyBkZXByZWNhdGlvbiB3YXJuaW5nLiBUaGlzXG4gICAqIG1lc3NhZ2UgbXVzdCBub3QgaW5jbHVkZSB0aGUgd2FybmluZyB0aGF0IHRoZSBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCwgdGhhdCBpc1xuICAgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlLiBJdCBzaG91bGQgb25seSBjb250YWluIHRoZSBpbnN0cnVjdGlvbiBvbiBob3dcbiAgICogdG8gcmVzb2x2ZSB0aGlzIHdhcm5pbmcuXG4gICAqL1xuICBzdGF0aWMgX2xvZ09wdGlvbih7IG9wdGlvbktleSwgZW52S2V5LCBjaGFuZ2VOZXdLZXksIGNoYW5nZU5ld0RlZmF1bHQsIHNvbHV0aW9uIH0pIHtcbiAgICBjb25zdCB0eXBlID0gb3B0aW9uS2V5ID8gJ29wdGlvbicgOiAnZW52aXJvbm1lbnQga2V5JztcbiAgICBjb25zdCBrZXkgPSBvcHRpb25LZXkgPyBvcHRpb25LZXkgOiBlbnZLZXk7XG4gICAgY29uc3Qga2V5QWN0aW9uID1cbiAgICAgIGNoYW5nZU5ld0tleSA9PSBudWxsXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogY2hhbmdlTmV3S2V5Lmxlbmd0aCA+IDBcbiAgICAgICAgICA/IGByZW5hbWVkIHRvICcke2NoYW5nZU5ld0tleX0nYFxuICAgICAgICAgIDogYHJlbW92ZWRgO1xuXG4gICAgLy8gQ29tcG9zZSBtZXNzYWdlXG4gICAgbGV0IG91dHB1dCA9IGBEZXByZWNhdGlvbldhcm5pbmc6IFRoZSBQYXJzZSBTZXJ2ZXIgJHt0eXBlfSAnJHtrZXl9JyBgO1xuICAgIG91dHB1dCArPSBjaGFuZ2VOZXdLZXkgPyBgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSAke2tleUFjdGlvbn0gaW4gYSBmdXR1cmUgdmVyc2lvbi5gIDogJyc7XG4gICAgb3V0cHV0ICs9IGNoYW5nZU5ld0RlZmF1bHRcbiAgICAgID8gYGRlZmF1bHQgd2lsbCBjaGFuZ2UgdG8gJyR7Y2hhbmdlTmV3RGVmYXVsdH0nIGluIGEgZnV0dXJlIHZlcnNpb24uYFxuICAgICAgOiAnJztcbiAgICBvdXRwdXQgKz0gc29sdXRpb24gPyBgICR7c29sdXRpb259YCA6ICcnO1xuICAgIGxvZ2dlci53YXJuKG91dHB1dCk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBEZXByZWNhdG9yO1xuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGFBQUEsR0FBQUYs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