parse-server 6.0.0-alpha.2 → 6.0.0-alpha.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +45 -17
  2. package/lib/AccountLockout.js +11 -26
  3. package/lib/Adapters/AdapterLoader.js +8 -14
  4. package/lib/Adapters/Analytics/AnalyticsAdapter.js +2 -8
  5. package/lib/Adapters/Auth/AuthAdapter.js +7 -16
  6. package/lib/Adapters/Auth/OAuth1Client.js +32 -57
  7. package/lib/Adapters/Auth/apple.js +6 -22
  8. package/lib/Adapters/Auth/facebook.js +7 -37
  9. package/lib/Adapters/Auth/gcenter.js +8 -37
  10. package/lib/Adapters/Auth/github.js +7 -10
  11. package/lib/Adapters/Auth/google.js +11 -34
  12. package/lib/Adapters/Auth/gpgames.js +5 -8
  13. package/lib/Adapters/Auth/httpsRequest.js +1 -7
  14. package/lib/Adapters/Auth/index.js +20 -65
  15. package/lib/Adapters/Auth/instagram.js +5 -9
  16. package/lib/Adapters/Auth/janraincapture.js +8 -12
  17. package/lib/Adapters/Auth/janrainengage.js +7 -11
  18. package/lib/Adapters/Auth/keycloak.js +5 -19
  19. package/lib/Adapters/Auth/ldap.js +1 -15
  20. package/lib/Adapters/Auth/line.js +7 -10
  21. package/lib/Adapters/Auth/linkedin.js +7 -12
  22. package/lib/Adapters/Auth/meetup.js +7 -10
  23. package/lib/Adapters/Auth/microsoft.js +7 -10
  24. package/lib/Adapters/Auth/oauth2.js +6 -18
  25. package/lib/Adapters/Auth/phantauth.js +8 -10
  26. package/lib/Adapters/Auth/qq.js +7 -13
  27. package/lib/Adapters/Auth/spotify.js +7 -14
  28. package/lib/Adapters/Auth/twitter.js +5 -15
  29. package/lib/Adapters/Auth/vkontakte.js +9 -15
  30. package/lib/Adapters/Auth/wechat.js +7 -10
  31. package/lib/Adapters/Auth/weibo.js +7 -11
  32. package/lib/Adapters/Cache/CacheAdapter.js +4 -12
  33. package/lib/Adapters/Cache/InMemoryCache.js +5 -19
  34. package/lib/Adapters/Cache/InMemoryCacheAdapter.js +1 -11
  35. package/lib/Adapters/Cache/LRUCache.js +1 -11
  36. package/lib/Adapters/Cache/NullCacheAdapter.js +1 -8
  37. package/lib/Adapters/Cache/RedisCacheAdapter.js +46 -87
  38. package/lib/Adapters/Cache/SchemaCache.js +1 -6
  39. package/lib/Adapters/Email/MailAdapter.js +2 -7
  40. package/lib/Adapters/Files/FilesAdapter.js +7 -21
  41. package/lib/Adapters/Files/GridFSBucketAdapter.js +6 -44
  42. package/lib/Adapters/Files/GridStoreAdapter.js +1 -1
  43. package/lib/Adapters/Logger/LoggerAdapter.js +2 -11
  44. package/lib/Adapters/Logger/WinstonLogger.js +3 -30
  45. package/lib/Adapters/Logger/WinstonLoggerAdapter.js +5 -16
  46. package/lib/Adapters/MessageQueue/EventEmitterMQ.js +3 -20
  47. package/lib/Adapters/PubSub/EventEmitterPubSub.js +1 -16
  48. package/lib/Adapters/PubSub/PubSubAdapter.js +2 -9
  49. package/lib/Adapters/PubSub/RedisPubSub.js +13 -10
  50. package/lib/Adapters/Push/PushAdapter.js +2 -8
  51. package/lib/Adapters/Storage/Mongo/MongoCollection.js +12 -37
  52. package/lib/Adapters/Storage/Mongo/MongoSchemaCollection.js +26 -79
  53. package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +78 -209
  54. package/lib/Adapters/Storage/Mongo/MongoTransform.js +82 -371
  55. package/lib/Adapters/Storage/Postgres/PostgresClient.js +1 -13
  56. package/lib/Adapters/Storage/Postgres/PostgresConfigParser.js +1 -20
  57. package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +119 -446
  58. package/lib/Adapters/Storage/Postgres/sql/index.js +4 -7
  59. package/lib/Adapters/Storage/StorageAdapter.js +1 -1
  60. package/lib/Adapters/WebSocketServer/WSAdapter.js +3 -12
  61. package/lib/Adapters/WebSocketServer/WSSAdapter.js +7 -12
  62. package/lib/Auth.js +54 -121
  63. package/lib/ClientSDK.js +3 -11
  64. package/lib/Config.js +69 -113
  65. package/lib/Controllers/AdaptableController.js +6 -18
  66. package/lib/Controllers/AnalyticsController.js +1 -9
  67. package/lib/Controllers/CacheController.js +3 -23
  68. package/lib/Controllers/DatabaseController.js +147 -345
  69. package/lib/Controllers/FilesController.js +5 -34
  70. package/lib/Controllers/HooksController.js +1 -51
  71. package/lib/Controllers/LiveQueryController.js +4 -23
  72. package/lib/Controllers/LoggerController.js +15 -54
  73. package/lib/Controllers/ParseGraphQLController.js +49 -104
  74. package/lib/Controllers/PushController.js +20 -59
  75. package/lib/Controllers/SchemaController.js +154 -344
  76. package/lib/Controllers/UserController.js +11 -72
  77. package/lib/Controllers/index.js +19 -68
  78. package/lib/Controllers/types.js +1 -1
  79. package/lib/Deprecator/Deprecations.js +1 -8
  80. package/lib/Deprecator/Deprecator.js +9 -18
  81. package/lib/GraphQL/ParseGraphQLSchema.js +16 -100
  82. package/lib/GraphQL/ParseGraphQLServer.js +2 -29
  83. package/lib/GraphQL/helpers/objectsMutations.js +2 -12
  84. package/lib/GraphQL/helpers/objectsQueries.js +18 -76
  85. package/lib/GraphQL/loaders/defaultGraphQLMutations.js +1 -9
  86. package/lib/GraphQL/loaders/defaultGraphQLQueries.js +1 -8
  87. package/lib/GraphQL/loaders/defaultGraphQLTypes.js +9 -115
  88. package/lib/GraphQL/loaders/defaultRelaySchema.js +6 -18
  89. package/lib/GraphQL/loaders/filesMutations.js +2 -19
  90. package/lib/GraphQL/loaders/functionsMutations.js +6 -17
  91. package/lib/GraphQL/loaders/parseClassMutations.js +6 -44
  92. package/lib/GraphQL/loaders/parseClassQueries.js +1 -26
  93. package/lib/GraphQL/loaders/parseClassTypes.js +10 -64
  94. package/lib/GraphQL/loaders/schemaDirectives.js +1 -17
  95. package/lib/GraphQL/loaders/schemaMutations.js +1 -20
  96. package/lib/GraphQL/loaders/schemaQueries.js +1 -14
  97. package/lib/GraphQL/loaders/schemaTypes.js +2 -6
  98. package/lib/GraphQL/loaders/usersMutations.js +6 -28
  99. package/lib/GraphQL/loaders/usersQueries.js +4 -26
  100. package/lib/GraphQL/parseGraphQLUtils.js +6 -19
  101. package/lib/GraphQL/transformers/className.js +1 -4
  102. package/lib/GraphQL/transformers/constraintType.js +1 -20
  103. package/lib/GraphQL/transformers/inputType.js +1 -20
  104. package/lib/GraphQL/transformers/mutation.js +6 -51
  105. package/lib/GraphQL/transformers/outputType.js +1 -20
  106. package/lib/GraphQL/transformers/query.js +6 -42
  107. package/lib/GraphQL/transformers/schemaFields.js +7 -34
  108. package/lib/KeyPromiseQueue.js +1 -12
  109. package/lib/LiveQuery/Client.js +1 -25
  110. package/lib/LiveQuery/Id.js +1 -7
  111. package/lib/LiveQuery/ParseCloudCodePublisher.js +13 -19
  112. package/lib/LiveQuery/ParseLiveQueryServer.js +92 -306
  113. package/lib/LiveQuery/ParsePubSub.js +1 -12
  114. package/lib/LiveQuery/ParseWebSocketServer.js +4 -26
  115. package/lib/LiveQuery/QueryTools.js +14 -116
  116. package/lib/LiveQuery/RequestSchema.js +1 -1
  117. package/lib/LiveQuery/SessionTokenCache.js +1 -17
  118. package/lib/LiveQuery/Subscription.js +4 -18
  119. package/lib/LiveQuery/equalObjects.js +2 -14
  120. package/lib/Options/Definitions.js +79 -10
  121. package/lib/Options/docs.js +23 -3
  122. package/lib/Options/index.js +4 -12
  123. package/lib/Options/parsers.js +1 -18
  124. package/lib/Page.js +1 -9
  125. package/lib/ParseMessageQueue.js +1 -10
  126. package/lib/ParseServer.js +144 -182
  127. package/lib/ParseServerRESTController.js +6 -33
  128. package/lib/PromiseRouter.js +16 -50
  129. package/lib/Push/PushQueue.js +3 -15
  130. package/lib/Push/PushWorker.js +7 -32
  131. package/lib/Push/utils.js +9 -38
  132. package/lib/RestQuery.js +105 -242
  133. package/lib/RestWrite.js +212 -377
  134. package/lib/Routers/AggregateRouter.js +14 -51
  135. package/lib/Routers/AnalyticsRouter.js +2 -8
  136. package/lib/Routers/AudiencesRouter.js +1 -15
  137. package/lib/Routers/ClassesRouter.js +3 -53
  138. package/lib/Routers/CloudCodeRouter.js +1 -19
  139. package/lib/Routers/FeaturesRouter.js +1 -10
  140. package/lib/Routers/FilesRouter.js +29 -76
  141. package/lib/Routers/FunctionsRouter.js +5 -28
  142. package/lib/Routers/GlobalConfigRouter.js +4 -18
  143. package/lib/Routers/GraphQLRouter.js +1 -14
  144. package/lib/Routers/HooksRouter.js +1 -29
  145. package/lib/Routers/IAPValidationRouter.js +6 -29
  146. package/lib/Routers/InstallationsRouter.js +2 -12
  147. package/lib/Routers/LogsRouter.js +4 -16
  148. package/lib/Routers/PagesRouter.js +69 -129
  149. package/lib/Routers/PublicAPIRouter.js +3 -62
  150. package/lib/Routers/PurgeRouter.js +1 -15
  151. package/lib/Routers/PushRouter.js +2 -18
  152. package/lib/Routers/RolesRouter.js +1 -7
  153. package/lib/Routers/SchemasRouter.js +4 -34
  154. package/lib/Routers/SecurityRouter.js +1 -12
  155. package/lib/Routers/SessionsRouter.js +3 -19
  156. package/lib/Routers/UsersRouter.js +58 -155
  157. package/lib/SchemaMigrations/DefinedSchemas.js +56 -115
  158. package/lib/SchemaMigrations/Migrations.js +2 -8
  159. package/lib/Security/Check.js +8 -16
  160. package/lib/Security/CheckGroup.js +4 -11
  161. package/lib/Security/CheckGroups/CheckGroupDatabase.js +8 -18
  162. package/lib/Security/CheckGroups/CheckGroupServerConfig.js +5 -15
  163. package/lib/Security/CheckGroups/CheckGroups.js +1 -4
  164. package/lib/Security/CheckRunner.js +22 -41
  165. package/lib/StatusHandler.js +12 -69
  166. package/lib/TestUtils.js +1 -6
  167. package/lib/Utils.js +27 -66
  168. package/lib/batch.js +17 -28
  169. package/lib/cache.js +1 -3
  170. package/lib/cli/definitions/parse-live-query-server.js +1 -3
  171. package/lib/cli/definitions/parse-server.js +1 -3
  172. package/lib/cli/parse-live-query-server.js +1 -6
  173. package/lib/cli/parse-server.js +11 -21
  174. package/lib/cli/utils/commander.js +13 -51
  175. package/lib/cli/utils/runner.js +1 -14
  176. package/lib/cloud-code/Parse.Cloud.js +71 -92
  177. package/lib/cryptoUtils.js +11 -19
  178. package/lib/defaults.js +2 -14
  179. package/lib/deprecated.js +1 -2
  180. package/lib/index.js +16 -34
  181. package/lib/logger.js +6 -13
  182. package/lib/middlewares.js +147 -151
  183. package/lib/password.js +6 -10
  184. package/lib/request.js +173 -2
  185. package/lib/requiredParameter.js +1 -3
  186. package/lib/rest.js +19 -41
  187. package/lib/triggers.js +54 -252
  188. package/lib/vendor/mongodbUrl.js +125 -305
  189. package/package.json +22 -19
  190. package/lib/cloud-code/HTTPResponse.js +0 -73
  191. package/lib/cloud-code/httpRequest.js +0 -192
@@ -1,20 +1,18 @@
1
- 'use strict'; // Helper functions for accessing the google API.
1
+ 'use strict';
2
2
 
3
+ // Helper functions for accessing the google API.
3
4
  var Parse = require('parse/node').Parse;
4
-
5
5
  const https = require('https');
6
-
7
6
  const jwt = require('jsonwebtoken');
8
-
9
7
  const TOKEN_ISSUER = 'accounts.google.com';
10
8
  const HTTPS_TOKEN_ISSUER = 'https://accounts.google.com';
11
- let cache = {}; // Retrieve Google Signin Keys (with cache control)
9
+ let cache = {};
12
10
 
11
+ // Retrieve Google Signin Keys (with cache control)
13
12
  function getGoogleKeyByKeyId(keyId) {
14
13
  if (cache[keyId] && cache.expiresAt > new Date()) {
15
14
  return cache[keyId];
16
15
  }
17
-
18
16
  return new Promise((resolve, reject) => {
19
17
  https.get(`https://www.googleapis.com/oauth2/v3/certs`, res => {
20
18
  let data = '';
@@ -32,35 +30,28 @@ function getGoogleKeyByKeyId(keyId) {
32
30
  }) => Object.assign(pems, {
33
31
  [kid]: rsaPublicKeyToPEM(modulus, exposant)
34
32
  }), {});
35
-
36
33
  if (res.headers['cache-control']) {
37
34
  var expire = res.headers['cache-control'].match(/max-age=([0-9]+)/);
38
-
39
35
  if (expire) {
40
36
  cache = Object.assign({}, pems, {
41
37
  expiresAt: new Date(new Date().getTime() + Number(expire[1]) * 1000)
42
38
  });
43
39
  }
44
40
  }
45
-
46
41
  resolve(pems[keyId]);
47
42
  });
48
43
  }).on('error', reject);
49
44
  });
50
45
  }
51
-
52
46
  function getHeaderFromToken(token) {
53
47
  const decodedToken = jwt.decode(token, {
54
48
  complete: true
55
49
  });
56
-
57
50
  if (!decodedToken) {
58
51
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `provided token does not decode as JWT`);
59
52
  }
60
-
61
53
  return decodedToken.header;
62
54
  }
