@lifeready/core 9.0.8 → 10.0.0

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 (225) hide show
  1. package/fesm2022/lifeready-core.mjs +10522 -0
  2. package/fesm2022/lifeready-core.mjs.map +1 -0
  3. package/package.json +21 -16
  4. package/types/lifeready-core.d.ts +5329 -0
  5. package/bundles/lifeready-core.umd.js +0 -13231
  6. package/bundles/lifeready-core.umd.js.map +0 -1
  7. package/bundles/lifeready-core.umd.min.js +0 -2
  8. package/bundles/lifeready-core.umd.min.js.map +0 -1
  9. package/esm2015/lib/_common/ast.js +0 -41
  10. package/esm2015/lib/_common/deferred-promise.js +0 -24
  11. package/esm2015/lib/_common/exceptions.js +0 -186
  12. package/esm2015/lib/_common/index.js +0 -3
  13. package/esm2015/lib/_common/kc-lodash.js +0 -11
  14. package/esm2015/lib/_common/key.js +0 -28
  15. package/esm2015/lib/_common/queries.gql.js +0 -43
  16. package/esm2015/lib/_common/run-outside-angular.js +0 -80
  17. package/esm2015/lib/_common/storage.js +0 -28
  18. package/esm2015/lib/_common/types.js +0 -2
  19. package/esm2015/lib/_common/utils.js +0 -73
  20. package/esm2015/lib/api/lr-apollo.service.js +0 -47
  21. package/esm2015/lib/api/lr-graphql/index.js +0 -6
  22. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
  23. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
  24. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
  25. package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
  26. package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
  27. package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
  28. package/esm2015/lib/api/query-processor/index.js +0 -3
  29. package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
  30. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
  31. package/esm2015/lib/api/types/graphql.types.js +0 -8
  32. package/esm2015/lib/api/types/index.js +0 -3
  33. package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
  34. package/esm2015/lib/auth/auth.config.js +0 -57
  35. package/esm2015/lib/auth/auth.gql.private.js +0 -85
  36. package/esm2015/lib/auth/auth.service.js +0 -616
  37. package/esm2015/lib/auth/auth.types.js +0 -19
  38. package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
  39. package/esm2015/lib/contact-card/contact-card.service.js +0 -156
  40. package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
  41. package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
  42. package/esm2015/lib/encryption/encryption.service.js +0 -188
  43. package/esm2015/lib/file-upload/file-upload.service.js +0 -70
  44. package/esm2015/lib/file-upload/file-upload.types.js +0 -2
  45. package/esm2015/lib/idle/idle.service.js +0 -159
  46. package/esm2015/lib/idle/idle.types.js +0 -7
  47. package/esm2015/lib/item/item.gql.js +0 -166
  48. package/esm2015/lib/item/item.gql.private.js +0 -41
  49. package/esm2015/lib/item/item.service.js +0 -662
  50. package/esm2015/lib/item/item.types.js +0 -2
  51. package/esm2015/lib/key/key-factory.service.js +0 -226
  52. package/esm2015/lib/key/key-graph.service.js +0 -314
  53. package/esm2015/lib/key/key-meta.service.js +0 -153
  54. package/esm2015/lib/key/key.service.js +0 -124
  55. package/esm2015/lib/key/key.types.js +0 -16
  56. package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
  57. package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
  58. package/esm2015/lib/lbop/lbop.service.js +0 -351
  59. package/esm2015/lib/life-ready.config.js +0 -96
  60. package/esm2015/lib/life-ready.module.js +0 -42
  61. package/esm2015/lib/lock/lock.gql.js +0 -40
  62. package/esm2015/lib/lock/lock.service.js +0 -64
  63. package/esm2015/lib/notification/notification.gql.js +0 -43
  64. package/esm2015/lib/notification/notification.service.js +0 -118
  65. package/esm2015/lib/password/password.gql.js +0 -28
  66. package/esm2015/lib/password/password.service.js +0 -309
  67. package/esm2015/lib/persist/persist.service.js +0 -181
  68. package/esm2015/lib/plan/plan.gql.js +0 -91
  69. package/esm2015/lib/plan/plan.service.js +0 -191
  70. package/esm2015/lib/plan/plan.types.js +0 -2
  71. package/esm2015/lib/profile/profile-details.service.js +0 -261
  72. package/esm2015/lib/profile/profile.gql.js +0 -170
  73. package/esm2015/lib/profile/profile.service.js +0 -166
  74. package/esm2015/lib/profile/profile.types.js +0 -45
  75. package/esm2015/lib/register/register.service.js +0 -173
  76. package/esm2015/lib/register/register.types.js +0 -3
  77. package/esm2015/lib/reminder/reminder.gql.js +0 -27
  78. package/esm2015/lib/reminder/reminder.service.js +0 -85
  79. package/esm2015/lib/reminder/reminder.types.js +0 -2
  80. package/esm2015/lib/scenario/scenario.constants.js +0 -2
  81. package/esm2015/lib/scenario/scenario.controller.js +0 -34
  82. package/esm2015/lib/scenario/scenario.gql.js +0 -90
  83. package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
  84. package/esm2015/lib/scenario/scenario.service.js +0 -679
  85. package/esm2015/lib/scenario/scenario.types.js +0 -2
  86. package/esm2015/lib/server-config/server-config.gql.js +0 -9
  87. package/esm2015/lib/server-config/server-config.service.js +0 -41
  88. package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
  89. package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
  90. package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
  91. package/esm2015/lib/slip39/slip39.service.js +0 -167
  92. package/esm2015/lib/time/time.service.js +0 -152
  93. package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
  94. package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
  95. package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
  96. package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
  97. package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
  98. package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
  99. package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
  100. package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
  101. package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
  102. package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
  103. package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
  104. package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
  105. package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
  106. package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
  107. package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
  108. package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
  109. package/esm2015/lib/two-factor/two-factor.service.js +0 -74
  110. package/esm2015/lib/user/user.gql.js +0 -32
  111. package/esm2015/lib/user/user.service.js +0 -58
  112. package/esm2015/lib/user/user.types.js +0 -2
  113. package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
  114. package/esm2015/lifeready-core.js +0 -17
  115. package/esm2015/public-api.js +0 -60
  116. package/fesm2015/lifeready-core.js +0 -10970
  117. package/fesm2015/lifeready-core.js.map +0 -1
  118. package/lib/_common/ast.d.ts +0 -11
  119. package/lib/_common/deferred-promise.d.ts +0 -12
  120. package/lib/_common/exceptions.d.ts +0 -126
  121. package/lib/_common/index.d.ts +0 -2
  122. package/lib/_common/kc-lodash.d.ts +0 -5
  123. package/lib/_common/key.d.ts +0 -14
  124. package/lib/_common/queries.gql.d.ts +0 -4
  125. package/lib/_common/run-outside-angular.d.ts +0 -14
  126. package/lib/_common/storage.d.ts +0 -13
  127. package/lib/_common/types.d.ts +0 -15
  128. package/lib/_common/utils.d.ts +0 -12
  129. package/lib/api/lr-apollo.service.d.ts +0 -15
  130. package/lib/api/lr-graphql/index.d.ts +0 -5
  131. package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
  132. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
  133. package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
  134. package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
  135. package/lib/api/lr-graphql/lr.service.d.ts +0 -9
  136. package/lib/api/query-processor/common-processors.service.d.ts +0 -36
  137. package/lib/api/query-processor/index.d.ts +0 -2
  138. package/lib/api/query-processor/query-processor.service.d.ts +0 -18
  139. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
  140. package/lib/api/types/graphql.types.d.ts +0 -30
  141. package/lib/api/types/index.d.ts +0 -2
  142. package/lib/api/types/lr-graphql.types.d.ts +0 -807
  143. package/lib/auth/auth.config.d.ts +0 -5
  144. package/lib/auth/auth.gql.private.d.ts +0 -25
  145. package/lib/auth/auth.service.d.ts +0 -72
  146. package/lib/auth/auth.types.d.ts +0 -70
  147. package/lib/contact-card/contact-card.gql.d.ts +0 -7
  148. package/lib/contact-card/contact-card.service.d.ts +0 -53
  149. package/lib/contact-card/contact-card2.gql.d.ts +0 -25
  150. package/lib/contact-card/contact-card2.service.d.ts +0 -64
  151. package/lib/encryption/encryption.service.d.ts +0 -42
  152. package/lib/file-upload/file-upload.service.d.ts +0 -15
  153. package/lib/file-upload/file-upload.types.d.ts +0 -5
  154. package/lib/idle/idle.service.d.ts +0 -47
  155. package/lib/idle/idle.types.d.ts +0 -10
  156. package/lib/item/item.gql.d.ts +0 -134
  157. package/lib/item/item.gql.private.d.ts +0 -35
  158. package/lib/item/item.service.d.ts +0 -201
  159. package/lib/item/item.types.d.ts +0 -95
  160. package/lib/key/key-factory.service.d.ts +0 -40
  161. package/lib/key/key-graph.service.d.ts +0 -41
  162. package/lib/key/key-meta.service.d.ts +0 -51
  163. package/lib/key/key.service.d.ts +0 -36
  164. package/lib/key/key.types.d.ts +0 -86
  165. package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
  166. package/lib/key-exchange/key-exchange.service.d.ts +0 -179
  167. package/lib/lbop/lbop.service.d.ts +0 -99
  168. package/lib/life-ready.config.d.ts +0 -26
  169. package/lib/life-ready.module.d.ts +0 -5
  170. package/lib/lock/lock.gql.d.ts +0 -27
  171. package/lib/lock/lock.service.d.ts +0 -34
  172. package/lib/notification/notification.gql.d.ts +0 -37
  173. package/lib/notification/notification.service.d.ts +0 -64
  174. package/lib/password/password.gql.d.ts +0 -3
  175. package/lib/password/password.service.d.ts +0 -79
  176. package/lib/persist/persist.service.d.ts +0 -31
  177. package/lib/plan/plan.gql.d.ts +0 -69
  178. package/lib/plan/plan.service.d.ts +0 -111
  179. package/lib/plan/plan.types.d.ts +0 -16
  180. package/lib/profile/profile-details.service.d.ts +0 -20
  181. package/lib/profile/profile.gql.d.ts +0 -21
  182. package/lib/profile/profile.service.d.ts +0 -32
  183. package/lib/profile/profile.types.d.ts +0 -121
  184. package/lib/register/register.service.d.ts +0 -25
  185. package/lib/register/register.types.d.ts +0 -6
  186. package/lib/reminder/reminder.gql.d.ts +0 -23
  187. package/lib/reminder/reminder.service.d.ts +0 -33
  188. package/lib/reminder/reminder.types.d.ts +0 -17
  189. package/lib/scenario/scenario.constants.d.ts +0 -1
  190. package/lib/scenario/scenario.controller.d.ts +0 -10
  191. package/lib/scenario/scenario.gql.d.ts +0 -78
  192. package/lib/scenario/scenario.private.gql.d.ts +0 -16
  193. package/lib/scenario/scenario.service.d.ts +0 -655
  194. package/lib/scenario/scenario.types.d.ts +0 -64
  195. package/lib/server-config/server-config.gql.d.ts +0 -5
  196. package/lib/server-config/server-config.service.d.ts +0 -9
  197. package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
  198. package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
  199. package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
  200. package/lib/slip39/slip39.service.d.ts +0 -42
  201. package/lib/time/time.service.d.ts +0 -26
  202. package/lib/tp-assembly/tp-assembly.d.ts +0 -177
  203. package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
  204. package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
  205. package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
  206. package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
  207. package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
  208. package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
  209. package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
  210. package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
  211. package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
  212. package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
  213. package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
  214. package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
  215. package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
  216. package/lib/trusted-party/trusted-party.service.d.ts +0 -192
  217. package/lib/trusted-party/trusted-party.types.d.ts +0 -31
  218. package/lib/two-factor/two-factor.service.d.ts +0 -15
  219. package/lib/user/user.gql.d.ts +0 -8
  220. package/lib/user/user.service.d.ts +0 -9
  221. package/lib/user/user.types.d.ts +0 -16
  222. package/lib/web-crypto/web-crypto.service.d.ts +0 -5
  223. package/lifeready-core.d.ts +0 -16
  224. package/lifeready-core.metadata.json +0 -1
  225. package/public-api.d.ts +0 -56