63
-
64
55
  async function verifyIdToken({
65
56
  id_token: token,
66
57
  id
@@ -70,14 +61,12 @@ async function verifyIdToken({
70
61
  if (!token) {
71
62
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token is invalid for this user.`);
72
63
  }
73
-
74
64
  const {
75
65
  kid: keyId,
76
66
  alg: algorithm
77
67
  } = getHeaderFromToken(token);
78
68
  let jwtClaims;
79
69
  const googleKey = await getGoogleKeyByKeyId(keyId);
80
-
81
70
  try {
82
71
  jwtClaims = jwt.verify(token, googleKey, {
83
72
  algorithms: algorithm,
@@ -87,37 +76,33 @@ async function verifyIdToken({
87
76
  const message = exception.message;
88
77
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `${message}`);
89
78
  }
90
-
91
79
  if (jwtClaims.iss !== TOKEN_ISSUER && jwtClaims.iss !== HTTPS_TOKEN_ISSUER) {
92
80
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token not issued by correct provider - expected: ${TOKEN_ISSUER} or ${HTTPS_TOKEN_ISSUER} | from: ${jwtClaims.iss}`);
93
81
  }
94
-
95
82
  if (jwtClaims.sub !== id) {
96
83
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `auth data is invalid for this user.`);
97
84
  }
98
-
99
85
  if (clientId && jwtClaims.aud !== clientId) {
100
86
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `id token not authorized for this clientId.`);
101
87
  }
102
-
103
88
  return jwtClaims;
104
- } // Returns a promise that fulfills if this user id is valid.
105
-
89
+ }
106
90
 
91
+ // Returns a promise that fulfills if this user id is valid.
107
92
  function validateAuthData(authData, options = {}) {
108
93
  return verifyIdToken(authData, options);
109
- } // Returns a promise that fulfills if this app id is valid.
110
-
94
+ }
111
95
 
96
+ // Returns a promise that fulfills if this app id is valid.
112
97
  function validateAppId() {
113
98
  return Promise.resolve();
114
99
  }
115
-
116
100
  module.exports = {
117
101
  validateAppId: validateAppId,
118
102
  validateAuthData: validateAuthData
119
- }; // Helpers functions to convert the RSA certs to PEM (from jwks-rsa)
103
+ };
120
104
 
105
+ // Helpers functions to convert the RSA certs to PEM (from jwks-rsa)
121
106
  function rsaPublicKeyToPEM(modulusB64, exponentB64) {
122
107
  const modulus = new Buffer(modulusB64, 'base64');
123
108
  const exponent = new Buffer(exponentB64, 'base64');
@@ -134,34 +119,26 @@ function rsaPublicKeyToPEM(modulusB64, exponentB64) {
134
119
  pem += '\n-----END RSA PUBLIC KEY-----\n';
135
120
  return pem;
136
121
  }
137
-
138
122
  function prepadSigned(hexStr) {
139
123
  const msb = hexStr[0];
140
-
141
124
  if (msb < '0' || msb > '7') {
142
125
  return `00${hexStr}`;
143
126
  }
144
-
145
127
  return hexStr;
146
128
  }
147
-
148
129
  function toHex(number) {
149
130
  const nstr = number.toString(16);
150
-
151
131
  if (nstr.length % 2) {
152
132
  return `0${nstr}`;
153
133
  }
154
-
155
134
  return nstr;
156
135
  }
157
-
158
136
  function encodeLengthHex(n) {
159
137
  if (n <= 127) {
160
138
  return toHex(n);
161
139
  }
162
-
163
140
  const nHex = toHex(n);
164
141
  const lengthOfLengthByte = 128 + nHex.length / 2;
165
142
  return toHex(lengthOfLengthByte) + nHex;
166
143
  }
167
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2dvb2dsZS5qcyJdLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwcyIsImp3dCIsIlRPS0VOX0lTU1VFUiIsIkhUVFBTX1RPS0VOX0lTU1VFUiIsImNhY2hlIiwiZ2V0R29vZ2xlS2V5QnlLZXlJZCIsImtleUlkIiwiZXhwaXJlc0F0IiwiRGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImtleXMiLCJKU09OIiwicGFyc2UiLCJwZW1zIiwicmVkdWNlIiwibiIsIm1vZHVsdXMiLCJlIiwiZXhwb3NhbnQiLCJraWQiLCJPYmplY3QiLCJhc3NpZ24iLCJyc2FQdWJsaWNLZXlUb1BFTSIsImhlYWRlcnMiLCJleHBpcmUiLCJtYXRjaCIsImdldFRpbWUiLCJOdW1iZXIiLCJnZXRIZWFkZXJGcm9tVG9rZW4iLCJ0b2tlbiIsImRlY29kZWRUb2tlbiIsImRlY29kZSIsImNvbXBsZXRlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiaGVhZGVyIiwidmVyaWZ5SWRUb2tlbiIsImlkX3Rva2VuIiwiaWQiLCJjbGllbnRJZCIsImFsZyIsImFsZ29yaXRobSIsImp3dENsYWltcyIsImdvb2dsZUtleSIsInZlcmlmeSIsImFsZ29yaXRobXMiLCJhdWRpZW5jZSIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJpc3MiLCJzdWIiLCJhdWQiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJvcHRpb25zIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bHVzQjY0IiwiZXhwb25lbnRCNjQiLCJCdWZmZXIiLCJleHBvbmVudCIsIm1vZHVsdXNIZXgiLCJwcmVwYWRTaWduZWQiLCJleHBvbmVudEhleCIsIm1vZGxlbiIsImxlbmd0aCIsImV4cGxlbiIsImVuY29kZWRNb2RsZW4iLCJlbmNvZGVMZW5ndGhIZXgiLCJlbmNvZGVkRXhwbGVuIiwiZW5jb2RlZFB1YmtleSIsImRlciIsInBlbSIsImpvaW4iLCJoZXhTdHIiLCJtc2IiLCJ0b0hleCIsIm51bWJlciIsIm5zdHIiLCJuSGV4IiwibGVuZ3RoT2ZMZW5ndGhCeXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxhLENBRUE7O0FBQ0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBRCxDQUFQLENBQXNCRCxLQUFsQzs7QUFFQSxNQUFNRSxLQUFLLEdBQUdELE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU1FLEdBQUcsR0FBR0YsT0FBTyxDQUFDLGNBQUQsQ0FBbkI7O0FBRUEsTUFBTUcsWUFBWSxHQUFHLHFCQUFyQjtBQUNBLE1BQU1DLGtCQUFrQixHQUFHLDZCQUEzQjtBQUVBLElBQUlDLEtBQUssR0FBRyxFQUFaLEMsQ0FFQTs7QUFDQSxTQUFTQyxtQkFBVCxDQUE2QkMsS0FBN0IsRUFBb0M7QUFDbEMsTUFBSUYsS0FBSyxDQUFDRSxLQUFELENBQUwsSUFBZ0JGLEtBQUssQ0FBQ0csU0FBTixHQUFrQixJQUFJQyxJQUFKLEVBQXRDLEVBQWtEO0FBQ2hELFdBQU9KLEtBQUssQ0FBQ0UsS0FBRCxDQUFaO0FBQ0Q7O0FBRUQsU0FBTyxJQUFJRyxPQUFKLENBQVksQ0FBQ0MsT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDWCxJQUFBQSxLQUFLLENBQ0ZZLEdBREgsQ0FDUSw0Q0FEUixFQUNxREMsR0FBRyxJQUFJO0FBQ3hELFVBQUlDLElBQUksR0FBRyxFQUFYO0FBQ0FELE1BQUFBLEdBQUcsQ0FBQ0UsRUFBSixDQUFPLE1BQVAsRUFBZUMsS0FBSyxJQUFJO0FBQ3RCRixRQUFBQSxJQUFJLElBQUlFLEtBQUssQ0FBQ0MsUUFBTixDQUFlLE1BQWYsQ0FBUjtBQUNELE9BRkQ7QUFHQUosTUFBQUEsR0FBRyxDQUFDRSxFQUFKLENBQU8sS0FBUCxFQUFjLE1BQU07QUFDbEIsY0FBTTtBQUFFRyxVQUFBQTtBQUFGLFlBQVdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXTixJQUFYLENBQWpCO0FBQ0EsY0FBTU8sSUFBSSxHQUFHSCxJQUFJLENBQUNJLE1BQUwsQ0FDWCxDQUFDRCxJQUFELEVBQU87QUFBRUUsVUFBQUEsQ0FBQyxFQUFFQyxPQUFMO0FBQWNDLFVBQUFBLENBQUMsRUFBRUMsUUFBakI7QUFBMkJDLFVBQUFBO0FBQTNCLFNBQVAsS0FDRUMsTUFBTSxDQUFDQyxNQUFQLENBQWNSLElBQWQsRUFBb0I7QUFDbEIsV0FBQ00sR0FBRCxHQUFPRyxpQkFBaUIsQ0FBQ04sT0FBRCxFQUFVRSxRQUFWO0FBRE4sU0FBcEIsQ0FGUyxFQUtYLEVBTFcsQ0FBYjs7QUFRQSxZQUFJYixHQUFHLENBQUNrQixPQUFKLENBQVksZUFBWixDQUFKLEVBQWtDO0FBQ2hDLGNBQUlDLE1BQU0sR0FBR25CLEdBQUcsQ0FBQ2tCLE9BQUosQ0FBWSxlQUFaLEVBQTZCRSxLQUE3QixDQUFtQyxrQkFBbkMsQ0FBYjs7QUFFQSxjQUFJRCxNQUFKLEVBQVk7QUFDVjVCLFlBQUFBLEtBQUssR0FBR3dCLE1BQU0sQ0FBQ0MsTUFBUCxDQUFjLEVBQWQsRUFBa0JSLElBQWxCLEVBQXdCO0FBQzlCZCxjQUFBQSxTQUFTLEVBQUUsSUFBSUMsSUFBSixDQUFTLElBQUlBLElBQUosR0FBVzBCLE9BQVgsS0FBdUJDLE1BQU0sQ0FBQ0gsTUFBTSxDQUFDLENBQUQsQ0FBUCxDQUFOLEdBQW9CLElBQXBEO0FBRG1CLGFBQXhCLENBQVI7QUFHRDtBQUNGOztBQUVEdEIsUUFBQUEsT0FBTyxDQUFDVyxJQUFJLENBQUNmLEtBQUQsQ0FBTCxDQUFQO0FBQ0QsT0FyQkQ7QUFzQkQsS0E1QkgsRUE2QkdTLEVBN0JILENBNkJNLE9BN0JOLEVBNkJlSixNQTdCZjtBQThCRCxHQS9CTSxDQUFQO0FBZ0NEOztBQUVELFNBQVN5QixrQkFBVCxDQUE0QkMsS0FBNUIsRUFBbUM7QUFDakMsUUFBTUMsWUFBWSxHQUFHckMsR0FBRyxDQUFDc0MsTUFBSixDQUFXRixLQUFYLEVBQWtCO0FBQUVHLElBQUFBLFFBQVEsRUFBRTtBQUFaLEdBQWxCLENBQXJCOztBQUVBLE1BQUksQ0FBQ0YsWUFBTCxFQUFtQjtBQUNqQixVQUFNLElBQUl4QyxLQUFLLENBQUMyQyxLQUFWLENBQWdCM0MsS0FBSyxDQUFDMkMsS0FBTixDQUFZQyxnQkFBNUIsRUFBK0MsdUNBQS9DLENBQU47QUFDRDs7QUFFRCxTQUFPSixZQUFZLENBQUNLLE1BQXBCO0FBQ0Q7O0FBRUQsZUFBZUMsYUFBZixDQUE2QjtBQUFFQyxFQUFBQSxRQUFRLEVBQUVSLEtBQVo7QUFBbUJTLEVBQUFBO0FBQW5CLENBQTdCLEVBQXNEO0FBQUVDLEVBQUFBO0FBQUYsQ0FBdEQsRUFBb0U7QUFDbEUsTUFBSSxDQUFDVixLQUFMLEVBQVk7QUFDVixVQUFNLElBQUl2QyxLQUFLLENBQUMyQyxLQUFWLENBQWdCM0MsS0FBSyxDQUFDMkMsS0FBTixDQUFZQyxnQkFBNUIsRUFBK0Msb0NBQS9DLENBQU47QUFDRDs7QUFFRCxRQUFNO0FBQUVmLElBQUFBLEdBQUcsRUFBRXJCLEtBQVA7QUFBYzBDLElBQUFBLEdBQUcsRUFBRUM7QUFBbkIsTUFBaUNiLGtCQUFrQixDQUFDQyxLQUFELENBQXpEO0FBQ0EsTUFBSWEsU0FBSjtBQUNBLFFBQU1DLFNBQVMsR0FBRyxNQUFNOUMsbUJBQW1CLENBQUNDLEtBQUQsQ0FBM0M7O0FBRUEsTUFBSTtBQUNGNEMsSUFBQUEsU0FBUyxHQUFHakQsR0FBRyxDQUFDbUQsTUFBSixDQUFXZixLQUFYLEVBQWtCYyxTQUFsQixFQUE2QjtBQUN2Q0UsTUFBQUEsVUFBVSxFQUFFSixTQUQyQjtBQUV2Q0ssTUFBQUEsUUFBUSxFQUFFUDtBQUY2QixLQUE3QixDQUFaO0FBSUQsR0FMRCxDQUtFLE9BQU9RLFNBQVAsRUFBa0I7QUFDbEIsVUFBTUMsT0FBTyxHQUFHRCxTQUFTLENBQUNDLE9BQTFCO0FBQ0EsVUFBTSxJQUFJMUQsS0FBSyxDQUFDMkMsS0FBVixDQUFnQjNDLEtBQUssQ0FBQzJDLEtBQU4sQ0FBWUMsZ0JBQTVCLEVBQStDLEdBQUVjLE9BQVEsRUFBekQsQ0FBTjtBQUNEOztBQUVELE1BQUlOLFNBQVMsQ0FBQ08sR0FBVixLQUFrQnZELFlBQWxCLElBQWtDZ0QsU0FBUyxDQUFDTyxHQUFWLEtBQWtCdEQsa0JBQXhELEVBQTRFO0FBQzFFLFVBQU0sSUFBSUwsS0FBSyxDQUFDMkMsS0FBVixDQUNKM0MsS0FBSyxDQUFDMkMsS0FBTixDQUFZQyxnQkFEUixFQUVILHVEQUFzRHhDLFlBQWEsT0FBTUMsa0JBQW1CLFlBQVcrQyxTQUFTLENBQUNPLEdBQUksRUFGbEgsQ0FBTjtBQUlEOztBQUVELE1BQUlQLFNBQVMsQ0FBQ1EsR0FBVixLQUFrQlosRUFBdEIsRUFBMEI7QUFDeEIsVUFBTSxJQUFJaEQsS0FBSyxDQUFDMkMsS0FBVixDQUFnQjNDLEtBQUssQ0FBQzJDLEtBQU4sQ0FBWUMsZ0JBQTVCLEVBQStDLHFDQUEvQyxDQUFOO0FBQ0Q7O0FBRUQsTUFBSUssUUFBUSxJQUFJRyxTQUFTLENBQUNTLEdBQVYsS0FBa0JaLFFBQWxDLEVBQTRDO0FBQzFDLFVBQU0sSUFBSWpELEtBQUssQ0FBQzJDLEtBQVYsQ0FDSjNDLEtBQUssQ0FBQzJDLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSCw0Q0FGRyxDQUFOO0FBSUQ7O0FBRUQsU0FBT1EsU0FBUDtBQUNELEMsQ0FFRDs7O0FBQ0EsU0FBU1UsZ0JBQVQsQ0FBMEJDLFFBQTFCLEVBQW9DQyxPQUFPLEdBQUcsRUFBOUMsRUFBa0Q7QUFDaEQsU0FBT2xCLGFBQWEsQ0FBQ2lCLFFBQUQsRUFBV0MsT0FBWCxDQUFwQjtBQUNELEMsQ0FFRDs7O0FBQ0EsU0FBU0MsYUFBVCxHQUF5QjtBQUN2QixTQUFPdEQsT0FBTyxDQUFDQyxPQUFSLEVBQVA7QUFDRDs7QUFFRHNELE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmRixFQUFBQSxhQUFhLEVBQUVBLGFBREE7QUFFZkgsRUFBQUEsZ0JBQWdCLEVBQUVBO0FBRkgsQ0FBakIsQyxDQUtBOztBQUNBLFNBQVM5QixpQkFBVCxDQUEyQm9DLFVBQTNCLEVBQXVDQyxXQUF2QyxFQUFvRDtBQUNsRCxRQUFNM0MsT0FBTyxHQUFHLElBQUk0QyxNQUFKLENBQVdGLFVBQVgsRUFBdUIsUUFBdkIsQ0FBaEI7QUFDQSxRQUFNRyxRQUFRLEdBQUcsSUFBSUQsTUFBSixDQUFXRCxXQUFYLEVBQXdCLFFBQXhCLENBQWpCO0FBQ0EsUUFBTUcsVUFBVSxHQUFHQyxZQUFZLENBQUMvQyxPQUFPLENBQUNQLFFBQVIsQ0FBaUIsS0FBakIsQ0FBRCxDQUEvQjtBQUNBLFFBQU11RCxXQUFXLEdBQUdELFlBQVksQ0FBQ0YsUUFBUSxDQUFDcEQsUUFBVCxDQUFrQixLQUFsQixDQUFELENBQWhDO0FBQ0EsUUFBTXdELE1BQU0sR0FBR0gsVUFBVSxDQUFDSSxNQUFYLEdBQW9CLENBQW5DO0FBQ0EsUUFBTUMsTUFBTSxHQUFHSCxXQUFXLENBQUNFLE1BQVosR0FBcUIsQ0FBcEM7QUFFQSxRQUFNRSxhQUFhLEdBQUdDLGVBQWUsQ0FBQ0osTUFBRCxDQUFyQztBQUNBLFFBQU1LLGFBQWEsR0FBR0QsZUFBZSxDQUFDRixNQUFELENBQXJDO0FBQ0EsUUFBTUksYUFBYSxHQUNqQixPQUNBRixlQUFlLENBQUNKLE1BQU0sR0FBR0UsTUFBVCxHQUFrQkMsYUFBYSxDQUFDRixNQUFkLEdBQXVCLENBQXpDLEdBQTZDSSxhQUFhLENBQUNKLE1BQWQsR0FBdUIsQ0FBcEUsR0FBd0UsQ0FBekUsQ0FEZixHQUVBLElBRkEsR0FHQUUsYUFIQSxHQUlBTixVQUpBLEdBS0EsSUFMQSxHQU1BUSxhQU5BLEdBT0FOLFdBUkY7QUFVQSxRQUFNUSxHQUFHLEdBQUcsSUFBSVosTUFBSixDQUFXVyxhQUFYLEVBQTBCLEtBQTFCLEVBQWlDOUQsUUFBakMsQ0FBMEMsUUFBMUMsQ0FBWjtBQUVBLE1BQUlnRSxHQUFHLEdBQUcsa0NBQVY7QUFDQUEsRUFBQUEsR0FBRyxJQUFLLEdBQUVELEdBQUcsQ0FBQy9DLEtBQUosQ0FBVSxVQUFWLEVBQXNCaUQsSUFBdEIsQ0FBMkIsSUFBM0IsQ0FBaUMsRUFBM0M7QUFDQUQsRUFBQUEsR0FBRyxJQUFJLGtDQUFQO0FBQ0EsU0FBT0EsR0FBUDtBQUNEOztBQUVELFNBQVNWLFlBQVQsQ0FBc0JZLE1BQXRCLEVBQThCO0FBQzVCLFFBQU1DLEdBQUcsR0FBR0QsTUFBTSxDQUFDLENBQUQsQ0FBbEI7O0FBQ0EsTUFBSUMsR0FBRyxHQUFHLEdBQU4sSUFBYUEsR0FBRyxHQUFHLEdBQXZCLEVBQTRCO0FBQzFCLFdBQVEsS0FBSUQsTUFBTyxFQUFuQjtBQUNEOztBQUNELFNBQU9BLE1BQVA7QUFDRDs7QUFFRCxTQUFTRSxLQUFULENBQWVDLE1BQWYsRUFBdUI7QUFDckIsUUFBTUMsSUFBSSxHQUFHRCxNQUFNLENBQUNyRSxRQUFQLENBQWdCLEVBQWhCLENBQWI7O0FBQ0EsTUFBSXNFLElBQUksQ0FBQ2IsTUFBTCxHQUFjLENBQWxCLEVBQXFCO0FBQ25CLFdBQVEsSUFBR2EsSUFBSyxFQUFoQjtBQUNEOztBQUNELFNBQU9BLElBQVA7QUFDRDs7QUFFRCxTQUFTVixlQUFULENBQXlCdEQsQ0FBekIsRUFBNEI7QUFDMUIsTUFBSUEsQ0FBQyxJQUFJLEdBQVQsRUFBYztBQUNaLFdBQU84RCxLQUFLLENBQUM5RCxDQUFELENBQVo7QUFDRDs7QUFDRCxRQUFNaUUsSUFBSSxHQUFHSCxLQUFLLENBQUM5RCxDQUFELENBQWxCO0FBQ0EsUUFBTWtFLGtCQUFrQixHQUFHLE1BQU1ELElBQUksQ0FBQ2QsTUFBTCxHQUFjLENBQS9DO0FBQ0EsU0FBT1csS0FBSyxDQUFDSSxrQkFBRCxDQUFMLEdBQTRCRCxJQUFuQztBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgdGhlIGdvb2dsZSBBUEkuXG52YXIgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5cbmNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbmNvbnN0IGp3dCA9IHJlcXVpcmUoJ2pzb253ZWJ0b2tlbicpO1xuXG5jb25zdCBUT0tFTl9JU1NVRVIgPSAnYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5jb25zdCBIVFRQU19UT0tFTl9JU1NVRVIgPSAnaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tJztcblxubGV0IGNhY2hlID0ge307XG5cbi8vIFJldHJpZXZlIEdvb2dsZSBTaWduaW4gS2V5cyAod2l0aCBjYWNoZSBjb250cm9sKVxuZnVuY3Rpb24gZ2V0R29vZ2xlS2V5QnlLZXlJZChrZXlJZCkge1xuICBpZiAoY2FjaGVba2V5SWRdICYmIGNhY2hlLmV4cGlyZXNBdCA+IG5ldyBEYXRlKCkpIHtcbiAgICByZXR1cm4gY2FjaGVba2V5SWRdO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwc1xuICAgICAgLmdldChgaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vb2F1dGgyL3YzL2NlcnRzYCwgcmVzID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEgKz0gY2h1bmsudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsga2V5cyB9ID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICBjb25zdCBwZW1zID0ga2V5cy5yZWR1Y2UoXG4gICAgICAgICAgICAocGVtcywgeyBuOiBtb2R1bHVzLCBlOiBleHBvc2FudCwga2lkIH0pID0+XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ocGVtcywge1xuICAgICAgICAgICAgICAgIFtraWRdOiByc2FQdWJsaWNLZXlUb1BFTShtb2R1bHVzLCBleHBvc2FudCksXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICAgICAgICAgIHZhciBleHBpcmUgPSByZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG5cbiAgICAgICAgICAgIGlmIChleHBpcmUpIHtcbiAgICAgICAgICAgICAgY2FjaGUgPSBPYmplY3QuYXNzaWduKHt9LCBwZW1zLCB7XG4gICAgICAgICAgICAgICAgZXhwaXJlc0F0OiBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSArIE51bWJlcihleHBpcmVbMV0pICogMTAwMCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUocGVtc1trZXlJZF0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEhlYWRlckZyb21Ub2tlbih0b2tlbikge1xuICBjb25zdCBkZWNvZGVkVG9rZW4gPSBqd3QuZGVjb2RlKHRva2VuLCB7IGNvbXBsZXRlOiB0cnVlIH0pO1xuXG4gIGlmICghZGVjb2RlZFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBwcm92aWRlZCB0b2tlbiBkb2VzIG5vdCBkZWNvZGUgYXMgSldUYCk7XG4gIH1cblxuICByZXR1cm4gZGVjb2RlZFRva2VuLmhlYWRlcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5SWRUb2tlbih7IGlkX3Rva2VuOiB0b2tlbiwgaWQgfSwgeyBjbGllbnRJZCB9KSB7XG4gIGlmICghdG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYGlkIHRva2VuIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci5gKTtcbiAgfVxuXG4gIGNvbnN0IHsga2lkOiBrZXlJZCwgYWxnOiBhbGdvcml0aG0gfSA9IGdldEhlYWRlckZyb21Ub2tlbih0b2tlbik7XG4gIGxldCBqd3RDbGFpbXM7XG4gIGNvbnN0IGdvb2dsZUtleSA9IGF3YWl0IGdldEdvb2dsZUtleUJ5S2V5SWQoa2V5SWQpO1xuXG4gIHRyeSB7XG4gICAgand0Q2xhaW1zID0gand0LnZlcmlmeSh0b2tlbiwgZ29vZ2xlS2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBhbGdvcml0aG0sXG4gICAgICBhdWRpZW5jZTogY2xpZW50SWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYCR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuaXNzICE9PSBUT0tFTl9JU1NVRVIgJiYgand0Q2xhaW1zLmlzcyAhPT0gSFRUUFNfVE9LRU5fSVNTVUVSKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBpZCB0b2tlbiBub3QgaXNzdWVkIGJ5IGNvcnJlY3QgcHJvdmlkZXIgLSBleHBlY3RlZDogJHtUT0tFTl9JU1NVRVJ9IG9yICR7SFRUUFNfVE9LRU5fSVNTVUVSfSB8IGZyb206ICR7and0Q2xhaW1zLmlzc31gXG4gICAgKTtcbiAgfVxuXG4gIGlmIChqd3RDbGFpbXMuc3ViICE9PSBpZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgYXV0aCBkYXRhIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci5gKTtcbiAgfVxuXG4gIGlmIChjbGllbnRJZCAmJiBqd3RDbGFpbXMuYXVkICE9PSBjbGllbnRJZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGF1dGhvcml6ZWQgZm9yIHRoaXMgY2xpZW50SWQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gand0Q2xhaW1zO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gdmVyaWZ5SWRUb2tlbihhdXRoRGF0YSwgb3B0aW9ucyk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkOiB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhOiB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcblxuLy8gSGVscGVycyBmdW5jdGlvbnMgdG8gY29udmVydCB0aGUgUlNBIGNlcnRzIHRvIFBFTSAoZnJvbSBqd2tzLXJzYSlcbmZ1bmN0aW9uIHJzYVB1YmxpY0tleVRvUEVNKG1vZHVsdXNCNjQsIGV4cG9uZW50QjY0KSB7XG4gIGNvbnN0IG1vZHVsdXMgPSBuZXcgQnVmZmVyKG1vZHVsdXNCNjQsICdiYXNlNjQnKTtcbiAgY29uc3QgZXhwb25lbnQgPSBuZXcgQnVmZmVyKGV4cG9uZW50QjY0LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IG1vZHVsdXNIZXggPSBwcmVwYWRTaWduZWQobW9kdWx1cy50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBleHBvbmVudEhleCA9IHByZXBhZFNpZ25lZChleHBvbmVudC50b1N0cmluZygnaGV4JykpO1xuICBjb25zdCBtb2RsZW4gPSBtb2R1bHVzSGV4Lmxlbmd0aCAvIDI7XG4gIGNvbnN0IGV4cGxlbiA9IGV4cG9uZW50SGV4Lmxlbmd0aCAvIDI7XG5cbiAgY29uc3QgZW5jb2RlZE1vZGxlbiA9IGVuY29kZUxlbmd0aEhleChtb2RsZW4pO1xuICBjb25zdCBlbmNvZGVkRXhwbGVuID0gZW5jb2RlTGVuZ3RoSGV4KGV4cGxlbik7XG4gIGNvbnN0IGVuY29kZWRQdWJrZXkgPVxuICAgICczMCcgK1xuICAgIGVuY29kZUxlbmd0aEhleChtb2RsZW4gKyBleHBsZW4gKyBlbmNvZGVkTW9kbGVuLmxlbmd0aCAvIDIgKyBlbmNvZGVkRXhwbGVuLmxlbmd0aCAvIDIgKyAyKSArXG4gICAgJzAyJyArXG4gICAgZW5jb2RlZE1vZGxlbiArXG4gICAgbW9kdWx1c0hleCArXG4gICAgJzAyJyArXG4gICAgZW5jb2RlZEV4cGxlbiArXG4gICAgZXhwb25lbnRIZXg7XG5cbiAgY29uc3QgZGVyID0gbmV3IEJ1ZmZlcihlbmNvZGVkUHVia2V5LCAnaGV4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gIGxldCBwZW0gPSAnLS0tLS1CRUdJTiBSU0EgUFVCTElDIEtFWS0tLS0tXFxuJztcbiAgcGVtICs9IGAke2Rlci5tYXRjaCgvLnsxLDY0fS9nKS5qb2luKCdcXG4nKX1gO1xuICBwZW0gKz0gJ1xcbi0tLS0tRU5EIFJTQSBQVUJMSUMgS0VZLS0tLS1cXG4nO1xuICByZXR1cm4gcGVtO1xufVxuXG5mdW5jdGlvbiBwcmVwYWRTaWduZWQoaGV4U3RyKSB7XG4gIGNvbnN0IG1zYiA9IGhleFN0clswXTtcbiAgaWYgKG1zYiA8ICcwJyB8fCBtc2IgPiAnNycpIHtcbiAgICByZXR1cm4gYDAwJHtoZXhTdHJ9YDtcbiAgfVxuICByZXR1cm4gaGV4U3RyO1xufVxuXG5mdW5jdGlvbiB0b0hleChudW1iZXIpIHtcbiAgY29uc3QgbnN0ciA9IG51bWJlci50b1N0cmluZygxNik7XG4gIGlmIChuc3RyLmxlbmd0aCAlIDIpIHtcbiAgICByZXR1cm4gYDAke25zdHJ9YDtcbiAgfVxuICByZXR1cm4gbnN0cjtcbn1cblxuZnVuY3Rpb24gZW5jb2RlTGVuZ3RoSGV4KG4pIHtcbiAgaWYgKG4gPD0gMTI3KSB7XG4gICAgcmV0dXJuIHRvSGV4KG4pO1xuICB9XG4gIGNvbnN0IG5IZXggPSB0b0hleChuKTtcbiAgY29uc3QgbGVuZ3RoT2ZMZW5ndGhCeXRlID0gMTI4ICsgbkhleC5sZW5ndGggLyAyO1xuICByZXR1cm4gdG9IZXgobGVuZ3RoT2ZMZW5ndGhCeXRlKSArIG5IZXg7XG59XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwcyIsImp3dCIsIlRPS0VOX0lTU1VFUiIsIkhUVFBTX1RPS0VOX0lTU1VFUiIsImNhY2hlIiwiZ2V0R29vZ2xlS2V5QnlLZXlJZCIsImtleUlkIiwiZXhwaXJlc0F0IiwiRGF0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImtleXMiLCJKU09OIiwicGFyc2UiLCJwZW1zIiwicmVkdWNlIiwibiIsIm1vZHVsdXMiLCJlIiwiZXhwb3NhbnQiLCJraWQiLCJPYmplY3QiLCJhc3NpZ24iLCJyc2FQdWJsaWNLZXlUb1BFTSIsImhlYWRlcnMiLCJleHBpcmUiLCJtYXRjaCIsImdldFRpbWUiLCJOdW1iZXIiLCJnZXRIZWFkZXJGcm9tVG9rZW4iLCJ0b2tlbiIsImRlY29kZWRUb2tlbiIsImRlY29kZSIsImNvbXBsZXRlIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwiaGVhZGVyIiwidmVyaWZ5SWRUb2tlbiIsImlkX3Rva2VuIiwiaWQiLCJjbGllbnRJZCIsImFsZyIsImFsZ29yaXRobSIsImp3dENsYWltcyIsImdvb2dsZUtleSIsInZlcmlmeSIsImFsZ29yaXRobXMiLCJhdWRpZW5jZSIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJpc3MiLCJzdWIiLCJhdWQiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJvcHRpb25zIiwidmFsaWRhdGVBcHBJZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJtb2R1bHVzQjY0IiwiZXhwb25lbnRCNjQiLCJCdWZmZXIiLCJleHBvbmVudCIsIm1vZHVsdXNIZXgiLCJwcmVwYWRTaWduZWQiLCJleHBvbmVudEhleCIsIm1vZGxlbiIsImxlbmd0aCIsImV4cGxlbiIsImVuY29kZWRNb2RsZW4iLCJlbmNvZGVMZW5ndGhIZXgiLCJlbmNvZGVkRXhwbGVuIiwiZW5jb2RlZFB1YmtleSIsImRlciIsInBlbSIsImpvaW4iLCJoZXhTdHIiLCJtc2IiLCJ0b0hleCIsIm51bWJlciIsIm5zdHIiLCJuSGV4IiwibGVuZ3RoT2ZMZW5ndGhCeXRlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ29vZ2xlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHRoZSBnb29nbGUgQVBJLlxudmFyIFBhcnNlID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpLlBhcnNlO1xuXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCBqd3QgPSByZXF1aXJlKCdqc29ud2VidG9rZW4nKTtcblxuY29uc3QgVE9LRU5fSVNTVUVSID0gJ2FjY291bnRzLmdvb2dsZS5jb20nO1xuY29uc3QgSFRUUFNfVE9LRU5fSVNTVUVSID0gJ2h0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbSc7XG5cbmxldCBjYWNoZSA9IHt9O1xuXG4vLyBSZXRyaWV2ZSBHb29nbGUgU2lnbmluIEtleXMgKHdpdGggY2FjaGUgY29udHJvbClcbmZ1bmN0aW9uIGdldEdvb2dsZUtleUJ5S2V5SWQoa2V5SWQpIHtcbiAgaWYgKGNhY2hlW2tleUlkXSAmJiBjYWNoZS5leHBpcmVzQXQgPiBuZXcgRGF0ZSgpKSB7XG4gICAgcmV0dXJuIGNhY2hlW2tleUlkXTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQoYGh0dHBzOi8vd3d3Lmdvb2dsZWFwaXMuY29tL29hdXRoMi92My9jZXJ0c2AsIHJlcyA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gJyc7XG4gICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICBkYXRhICs9IGNodW5rLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGtleXMgfSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgICAgY29uc3QgcGVtcyA9IGtleXMucmVkdWNlKFxuICAgICAgICAgICAgKHBlbXMsIHsgbjogbW9kdWx1cywgZTogZXhwb3NhbnQsIGtpZCB9KSA9PlxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHBlbXMsIHtcbiAgICAgICAgICAgICAgICBba2lkXTogcnNhUHVibGljS2V5VG9QRU0obW9kdWx1cywgZXhwb3NhbnQpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHt9XG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChyZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddKSB7XG4gICAgICAgICAgICB2YXIgZXhwaXJlID0gcmVzLmhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXS5tYXRjaCgvbWF4LWFnZT0oWzAtOV0rKS8pO1xuXG4gICAgICAgICAgICBpZiAoZXhwaXJlKSB7XG4gICAgICAgICAgICAgIGNhY2hlID0gT2JqZWN0LmFzc2lnbih7fSwgcGVtcywge1xuICAgICAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkgKyBOdW1iZXIoZXhwaXJlWzFdKSAqIDEwMDApLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHBlbXNba2V5SWRdKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJGcm9tVG9rZW4odG9rZW4pIHtcbiAgY29uc3QgZGVjb2RlZFRva2VuID0gand0LmRlY29kZSh0b2tlbiwgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcblxuICBpZiAoIWRlY29kZWRUb2tlbikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgcHJvdmlkZWQgdG9rZW4gZG9lcyBub3QgZGVjb2RlIGFzIEpXVGApO1xuICB9XG5cbiAgcmV0dXJuIGRlY29kZWRUb2tlbi5oZWFkZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUlkVG9rZW4oeyBpZF90b2tlbjogdG9rZW4sIGlkIH0sIHsgY2xpZW50SWQgfSkge1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGBpZCB0b2tlbiBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gIH1cblxuICBjb25zdCB7IGtpZDoga2V5SWQsIGFsZzogYWxnb3JpdGhtIH0gPSBnZXRIZWFkZXJGcm9tVG9rZW4odG9rZW4pO1xuICBsZXQgand0Q2xhaW1zO1xuICBjb25zdCBnb29nbGVLZXkgPSBhd2FpdCBnZXRHb29nbGVLZXlCeUtleUlkKGtleUlkKTtcblxuICB0cnkge1xuICAgIGp3dENsYWltcyA9IGp3dC52ZXJpZnkodG9rZW4sIGdvb2dsZUtleSwge1xuICAgICAgYWxnb3JpdGhtczogYWxnb3JpdGhtLFxuICAgICAgYXVkaWVuY2U6IGNsaWVudElkLFxuICAgIH0pO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXhjZXB0aW9uLm1lc3NhZ2U7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsIGAke21lc3NhZ2V9YCk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLmlzcyAhPT0gVE9LRU5fSVNTVUVSICYmIGp3dENsYWltcy5pc3MgIT09IEhUVFBTX1RPS0VOX0lTU1VFUikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGlzc3VlZCBieSBjb3JyZWN0IHByb3ZpZGVyIC0gZXhwZWN0ZWQ6ICR7VE9LRU5fSVNTVUVSfSBvciAke0hUVFBTX1RPS0VOX0lTU1VFUn0gfCBmcm9tOiAke2p3dENsYWltcy5pc3N9YFxuICAgICk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLnN1YiAhPT0gaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgYGF1dGggZGF0YSBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuYCk7XG4gIH1cblxuICBpZiAoY2xpZW50SWQgJiYgand0Q2xhaW1zLmF1ZCAhPT0gY2xpZW50SWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYGlkIHRva2VuIG5vdCBhdXRob3JpemVkIGZvciB0aGlzIGNsaWVudElkLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGp3dENsYWltcztcbn1cblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIHZlcmlmeUlkVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZDogdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YTogdmFsaWRhdGVBdXRoRGF0YSxcbn07XG5cbi8vIEhlbHBlcnMgZnVuY3Rpb25zIHRvIGNvbnZlcnQgdGhlIFJTQSBjZXJ0cyB0byBQRU0gKGZyb20gandrcy1yc2EpXG5mdW5jdGlvbiByc2FQdWJsaWNLZXlUb1BFTShtb2R1bHVzQjY0LCBleHBvbmVudEI2NCkge1xuICBjb25zdCBtb2R1bHVzID0gbmV3IEJ1ZmZlcihtb2R1bHVzQjY0LCAnYmFzZTY0Jyk7XG4gIGNvbnN0IGV4cG9uZW50ID0gbmV3IEJ1ZmZlcihleHBvbmVudEI2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBtb2R1bHVzSGV4ID0gcHJlcGFkU2lnbmVkKG1vZHVsdXMudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgZXhwb25lbnRIZXggPSBwcmVwYWRTaWduZWQoZXhwb25lbnQudG9TdHJpbmcoJ2hleCcpKTtcbiAgY29uc3QgbW9kbGVuID0gbW9kdWx1c0hleC5sZW5ndGggLyAyO1xuICBjb25zdCBleHBsZW4gPSBleHBvbmVudEhleC5sZW5ndGggLyAyO1xuXG4gIGNvbnN0IGVuY29kZWRNb2RsZW4gPSBlbmNvZGVMZW5ndGhIZXgobW9kbGVuKTtcbiAgY29uc3QgZW5jb2RlZEV4cGxlbiA9IGVuY29kZUxlbmd0aEhleChleHBsZW4pO1xuICBjb25zdCBlbmNvZGVkUHVia2V5ID1cbiAgICAnMzAnICtcbiAgICBlbmNvZGVMZW5ndGhIZXgobW9kbGVuICsgZXhwbGVuICsgZW5jb2RlZE1vZGxlbi5sZW5ndGggLyAyICsgZW5jb2RlZEV4cGxlbi5sZW5ndGggLyAyICsgMikgK1xuICAgICcwMicgK1xuICAgIGVuY29kZWRNb2RsZW4gK1xuICAgIG1vZHVsdXNIZXggK1xuICAgICcwMicgK1xuICAgIGVuY29kZWRFeHBsZW4gK1xuICAgIGV4cG9uZW50SGV4O1xuXG4gIGNvbnN0IGRlciA9IG5ldyBCdWZmZXIoZW5jb2RlZFB1YmtleSwgJ2hleCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICBsZXQgcGVtID0gJy0tLS0tQkVHSU4gUlNBIFBVQkxJQyBLRVktLS0tLVxcbic7XG4gIHBlbSArPSBgJHtkZXIubWF0Y2goLy57MSw2NH0vZykuam9pbignXFxuJyl9YDtcbiAgcGVtICs9ICdcXG4tLS0tLUVORCBSU0EgUFVCTElDIEtFWS0tLS0tXFxuJztcbiAgcmV0dXJuIHBlbTtcbn1cblxuZnVuY3Rpb24gcHJlcGFkU2lnbmVkKGhleFN0cikge1xuICBjb25zdCBtc2IgPSBoZXhTdHJbMF07XG4gIGlmIChtc2IgPCAnMCcgfHwgbXNiID4gJzcnKSB7XG4gICAgcmV0dXJuIGAwMCR7aGV4U3RyfWA7XG4gIH1cbiAgcmV0dXJuIGhleFN0cjtcbn1cblxuZnVuY3Rpb24gdG9IZXgobnVtYmVyKSB7XG4gIGNvbnN0IG5zdHIgPSBudW1iZXIudG9TdHJpbmcoMTYpO1xuICBpZiAobnN0ci5sZW5ndGggJSAyKSB7XG4gICAgcmV0dXJuIGAwJHtuc3RyfWA7XG4gIH1cbiAgcmV0dXJuIG5zdHI7XG59XG5cbmZ1bmN0aW9uIGVuY29kZUxlbmd0aEhleChuKSB7XG4gIGlmIChuIDw9IDEyNykge1xuICAgIHJldHVybiB0b0hleChuKTtcbiAgfVxuICBjb25zdCBuSGV4ID0gdG9IZXgobik7XG4gIGNvbnN0IGxlbmd0aE9mTGVuZ3RoQnl0ZSA9IDEyOCArIG5IZXgubGVuZ3RoIC8gMjtcbiAgcmV0dXJuIHRvSGV4KGxlbmd0aE9mTGVuZ3RoQnl0ZSkgKyBuSGV4O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUVaO0FBQ0EsSUFBSUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUNELEtBQUs7QUFFdkMsTUFBTUUsS0FBSyxHQUFHRCxPQUFPLENBQUMsT0FBTyxDQUFDO0FBQzlCLE1BQU1FLEdBQUcsR0FBR0YsT0FBTyxDQUFDLGNBQWMsQ0FBQztBQUVuQyxNQUFNRyxZQUFZLEdBQUcscUJBQXFCO0FBQzFDLE1BQU1DLGtCQUFrQixHQUFHLDZCQUE2QjtBQUV4RCxJQUFJQyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztBQUVkO0FBQ0EsU0FBU0MsbUJBQW1CLENBQUNDLEtBQUssRUFBRTtFQUNsQyxJQUFJRixLQUFLLENBQUNFLEtBQUssQ0FBQyxJQUFJRixLQUFLLENBQUNHLFNBQVMsR0FBRyxJQUFJQyxJ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
@@ -11,25 +11,22 @@ const authData = {
11
11
  const {
12
12
  Parse
13
13
  } = require('parse/node');
14
+ const httpsRequest = require('./httpsRequest');
14
15
 
15
- const httpsRequest = require('./httpsRequest'); // Returns a promise that fulfills if this user id is valid.
16
-
17
-
16
+ // Returns a promise that fulfills if this user id is valid.
18
17
  async function validateAuthData(authData) {
19
18
  const response = await httpsRequest.get(`https://www.googleapis.com/games/v1/players/${authData.id}?access_token=${authData.access_token}`);
20
-
21
19
  if (!(response && response.playerId === authData.id)) {
22
20
  throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Google Play Games Services - authData is invalid for this user.');
23
21
  }
24
- } // Returns a promise that fulfills if this app id is valid.
25
-
22
+ }
26
23
 
24
+ // Returns a promise that fulfills if this app id is valid.
27
25
  function validateAppId() {
28
26
  return Promise.resolve();
29
27
  }
30
-
31
28
  module.exports = {
32
29
  validateAppId,
33
30
  validateAuthData
34
31
  };
35
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2dwZ2FtZXMuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiaHR0cHNSZXF1ZXN0IiwidmFsaWRhdGVBdXRoRGF0YSIsImF1dGhEYXRhIiwicmVzcG9uc2UiLCJnZXQiLCJpZCIsImFjY2Vzc190b2tlbiIsInBsYXllcklkIiwiRXJyb3IiLCJPQkpFQ1RfTk9UX0ZPVU5EIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUFFQSxFQUFBQTtBQUFGLElBQVlDLE9BQU8sQ0FBQyxZQUFELENBQXpCOztBQUNBLE1BQU1DLFlBQVksR0FBR0QsT0FBTyxDQUFDLGdCQUFELENBQTVCLEMsQ0FFQTs7O0FBQ0EsZUFBZUUsZ0JBQWYsQ0FBZ0NDLFFBQWhDLEVBQTBDO0FBQ3hDLFFBQU1DLFFBQVEsR0FBRyxNQUFNSCxZQUFZLENBQUNJLEdBQWIsQ0FDcEIsK0NBQThDRixRQUFRLENBQUNHLEVBQUcsaUJBQWdCSCxRQUFRLENBQUNJLFlBQWEsRUFENUUsQ0FBdkI7O0FBR0EsTUFBSSxFQUFFSCxRQUFRLElBQUlBLFFBQVEsQ0FBQ0ksUUFBVCxLQUFzQkwsUUFBUSxDQUFDRyxFQUE3QyxDQUFKLEVBQXNEO0FBQ3BELFVBQU0sSUFBSVAsS0FBSyxDQUFDVSxLQUFWLENBQ0pWLEtBQUssQ0FBQ1UsS0FBTixDQUFZQyxnQkFEUixFQUVKLGlFQUZJLENBQU47QUFJRDtBQUNGLEMsQ0FFRDs7O0FBQ0EsU0FBU0MsYUFBVCxHQUF5QjtBQUN2QixTQUFPQyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNEOztBQUVEQyxNQUFNLENBQUNDLE9BQVAsR0FBaUI7QUFDZkosRUFBQUEsYUFEZTtBQUVmVCxFQUFBQTtBQUZlLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLyogR29vZ2xlIFBsYXkgR2FtZSBTZXJ2aWNlc1xuaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FtZXMvc2VydmljZXMvd2ViL2FwaS9wbGF5ZXJzL2dldFxuXG5jb25zdCBhdXRoRGF0YSA9IHtcbiAgaWQ6ICdwbGF5ZXJJZCcsXG4gIGFjY2Vzc190b2tlbjogJ3Rva2VuJyxcbn07XG4qL1xuY29uc3QgeyBQYXJzZSB9ID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcblxuLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyBpZiB0aGlzIHVzZXIgaWQgaXMgdmFsaWQuXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhKSB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHR0cHNSZXF1ZXN0LmdldChcbiAgICBgaHR0cHM6Ly93d3cuZ29vZ2xlYXBpcy5jb20vZ2FtZXMvdjEvcGxheWVycy8ke2F1dGhEYXRhLmlkfT9hY2Nlc3NfdG9rZW49JHthdXRoRGF0YS5hY2Nlc3NfdG9rZW59YFxuICApO1xuICBpZiAoIShyZXNwb25zZSAmJiByZXNwb25zZS5wbGF5ZXJJZCA9PT0gYXV0aERhdGEuaWQpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgICdHb29nbGUgUGxheSBHYW1lcyBTZXJ2aWNlcyAtIGF1dGhEYXRhIGlzIGludmFsaWQgZm9yIHRoaXMgdXNlci4nXG4gICAgKTtcbiAgfVxufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZCgpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXX0=
32
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJQYXJzZSIsInJlcXVpcmUiLCJodHRwc1JlcXVlc3QiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiYXV0aERhdGEiLCJyZXNwb25zZSIsImdldCIsImlkIiwiYWNjZXNzX3Rva2VuIiwicGxheWVySWQiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUFwcElkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJtb2R1bGUiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL0FkYXB0ZXJzL0F1dGgvZ3BnYW1lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBHb29nbGUgUGxheSBHYW1lIFNlcnZpY2VzXG5odHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nYW1lcy9zZXJ2aWNlcy93ZWIvYXBpL3BsYXllcnMvZ2V0XG5cbmNvbnN0IGF1dGhEYXRhID0ge1xuICBpZDogJ3BsYXllcklkJyxcbiAgYWNjZXNzX3Rva2VuOiAndG9rZW4nLFxufTtcbiovXG5jb25zdCB7IFBhcnNlIH0gPSByZXF1aXJlKCdwYXJzZS9ub2RlJyk7XG5jb25zdCBodHRwc1JlcXVlc3QgPSByZXF1aXJlKCcuL2h0dHBzUmVxdWVzdCcpO1xuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwc1JlcXVlc3QuZ2V0KFxuICAgIGBodHRwczovL3d3dy5nb29nbGVhcGlzLmNvbS9nYW1lcy92MS9wbGF5ZXJzLyR7YXV0aERhdGEuaWR9P2FjY2Vzc190b2tlbj0ke2F1dGhEYXRhLmFjY2Vzc190b2tlbn1gXG4gICk7XG4gIGlmICghKHJlc3BvbnNlICYmIHJlc3BvbnNlLnBsYXllcklkID09PSBhdXRoRGF0YS5pZCkpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgJ0dvb2dsZSBQbGF5IEdhbWVzIFNlcnZpY2VzIC0gYXV0aERhdGEgaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLidcbiAgICApO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtFQUFFQTtBQUFNLENBQUMsR0FBR0MsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN2QyxNQUFNQyxZQUFZLEdBQUdELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzs7QUFFOUM7QUFDQSxlQUFlRSxnQkFBZ0IsQ0FBQ0MsUUFBUSxFQUFFO0VBQ3hDLE1BQU1DLFFBQVEsR0FBRyxNQUFNSCxZQUFZLENBQUNJLEdBQUcsQ0FDcEMsK0NBQThDRixRQUFRLENBQUNHLEVBQUcsaUJBQWdCSCxRQUFRLENBQUNJLFlBQWEsRUFBQyxDQUNuRztFQUNELElBQUksRUFBRUgsUUFBUSxJQUFJQSxRQUFRLENBQUNJLFFBQVEsS0FBS0wsUUFBUSxDQUFDRyxFQUFFLENBQUMsRUFBRTtJQUNwRCxNQUFNLElBQUlQLEtBQUssQ0FBQ1UsS0FBSyxDQUNuQlYsS0FBSyxDQUFDVSxLQUFLLENBQUNDLGdCQUFnQixFQUM1QixpRUFBaUUsQ0FDbEU7RUFDSDtBQUNGOztBQUVBO0FBQ0EsU0FBU0MsYUFBYSxHQUFHO0VBQ3ZCLE9BQU9DLE9BQU8sQ0FBQ0MsT0FBTyxFQUFFO0FBQzFCO0FBRUFDLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHO0VBQ2ZKLGFBQWE7RUFDYlQ7QUFDRixDQUFDIn0=
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  const https = require('https');
4
-
5
4
  function makeCallback(resolve, reject, noJSON) {
6
5
  return function (res) {
7
6
  let data = '';
@@ -12,25 +11,21 @@ function makeCallback(resolve, reject, noJSON) {
12
11
  if (noJSON) {
13
12
  return resolve(data);
14
13
  }
15
-
16
14
  try {
17
15
  data = JSON.parse(data);
18
16
  } catch (e) {
19
17
  return reject(e);
20
18
  }
21
-
22
19
  resolve(data);
23
20
  });
24
21
  res.on('error', reject);
25
22
  };
26
23
  }