@@ -1,64 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Injectable, Injector, NgZone } from '@angular/core';
3
- import { LrMutation, LrService } from '../api/lr-graphql';
4
- import { RunOutsideAngular } from '../_common/run-outside-angular';
5
- import { AcquireLockMutation, ReleaseLockMutation, UpdateLockMutation, } from './lock.gql';
6
- import * as i0 from "@angular/core";
7
- let LockService = class LockService extends LrService {
8
- constructor(ngZone, injector) {
9
- super(injector);
10
- this.ngZone = ngZone;
11
- this.injector = injector;
12
- }
13
- // Updating the lock version is always to be down along with another mutation.
14
- updateLockMutation(options) {
15
- return new LrMutation({
16
- mutation: UpdateLockMutation,
17
- variables: {
18
- input: {
19
- resourceId: options.resourceId,
20
- version: options.version,
21
- },
22
- },
23
- });
24
- }
25
- acquireLockMutation(options) {
26
- return new LrMutation({
27
- mutation: AcquireLockMutation,
28
- variables: {
29
- input: {
30
- resourceId: options.resourceId,
31
- timeoutMs: options.timeoutMs,
32
- },
33
- },
34
- });
35
- }
36
- releaseLockMutation(options) {
37
- return new LrMutation({
38
- mutation: ReleaseLockMutation,
39
- variables: {
40
- input: {
41
- resourceId: options.resourceId,
42
- version: options.version,
43
- },
44
- },
45
- });
46
- }
47
- };
48
- LockService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LockService_Factory() { return new LockService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR)); }, token: LockService, providedIn: "root" });
49
- LockService.decorators = [
50
- { type: Injectable, args: [{
51
- providedIn: 'root',
52
- },] }
53
- ];
54
- LockService.ctorParameters = () => [
55
- { type: NgZone },
56
- { type: Injector }
57
- ];
58
- LockService = __decorate([
59
- RunOutsideAngular({
60
- ngZoneName: 'ngZone',
61
- })
62
- ], LockService);
63
- export { LockService };
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2xvY2svbG9jay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixrQkFBa0IsR0FDbkIsTUFBTSxZQUFZLENBQUM7O0lBUVAsV0FBVyxTQUFYLFdBQVksU0FBUSxTQUFTO0lBQ3hDLFlBQW9CLE1BQWMsRUFBVSxRQUFrQjtRQUM1RCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFERSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUU5RCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGtCQUFrQixDQUFDLE9BQWlEO1FBQ2xFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQW1EO1FBQ3JFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM3QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQWdEO1FBQ2xFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7OztZQTVDQSxVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWQ4QixNQUFNO1lBQWhCLFFBQVE7O0FBZWhCLFdBQVc7SUFOdkIsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLFdBQVcsQ0F5Q3ZCO1NBekNZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICBBY3F1aXJlTG9ja011dGF0aW9uLFxuICBSZWxlYXNlTG9ja011dGF0aW9uLFxuICBVcGRhdGVMb2NrTXV0YXRpb24sXG59IGZyb20gJy4vbG9jay5ncWwnO1xuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2UgZXh0ZW5kcyBMclNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHRoZSBsb2NrIHZlcnNpb24gaXMgYWx3YXlzIHRvIGJlIGRvd24gYWxvbmcgd2l0aCBhbm90aGVyIG11dGF0aW9uLlxuICB1cGRhdGVMb2NrTXV0YXRpb24ob3B0aW9uczogeyByZXNvdXJjZUlkPzogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlTG9ja011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVzb3VyY2VJZDogb3B0aW9ucy5yZXNvdXJjZUlkLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhY3F1aXJlTG9ja011dGF0aW9uKG9wdGlvbnM6IHsgcmVzb3VyY2VJZD86IHN0cmluZzsgdGltZW91dE1zOiBudW1iZXIgfSkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQWNxdWlyZUxvY2tNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHJlc291cmNlSWQ6IG9wdGlvbnMucmVzb3VyY2VJZCxcbiAgICAgICAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbGVhc2VMb2NrTXV0YXRpb24ob3B0aW9uczogeyByZXNvdXJjZUlkOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBSZWxlYXNlTG9ja011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVzb3VyY2VJZDogb3B0aW9ucy5yZXNvdXJjZUlkLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,43 +0,0 @@
1
- import { gqlTyped } from '../_common/ast';
2
- export const UpdateNotificationMutation = gqlTyped `
3
- mutation UpdateNotificationMutation($input: UpdateNotificationInput!) {
4
- updateNotification(input: $input) {
5
- notification {
6
- id
7
- }
8
- }
9
- }
10
- `;
11
- export const UpdateAllNotificationsReadStateMutation = gqlTyped `
12
- mutation UpdateAllNotificationsReadStateMutation($input: UpdateAllNotificationsReadStateInput!) {
13
- updateAllNotificationsReadState(input: $input) {
14
- count
15
- }
16
- }
17
- `;
18
- export const DebugCreateNotificationMutation = gqlTyped `
19
- mutation DebugCreateNotificationMutation($input: DebugCreateNotificationInput!) {
20
- debugCreateNotification(input: $input) {
21
- notification {
22
- id
23
- }
24
- }
25
- }
26
- `;
27
- export const DebugDeleteAllNotificationsMutation = gqlTyped `
28
- mutation DebugDeleteAllNotificationsMutation($input: DebugDeleteAllNotificationsInput!) {
29
- debugDeleteAllNotifications(input: $input) {
30
- count
31
- }
32
- }
33
- `;
34
- export const UpdateNotificationFeatureStateMutation = gqlTyped `
35
- mutation UpdateNotificationFeatureStateMutation($input: UpdateNotificationFeatureStateInput!) {
36
- updateNotificationFeatureState(input: $input) {
37
- featureState {
38
- notificationsLastViewed
39
- }
40
- }
41
- }
42
- `;
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmdxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVMUMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFrQzs7Ozs7Ozs7Q0FRbkYsQ0FBQztBQU9GLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBK0M7Ozs7OztDQU03RyxDQUFDO0FBU0YsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsUUFBUSxDQUF1Qzs7Ozs7Ozs7Q0FRN0YsQ0FBQztBQU9GLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLFFBQVEsQ0FBMkM7Ozs7OztDQU1yRyxDQUFDO0FBU0YsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsUUFBUSxDQUE4Qzs7Ozs7Ozs7Q0FRM0csQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdxbFR5cGVkIH0gZnJvbSAnLi4vX2NvbW1vbi9hc3QnO1xuaW1wb3J0IHsgRGF0ZVRpbWUsIElEIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvblJlc3VsdCB7XG4gIHVwZGF0ZU5vdGlmaWNhdGlvbjoge1xuICAgIG5vdGlmaWNhdGlvbjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgVXBkYXRlTm90aWZpY2F0aW9uTXV0YXRpb24gPSBncWxUeXBlZDxVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvblJlc3VsdD5gXG5tdXRhdGlvbiBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZU5vdGlmaWNhdGlvbklucHV0ISkge1xuICB1cGRhdGVOb3RpZmljYXRpb24oaW5wdXQ6ICRpbnB1dCkge1xuICAgIG5vdGlmaWNhdGlvbiB7XG4gICAgICBpZFxuICAgIH1cbiAgfVxufVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb25SZXN1bHQge1xuICB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlOiB7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24gPSBncWxUeXBlZDxVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU11dGF0aW9uKCRpbnB1dDogVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZUlucHV0ISkge1xuICB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlKGlucHV0OiAkaW5wdXQpIHtcbiAgICBjb3VudFxuICB9XG59XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb25SZXN1bHQge1xuICBkZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbjoge1xuICAgIG5vdGlmaWNhdGlvbjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgRGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbiA9IGdxbFR5cGVkPERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gRGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbigkaW5wdXQ6IERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uSW5wdXQhKSB7XG4gIGRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uKGlucHV0OiAkaW5wdXQpIHtcbiAgICBub3RpZmljYXRpb24ge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb25SZXN1bHQge1xuICBkZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnM6IHtcbiAgICBjb3VudDogbnVtYmVyO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uID0gZ3FsVHlwZWQ8RGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb24oJGlucHV0OiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNJbnB1dCEpIHtcbiAgZGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zKGlucHV0OiAkaW5wdXQpIHtcbiAgICBjb3VudFxuICB9XG59XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uUmVzdWx0IHtcbiAgdXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlOiB7XG4gICAgZmVhdHVyZVN0YXRlOiB7XG4gICAgICBub3RpZmljYXRpb25zTGFzdFZpZXdlZDogRGF0ZVRpbWU7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbiA9IGdxbFR5cGVkPFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uUmVzdWx0PmBcbm11dGF0aW9uIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uKCRpbnB1dDogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlSW5wdXQhKSB7XG4gIHVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZShpbnB1dDogJGlucHV0KSB7XG4gICAgZmVhdHVyZVN0YXRlIHtcbiAgICAgIG5vdGlmaWNhdGlvbnNMYXN0Vmlld2VkXG5cdFx0fVxuICB9XG59XG5gO1xuIl19
@@ -1,118 +0,0 @@
1
- import { __awaiter, __decorate } from "tslib";
2
- import { Injectable, Injector, NgZone } from '@angular/core';
3
- import { LrMutation, LrService } from '../api/lr-graphql';
4
- import { RunOutsideAngular } from '../_common/run-outside-angular';
5
- import { DebugCreateNotificationMutation, DebugDeleteAllNotificationsMutation, UpdateAllNotificationsReadStateMutation, UpdateNotificationFeatureStateMutation, UpdateNotificationMutation, } from './notification.gql';
6
- import * as i0 from "@angular/core";
7
- let NotificationService = class NotificationService extends LrService {
8
- constructor(ngZone, injector) {
9
- super(injector);
10
- this.ngZone = ngZone;
11
- this.injector = injector;
12
- }
13
- updateNotification(options) {
14
- return __awaiter(this, void 0, void 0, function* () {
15
- return this.mutate(this.updateNotificationMutation(options));
16
- });
17
- }
18
- updateNotificationMutation(options) {
19
- return __awaiter(this, void 0, void 0, function* () {
20
- return new LrMutation({
21
- mutation: UpdateNotificationMutation,
22
- variables: {
23
- input: Object.assign({}, options),
24
- },
25
- });
26
- });
27
- }
28
- updateAllNotificationsReadState(options) {
29
- return __awaiter(this, void 0, void 0, function* () {
30
- return this.mutate(this.updateAllNotificationsReadStateMutation(options));
31
- });
32
- }
33
- updateAllNotificationsReadStateMutation(options) {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- return new LrMutation({
36
- mutation: UpdateAllNotificationsReadStateMutation,
37
- variables: {
38
- input: Object.assign({}, options),
39
- },
40
- });
41
- });
42
- }
43
- debugCreateNotification(options) {
44
- return __awaiter(this, void 0, void 0, function* () {
45
- return this.mutate(this.debugCreateNotificationMutation(options));
46
- });
47
- }
48
- debugCreateNotificationMutation(options) {
49
- var _a;
50
- return __awaiter(this, void 0, void 0, function* () {
51
- return new LrMutation({
52
- mutation: DebugCreateNotificationMutation,
53
- variables: {
54
- input: {
55
- receiverId: options.receiverId,
56
- hasBeenRead: options.hasBeenRead,
57
- timeRead: (_a = options.timeRead) === null || _a === void 0 ? void 0 : _a.toISOString(),
58
- plainData: JSON.stringify(options.plainData),
59
- plainMeta: JSON.stringify(options.plainMeta),
60
- },
61
- },
62
- });
63
- });
64
- }
65
- debugDeleteAllNotifications(options) {
66
- return __awaiter(this, void 0, void 0, function* () {
67
- return this.mutate(this.debugDeleteAllNotificationsMutation(options));
68
- });
69
- }
70
- debugDeleteAllNotificationsMutation(options) {
71
- return __awaiter(this, void 0, void 0, function* () {
72
- return new LrMutation({
73
- mutation: DebugDeleteAllNotificationsMutation,
74
- variables: {
75
- input: {
76
- receiverId: options.receiverId,
77
- },
78
- },
79
- });
80
- });
81
- }
82
- updateNotificationFeatureState(options) {
83
- return __awaiter(this, void 0, void 0, function* () {
84
- return this.mutate(this.updateNotificationFeatureStateMutation(options));
85
- });
86
- }
87
- updateNotificationFeatureStateMutation(options) {
88
- var _a;
89
- return __awaiter(this, void 0, void 0, function* () {
90
- return new LrMutation({
91
- mutation: UpdateNotificationFeatureStateMutation,
92
- variables: {
93
- input: {
94
- lastViewed: (_a = options.lastViewed) === null || _a === void 0 ? void 0 : _a.toISOString(),
95
- clearLastViewed: options.lastViewed == null || undefined,
96
- },
97
- },
98
- });
99
- });
100
- }
101
- };
102
- NotificationService.ɵprov = i0.ɵɵdefineInjectable({ factory: function NotificationService_Factory() { return new NotificationService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR)); }, token: NotificationService, providedIn: "root" });
103
- NotificationService.decorators = [
104
- { type: Injectable, args: [{
105
- providedIn: 'root',
106
- },] }
107
- ];
108
- NotificationService.ctorParameters = () => [
109
- { type: NgZone },
110
- { type: Injector }
111
- ];
112
- NotificationService = __decorate([
113
- RunOutsideAngular({
114
- ngZoneName: 'ngZone',
115
- })
116
- ], NotificationService);
117
- export { NotificationService };
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyx1Q0FBdUMsRUFDdkMsc0NBQXNDLEVBQ3RDLDBCQUEwQixHQUMzQixNQUFNLG9CQUFvQixDQUFDOztJQWlDZixtQkFBbUIsU0FBbkIsbUJBQW9CLFNBQVEsU0FBUztJQUNoRCxZQUFvQixNQUFjLEVBQVUsUUFBa0I7UUFDNUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBREUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7SUFFOUQsQ0FBQztJQUVLLGtCQUFrQixDQUFDLE9BQWtDOztZQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztLQUFBO0lBRUssMEJBQTBCLENBQUMsT0FBa0M7O1lBQ2pFLE9BQU8sSUFBSSxVQUFVLENBQUM7Z0JBQ3BCLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLG9CQUNBLE9BQU8sQ0FDWDtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVLLCtCQUErQixDQUNuQyxPQUErQzs7WUFFL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7S0FBQTtJQUVLLHVDQUF1QyxDQUMzQyxPQUErQzs7WUFFL0MsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLHVDQUF1QztnQkFDakQsU0FBUyxFQUFFO29CQUNULEtBQUssb0JBQ0EsT0FBTyxDQUNYO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRUssdUJBQXVCLENBQUMsT0FBdUM7O1lBQ25FLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO0tBQUE7SUFFSywrQkFBK0IsQ0FDbkMsT0FBdUM7OztZQUV2QyxPQUFPLElBQUksVUFBVSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsK0JBQStCO2dCQUN6QyxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTt3QkFDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO3dCQUNoQyxRQUFRLFFBQUUsT0FBTyxDQUFDLFFBQVEsMENBQUUsV0FBVyxFQUFFO3dCQUN6QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO3dCQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO3FCQUM3QztpQkFDRjthQUNGLENBQUMsQ0FBQzs7S0FDSjtJQUVLLDJCQUEyQixDQUMvQixPQUEyQzs7WUFFM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7S0FBQTtJQUVLLG1DQUFtQyxDQUN2QyxPQUEyQzs7WUFFM0MsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLG1DQUFtQztnQkFDN0MsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7cUJBQy9CO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRUssOEJBQThCLENBQ2xDLE9BQThDOztZQUU5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztLQUFBO0lBRUssc0NBQXNDLENBQzFDLE9BQThDOzs7WUFFOUMsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLHNDQUFzQztnQkFDaEQsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxVQUFVLFFBQUUsT0FBTyxDQUFDLFVBQVUsMENBQUUsV0FBVyxFQUFFO3dCQUM3QyxlQUFlLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksU0FBUztxQkFDekQ7aUJBQ0Y7YUFDRixDQUFDLENBQUM7O0tBQ0o7Q0FDRixDQUFBOzs7WUFyR0EsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUExQzhCLE1BQU07WUFBaEIsUUFBUTs7QUEyQ2hCLG1CQUFtQjtJQU4vQixpQkFBaUIsQ0FBQztRQUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcsbUJBQW1CLENBa0cvQjtTQWxHWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb24sXG4gIERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uLFxuICBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24sXG4gIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uLFxuICBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvbixcbn0gZnJvbSAnLi9ub3RpZmljYXRpb24uZ3FsJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25PcHRpb25zIHtcbiAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgaGFzQmVlblJlYWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU9wdGlvbnMge1xuICBoYXNCZWVuUmVhZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk9wdGlvbnMge1xuICByZWNlaXZlcklkOiBzdHJpbmc7XG4gIHBsYWluRGF0YT86IFJlY29yZDxzdHJpbmcsIEpTT05PYmplY3Q+O1xuICBwbGFpbk1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PjtcbiAgaGFzQmVlblJlYWQ/OiBib29sZWFuO1xuICB0aW1lUmVhZD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zT3B0aW9ucyB7XG4gIHJlY2VpdmVySWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVPcHRpb25zIHtcbiAgbGFzdFZpZXdlZDogRGF0ZSB8IG51bGw7XG59XG5cbkBSdW5PdXRzaWRlQW5ndWxhcih7XG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxufSlcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb24ob3B0aW9uczogVXBkYXRlTm90aWZpY2F0aW9uT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uKG9wdGlvbnM6IFVwZGF0ZU5vdGlmaWNhdGlvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlKFxuICAgIG9wdGlvbnM6IFVwZGF0ZUFsbE5vdGlmaWNhdGlvbnNSZWFkU3RhdGVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZUFsbE5vdGlmaWNhdGlvbnNSZWFkU3RhdGVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24oXG4gICAgb3B0aW9uczogVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uKG9wdGlvbnM6IERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgZGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbihcbiAgICBvcHRpb25zOiBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVjZWl2ZXJJZDogb3B0aW9ucy5yZWNlaXZlcklkLFxuICAgICAgICAgIGhhc0JlZW5SZWFkOiBvcHRpb25zLmhhc0JlZW5SZWFkLFxuICAgICAgICAgIHRpbWVSZWFkOiBvcHRpb25zLnRpbWVSZWFkPy50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHBsYWluRGF0YTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wbGFpbkRhdGEpLFxuICAgICAgICAgIHBsYWluTWV0YTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wbGFpbk1ldGEpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9ucyhcbiAgICBvcHRpb25zOiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNPcHRpb25zXG4gICkge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uKFxuICAgIG9wdGlvbnM6IERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc09wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHJlY2VpdmVySWQ6IG9wdGlvbnMucmVjZWl2ZXJJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGUoXG4gICAgb3B0aW9uczogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy51cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbihcbiAgICBvcHRpb25zOiBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBsYXN0Vmlld2VkOiBvcHRpb25zLmxhc3RWaWV3ZWQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgY2xlYXJMYXN0Vmlld2VkOiBvcHRpb25zLmxhc3RWaWV3ZWQgPT0gbnVsbCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -1,28 +0,0 @@
1
- import gql from 'graphql-tag';
2
- export const PasswordChangeRequestMutation = gql `
3
- mutation {
4
- passwordChangeRequest(input: {}) {
5
- challenge
6
- }
7
- }
8
- `;
9
- export const PasswordChangeMutation = gql `
10
- mutation PasswordChange($input: PasswordChangeInput!) {
11
- passwordChange(input: $input) {
12
- token
13
- newPassKey {
14
- id
15
- }
16
- }
17
- }
18
- `;
19
- export const PasswordChangeConfigQuery = gql `
20
- query PasswordChangeConfigQuery {
21
- passwordChangeConfig {
22
- maxAuthAgeSeconds
23
- authTime
24
- serverTime
25
- }
26
- }
27
- `;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQuZ3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3Bhc3N3b3JkL3Bhc3N3b3JkLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Q0FNL0MsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7O0NBU3hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUE7Ozs7Ozs7O0NBUTNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcblxuZXhwb3J0IGNvbnN0IFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uID0gZ3FsYFxuICBtdXRhdGlvbiB7XG4gICAgcGFzc3dvcmRDaGFuZ2VSZXF1ZXN0KGlucHV0OiB7fSkge1xuICAgICAgY2hhbGxlbmdlXG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgUGFzc3dvcmRDaGFuZ2VNdXRhdGlvbiA9IGdxbGBcbiAgbXV0YXRpb24gUGFzc3dvcmRDaGFuZ2UoJGlucHV0OiBQYXNzd29yZENoYW5nZUlucHV0ISkge1xuICAgIHBhc3N3b3JkQ2hhbmdlKGlucHV0OiAkaW5wdXQpIHtcbiAgICAgIHRva2VuXG4gICAgICBuZXdQYXNzS2V5IHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBQYXNzd29yZENoYW5nZUNvbmZpZ1F1ZXJ5ID0gZ3FsYFxuICBxdWVyeSBQYXNzd29yZENoYW5nZUNvbmZpZ1F1ZXJ5IHtcbiAgICBwYXNzd29yZENoYW5nZUNvbmZpZyB7XG4gICAgICBtYXhBdXRoQWdlU2Vjb25kc1xuICAgICAgYXV0aFRpbWVcbiAgICAgIHNlcnZlclRpbWVcbiAgICB9XG4gIH1cbmA7XG4iXX0=
@@ -1,309 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { HttpClient } from '@angular/common/http';
3
- import { Inject, Injectable } from '@angular/core';
4
- import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
5
- import * as moment_ from 'moment';
6
- import { EncryptionService } from '../encryption/encryption.service';
7
- import { KeyFactoryService as KFS } from '../key/key-factory.service';
8
- import { KeyGraphService } from '../key/key-graph.service';
9
- import { httpOptions, KC_CONFIG } from '../life-ready.config';
10
- import { ProfileService } from '../profile/profile.service';
11
- import { WebCryptoService } from '../web-crypto/web-crypto.service';
12
- import { KcAuthException } from '../_common/exceptions';
13
- import { LrApolloService } from './../api/lr-apollo.service';
14
- import { PasswordChangeConfigQuery, PasswordChangeMutation, PasswordChangeRequestMutation, } from './password.gql';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "../life-ready.config";
17
- import * as i2 from "@angular/common/http";
18
- import * as i3 from "../api/lr-apollo.service";
19
- import * as i4 from "@aws-amplify/auth/lib-esm/Auth";
20
- import * as i5 from "../profile/profile.service";
21
- import * as i6 from "../key/key-factory.service";
22
- import * as i7 from "../encryption/encryption.service";
23
- import * as i8 from "../key/key-graph.service";
24
- import * as i9 from "../web-crypto/web-crypto.service";
25
- // Ref: https://stackoverflow.com/questions/59735280/angular-8-moment-error-cannot-call-a-namespace-moment
26
- const moment = moment_;
27
- export class PasswordCheck {
28
- }
29
- export class PasswordService {
30
- constructor(config, http, apollo, auth, profileService, keyFactory, encryptionService, keyGraph, webCryptoService) {
31
- this.config = config;
32
- this.http = http;
33
- this.apollo = apollo;
34
- this.auth = auth;
35
- this.profileService = profileService;
36
- this.keyFactory = keyFactory;
37
- this.encryptionService = encryptionService;
38
- this.keyGraph = keyGraph;
39
- this.webCryptoService = webCryptoService;
40
- this.CLIENT_NONCE_LENGTH = 32;
41
- }
42
- checkPassword(plainPassword) {
43
- return __awaiter(this, void 0, void 0, function* () {
44
- const { years } = this.passwordStrength(plainPassword);
45
- return {
46
- length: plainPassword.length,
47
- timeToCrack: moment.duration({ years }),
48
- passwordExposed: yield this.getExposureCount(plainPassword),
49
- };
50
- });
51
- }
52
- getExposureCount(plainPassword) {
53
- return __awaiter(this, void 0, void 0, function* () {
54
- const sha1Password = yield this.webCryptoService.stringDigest('SHA-1', plainPassword);
55
- const first5sha1 = sha1Password.substring(0, 5);
56
- const response = yield this.http
57
- .get(`https://api.pwnedpasswords.com/range/${first5sha1}`, {
58
- responseType: 'text',
59
- })
60
- .toPromise();
61
- const results = new RegExp(`^(?:${sha1Password.substring(5)}:)(?<count>\\d+)$`, 'im').exec(response);
62
- if (results) {
63
- return +results.groups.count;
64
- }
65
- return 0;
66
- });
67
- }
68
- getPassIdpString(passIdp) {
69
- return passIdp.toJSON(true).k;
70
- }
71
- createPassKeyBundle(password) {
72
- return __awaiter(this, void 0, void 0, function* () {
73
- const passIdpParams = yield this.keyFactory.createPassIdpParams();
74
- const passIdp = (yield this.keyFactory.derivePassIdp(Object.assign({ password }, passIdpParams))).jwk;
75
- const passKeyParams = yield this.keyFactory.createPassKeyParams();
76
- const passKey = (yield this.keyFactory.derivePassKey(Object.assign({ password }, passKeyParams))).jwk;
77
- const passIdpVerifier = yield this.keyFactory.createPkcSignKey();
78
- const wrappedPassIdpVerifierPrk = yield this.encryptionService.encrypt(passKey, passIdpVerifier.toJSON(true));
79
- // There are two formats that the private key can be represented in JWK:
80
- // https://tools.ietf.org/html/rfc8017#page-9
81
- // The second form is an optimization:
82
- // https://crypto.stackexchange.com/questions/19413/what-are-dp-and-dq-in-encryption-by-rsa-in-c
83
- return {
84
- passKeyParams,
85
- passKey,
86
- passIdpParams,
87
- passIdp,
88
- passIdpVerifier,
89
- wrappedPassIdpVerifierPrk,
90
- };
91
- });
92
- }
93
- /**
94
- * We need to allow for interruption of the process at any point. Each API call can be considered
95
- * atomic and either succeeds or fails.
96
- *
97
- * The LR server APIs use semaphore tokens for locking critical operations, so concurrent calls will
98
- * fail.
99
- *
100
- * We assume the worst case for IdP API calls. So we use the semaphore token from LR to prevent
101
- * concurrent calls to IdP APIs, but we have to assume that the IdP API calls will either succeed or
102
- * fail within a reasonable amount of time.
103
- *
104
- * Each location where the server state changes can be a potential point of interruption.
105
- * Potential points of interruption are marked with: --Potential Failure Point--
106
- *
107
- * Places for timeout:
108
- * - Login age too old at call to: verifyPassword()
109
- * - Login age too old at call to: changePasswordMutation()
110
- * - Semaphore token expires at call to: changePasswordComplete()
111
- *
112
- * Tests:
113
- * - Potential Failure Point 1: should be able to restart the process, user remains signed in.
114
- * - Potential Failure Point 2: should enter recovery flow
115
- * - Potential Failure Point 3: should enter recovery flow
116
- * - Potential Failure Point 4: should enter recovery flow
117
- *
118
- */
119
- isLoginRequired() {
120
- return __awaiter(this, void 0, void 0, function* () {
121
- const changePasswordConfig = yield this.getChangePasswordConfig();
122
- const authTime = moment(changePasswordConfig.authTime);
123
- const serverTime = moment(changePasswordConfig.serverTime);
124
- const duration = moment.duration(serverTime.diff(authTime));
125
- const seconds = duration.asSeconds();
126
- if (seconds > changePasswordConfig.maxAuthAgeSeconds) {
127
- return true;
128
- }
129
- else {
130
- return false;
131
- }
132
- });
133
- }
134
- changePassword(password, newPassword) {
135
- return __awaiter(this, void 0, void 0, function* () {
136
- const cognitoUser = yield this.auth.currentAuthenticatedUser();
137
- // Not checking that passwords are different. It makes it easier to test.
138
- const { currentUser } = yield this.profileService.getCurrentUser();
139
- const { passIdp, signedChallenge } = yield this.verifyPassword(password, currentUser);
140
- // --Potential Failure Point 1--
141
- // verifyPassword() asks for a current password challenge hence changes server state.
142
- // Place break points here to test the failure scenarios.
143
- // Generate the new passIdp
144
- const newPassKey = yield this.createPassKeyBundle(newPassword);
145
- // Re-encrypt master key with new key
146
- const masterKey = yield this.keyGraph.getKey(currentUser.currentUserKey.masterKey.id);
147
- const newWrappedMasterKey = yield this.encryptionService.encrypt(newPassKey.passKey, masterKey.jwk.toJSON(true));
148
- // If the IdP change password failed, we need to go into recovery mode by forcing
149
- // a login. We can't logout the user just yet since the IdP password change needs
150
- // the user to be logged in. We _can_ removed any persisted session values for the IdP
151
- // but that seems like too much trouble.
152
- const { token } = yield this.changePasswordMutation(signedChallenge, currentUser.currentUserKey.masterKey.id, newWrappedMasterKey, newPassKey);
153
- // --Potential Failure Point 2--
154
- // changePasswordMutation() uploads new keys and obtains a semaphore lock to prevent any other
155
- // clients from performing IdP password change.
156
- // Now we can do the IdP password change.
157
- // todo: Add this back in
158
- yield this.auth.changePassword(cognitoUser, this.getPassIdpString(passIdp), this.getPassIdpString(newPassKey.passIdp));
159
- // --Potential Failure Point 3--
160
- // IdP password change
161
- // Note that changePassword() could throw an exception for a number of reason. It could throw
162
- // a network timeout for example. But we don't know if it's the response that timed out and
163
- // the idp password change was actually carried out. So we have to be extra conservative and
164
- // only act on a clear success. Otherwise we go into recover mode.
165
- yield this.changePasswordComplete({ useNewPassword: true, token });
166
- });
167
- }
168
- changePasswordComplete(options) {
169
- return __awaiter(this, void 0, void 0, function* () {
170
- const { useNewPassword, token } = options;
171
- return this.http
172
- .post(`${this.config.authUrl}users/password-change-complete/`, Object.assign({ use_new_password: useNewPassword }, (token && { token })), yield httpOptions(this.auth, this.config))
173
- .toPromise();
174
- });
175
- }
176
- getVerifierPrK(passKey, wrappedPrK) {
177
- return __awaiter(this, void 0, void 0, function* () {
178
- try {
179
- const prkJson = yield this.encryptionService.decrypt(passKey, wrappedPrK);
180
- return KFS.asKey(prkJson);
181
- }
182
- catch (error) {
183
- throw new KcAuthException('Wrong current password');
184
- }
185
- });
186
- }
187
- verifyPassword(password, currentUser) {
188
- return __awaiter(this, void 0, void 0, function* () {
189
- // Get information from the server to prepare for password change.
190
- const passwordRequest = yield this.apollo.mutate({
191
- mutation: PasswordChangeRequestMutation,
192
- variables: {},
193
- });
194
- // Get the old passKey so we can decrypt the old password verifier
195
- const passKeyResult = yield this.keyFactory.derivePassKey(Object.assign({ password }, currentUser.currentUserKey.passKey.passKeyParams));
196
- const verifierPrK = yield this.getVerifierPrK(passKeyResult.jwk, currentUser.currentUserKey.passKey.wrappedPassIdpVerifierPrk);
197
- // Sign the server challenge to prove to the server we can decrypt the password verifier.
198
- // Generate
199
- const clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
200
- const signedChallenge = yield this.encryptionService.sign(verifierPrK, {
201
- serverNonce: passwordRequest.passwordChangeRequest.challenge.serverNonce,
202
- clientNonce,
203
- });
204
- const passIdpResult = yield this.keyFactory.derivePassIdp(Object.assign({ password }, currentUser.currentUserKey.passKey.passIdpParams));
205
- return {
206
- passIdp: passIdpResult.jwk,
207
- signedChallenge,
208
- };
209
- });
210
- }
211
- changePasswordMutation(signedChallenge, masterKeyId, newWrappedMasterKey, passKeyBundle) {
212
- return __awaiter(this, void 0, void 0, function* () {
213
- const response = yield this.apollo.mutate({
214
- mutation: PasswordChangeMutation,
215
- variables: {
216
- input: {
217
- signedChallenge: JSON.stringify(signedChallenge),
218
- masterKeyId,
219
- newWrappedMasterKey: JSON.stringify(newWrappedMasterKey),
220
- newPassKey: {
221
- passIdpParams: JSON.stringify(passKeyBundle.passIdpParams),
222
- passIdpVerifierPbk: JSON.stringify(passKeyBundle.passIdpVerifier.toJSON()),
223
- wrappedPassIdpVerifierPrk: JSON.stringify(passKeyBundle.wrappedPassIdpVerifierPrk),
224
- passKeyParams: JSON.stringify(passKeyBundle.passKeyParams),
225
- },
226
- },
227
- },
228
- });
229
- return {
230
- token: response.passwordChange.token,
231
- newPassKeyId: response.passwordChange.newPassKey.id,
232
- };
233
- });
234
- }
235
- getChangePasswordConfig() {
236
- return __awaiter(this, void 0, void 0, function* () {
237
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
- const res = yield this.apollo.query({
239
- query: PasswordChangeConfigQuery,
240
- });
241
- const ret = res.passwordChangeConfig;
242
- ret.authTime = new Date(ret.authTime);
243
- ret.serverTime = new Date(ret.serverTime);
244
- return ret;
245
- });
246
- }
247
- passwordStrength(password) {
248
- const upper = /[A-Z]/g;
249
- const lower = /[a-z]/g;
250
- const digit = /[0-9]/g;
251
- const upperChoices = 26;
252
- const lowerChoices = 26;
253
- const digitChoices = 10;
254
- const specialChoices = 30; // /[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/g
255
- function instanceCount(str, re) {
256
- return ((str || '').match(re) || []).length;
257
- }
258
- const uppers = instanceCount(password, upper);
259
- const lowers = instanceCount(password, lower);
260
- const digits = instanceCount(password, digit);
261
- const specials = password.length - uppers - lowers - digits;
262
- let choices = 0;
263
- if (uppers) {
264
- choices += upperChoices;
265
- }
266
- if (lowers) {
267
- choices += lowerChoices;
268
- }
269
- if (digits) {
270
- choices += digitChoices;
271
- }
272
- if (specials) {
273
- choices += specialChoices;
274
- }
275
- if (password.length === 0) {
276
- return {
277
- years: 0,
278
- // bits of entropy
279
- bits: 0,
280
- };
281
- }
282
- const permutations = Math.pow(choices, password.length);
283
- const years = (54000 * permutations) /
284
- Math.pow(upperChoices + lowerChoices + digitChoices, 12);
285
- return {
286
- years,
287
- // bits of entropy
288
- bits: Math.round(Math.log2(permutations)),
289
- };
290
- }
291
- }
292
- PasswordService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PasswordService_Factory() { return new PasswordService(i0.ɵɵinject(i1.KC_CONFIG), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.AuthClass), i0.ɵɵinject(i5.ProfileService), i0.ɵɵinject(i6.KeyFactoryService), i0.ɵɵinject(i7.EncryptionService), i0.ɵɵinject(i8.KeyGraphService), i0.ɵɵinject(i9.WebCryptoService)); }, token: PasswordService, providedIn: "root" });
293
- PasswordService.decorators = [
294
- { type: Injectable, args: [{
295
- providedIn: 'root',
296
- },] }
297
- ];
298
- PasswordService.ctorParameters = () => [
299
- { type: undefined, decorators: [{ type: Inject, args: [KC_CONFIG,] }] },
300
- { type: HttpClient },
301
- { type: LrApolloService },
302
- { type: AuthClass },
303
- { type: ProfileService },
304
- { type: KFS },
305
- { type: EncryptionService },
306
- { type: KeyGraphService },
307
- { type: WebCryptoService }
308
- ];
309
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9wYXNzd29yZC9wYXNzd29yZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBWSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0Qiw2QkFBNkIsR0FDOUIsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFFeEIsMEdBQTBHO0FBQzFHLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQXlCdkIsTUFBTSxPQUFPLGFBQWE7Q0FJekI7QUFLRCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUM2QixNQUFnQixF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Q0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0QsT0FBTztZQUNMLEtBQUs7WUFDTCxrQkFBa0I7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxQyxDQUFDO0lBQ0osQ0FBQzs7OztZQTdXRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs0Q0FLSSxNQUFNLFNBQUMsU0FBUztZQS9EWixVQUFVO1lBaUJWLGVBQWU7WUFkZixTQUFTO1lBVVQsY0FBYztZQUhPLEdBQUc7WUFEeEIsaUJBQWlCO1lBRWpCLGVBQWU7WUFJZixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2duaXRvVXNlciB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoJztcbmltcG9ydCB7IEF1dGhDbGFzcyB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoL2xpYi1lc20vQXV0aCc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBKV0ssIEpXUyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFBhc3NLZXlCdW5kbGUgfSBmcm9tICcuLi9hdXRoL2F1dGgudHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgaHR0cE9wdGlvbnMsIEtjQ29uZmlnLCBLQ19DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XG5pbXBvcnQgeyBQcm9maWxlU2VydmljZSB9IGZyb20gJy4uL3Byb2ZpbGUvcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaUN1cnJlbnRVc2VyIH0gZnJvbSAnLi4vcHJvZmlsZS9wcm9maWxlLnR5cGVzJztcbmltcG9ydCB7IFdlYkNyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi93ZWItY3J5cHRvL3dlYi1jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBLY0F1dGhFeGNlcHRpb24gfSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgTHJBcG9sbG9TZXJ2aWNlIH0gZnJvbSAnLi8uLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGFzc3dvcmRDaGFuZ2VDb25maWdRdWVyeSxcbiAgUGFzc3dvcmRDaGFuZ2VNdXRhdGlvbixcbiAgUGFzc3dvcmRDaGFuZ2VSZXF1ZXN0TXV0YXRpb24sXG59IGZyb20gJy4vcGFzc3dvcmQuZ3FsJztcblxuLy8gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81OTczNTI4MC9hbmd1bGFyLTgtbW9tZW50LWVycm9yLWNhbm5vdC1jYWxsLWEtbmFtZXNwYWNlLW1vbWVudFxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcblxuaW50ZXJmYWNlIFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uIHtcbiAgcGFzc3dvcmRDaGFuZ2VSZXF1ZXN0OiB7XG4gICAgY2hhbGxlbmdlOiB7XG4gICAgICBzZXJ2ZXJOb25jZTogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmludGVyZmFjZSBQYXNzd29yZENoYW5nZU11dGF0aW9uIHtcbiAgcGFzc3dvcmRDaGFuZ2U6IHtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIG5ld1Bhc3NLZXk6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZENoYW5nZUNvbmZpZyB7XG4gIG1heEF1dGhBZ2VTZWNvbmRzOiBudW1iZXI7XG4gIGF1dGhUaW1lOiBzdHJpbmcgfCBEYXRlO1xuICBzZXJ2ZXJUaW1lOiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVjayB7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgdGltZVRvQ3JhY2s/OiBEdXJhdGlvbjtcbiAgcGFzc3dvcmRFeHBvc2VkPzogbnVtYmVyO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBDTElFTlRfTk9OQ0VfTEVOR1RIID0gMzI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChLQ19DT05GSUcpIHByaXZhdGUgY29uZmlnOiBLY0NvbmZpZyxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhcG9sbG86IExyQXBvbGxvU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhDbGFzcyxcbiAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtGUyxcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3ZWJDcnlwdG9TZXJ2aWNlOiBXZWJDcnlwdG9TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgY2hlY2tQYXNzd29yZChwbGFpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFBhc3N3b3JkQ2hlY2s+IHtcbiAgICBjb25zdCB7IHllYXJzIH0gPSB0aGlzLnBhc3N3b3JkU3RyZW5ndGgocGxhaW5QYXNzd29yZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiBwbGFpblBhc3N3b3JkLmxlbmd0aCxcbiAgICAgIHRpbWVUb0NyYWNrOiBtb21lbnQuZHVyYXRpb24oeyB5ZWFycyB9KSxcbiAgICAgIHBhc3N3b3JkRXhwb3NlZDogYXdhaXQgdGhpcy5nZXRFeHBvc3VyZUNvdW50KHBsYWluUGFzc3dvcmQpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RXhwb3N1cmVDb3VudChwbGFpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHNoYTFQYXNzd29yZCA9IGF3YWl0IHRoaXMud2ViQ3J5cHRvU2VydmljZS5zdHJpbmdEaWdlc3QoXG4gICAgICAnU0hBLTEnLFxuICAgICAgcGxhaW5QYXNzd29yZFxuICAgICk7XG4gICAgY29uc3QgZmlyc3Q1c2hhMSA9IHNoYTFQYXNzd29yZC5zdWJzdHJpbmcoMCwgNSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLmdldChgaHR0cHM6Ly9hcGkucHduZWRwYXNzd29yZHMuY29tL3JhbmdlLyR7Zmlyc3Q1c2hhMX1gLCB7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4oPzoke3NoYTFQYXNzd29yZC5zdWJzdHJpbmcoNSl9OikoPzxjb3VudD5cXFxcZCspJGAsXG4gICAgICAnaW0nXG4gICAgKS5leGVjKHJlc3BvbnNlKTtcblxuICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICByZXR1cm4gK3Jlc3VsdHMuZ3JvdXBzLmNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXNzSWRwU3RyaW5nKHBhc3NJZHA6IEpXSy5LZXkpIHtcbiAgICByZXR1cm4gKHBhc3NJZHAudG9KU09OKHRydWUpIGFzIEpTT05PYmplY3QpLms7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlUGFzc0tleUJ1bmRsZShcbiAgICBwYXNzd29yZDogQ3J5cHRvS2V5XG4gICk6IFByb21pc2U8UGFzc0tleUJ1bmRsZT4ge1xuICAgIGNvbnN0IHBhc3NJZHBQYXJhbXMgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGFzc0lkcFBhcmFtcygpO1xuICAgIGNvbnN0IHBhc3NJZHAgPSAoXG4gICAgICBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0lkcCh7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAuLi5wYXNzSWRwUGFyYW1zLFxuICAgICAgfSlcbiAgICApLmp3aztcblxuICAgIGNvbnN0IHBhc3NLZXlQYXJhbXMgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGFzc0tleVBhcmFtcygpO1xuICAgIGNvbnN0IHBhc3NLZXkgPSAoXG4gICAgICBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0tleSh7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAuLi5wYXNzS2V5UGFyYW1zLFxuICAgICAgfSlcbiAgICApLmp3aztcblxuICAgIGNvbnN0IHBhc3NJZHBWZXJpZmllciA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVQa2NTaWduS2V5KCk7XG5cbiAgICBjb25zdCB3cmFwcGVkUGFzc0lkcFZlcmlmaWVyUHJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcGFzc0tleSxcbiAgICAgIHBhc3NJZHBWZXJpZmllci50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgLy8gVGhlcmUgYXJlIHR3byBmb3JtYXRzIHRoYXQgdGhlIHByaXZhdGUga2V5IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKV0s6XG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgwMTcjcGFnZS05XG4gICAgLy8gVGhlIHNlY29uZCBmb3JtIGlzIGFuIG9wdGltaXphdGlvbjpcbiAgICAvLyBodHRwczovL2NyeXB0by5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTk0MTMvd2hhdC1hcmUtZHAtYW5kLWRxLWluLWVuY3J5cHRpb24tYnktcnNhLWluLWNcblxuICAgIHJldHVybiB7XG4gICAgICBwYXNzS2V5UGFyYW1zLFxuICAgICAgcGFzc0tleSxcbiAgICAgIHBhc3NJZHBQYXJhbXMsXG4gICAgICBwYXNzSWRwLFxuICAgICAgcGFzc0lkcFZlcmlmaWVyLFxuICAgICAgd3JhcHBlZFBhc3NJZHBWZXJpZmllclByayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdlIG5lZWQgdG8gYWxsb3cgZm9yIGludGVycnVwdGlvbiBvZiB0aGUgcHJvY2VzcyBhdCBhbnkgcG9pbnQuIEVhY2ggQVBJIGNhbGwgY2FuIGJlIGNvbnNpZGVyZWRcbiAgICogYXRvbWljIGFuZCBlaXRoZXIgc3VjY2VlZHMgb3IgZmFpbHMuXG4gICAqXG4gICAqIFRoZSBMUiBzZXJ2ZXIgQVBJcyB1c2Ugc2VtYXBob3JlIHRva2VucyBmb3IgbG9ja2luZyBjcml0aWNhbCBvcGVyYXRpb25zLCBzbyBjb25jdXJyZW50IGNhbGxzIHdpbGxcbiAgICogZmFpbC5cbiAgICpcbiAgICogV2UgYXNzdW1lIHRoZSB3b3JzdCBjYXNlIGZvciBJZFAgQVBJIGNhbGxzLiBTbyB3ZSB1c2UgdGhlIHNlbWFwaG9yZSB0b2tlbiBmcm9tIExSIHRvIHByZXZlbnRcbiAgICogY29uY3VycmVudCBjYWxscyB0byBJZFAgQVBJcywgYnV0IHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIElkUCBBUEkgY2FsbHMgd2lsbCBlaXRoZXIgc3VjY2VlZCBvclxuICAgKiBmYWlsIHdpdGhpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuXG4gICAqXG4gICAqIEVhY2ggbG9jYXRpb24gd2hlcmUgdGhlIHNlcnZlciBzdGF0ZSBjaGFuZ2VzIGNhbiBiZSBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcnJ1cHRpb24uXG4gICAqIFBvdGVudGlhbCBwb2ludHMgb2YgaW50ZXJydXB0aW9uIGFyZSBtYXJrZWQgd2l0aDogLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludC0tXG4gICAqXG4gICAqIFBsYWNlcyBmb3IgdGltZW91dDpcbiAgICogLSBMb2dpbiBhZ2UgdG9vIG9sZCBhdCBjYWxsIHRvOiB2ZXJpZnlQYXNzd29yZCgpXG4gICAqIC0gTG9naW4gYWdlIHRvbyBvbGQgYXQgY2FsbCB0bzogY2hhbmdlUGFzc3dvcmRNdXRhdGlvbigpXG4gICAqIC0gU2VtYXBob3JlIHRva2VuIGV4cGlyZXMgYXQgY2FsbCB0bzogY2hhbmdlUGFzc3dvcmRDb21wbGV0ZSgpXG4gICAqXG4gICAqIFRlc3RzOlxuICAgKiAtIFBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDE6IHNob3VsZCBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3MsIHVzZXIgcmVtYWlucyBzaWduZWQgaW4uXG4gICAqIC0gUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMjogc2hvdWxkIGVudGVyIHJlY292ZXJ5IGZsb3dcbiAgICogLSBQb3RlbnRpYWwgRmFpbHVyZSBQb2ludCAzOiBzaG91bGQgZW50ZXIgcmVjb3ZlcnkgZmxvd1xuICAgKiAtIFBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDQ6IHNob3VsZCBlbnRlciByZWNvdmVyeSBmbG93XG4gICAqXG4gICAqL1xuXG4gIHB1YmxpYyBhc3luYyBpc0xvZ2luUmVxdWlyZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2hhbmdlUGFzc3dvcmRDb25maWcgPSBhd2FpdCB0aGlzLmdldENoYW5nZVBhc3N3b3JkQ29uZmlnKCk7XG4gICAgY29uc3QgYXV0aFRpbWUgPSBtb21lbnQoY2hhbmdlUGFzc3dvcmRDb25maWcuYXV0aFRpbWUpO1xuICAgIGNvbnN0IHNlcnZlclRpbWUgPSBtb21lbnQoY2hhbmdlUGFzc3dvcmRDb25maWcuc2VydmVyVGltZSk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24oc2VydmVyVGltZS5kaWZmKGF1dGhUaW1lKSk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IGR1cmF0aW9uLmFzU2Vjb25kcygpO1xuICAgIGlmIChzZWNvbmRzID4gY2hhbmdlUGFzc3dvcmRDb25maWcubWF4QXV0aEFnZVNlY29uZHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVBhc3N3b3JkKHBhc3N3b3JkOiBDcnlwdG9LZXksIG5ld1Bhc3N3b3JkOiBDcnlwdG9LZXkpIHtcbiAgICBjb25zdCBjb2duaXRvVXNlcjogQ29nbml0b1VzZXIgPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyKCk7XG5cbiAgICAvLyBOb3QgY2hlY2tpbmcgdGhhdCBwYXNzd29yZHMgYXJlIGRpZmZlcmVudC4gSXQgbWFrZXMgaXQgZWFzaWVyIHRvIHRlc3QuXG4gICAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuXG4gICAgY29uc3QgeyBwYXNzSWRwLCBzaWduZWRDaGFsbGVuZ2UgfSA9IGF3YWl0IHRoaXMudmVyaWZ5UGFzc3dvcmQoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGN1cnJlbnRVc2VyXG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMS0tXG4gICAgLy8gdmVyaWZ5UGFzc3dvcmQoKSBhc2tzIGZvciBhIGN1cnJlbnQgcGFzc3dvcmQgY2hhbGxlbmdlIGhlbmNlIGNoYW5nZXMgc2VydmVyIHN0YXRlLlxuICAgIC8vIFBsYWNlIGJyZWFrIHBvaW50cyBoZXJlIHRvIHRlc3QgdGhlIGZhaWx1cmUgc2NlbmFyaW9zLlxuXG4gICAgLy8gR2VuZXJhdGUgdGhlIG5ldyBwYXNzSWRwXG4gICAgY29uc3QgbmV3UGFzc0tleSA9IGF3YWl0IHRoaXMuY3JlYXRlUGFzc0tleUJ1bmRsZShuZXdQYXNzd29yZCk7XG5cbiAgICAvLyBSZS1lbmNyeXB0IG1hc3RlciBrZXkgd2l0aCBuZXcga2V5XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoXG4gICAgICBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5tYXN0ZXJLZXkuaWRcbiAgICApO1xuICAgIGNvbnN0IG5ld1dyYXBwZWRNYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBuZXdQYXNzS2V5LnBhc3NLZXksXG4gICAgICBtYXN0ZXJLZXkuandrLnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgSWRQIGNoYW5nZSBwYXNzd29yZCBmYWlsZWQsIHdlIG5lZWQgdG8gZ28gaW50byByZWNvdmVyeSBtb2RlIGJ5IGZvcmNpbmdcbiAgICAvLyBhIGxvZ2luLiBXZSBjYW4ndCBsb2dvdXQgdGhlIHVzZXIganVzdCB5ZXQgc2luY2UgdGhlIElkUCBwYXNzd29yZCBjaGFuZ2UgbmVlZHNcbiAgICAvLyB0aGUgdXNlciB0byBiZSBsb2dnZWQgaW4uIFdlIF9jYW5fIHJlbW92ZWQgYW55IHBlcnNpc3RlZCBzZXNzaW9uIHZhbHVlcyBmb3IgdGhlIElkUFxuICAgIC8vIGJ1dCB0aGF0IHNlZW1zIGxpa2UgdG9vIG11Y2ggdHJvdWJsZS5cblxuICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IHRoaXMuY2hhbmdlUGFzc3dvcmRNdXRhdGlvbihcbiAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICAgIGN1cnJlbnRVc2VyLmN1cnJlbnRVc2VyS2V5Lm1hc3RlcktleS5pZCxcbiAgICAgIG5ld1dyYXBwZWRNYXN0ZXJLZXksXG4gICAgICBuZXdQYXNzS2V5XG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMi0tXG4gICAgLy8gY2hhbmdlUGFzc3dvcmRNdXRhdGlvbigpIHVwbG9hZHMgbmV3IGtleXMgYW5kIG9idGFpbnMgYSBzZW1hcGhvcmUgbG9jayB0byBwcmV2ZW50IGFueSBvdGhlclxuICAgIC8vIGNsaWVudHMgZnJvbSBwZXJmb3JtaW5nIElkUCBwYXNzd29yZCBjaGFuZ2UuXG5cbiAgICAvLyBOb3cgd2UgY2FuIGRvIHRoZSBJZFAgcGFzc3dvcmQgY2hhbmdlLlxuICAgIC8vIHRvZG86IEFkZCB0aGlzIGJhY2sgaW5cbiAgICBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoXG4gICAgICBjb2duaXRvVXNlcixcbiAgICAgIHRoaXMuZ2V0UGFzc0lkcFN0cmluZyhwYXNzSWRwKSxcbiAgICAgIHRoaXMuZ2V0UGFzc0lkcFN0cmluZyhuZXdQYXNzS2V5LnBhc3NJZHApXG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMy0tXG4gICAgLy8gSWRQIHBhc3N3b3JkIGNoYW5nZVxuXG4gICAgLy8gTm90ZSB0aGF0IGNoYW5nZVBhc3N3b3JkKCkgY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBhIG51bWJlciBvZiByZWFzb24uIEl0IGNvdWxkIHRocm93XG4gICAgLy8gYSBuZXR3b3JrIHRpbWVvdXQgZm9yIGV4YW1wbGUuIEJ1dCB3ZSBkb24ndCBrbm93IGlmIGl0J3MgdGhlIHJlc3BvbnNlIHRoYXQgdGltZWQgb3V0IGFuZFxuICAgIC8vIHRoZSBpZHAgcGFzc3dvcmQgY2hhbmdlIHdhcyBhY3R1YWxseSBjYXJyaWVkIG91dC4gU28gd2UgaGF2ZSB0byBiZSBleHRyYSBjb25zZXJ2YXRpdmUgYW5kXG4gICAgLy8gb25seSBhY3Qgb24gYSBjbGVhciBzdWNjZXNzLiBPdGhlcndpc2Ugd2UgZ28gaW50byByZWNvdmVyIG1vZGUuXG4gICAgYXdhaXQgdGhpcy5jaGFuZ2VQYXNzd29yZENvbXBsZXRlKHsgdXNlTmV3UGFzc3dvcmQ6IHRydWUsIHRva2VuIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVBhc3N3b3JkQ29tcGxldGUob3B0aW9uczoge1xuICAgIHVzZU5ld1Bhc3N3b3JkOiBib29sZWFuO1xuICAgIHRva2VuPzogc3RyaW5nO1xuICB9KSB7XG4gICAgY29uc3QgeyB1c2VOZXdQYXNzd29yZCwgdG9rZW4gfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvcGFzc3dvcmQtY2hhbmdlLWNvbXBsZXRlL2AsXG4gICAgICAgIHtcbiAgICAgICAgICB1c2VfbmV3X3Bhc3N3b3JkOiB1c2VOZXdQYXNzd29yZCxcbiAgICAgICAgICAuLi4odG9rZW4gJiYgeyB0b2tlbiB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYXdhaXQgaHR0cE9wdGlvbnModGhpcy5hdXRoLCB0aGlzLmNvbmZpZylcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0VmVyaWZpZXJQcksoXG4gICAgcGFzc0tleTogSldLLktleSxcbiAgICB3cmFwcGVkUHJLOiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PlxuICApOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJrSnNvbiA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChwYXNzS2V5LCB3cmFwcGVkUHJLKTtcbiAgICAgIHJldHVybiBLRlMuYXNLZXkocHJrSnNvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBLY0F1dGhFeGNlcHRpb24oJ1dyb25nIGN1cnJlbnQgcGFzc3dvcmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZlcmlmeVBhc3N3b3JkKFxuICAgIHBhc3N3b3JkOiBDcnlwdG9LZXksXG4gICAgY3VycmVudFVzZXI6IEFwaUN1cnJlbnRVc2VyXG4gICk6IFByb21pc2U8eyBwYXNzSWRwOiBKV0suS2V5OyBzaWduZWRDaGFsbGVuZ2U6IEpXUy5DcmVhdGVTaWduUmVzdWx0IH0+IHtcbiAgICAvLyBHZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIHRvIHByZXBhcmUgZm9yIHBhc3N3b3JkIGNoYW5nZS5cbiAgICBjb25zdCBwYXNzd29yZFJlcXVlc3QgPVxuICAgICAgYXdhaXQgdGhpcy5hcG9sbG8ubXV0YXRlPFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uPih7XG4gICAgICAgIG11dGF0aW9uOiBQYXNzd29yZENoYW5nZVJlcXVlc3RNdXRhdGlvbixcbiAgICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIH0pO1xuXG4gICAgLy8gR2V0IHRoZSBvbGQgcGFzc0tleSBzbyB3ZSBjYW4gZGVjcnlwdCB0aGUgb2xkIHBhc3N3b3JkIHZlcmlmaWVyXG4gICAgY29uc3QgcGFzc0tleVJlc3VsdCA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5kZXJpdmVQYXNzS2V5KHtcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgLi4uY3VycmVudFVzZXIuY3VycmVudFVzZXJLZXkucGFzc0tleS5wYXNzS2V5UGFyYW1zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdmVyaWZpZXJQcksgPSBhd2FpdCB0aGlzLmdldFZlcmlmaWVyUHJLKFxuICAgICAgcGFzc0tleVJlc3VsdC5qd2ssXG4gICAgICBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5wYXNzS2V5LndyYXBwZWRQYXNzSWRwVmVyaWZpZXJQcmtcbiAgICApO1xuXG4gICAgLy8gU2lnbiB0aGUgc2VydmVyIGNoYWxsZW5nZSB0byBwcm92ZSB0byB0aGUgc2VydmVyIHdlIGNhbiBkZWNyeXB0IHRoZSBwYXNzd29yZCB2ZXJpZmllci5cbiAgICAvLyBHZW5lcmF0ZVxuICAgIGNvbnN0IGNsaWVudE5vbmNlID0gdGhpcy5rZXlGYWN0b3J5LnJhbmRvbVN0cmluZyh0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEgpO1xuXG4gICAgY29uc3Qgc2lnbmVkQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHZlcmlmaWVyUHJLLCB7XG4gICAgICBzZXJ2ZXJOb25jZTogcGFzc3dvcmRSZXF1ZXN0LnBhc3N3b3JkQ2hhbmdlUmVxdWVzdC5jaGFsbGVuZ2Uuc2VydmVyTm9uY2UsXG4gICAgICBjbGllbnROb25jZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhc3NJZHBSZXN1bHQgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0lkcCh7XG4gICAgICBwYXNzd29yZCxcbiAgICAgIC4uLmN1cnJlbnRVc2VyLmN1cnJlbnRVc2VyS2V5LnBhc3NLZXkucGFzc0lkcFBhcmFtcyxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXNzSWRwOiBwYXNzSWRwUmVzdWx0Lmp3ayxcbiAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VQYXNzd29yZE11dGF0aW9uKFxuICAgIHNpZ25lZENoYWxsZW5nZTogSldTLkNyZWF0ZVNpZ25SZXN1bHQsXG4gICAgbWFzdGVyS2V5SWQ6IHN0cmluZyxcbiAgICBuZXdXcmFwcGVkTWFzdGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PixcbiAgICBwYXNzS2V5QnVuZGxlOiBQYXNzS2V5QnVuZGxlXG4gICk6IFByb21pc2U8eyB0b2tlbjogc3RyaW5nOyBuZXdQYXNzS2V5SWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwb2xsby5tdXRhdGU8UGFzc3dvcmRDaGFuZ2VNdXRhdGlvbj4oe1xuICAgICAgbXV0YXRpb246IFBhc3N3b3JkQ2hhbmdlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBzaWduZWRDaGFsbGVuZ2U6IEpTT04uc3RyaW5naWZ5KHNpZ25lZENoYWxsZW5nZSksXG4gICAgICAgICAgbWFzdGVyS2V5SWQsXG4gICAgICAgICAgbmV3V3JhcHBlZE1hc3RlcktleTogSlNPTi5zdHJpbmdpZnkobmV3V3JhcHBlZE1hc3RlcktleSksXG4gICAgICAgICAgbmV3UGFzc0tleToge1xuICAgICAgICAgICAgcGFzc0lkcFBhcmFtczogSlNPTi5zdHJpbmdpZnkocGFzc0tleUJ1bmRsZS5wYXNzSWRwUGFyYW1zKSxcbiAgICAgICAgICAgIHBhc3NJZHBWZXJpZmllclBiazogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHBhc3NLZXlCdW5kbGUucGFzc0lkcFZlcmlmaWVyLnRvSlNPTigpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3JhcHBlZFBhc3NJZHBWZXJpZmllclByazogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHBhc3NLZXlCdW5kbGUud3JhcHBlZFBhc3NJZHBWZXJpZmllclBya1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhc3NLZXlQYXJhbXM6IEpTT04uc3RyaW5naWZ5KHBhc3NLZXlCdW5kbGUucGFzc0tleVBhcmFtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiByZXNwb25zZS5wYXNzd29yZENoYW5nZS50b2tlbixcbiAgICAgIG5ld1Bhc3NLZXlJZDogcmVzcG9uc2UucGFzc3dvcmRDaGFuZ2UubmV3UGFzc0tleS5pZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hhbmdlUGFzc3dvcmRDb25maWcoKTogUHJvbWlzZTxQYXNzd29yZENoYW5nZUNvbmZpZz4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5hcG9sbG8ucXVlcnk8YW55Pih7XG4gICAgICBxdWVyeTogUGFzc3dvcmRDaGFuZ2VDb25maWdRdWVyeSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldCA9IHJlcy5wYXNzd29yZENoYW5nZUNvbmZpZyBhcyBQYXNzd29yZENoYW5nZUNvbmZpZztcblxuICAgIHJldC5hdXRoVGltZSA9IG5ldyBEYXRlKHJldC5hdXRoVGltZSk7XG4gICAgcmV0LnNlcnZlclRpbWUgPSBuZXcgRGF0ZShyZXQuc2VydmVyVGltZSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBwYXNzd29yZFN0cmVuZ3RoKHBhc3N3b3JkKTogeyB5ZWFyczogbnVtYmVyOyBiaXRzOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdXBwZXIgPSAvW0EtWl0vZztcbiAgICBjb25zdCBsb3dlciA9IC9bYS16XS9nO1xuICAgIGNvbnN0IGRpZ2l0ID0gL1swLTldL2c7XG5cbiAgICBjb25zdCB1cHBlckNob2ljZXMgPSAyNjtcbiAgICBjb25zdCBsb3dlckNob2ljZXMgPSAyNjtcbiAgICBjb25zdCBkaWdpdENob2ljZXMgPSAxMDtcbiAgICBjb25zdCBzcGVjaWFsQ2hvaWNlcyA9IDMwOyAvLyAvWyFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX5dL2dcblxuICAgIGZ1bmN0aW9uIGluc3RhbmNlQ291bnQoc3RyLCByZSkge1xuICAgICAgcmV0dXJuICgoc3RyIHx8ICcnKS5tYXRjaChyZSkgfHwgW10pLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCB1cHBlcnMgPSBpbnN0YW5jZUNvdW50KHBhc3N3b3JkLCB1cHBlcik7XG4gICAgY29uc3QgbG93ZXJzID0gaW5zdGFuY2VDb3VudChwYXNzd29yZCwgbG93ZXIpO1xuICAgIGNvbnN0IGRpZ2l0cyA9IGluc3RhbmNlQ291bnQocGFzc3dvcmQsIGRpZ2l0KTtcbiAgICBjb25zdCBzcGVjaWFscyA9IHBhc3N3b3JkLmxlbmd0aCAtIHVwcGVycyAtIGxvd2VycyAtIGRpZ2l0cztcblxuICAgIGxldCBjaG9pY2VzID0gMDtcbiAgICBpZiAodXBwZXJzKSB7XG4gICAgICBjaG9pY2VzICs9IHVwcGVyQ2hvaWNlcztcbiAgICB9XG4gICAgaWYgKGxvd2Vycykge1xuICAgICAgY2hvaWNlcyArPSBsb3dlckNob2ljZXM7XG4gICAgfVxuICAgIGlmIChkaWdpdHMpIHtcbiAgICAgIGNob2ljZXMgKz0gZGlnaXRDaG9pY2VzO1xuICAgIH1cbiAgICBpZiAoc3BlY2lhbHMpIHtcbiAgICAgIGNob2ljZXMgKz0gc3BlY2lhbENob2ljZXM7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgIC8vIGJpdHMgb2YgZW50cm9weVxuICAgICAgICBiaXRzOiAwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJtdXRhdGlvbnMgPSBNYXRoLnBvdyhjaG9pY2VzLCBwYXNzd29yZC5sZW5ndGgpO1xuXG4gICAgY29uc3QgeWVhcnMgPVxuICAgICAgKDU0MDAwICogcGVybXV0YXRpb25zKSAvXG4gICAgICBNYXRoLnBvdyh1cHBlckNob2ljZXMgKyBsb3dlckNob2ljZXMgKyBkaWdpdENob2ljZXMsIDEyKTtcbiAgICByZXR1cm4ge1xuICAgICAgeWVhcnMsXG4gICAgICAvLyBiaXRzIG9mIGVudHJvcHlcbiAgICAgIGJpdHM6IE1hdGgucm91bmQoTWF0aC5sb2cyKHBlcm11dGF0aW9ucykpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==