27
-
28
24
  function get(options, noJSON = false) {
29
25
  return new Promise((resolve, reject) => {
30
26
  https.get(options, makeCallback(resolve, reject, noJSON)).on('error', reject);
31
27
  });
32
28
  }
33
-
34
29
  function request(options, postData) {
35
30
  return new Promise((resolve, reject) => {
36
31
  const req = https.request(options, makeCallback(resolve, reject));
@@ -39,9 +34,8 @@ function request(options, postData) {
39
34
  req.end();
40
35
  });
41
36
  }
42
-
43
37
  module.exports = {
44
38
  get,
45
39
  request
46
40
  };
47
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2h0dHBzUmVxdWVzdC5qcyJdLCJuYW1lcyI6WyJodHRwcyIsInJlcXVpcmUiLCJtYWtlQ2FsbGJhY2siLCJyZXNvbHZlIiwicmVqZWN0Iiwibm9KU09OIiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJKU09OIiwicGFyc2UiLCJlIiwiZ2V0Iiwib3B0aW9ucyIsIlByb21pc2UiLCJyZXF1ZXN0IiwicG9zdERhdGEiLCJyZXEiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBTUEsS0FBSyxHQUFHQyxPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFFQSxTQUFTQyxZQUFULENBQXNCQyxPQUF0QixFQUErQkMsTUFBL0IsRUFBdUNDLE1BQXZDLEVBQStDO0FBQzdDLFNBQU8sVUFBVUMsR0FBVixFQUFlO0FBQ3BCLFFBQUlDLElBQUksR0FBRyxFQUFYO0FBQ0FELElBQUFBLEdBQUcsQ0FBQ0UsRUFBSixDQUFPLE1BQVAsRUFBZUMsS0FBSyxJQUFJO0FBQ3RCRixNQUFBQSxJQUFJLElBQUlFLEtBQVI7QUFDRCxLQUZEO0FBR0FILElBQUFBLEdBQUcsQ0FBQ0UsRUFBSixDQUFPLEtBQVAsRUFBYyxNQUFNO0FBQ2xCLFVBQUlILE1BQUosRUFBWTtBQUNWLGVBQU9GLE9BQU8sQ0FBQ0ksSUFBRCxDQUFkO0FBQ0Q7O0FBQ0QsVUFBSTtBQUNGQSxRQUFBQSxJQUFJLEdBQUdHLElBQUksQ0FBQ0MsS0FBTCxDQUFXSixJQUFYLENBQVA7QUFDRCxPQUZELENBRUUsT0FBT0ssQ0FBUCxFQUFVO0FBQ1YsZUFBT1IsTUFBTSxDQUFDUSxDQUFELENBQWI7QUFDRDs7QUFDRFQsTUFBQUEsT0FBTyxDQUFDSSxJQUFELENBQVA7QUFDRCxLQVZEO0FBV0FELElBQUFBLEdBQUcsQ0FBQ0UsRUFBSixDQUFPLE9BQVAsRUFBZ0JKLE1BQWhCO0FBQ0QsR0FqQkQ7QUFrQkQ7O0FBRUQsU0FBU1MsR0FBVCxDQUFhQyxPQUFiLEVBQXNCVCxNQUFNLEdBQUcsS0FBL0IsRUFBc0M7QUFDcEMsU0FBTyxJQUFJVSxPQUFKLENBQVksQ0FBQ1osT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDSixJQUFBQSxLQUFLLENBQUNhLEdBQU4sQ0FBVUMsT0FBVixFQUFtQlosWUFBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBa0JDLE1BQWxCLENBQS9CLEVBQTBERyxFQUExRCxDQUE2RCxPQUE3RCxFQUFzRUosTUFBdEU7QUFDRCxHQUZNLENBQVA7QUFHRDs7QUFFRCxTQUFTWSxPQUFULENBQWlCRixPQUFqQixFQUEwQkcsUUFBMUIsRUFBb0M7QUFDbEMsU0FBTyxJQUFJRixPQUFKLENBQVksQ0FBQ1osT0FBRCxFQUFVQyxNQUFWLEtBQXFCO0FBQ3RDLFVBQU1jLEdBQUcsR0FBR2xCLEtBQUssQ0FBQ2dCLE9BQU4sQ0FBY0YsT0FBZCxFQUF1QlosWUFBWSxDQUFDQyxPQUFELEVBQVVDLE1BQVYsQ0FBbkMsQ0FBWjtBQUNBYyxJQUFBQSxHQUFHLENBQUNWLEVBQUosQ0FBTyxPQUFQLEVBQWdCSixNQUFoQjtBQUNBYyxJQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVUYsUUFBVjtBQUNBQyxJQUFBQSxHQUFHLENBQUNFLEdBQUo7QUFDRCxHQUxNLENBQVA7QUFNRDs7QUFFREMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQUVULEVBQUFBLEdBQUY7QUFBT0csRUFBQUE7QUFBUCxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcblxuZnVuY3Rpb24gbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCwgbm9KU09OKSB7XG4gIHJldHVybiBmdW5jdGlvbiAocmVzKSB7XG4gICAgbGV0IGRhdGEgPSAnJztcbiAgICByZXMub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICBkYXRhICs9IGNodW5rO1xuICAgIH0pO1xuICAgIHJlcy5vbignZW5kJywgKCkgPT4ge1xuICAgICAgaWYgKG5vSlNPTikge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KGUpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICB9KTtcbiAgICByZXMub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0KG9wdGlvbnMsIG5vSlNPTiA9IGZhbHNlKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHMuZ2V0KG9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QsIG5vSlNPTikpLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0KG9wdGlvbnMsIHBvc3REYXRhKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxID0gaHR0cHMucmVxdWVzdChvcHRpb25zLCBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0KSk7XG4gICAgcmVxLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgcmVxLndyaXRlKHBvc3REYXRhKTtcbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgZ2V0LCByZXF1ZXN0IH07XG4iXX0=
41
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJodHRwcyIsInJlcXVpcmUiLCJtYWtlQ2FsbGJhY2siLCJyZXNvbHZlIiwicmVqZWN0Iiwibm9KU09OIiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJKU09OIiwicGFyc2UiLCJlIiwiZ2V0Iiwib3B0aW9ucyIsIlByb21pc2UiLCJyZXF1ZXN0IiwicG9zdERhdGEiLCJyZXEiLCJ3cml0ZSIsImVuZCIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9odHRwc1JlcXVlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5mdW5jdGlvbiBtYWtlQ2FsbGJhY2socmVzb2x2ZSwgcmVqZWN0LCBub0pTT04pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXMpIHtcbiAgICBsZXQgZGF0YSA9ICcnO1xuICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICBpZiAobm9KU09OKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlKGRhdGEpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGRhdGEpO1xuICAgIH0pO1xuICAgIHJlcy5vbignZXJyb3InLCByZWplY3QpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBnZXQob3B0aW9ucywgbm9KU09OID0gZmFsc2UpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwcy5nZXQob3B0aW9ucywgbWFrZUNhbGxiYWNrKHJlc29sdmUsIHJlamVjdCwgbm9KU09OKSkub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3Qob3B0aW9ucywgcG9zdERhdGEpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZXEgPSBodHRwcy5yZXF1ZXN0KG9wdGlvbnMsIG1ha2VDYWxsYmFjayhyZXNvbHZlLCByZWplY3QpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICByZXEud3JpdGUocG9zdERhdGEpO1xuICAgIHJlcS5lbmQoKTtcbiAgfSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBnZXQsIHJlcXVlc3QgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFFOUIsU0FBU0MsWUFBWSxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUFFO0VBQzdDLE9BQU8sVUFBVUMsR0FBRyxFQUFFO0lBQ3BCLElBQUlDLElBQUksR0FBRyxFQUFFO0lBQ2JELEdBQUcsQ0FBQ0UsRUFBRSxDQUFDLE1BQU0sRUFBRUMsS0FBSyxJQUFJO01BQ3RCRixJQUFJLElBQUlFLEtBQUs7SUFDZixDQUFDLENBQUM7SUFDRkgsR0FBRyxDQUFDRSxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU07TUFDbEIsSUFBSUgsTUFBTSxFQUFFO1FBQ1YsT0FBT0YsT0FBTyxDQUFDSSxJQUFJLENBQUM7TUFDdEI7TUFDQSxJQUFJO1FBQ0ZBLElBQUksR0FBR0csSUFBSSxDQUFDQyxLQUFLLENBQUNKLElBQUksQ0FBQztNQUN6QixDQUFDLENBQUMsT0FBT0ssQ0FBQyxFQUFFO1FBQ1YsT0FBT1IsTUFBTSxDQUFDUSxDQUFDLENBQUM7TUFDbEI7TUFDQVQsT0FBTyxDQUFDSSxJQUFJLENBQUM7SUFDZixDQUFDLENBQUM7SUFDRkQsR0FBRyxDQUFDRSxFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7RUFDekIsQ0FBQztBQUNIO0FBRUEsU0FBU1MsR0FBRyxDQUFDQyxPQUFPLEVBQUVULE1BQU0sR0FBRyxLQUFLLEVBQUU7RUFDcEMsT0FBTyxJQUFJVSxPQUFPLENBQUMsQ0FBQ1osT0FBTyxFQUFFQyxNQUFNLEtBQUs7SUFDdENKLEtBQUssQ0FBQ2EsR0FBRyxDQUFDQyxPQUFPLEVBQUVaLFlBQVksQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sQ0FBQyxDQUFDLENBQUNHLEVBQUUsQ0FBQyxPQUFPLEVBQUVKLE1BQU0sQ0FBQztFQUMvRSxDQUFDLENBQUM7QUFDSjtBQUVBLFNBQVNZLE9BQU8sQ0FBQ0YsT0FBTyxFQUFFRyxRQUFRLEVBQUU7RUFDbEMsT0FBTyxJQUFJRixPQUFPLENBQUMsQ0FBQ1osT0FBTyxFQUFFQyxNQUFNLEtBQUs7SUFDdEMsTUFBTWMsR0FBRyxHQUFHbEIsS0FBSyxDQUFDZ0IsT0FBTyxDQUFDRixPQUFPLEVBQUVaLFlBQVksQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLENBQUMsQ0FBQztJQUNqRWMsR0FBRyxDQUFDVixFQUFFLENBQUMsT0FBTyxFQUFFSixNQUFNLENBQUM7SUFDdkJjLEdBQUcsQ0FBQ0MsS0FBSyxDQUFDRixRQUFRLENBQUM7SUFDbkJDLEdBQUcsQ0FBQ0UsR0FBRyxFQUFFO0VBQ1gsQ0FBQyxDQUFDO0FBQ0o7QUFFQUMsTUFBTSxDQUFDQyxPQUFPLEdBQUc7RUFBRVQsR0FBRztFQUFFRztBQUFRLENBQUMifQ==
@@ -1,60 +1,32 @@
1
1
  "use strict";
2
2
 
3
3
  var _AdapterLoader = _interopRequireDefault(require("../AdapterLoader"));
4
-
5
4
  var _node = _interopRequireDefault(require("parse/node"));
6
-
7
5
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
8
-
9
6
  const apple = require('./apple');
10
-
11
7
  const gcenter = require('./gcenter');
12
-
13
8
  const gpgames = require('./gpgames');
14
-
15
9
  const facebook = require('./facebook');
16
-
17
10
  const instagram = require('./instagram');
18
-
19
11
  const linkedin = require('./linkedin');
20
-
21
12
  const meetup = require('./meetup');
22
-
23
13
  const google = require('./google');
24
-
25
14
  const github = require('./github');
26
-
27
15
  const twitter = require('./twitter');
28
-
29
16
  const spotify = require('./spotify');
30
-
31
17
  const digits = require('./twitter'); // digits tokens are validated by twitter
32
-
33
-
34
18
  const janrainengage = require('./janrainengage');
35
-
36
19
  const janraincapture = require('./janraincapture');
37
-
38
20
  const line = require('./line');
39
-
40
21
  const vkontakte = require('./vkontakte');
41
-
42
22
  const qq = require('./qq');
43
-
44
23
  const wechat = require('./wechat');
45
-
46
24
  const weibo = require('./weibo');
47
-
48
25
  const oauth2 = require('./oauth2');
49
-
50
26
  const phantauth = require('./phantauth');
51
-
52
27
  const microsoft = require('./microsoft');
53
-
54
28
  const keycloak = require('./keycloak');
55
-
56
29
  const ldap = require('./ldap');
57
-
58
30
  const anonymous = {
59
31
  validateAuthData: () => {
60
32
  return Promise.resolve();
@@ -88,40 +60,34 @@ const providers = {
88
60
  microsoft,
89
61
  keycloak,
90
62
  ldap
91
- }; // Indexed auth policies
63
+ };
92
64
 
65
+ // Indexed auth policies
93
66
  const authAdapterPolicies = {
94
67
  default: true,
95
68
  solo: true,
96
69
  additional: true
97
70
  };
98
-
99
71
  function authDataValidator(provider, adapter, appIds, options) {
100
72
  return async function (authData, req, user, requestObject) {
101
73
  if (appIds && typeof adapter.validateAppId === 'function') {
102
74
  await Promise.resolve(adapter.validateAppId(appIds, authData, options, requestObject));
103
75
  }
104
-
105
76
  if (adapter.policy && !authAdapterPolicies[adapter.policy]) {
106
77
  throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'AuthAdapter policy is not configured correctly. The value must be either "solo", "additional", "default" or undefined (will be handled as "default")');
107
78
  }
108
-
109
79
  if (typeof adapter.validateAuthData === 'function') {
110
80
  return adapter.validateAuthData(authData, options, requestObject);
111
81
  }
112
-
113
82
  if (typeof adapter.validateSetUp !== 'function' || typeof adapter.validateLogin !== 'function' || typeof adapter.validateUpdate !== 'function') {
114
83
  throw new _node.default.Error(_node.default.Error.OTHER_CAUSE, 'Adapter is not configured. Implement either validateAuthData or all of the following: validateSetUp, validateLogin and validateUpdate');
115
- } // When masterKey is detected, we should trigger a logged in user
116
-
117
-
84
+ }
85
+ // When masterKey is detected, we should trigger a logged in user
118
86
  const isLoggedIn = req.auth.user && user && req.auth.user.id === user.id || user && req.auth.isMaster;
119
87
  let hasAuthDataConfigured = false;
120
-
121
88
  if (user && user.get('authData') && user.get('authData')[provider]) {
122
89
  hasAuthDataConfigured = true;
123
90
  }
124
-
125
91
  if (isLoggedIn) {
126
92
  // User is updating their authData
127
93
  if (hasAuthDataConfigured) {
@@ -129,54 +95,50 @@ function authDataValidator(provider, adapter, appIds, options) {
129
95
  method: 'validateUpdate',
130
96
  validator: () => adapter.validateUpdate(authData, options, requestObject)
131
97
  };
132
- } // Set up if the user does not have the provider configured
133
-
134
-
98
+ }
99
+ // Set up if the user does not have the provider configured
135
100
  return {
136
101
  method: 'validateSetUp',
137
102
  validator: () => adapter.validateSetUp(authData, options, requestObject)
138
103
  };
139
- } // Not logged in and authData is configured on the user
140
-
104
+ }
141
105
 
106
+ // Not logged in and authData is configured on the user
142
107
  if (hasAuthDataConfigured) {
143
108
  return {
144
109
  method: 'validateLogin',
145
110
  validator: () => adapter.validateLogin(authData, options, requestObject)
146
111
  };
147
- } // User not logged in and the provider is not set up, for example when a new user
148
- // signs up or an existing user uses a new auth provider
149
-
112
+ }
150
113
 
114
+ // User not logged in and the provider is not set up, for example when a new user
115
+ // signs up or an existing user uses a new auth provider
151
116
  return {
152
117
  method: 'validateSetUp',
153
118
  validator: () => adapter.validateSetUp(authData, options, requestObject)
154
119
  };
155
120
  };
156
121
  }
157
-
158
122
  function loadAuthAdapter(provider, authOptions) {
159
123
  // providers are auth providers implemented by default
160
- let defaultAdapter = providers[provider]; // authOptions can contain complete custom auth adapters or
124
+ let defaultAdapter = providers[provider];
125
+ // authOptions can contain complete custom auth adapters or
161
126
  // a default auth adapter like Facebook
162
-
163
127
  const providerOptions = authOptions[provider];
164
-
165
128
  if (providerOptions && Object.prototype.hasOwnProperty.call(providerOptions, 'oauth2') && providerOptions['oauth2'] === true) {
166
129
  defaultAdapter = oauth2;
167
- } // Default provider not found and a custom auth provider was not provided
168
-
130
+ }
169
131
 
132
+ // Default provider not found and a custom auth provider was not provided
170
133
  if (!defaultAdapter && !providerOptions) {
171
134
  return;
172
135
  }
173
-
174
136
  const adapter = Object.assign({}, defaultAdapter);
175
- const appIds = providerOptions ? providerOptions.appIds : undefined; // Try the configuration methods
137
+ const appIds = providerOptions ? providerOptions.appIds : undefined;
176
138
 
139
+ // Try the configuration methods
177
140
  if (providerOptions) {
178
141
  const optionalAdapter = (0, _AdapterLoader.default)(providerOptions, undefined, providerOptions);
179
-
180
142
  if (optionalAdapter) {
181
143
  ['validateAuthData', 'validateAppId', 'validateSetUp', 'validateLogin', 'validateUpdate', 'challenge', 'policy'].forEach(key => {
182
144
  if (optionalAdapter[key]) {
@@ -185,29 +147,24 @@ function loadAuthAdapter(provider, authOptions) {
185
147
  });
186
148
  }
187
149
  }
188
-
189
150
  return {
190
151
  adapter,
191
152
  appIds,
192
153
  providerOptions
193
154
  };
194
155
  }
195
-
196
156
  module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
197
157
  let _enableAnonymousUsers = enableAnonymousUsers;
198
-
199
158
  const setEnableAnonymousUsers = function (enable) {
200
159
  _enableAnonymousUsers = enable;
201
- }; // To handle the test cases on configuration
202
-
203
-
160
+ };
161
+ // To handle the test cases on configuration
204
162
  const getValidatorForProvider = function (provider) {
205
163
  if (provider === 'anonymous' && !_enableAnonymousUsers) {
206
164
  return {
207
165
  validator: undefined
208
166
  };
209
167
  }
210
-
211
168
  const authAdapter = loadAuthAdapter(provider, authOptions);
212
169
  if (!authAdapter) return;
213
170
  const {
@@ -220,12 +177,10 @@ module.exports = function (authOptions = {}, enableAnonymousUsers = true) {
220
177
  adapter
221
178
  };
222
179
  };
223
-
224
180
  return Object.freeze({
225
181
  getValidatorForProvider,
226
182
  setEnableAnonymousUsers
227
183
  });
228
184
  };
229
-
230
185
  module.exports.loadAuthAdapter = loadAuthAdapter;
231
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2luZGV4LmpzIl0sIm5hbWVzIjpbImFwcGxlIiwicmVxdWlyZSIsImdjZW50ZXIiLCJncGdhbWVzIiwiZmFjZWJvb2siLCJpbnN0YWdyYW0iLCJsaW5rZWRpbiIsIm1lZXR1cCIsImdvb2dsZSIsImdpdGh1YiIsInR3aXR0ZXIiLCJzcG90aWZ5IiwiZGlnaXRzIiwiamFucmFpbmVuZ2FnZSIsImphbnJhaW5jYXB0dXJlIiwibGluZSIsInZrb250YWt0ZSIsInFxIiwid2VjaGF0Iiwid2VpYm8iLCJvYXV0aDIiLCJwaGFudGF1dGgiLCJtaWNyb3NvZnQiLCJrZXljbG9hayIsImxkYXAiLCJhbm9ueW1vdXMiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ2YWxpZGF0ZUFwcElkIiwicHJvdmlkZXJzIiwiYXV0aEFkYXB0ZXJQb2xpY2llcyIsImRlZmF1bHQiLCJzb2xvIiwiYWRkaXRpb25hbCIsImF1dGhEYXRhVmFsaWRhdG9yIiwicHJvdmlkZXIiLCJhZGFwdGVyIiwiYXBwSWRzIiwib3B0aW9ucyIsImF1dGhEYXRhIiwicmVxIiwidXNlciIsInJlcXVlc3RPYmplY3QiLCJwb2xpY3kiLCJQYXJzZSIsIkVycm9yIiwiT1RIRVJfQ0FVU0UiLCJ2YWxpZGF0ZVNldFVwIiwidmFsaWRhdGVMb2dpbiIsInZhbGlkYXRlVXBkYXRlIiwiaXNMb2dnZWRJbiIsImF1dGgiLCJpZCIsImlzTWFzdGVyIiwiaGFzQXV0aERhdGFDb25maWd1cmVkIiwiZ2V0IiwibWV0aG9kIiwidmFsaWRhdG9yIiwibG9hZEF1dGhBZGFwdGVyIiwiYXV0aE9wdGlvbnMiLCJkZWZhdWx0QWRhcHRlciIsInByb3ZpZGVyT3B0aW9ucyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImFzc2lnbiIsInVuZGVmaW5lZCIsIm9wdGlvbmFsQWRhcHRlciIsImZvckVhY2giLCJrZXkiLCJtb2R1bGUiLCJleHBvcnRzIiwiZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJfZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJzZXRFbmFibGVBbm9ueW1vdXNVc2VycyIsImVuYWJsZSIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiYXV0aEFkYXB0ZXIiLCJmcmVlemUiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBQ0E7Ozs7QUFFQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxTQUFELENBQXJCOztBQUNBLE1BQU1DLE9BQU8sR0FBR0QsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0EsTUFBTUUsT0FBTyxHQUFHRixPQUFPLENBQUMsV0FBRCxDQUF2Qjs7QUFDQSxNQUFNRyxRQUFRLEdBQUdILE9BQU8sQ0FBQyxZQUFELENBQXhCOztBQUNBLE1BQU1JLFNBQVMsR0FBR0osT0FBTyxDQUFDLGFBQUQsQ0FBekI7O0FBQ0EsTUFBTUssUUFBUSxHQUFHTCxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxNQUFNTSxNQUFNLEdBQUdOLE9BQU8sQ0FBQyxVQUFELENBQXRCOztBQUNBLE1BQU1PLE1BQU0sR0FBR1AsT0FBTyxDQUFDLFVBQUQsQ0FBdEI7O0FBQ0EsTUFBTVEsTUFBTSxHQUFHUixPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFDQSxNQUFNUyxPQUFPLEdBQUdULE9BQU8sQ0FBQyxXQUFELENBQXZCOztBQUNBLE1BQU1VLE9BQU8sR0FBR1YsT0FBTyxDQUFDLFdBQUQsQ0FBdkI7O0FBQ0EsTUFBTVcsTUFBTSxHQUFHWCxPQUFPLENBQUMsV0FBRCxDQUF0QixDLENBQXFDOzs7QUFDckMsTUFBTVksYUFBYSxHQUFHWixPQUFPLENBQUMsaUJBQUQsQ0FBN0I7O0FBQ0EsTUFBTWEsY0FBYyxHQUFHYixPQUFPLENBQUMsa0JBQUQsQ0FBOUI7O0FBQ0EsTUFBTWMsSUFBSSxHQUFHZCxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxNQUFNZSxTQUFTLEdBQUdmLE9BQU8sQ0FBQyxhQUFELENBQXpCOztBQUNBLE1B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QUFYO0FBQW1Cd0IsTUFBQUE7QUFBbkIsUUFBdUNpQixXQUE3QztBQUNBLFdBQU87QUFBRXJCLE1BQUFBLFNBQVMsRUFBRXZCLGlCQUFpQixDQUFDQyxRQUFELEVBQVdDLE9BQVgsRUFBb0JDLE1BQXBCLEVBQTRCd0IsZUFBNUIsQ0FBOUI7QUFBNEV6QixNQUFBQTtBQUE1RSxLQUFQO0FBQ0QsR0FSRDs7QUFVQSxTQUFPMEIsTUFBTSxDQUFDaUIsTUFBUCxDQUFjO0FBQ25CRixJQUFBQSx1QkFEbUI7QUFFbkJGLElBQUFBO0FBRm1CLEdBQWQsQ0FBUDtBQUlELENBcEJEOztBQXNCQUosTUFBTSxDQUFDQyxPQUFQLENBQWVkLGVBQWYsR0FBaUNBLGVBQWpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvYWRBZGFwdGVyIGZyb20gJy4uL0FkYXB0ZXJMb2FkZXInO1xuaW1wb3J0IFBhcnNlIGZyb20gJ3BhcnNlL25vZGUnO1xuXG5jb25zdCBhcHBsZSA9IHJlcXVpcmUoJy4vYXBwbGUnKTtcbmNvbnN0IGdjZW50ZXIgPSByZXF1aXJlKCcuL2djZW50ZXInKTtcbmNvbnN0IGdwZ2FtZXMgPSByZXF1aXJlKCcuL2dwZ2FtZXMnKTtcbmNvbnN0IGZhY2Vib29rID0gcmVxdWlyZSgnLi9mYWNlYm9vaycpO1xuY29uc3QgaW5zdGFncmFtID0gcmVxdWlyZSgnLi9pbnN0YWdyYW0nKTtcbmNvbnN0IGxpbmtlZGluID0gcmVxdWlyZSgnLi9saW5rZWRpbicpO1xuY29uc3QgbWVldHVwID0gcmVxdWlyZSgnLi9tZWV0dXAnKTtcbmNvbnN0IGdvb2dsZSA9IHJlcXVpcmUoJy4vZ29vZ2xlJyk7XG5jb25zdCBnaXRodWIgPSByZXF1aXJlKCcuL2dpdGh1YicpO1xuY29uc3QgdHdpdHRlciA9IHJlcXVpcmUoJy4vdHdpdHRlcicpO1xuY29uc3Qgc3BvdGlmeSA9IHJlcXVpcmUoJy4vc3BvdGlmeScpO1xuY29uc3QgZGlnaXRzID0gcmVxdWlyZSgnLi90d2l0dGVyJyk7IC8vIGRpZ2l0cyB0b2tlbnMgYXJlIHZhbGlkYXRlZCBieSB0d2l0dGVyXG5jb25zdCBqYW5yYWluZW5nYWdlID0gcmVxdWlyZSgnLi9qYW5yYWluZW5nYWdlJyk7XG5jb25zdCBqYW5yYWluY2FwdHVyZSA9IHJlcXVpcmUoJy4vamFucmFpbmNhcHR1cmUnKTtcbmNvbnN0IGxpbmUgPSByZXF1aXJlKCcuL2xpbmUnKTtcbmNvbnN0IHZrb250YWt0ZSA9IHJlcXVpcmUoJy4vdmtvbnRha3RlJyk7XG5jb25zdCBxcSA9IHJlcXVpcmUoJy4vcXEnKTtcbmNvbnN0IHdlY2hhdCA9IHJlcXVpcmUoJy4vd2VjaGF0Jyk7XG5jb25zdCB3ZWlibyA9IHJlcXVpcmUoJy4vd2VpYm8nKTtcbmNvbnN0IG9hdXRoMiA9IHJlcXVpcmUoJy4vb2F1dGgyJyk7XG5jb25zdCBwaGFudGF1dGggPSByZXF1aXJlKCcuL3BoYW50YXV0aCcpO1xuY29uc3QgbWljcm9zb2Z0ID0gcmVxdWlyZSgnLi9taWNyb3NvZnQnKTtcbmNvbnN0IGtleWNsb2FrID0gcmVxdWlyZSgnLi9rZXljbG9haycpO1xuY29uc3QgbGRhcCA9IHJlcXVpcmUoJy4vbGRhcCcpO1xuXG5jb25zdCBhbm9ueW1vdXMgPSB7XG4gIHZhbGlkYXRlQXV0aERhdGE6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG4gIHZhbGlkYXRlQXBwSWQ6ICgpID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH0sXG59O1xuXG5jb25zdCBwcm92aWRlcnMgPSB7XG4gIGFwcGxlLFxuICBnY2VudGVyLFxuICBncGdhbWVzLFxuICBmYWNlYm9vayxcbiAgaW5zdGFncmFtLFxuICBsaW5rZWRpbixcbiAgbWVldHVwLFxuICBnb29nbGUsXG4gIGdpdGh1YixcbiAgdHdpdHRlcixcbiAgc3BvdGlmeSxcbiAgYW5vbnltb3VzLFxuICBkaWdpdHMsXG4gIGphbnJhaW5lbmdhZ2UsXG4gIGphbnJhaW5jYXB0dXJlLFxuICBsaW5lLFxuICB2a29udGFrdGUsXG4gIHFxLFxuICB3ZWNoYXQsXG4gIHdlaWJvLFxuICBwaGFudGF1dGgsXG4gIG1pY3Jvc29mdCxcbiAga2V5Y2xvYWssXG4gIGxkYXAsXG59O1xuXG4vLyBJbmRleGVkIGF1dGggcG9saWNpZXNcbmNvbnN0IGF1dGhBZGFwdGVyUG9saWNpZXMgPSB7XG4gIGRlZmF1bHQ6IHRydWUsXG4gIHNvbG86IHRydWUsXG4gIGFkZGl0aW9uYWw6IHRydWUsXG59O1xuXG5mdW5jdGlvbiBhdXRoRGF0YVZhbGlkYXRvcihwcm92aWRlciwgYWRhcHRlciwgYXBwSWRzLCBvcHRpb25zKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoYXV0aERhdGEsIHJlcSwgdXNlciwgcmVxdWVzdE9iamVjdCkge1xuICAgIGlmIChhcHBJZHMgJiYgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVBcHBJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKGFkYXB0ZXIudmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSk7XG4gICAgfVxuICAgIGlmIChhZGFwdGVyLnBvbGljeSAmJiAhYXV0aEFkYXB0ZXJQb2xpY2llc1thZGFwdGVyLnBvbGljeV0pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgICAgICdBdXRoQWRhcHRlciBwb2xpY3kgaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5LiBUaGUgdmFsdWUgbXVzdCBiZSBlaXRoZXIgXCJzb2xvXCIsIFwiYWRkaXRpb25hbFwiLCBcImRlZmF1bHRcIiBvciB1bmRlZmluZWQgKHdpbGwgYmUgaGFuZGxlZCBhcyBcImRlZmF1bHRcIiknXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVBdXRoRGF0YSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGFkYXB0ZXIudmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlU2V0VXAgIT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlTG9naW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgIHR5cGVvZiBhZGFwdGVyLnZhbGlkYXRlVXBkYXRlICE9PSAnZnVuY3Rpb24nXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICAgIFBhcnNlLkVycm9yLk9USEVSX0NBVVNFLFxuICAgICAgICAnQWRhcHRlciBpcyBub3QgY29uZmlndXJlZC4gSW1wbGVtZW50IGVpdGhlciB2YWxpZGF0ZUF1dGhEYXRhIG9yIGFsbCBvZiB0aGUgZm9sbG93aW5nOiB2YWxpZGF0ZVNldFVwLCB2YWxpZGF0ZUxvZ2luIGFuZCB2YWxpZGF0ZVVwZGF0ZSdcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIFdoZW4gbWFzdGVyS2V5IGlzIGRldGVjdGVkLCB3ZSBzaG91bGQgdHJpZ2dlciBhIGxvZ2dlZCBpbiB1c2VyXG4gICAgY29uc3QgaXNMb2dnZWRJbiA9XG4gICAgICAocmVxLmF1dGgudXNlciAmJiB1c2VyICYmIHJlcS5hdXRoLnVzZXIuaWQgPT09IHVzZXIuaWQpIHx8ICh1c2VyICYmIHJlcS5hdXRoLmlzTWFzdGVyKTtcbiAgICBsZXQgaGFzQXV0aERhdGFDb25maWd1cmVkID0gZmFsc2U7XG5cbiAgICBpZiAodXNlciAmJiB1c2VyLmdldCgnYXV0aERhdGEnKSAmJiB1c2VyLmdldCgnYXV0aERhdGEnKVtwcm92aWRlcl0pIHtcbiAgICAgIGhhc0F1dGhEYXRhQ29uZmlndXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzTG9nZ2VkSW4pIHtcbiAgICAgIC8vIFVzZXIgaXMgdXBkYXRpbmcgdGhlaXIgYXV0aERhdGFcbiAgICAgIGlmIChoYXNBdXRoRGF0YUNvbmZpZ3VyZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlVXBkYXRlKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8vIFNldCB1cCBpZiB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSBwcm92aWRlciBjb25maWd1cmVkXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlU2V0VXAoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBOb3QgbG9nZ2VkIGluIGFuZCBhdXRoRGF0YSBpcyBjb25maWd1cmVkIG9uIHRoZSB1c2VyXG4gICAgaWYgKGhhc0F1dGhEYXRhQ29uZmlndXJlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kOiAndmFsaWRhdGVMb2dpbicsXG4gICAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZUxvZ2luKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVXNlciBub3QgbG9nZ2VkIGluIGFuZCB0aGUgcHJvdmlkZXIgaXMgbm90IHNldCB1cCwgZm9yIGV4YW1wbGUgd2hlbiBhIG5ldyB1c2VyXG4gICAgLy8gc2lnbnMgdXAgb3IgYW4gZXhpc3RpbmcgdXNlciB1c2VzIGEgbmV3IGF1dGggcHJvdmlkZXJcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kOiAndmFsaWRhdGVTZXRVcCcsXG4gICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVTZXRVcChhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gbG9hZEF1dGhBZGFwdGVyKHByb3ZpZGVyLCBhdXRoT3B0aW9ucykge1xuICAvLyBwcm92aWRlcnMgYXJlIGF1dGggcHJvdmlkZXJzIGltcGxlbWVudGVkIGJ5IGRlZmF1bHRcbiAgbGV0IGRlZmF1bHRBZGFwdGVyID0gcHJvdmlkZXJzW3Byb3ZpZGVyXTtcbiAgLy8gYXV0aE9wdGlvbnMgY2FuIGNvbnRhaW4gY29tcGxldGUgY3VzdG9tIGF1dGggYWRhcHRlcnMgb3JcbiAgLy8gYSBkZWZhdWx0IGF1dGggYWRhcHRlciBsaWtlIEZhY2Vib29rXG4gIGNvbnN0IHByb3ZpZGVyT3B0aW9ucyA9IGF1dGhPcHRpb25zW3Byb3ZpZGVyXTtcbiAgaWYgKFxuICAgIHByb3ZpZGVyT3B0aW9ucyAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm92aWRlck9wdGlvbnMsICdvYXV0aDInKSAmJlxuICAgIHByb3ZpZGVyT3B0aW9uc1snb2F1dGgyJ10gPT09IHRydWVcbiAgKSB7XG4gICAgZGVmYXVsdEFkYXB0ZXIgPSBvYXV0aDI7XG4gIH1cblxuICAvLyBEZWZhdWx0IHByb3ZpZGVyIG5vdCBmb3VuZCBhbmQgYSBjdXN0b20gYXV0aCBwcm92aWRlciB3YXMgbm90IHByb3ZpZGVkXG4gIGlmICghZGVmYXVsdEFkYXB0ZXIgJiYgIXByb3ZpZGVyT3B0aW9ucykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFkYXB0ZXIgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0QWRhcHRlcik7XG4gIGNvbnN0IGFwcElkcyA9IHByb3ZpZGVyT3B0aW9ucyA/IHByb3ZpZGVyT3B0aW9ucy5hcHBJZHMgOiB1bmRlZmluZWQ7XG5cbiAgLy8gVHJ5IHRoZSBjb25maWd1cmF0aW9uIG1ldGhvZHNcbiAgaWYgKHByb3ZpZGVyT3B0aW9ucykge1xuICAgIGNvbnN0IG9wdGlvbmFsQWRhcHRlciA9IGxvYWRBZGFwdGVyKHByb3ZpZGVyT3B0aW9ucywgdW5kZWZpbmVkLCBwcm92aWRlck9wdGlvbnMpO1xuICAgIGlmIChvcHRpb25hbEFkYXB0ZXIpIHtcbiAgICAgIFtcbiAgICAgICAgJ3ZhbGlkYXRlQXV0aERhdGEnLFxuICAgICAgICAndmFsaWRhdGVBcHBJZCcsXG4gICAgICAgICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgICAgJ3ZhbGlkYXRlTG9naW4nLFxuICAgICAgICAndmFsaWRhdGVVcGRhdGUnLFxuICAgICAgICAnY2hhbGxlbmdlJyxcbiAgICAgICAgJ3BvbGljeScsXG4gICAgICBdLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbmFsQWRhcHRlcltrZXldKSB7XG4gICAgICAgICAgYWRhcHRlcltrZXldID0gb3B0aW9uYWxBZGFwdGVyW2tleV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGF1dGhPcHRpb25zID0ge30sIGVuYWJsZUFub255bW91c1VzZXJzID0gdHJ1ZSkge1xuICBsZXQgX2VuYWJsZUFub255bW91c1VzZXJzID0gZW5hYmxlQW5vbnltb3VzVXNlcnM7XG4gIGNvbnN0IHNldEVuYWJsZUFub255bW91c1VzZXJzID0gZnVuY3Rpb24gKGVuYWJsZSkge1xuICAgIF9lbmFibGVBbm9ueW1vdXNVc2VycyA9IGVuYWJsZTtcbiAgfTtcbiAgLy8gVG8gaGFuZGxlIHRoZSB0ZXN0IGNhc2VzIG9uIGNvbmZpZ3VyYXRpb25cbiAgY29uc3QgZ2V0VmFsaWRhdG9yRm9yUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHtcbiAgICBpZiAocHJvdmlkZXIgPT09ICdhbm9ueW1vdXMnICYmICFfZW5hYmxlQW5vbnltb3VzVXNlcnMpIHtcbiAgICAgIHJldHVybiB7IHZhbGlkYXRvcjogdW5kZWZpbmVkIH07XG4gICAgfVxuICAgIGNvbnN0IGF1dGhBZGFwdGVyID0gbG9hZEF1dGhBZGFwdGVyKHByb3ZpZGVyLCBhdXRoT3B0aW9ucyk7XG4gICAgaWYgKCFhdXRoQWRhcHRlcikgcmV0dXJuO1xuICAgIGNvbnN0IHsgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMgfSA9IGF1dGhBZGFwdGVyO1xuICAgIHJldHVybiB7IHZhbGlkYXRvcjogYXV0aERhdGFWYWxpZGF0b3IocHJvdmlkZXIsIGFkYXB0ZXIsIGFwcElkcywgcHJvdmlkZXJPcHRpb25zKSwgYWRhcHRlciB9O1xuICB9O1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBnZXRWYWxpZGF0b3JGb3JQcm92aWRlcixcbiAgICBzZXRFbmFibGVBbm9ueW1vdXNVc2VycyxcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5sb2FkQXV0aEFkYXB0ZXIgPSBsb2FkQXV0aEFkYXB0ZXI7XG4iXX0=
186
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhcHBsZSIsInJlcXVpcmUiLCJnY2VudGVyIiwiZ3BnYW1lcyIsImZhY2Vib29rIiwiaW5zdGFncmFtIiwibGlua2VkaW4iLCJtZWV0dXAiLCJnb29nbGUiLCJnaXRodWIiLCJ0d2l0dGVyIiwic3BvdGlmeSIsImRpZ2l0cyIsImphbnJhaW5lbmdhZ2UiLCJqYW5yYWluY2FwdHVyZSIsImxpbmUiLCJ2a29udGFrdGUiLCJxcSIsIndlY2hhdCIsIndlaWJvIiwib2F1dGgyIiwicGhhbnRhdXRoIiwibWljcm9zb2Z0Iiwia2V5Y2xvYWsiLCJsZGFwIiwiYW5vbnltb3VzIiwidmFsaWRhdGVBdXRoRGF0YSIsIlByb21pc2UiLCJyZXNvbHZlIiwidmFsaWRhdGVBcHBJZCIsInByb3ZpZGVycyIsImF1dGhBZGFwdGVyUG9saWNpZXMiLCJkZWZhdWx0Iiwic29sbyIsImFkZGl0aW9uYWwiLCJhdXRoRGF0YVZhbGlkYXRvciIsInByb3ZpZGVyIiwiYWRhcHRlciIsImFwcElkcyIsIm9wdGlvbnMiLCJhdXRoRGF0YSIsInJlcSIsInVzZXIiLCJyZXF1ZXN0T2JqZWN0IiwicG9saWN5IiwiUGFyc2UiLCJFcnJvciIsIk9USEVSX0NBVVNFIiwidmFsaWRhdGVTZXRVcCIsInZhbGlkYXRlTG9naW4iLCJ2YWxpZGF0ZVVwZGF0ZSIsImlzTG9nZ2VkSW4iLCJhdXRoIiwiaWQiLCJpc01hc3RlciIsImhhc0F1dGhEYXRhQ29uZmlndXJlZCIsImdldCIsIm1ldGhvZCIsInZhbGlkYXRvciIsImxvYWRBdXRoQWRhcHRlciIsImF1dGhPcHRpb25zIiwiZGVmYXVsdEFkYXB0ZXIiLCJwcm92aWRlck9wdGlvbnMiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJhc3NpZ24iLCJ1bmRlZmluZWQiLCJvcHRpb25hbEFkYXB0ZXIiLCJsb2FkQWRhcHRlciIsImZvckVhY2giLCJrZXkiLCJtb2R1bGUiLCJleHBvcnRzIiwiZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJfZW5hYmxlQW5vbnltb3VzVXNlcnMiLCJzZXRFbmFibGVBbm9ueW1vdXNVc2VycyIsImVuYWJsZSIsImdldFZhbGlkYXRvckZvclByb3ZpZGVyIiwiYXV0aEFkYXB0ZXIiLCJmcmVlemUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvQWRhcHRlcnMvQXV0aC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9hZEFkYXB0ZXIgZnJvbSAnLi4vQWRhcHRlckxvYWRlcic7XG5pbXBvcnQgUGFyc2UgZnJvbSAncGFyc2Uvbm9kZSc7XG5cbmNvbnN0IGFwcGxlID0gcmVxdWlyZSgnLi9hcHBsZScpO1xuY29uc3QgZ2NlbnRlciA9IHJlcXVpcmUoJy4vZ2NlbnRlcicpO1xuY29uc3QgZ3BnYW1lcyA9IHJlcXVpcmUoJy4vZ3BnYW1lcycpO1xuY29uc3QgZmFjZWJvb2sgPSByZXF1aXJlKCcuL2ZhY2Vib29rJyk7XG5jb25zdCBpbnN0YWdyYW0gPSByZXF1aXJlKCcuL2luc3RhZ3JhbScpO1xuY29uc3QgbGlua2VkaW4gPSByZXF1aXJlKCcuL2xpbmtlZGluJyk7XG5jb25zdCBtZWV0dXAgPSByZXF1aXJlKCcuL21lZXR1cCcpO1xuY29uc3QgZ29vZ2xlID0gcmVxdWlyZSgnLi9nb29nbGUnKTtcbmNvbnN0IGdpdGh1YiA9IHJlcXVpcmUoJy4vZ2l0aHViJyk7XG5jb25zdCB0d2l0dGVyID0gcmVxdWlyZSgnLi90d2l0dGVyJyk7XG5jb25zdCBzcG90aWZ5ID0gcmVxdWlyZSgnLi9zcG90aWZ5Jyk7XG5jb25zdCBkaWdpdHMgPSByZXF1aXJlKCcuL3R3aXR0ZXInKTsgLy8gZGlnaXRzIHRva2VucyBhcmUgdmFsaWRhdGVkIGJ5IHR3aXR0ZXJcbmNvbnN0IGphbnJhaW5lbmdhZ2UgPSByZXF1aXJlKCcuL2phbnJhaW5lbmdhZ2UnKTtcbmNvbnN0IGphbnJhaW5jYXB0dXJlID0gcmVxdWlyZSgnLi9qYW5yYWluY2FwdHVyZScpO1xuY29uc3QgbGluZSA9IHJlcXVpcmUoJy4vbGluZScpO1xuY29uc3QgdmtvbnRha3RlID0gcmVxdWlyZSgnLi92a29udGFrdGUnKTtcbmNvbnN0IHFxID0gcmVxdWlyZSgnLi9xcScpO1xuY29uc3Qgd2VjaGF0ID0gcmVxdWlyZSgnLi93ZWNoYXQnKTtcbmNvbnN0IHdlaWJvID0gcmVxdWlyZSgnLi93ZWlibycpO1xuY29uc3Qgb2F1dGgyID0gcmVxdWlyZSgnLi9vYXV0aDInKTtcbmNvbnN0IHBoYW50YXV0aCA9IHJlcXVpcmUoJy4vcGhhbnRhdXRoJyk7XG5jb25zdCBtaWNyb3NvZnQgPSByZXF1aXJlKCcuL21pY3Jvc29mdCcpO1xuY29uc3Qga2V5Y2xvYWsgPSByZXF1aXJlKCcuL2tleWNsb2FrJyk7XG5jb25zdCBsZGFwID0gcmVxdWlyZSgnLi9sZGFwJyk7XG5cbmNvbnN0IGFub255bW91cyA9IHtcbiAgdmFsaWRhdGVBdXRoRGF0YTogKCkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSxcbiAgdmFsaWRhdGVBcHBJZDogKCkgPT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSxcbn07XG5cbmNvbnN0IHByb3ZpZGVycyA9IHtcbiAgYXBwbGUsXG4gIGdjZW50ZXIsXG4gIGdwZ2FtZXMsXG4gIGZhY2Vib29rLFxuICBpbnN0YWdyYW0sXG4gIGxpbmtlZGluLFxuICBtZWV0dXAsXG4gIGdvb2dsZSxcbiAgZ2l0aHViLFxuICB0d2l0dGVyLFxuICBzcG90aWZ5LFxuICBhbm9ueW1vdXMsXG4gIGRpZ2l0cyxcbiAgamFucmFpbmVuZ2FnZSxcbiAgamFucmFpbmNhcHR1cmUsXG4gIGxpbmUsXG4gIHZrb250YWt0ZSxcbiAgcXEsXG4gIHdlY2hhdCxcbiAgd2VpYm8sXG4gIHBoYW50YXV0aCxcbiAgbWljcm9zb2Z0LFxuICBrZXljbG9hayxcbiAgbGRhcCxcbn07XG5cbi8vIEluZGV4ZWQgYXV0aCBwb2xpY2llc1xuY29uc3QgYXV0aEFkYXB0ZXJQb2xpY2llcyA9IHtcbiAgZGVmYXVsdDogdHJ1ZSxcbiAgc29sbzogdHJ1ZSxcbiAgYWRkaXRpb25hbDogdHJ1ZSxcbn07XG5cbmZ1bmN0aW9uIGF1dGhEYXRhVmFsaWRhdG9yKHByb3ZpZGVyLCBhZGFwdGVyLCBhcHBJZHMsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChhdXRoRGF0YSwgcmVxLCB1c2VyLCByZXF1ZXN0T2JqZWN0KSB7XG4gICAgaWYgKGFwcElkcyAmJiB0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUFwcElkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoYWRhcHRlci52YWxpZGF0ZUFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpKTtcbiAgICB9XG4gICAgaWYgKGFkYXB0ZXIucG9saWN5ICYmICFhdXRoQWRhcHRlclBvbGljaWVzW2FkYXB0ZXIucG9saWN5XSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PVEhFUl9DQVVTRSxcbiAgICAgICAgJ0F1dGhBZGFwdGVyIHBvbGljeSBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuIFRoZSB2YWx1ZSBtdXN0IGJlIGVpdGhlciBcInNvbG9cIiwgXCJhZGRpdGlvbmFsXCIsIFwiZGVmYXVsdFwiIG9yIHVuZGVmaW5lZCAod2lsbCBiZSBoYW5kbGVkIGFzIFwiZGVmYXVsdFwiKSdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWRhcHRlci52YWxpZGF0ZUF1dGhEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYWRhcHRlci52YWxpZGF0ZUF1dGhEYXRhKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVTZXRVcCAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVMb2dpbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgdHlwZW9mIGFkYXB0ZXIudmFsaWRhdGVVcGRhdGUgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgICAgUGFyc2UuRXJyb3IuT1RIRVJfQ0FVU0UsXG4gICAgICAgICdBZGFwdGVyIGlzIG5vdCBjb25maWd1cmVkLiBJbXBsZW1lbnQgZWl0aGVyIHZhbGlkYXRlQXV0aERhdGEgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmc6IHZhbGlkYXRlU2V0VXAsIHZhbGlkYXRlTG9naW4gYW5kIHZhbGlkYXRlVXBkYXRlJ1xuICAgICAgKTtcbiAgICB9XG4gICAgLy8gV2hlbiBtYXN0ZXJLZXkgaXMgZGV0ZWN0ZWQsIHdlIHNob3VsZCB0cmlnZ2VyIGEgbG9nZ2VkIGluIHVzZXJcbiAgICBjb25zdCBpc0xvZ2dlZEluID1cbiAgICAgIChyZXEuYXV0aC51c2VyICYmIHVzZXIgJiYgcmVxLmF1dGgudXNlci5pZCA9PT0gdXNlci5pZCkgfHwgKHVzZXIgJiYgcmVxLmF1dGguaXNNYXN0ZXIpO1xuICAgIGxldCBoYXNBdXRoRGF0YUNvbmZpZ3VyZWQgPSBmYWxzZTtcblxuICAgIGlmICh1c2VyICYmIHVzZXIuZ2V0KCdhdXRoRGF0YScpICYmIHVzZXIuZ2V0KCdhdXRoRGF0YScpW3Byb3ZpZGVyXSkge1xuICAgICAgaGFzQXV0aERhdGFDb25maWd1cmVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNMb2dnZWRJbikge1xuICAgICAgLy8gVXNlciBpcyB1cGRhdGluZyB0aGVpciBhdXRoRGF0YVxuICAgICAgaWYgKGhhc0F1dGhEYXRhQ29uZmlndXJlZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlVXBkYXRlJyxcbiAgICAgICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVVcGRhdGUoYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gU2V0IHVwIGlmIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgdGhlIHByb3ZpZGVyIGNvbmZpZ3VyZWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1ldGhvZDogJ3ZhbGlkYXRlU2V0VXAnLFxuICAgICAgICB2YWxpZGF0b3I6ICgpID0+IGFkYXB0ZXIudmFsaWRhdGVTZXRVcChhdXRoRGF0YSwgb3B0aW9ucywgcmVxdWVzdE9iamVjdCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIE5vdCBsb2dnZWQgaW4gYW5kIGF1dGhEYXRhIGlzIGNvbmZpZ3VyZWQgb24gdGhlIHVzZXJcbiAgICBpZiAoaGFzQXV0aERhdGFDb25maWd1cmVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2Q6ICd2YWxpZGF0ZUxvZ2luJyxcbiAgICAgICAgdmFsaWRhdG9yOiAoKSA9PiBhZGFwdGVyLnZhbGlkYXRlTG9naW4oYXV0aERhdGEsIG9wdGlvbnMsIHJlcXVlc3RPYmplY3QpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBVc2VyIG5vdCBsb2dnZWQgaW4gYW5kIHRoZSBwcm92aWRlciBpcyBub3Qgc2V0IHVwLCBmb3IgZXhhbXBsZSB3aGVuIGEgbmV3IHVzZXJcbiAgICAvLyBzaWducyB1cCBvciBhbiBleGlzdGluZyB1c2VyIHVzZXMgYSBuZXcgYXV0aCBwcm92aWRlclxuICAgIHJldHVybiB7XG4gICAgICBtZXRob2Q6ICd2YWxpZGF0ZVNldFVwJyxcbiAgICAgIHZhbGlkYXRvcjogKCkgPT4gYWRhcHRlci52YWxpZGF0ZVNldFVwKGF1dGhEYXRhLCBvcHRpb25zLCByZXF1ZXN0T2JqZWN0KSxcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBsb2FkQXV0aEFkYXB0ZXIocHJvdmlkZXIsIGF1dGhPcHRpb25zKSB7XG4gIC8vIHByb3ZpZGVycyBhcmUgYXV0aCBwcm92aWRlcnMgaW1wbGVtZW50ZWQgYnkgZGVmYXVsdFxuICBsZXQgZGVmYXVsdEFkYXB0ZXIgPSBwcm92aWRlcnNbcHJvdmlkZXJdO1xuICAvLyBhdXRoT3B0aW9ucyBjYW4gY29udGFpbiBjb21wbGV0ZSBjdXN0b20gYXV0aCBhZGFwdGVycyBvclxuICAvLyBhIGRlZmF1bHQgYXV0aCBhZGFwdGVyIGxpa2UgRmFjZWJvb2tcbiAgY29uc3QgcHJvdmlkZXJPcHRpb25zID0gYXV0aE9wdGlvbnNbcHJvdmlkZXJdO1xuICBpZiAoXG4gICAgcHJvdmlkZXJPcHRpb25zICYmXG4gICAgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3ZpZGVyT3B0aW9ucywgJ29hdXRoMicpICYmXG4gICAgcHJvdmlkZXJPcHRpb25zWydvYXV0aDInXSA9PT0gdHJ1ZVxuICApIHtcbiAgICBkZWZhdWx0QWRhcHRlciA9IG9hdXRoMjtcbiAgfVxuXG4gIC8vIERlZmF1bHQgcHJvdmlkZXIgbm90IGZvdW5kIGFuZCBhIGN1c3RvbSBhdXRoIHByb3ZpZGVyIHdhcyBub3QgcHJvdmlkZWRcbiAgaWYgKCFkZWZhdWx0QWRhcHRlciAmJiAhcHJvdmlkZXJPcHRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWRhcHRlciA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRBZGFwdGVyKTtcbiAgY29uc3QgYXBwSWRzID0gcHJvdmlkZXJPcHRpb25zID8gcHJvdmlkZXJPcHRpb25zLmFwcElkcyA6IHVuZGVmaW5lZDtcblxuICAvLyBUcnkgdGhlIGNvbmZpZ3VyYXRpb24gbWV0aG9kc1xuICBpZiAocHJvdmlkZXJPcHRpb25zKSB7XG4gICAgY29uc3Qgb3B0aW9uYWxBZGFwdGVyID0gbG9hZEFkYXB0ZXIocHJvdmlkZXJPcHRpb25zLCB1bmRlZmluZWQsIHByb3ZpZGVyT3B0aW9ucyk7XG4gICAgaWYgKG9wdGlvbmFsQWRhcHRlcikge1xuICAgICAgW1xuICAgICAgICAndmFsaWRhdGVBdXRoRGF0YScsXG4gICAgICAgICd2YWxpZGF0ZUFwcElkJyxcbiAgICAgICAgJ3ZhbGlkYXRlU2V0VXAnLFxuICAgICAgICAndmFsaWRhdGVMb2dpbicsXG4gICAgICAgICd2YWxpZGF0ZVVwZGF0ZScsXG4gICAgICAgICdjaGFsbGVuZ2UnLFxuICAgICAgICAncG9saWN5JyxcbiAgICAgIF0uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAob3B0aW9uYWxBZGFwdGVyW2tleV0pIHtcbiAgICAgICAgICBhZGFwdGVyW2tleV0gPSBvcHRpb25hbEFkYXB0ZXJba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXV0aE9wdGlvbnMgPSB7fSwgZW5hYmxlQW5vbnltb3VzVXNlcnMgPSB0cnVlKSB7XG4gIGxldCBfZW5hYmxlQW5vbnltb3VzVXNlcnMgPSBlbmFibGVBbm9ueW1vdXNVc2VycztcbiAgY29uc3Qgc2V0RW5hYmxlQW5vbnltb3VzVXNlcnMgPSBmdW5jdGlvbiAoZW5hYmxlKSB7XG4gICAgX2VuYWJsZUFub255bW91c1VzZXJzID0gZW5hYmxlO1xuICB9O1xuICAvLyBUbyBoYW5kbGUgdGhlIHRlc3QgY2FzZXMgb24gY29uZmlndXJhdGlvblxuICBjb25zdCBnZXRWYWxpZGF0b3JGb3JQcm92aWRlciA9IGZ1bmN0aW9uIChwcm92aWRlcikge1xuICAgIGlmIChwcm92aWRlciA9PT0gJ2Fub255bW91cycgJiYgIV9lbmFibGVBbm9ueW1vdXNVc2Vycykge1xuICAgICAgcmV0dXJuIHsgdmFsaWRhdG9yOiB1bmRlZmluZWQgfTtcbiAgICB9XG4gICAgY29uc3QgYXV0aEFkYXB0ZXIgPSBsb2FkQXV0aEFkYXB0ZXIocHJvdmlkZXIsIGF1dGhPcHRpb25zKTtcbiAgICBpZiAoIWF1dGhBZGFwdGVyKSByZXR1cm47XG4gICAgY29uc3QgeyBhZGFwdGVyLCBhcHBJZHMsIHByb3ZpZGVyT3B0aW9ucyB9ID0gYXV0aEFkYXB0ZXI7XG4gICAgcmV0dXJuIHsgdmFsaWRhdG9yOiBhdXRoRGF0YVZhbGlkYXRvcihwcm92aWRlciwgYWRhcHRlciwgYXBwSWRzLCBwcm92aWRlck9wdGlvbnMpLCBhZGFwdGVyIH07XG4gIH07XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGdldFZhbGlkYXRvckZvclByb3ZpZGVyLFxuICAgIHNldEVuYWJsZUFub255bW91c1VzZXJzLFxuICB9KTtcbn07XG5cbm1vZHVsZS5leHBvcnRzLmxvYWRBdXRoQWRhcHRlciA9IGxvYWRBdXRoQWRhcHRlcjtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQStCO0FBRS9CLE1BQU1BLEtBQUssR0FBR0MsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUNoQyxNQUFNQyxPQUFPLEdBQUdELE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDcEMsTUFBTUUsT0FBTyxHQUFHRixPQUFPLENBQUMsV0FBVyxDQUFDO0FBQ3BDLE1BQU1HLFFBQVEsR0FBR0gsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUN0QyxNQUFNSSxTQUFTLEdBQUdKLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDeEMsTUFBTUssUUFBUSxHQUFHTCxPQUFPLENBQUMsWUFBWSxDQUFDO0FBQ3RDLE1BQU1NLE1BQU0sR0FBR04sT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUNsQyxNQUFNTyxNQUFNLEdBQUdQLE9BQU8sQ0FBQyxVQUFVLENBQUM7QUFDbEMsTUFBTVEsTUFBTSxHQUFHUixPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ2xDLE1BQU1TLE9BQU8sR0FBR1QsT0FBTyxDQUFDLFdBQVcsQ0FBQztBQUNwQyxNQUFNVSxPQUFPLEdBQUdWLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDcEMsTUFBTVcsTUFBTSxHQUFHWCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNWSxhQUFhLEdBQUdaLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztBQUNoRCxNQUFNYSxjQUFjLEdBQUdiLE9BQU8s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