@vendasta/iam 2.0.1 → 2.3.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 (135) hide show
  1. package/esm2020/lib/_generated/host.service.mjs +25 -0
  2. package/esm2020/lib/_generated/index.mjs +2 -0
  3. package/esm2020/lib/_internal/enums/api.enum.mjs +22 -0
  4. package/esm2020/lib/_internal/enums/index.mjs +12 -0
  5. package/esm2020/lib/_internal/enums/policies.enum.mjs +18 -0
  6. package/esm2020/lib/_internal/enums/resources.enum.mjs +14 -0
  7. package/esm2020/lib/_internal/enums/subjects.enum.mjs +17 -0
  8. package/esm2020/lib/_internal/enums/users.enum.mjs +13 -0
  9. package/esm2020/lib/_internal/iam.api.service.mjs +189 -0
  10. package/esm2020/lib/_internal/index.mjs +12 -0
  11. package/esm2020/lib/_internal/interfaces/annotations.interface.mjs +8 -0
  12. package/esm2020/lib/_internal/interfaces/api.interface.mjs +2 -0
  13. package/esm2020/lib/_internal/interfaces/attributes.interface.mjs +8 -0
  14. package/esm2020/lib/_internal/interfaces/field-mask.interface.mjs +8 -0
  15. package/esm2020/lib/_internal/interfaces/index.mjs +2 -0
  16. package/esm2020/lib/_internal/interfaces/policies.interface.mjs +3 -0
  17. package/esm2020/lib/_internal/interfaces/resources.interface.mjs +2 -0
  18. package/esm2020/lib/_internal/interfaces/security-logs.interface.mjs +8 -0
  19. package/esm2020/lib/_internal/interfaces/subjects.interface.mjs +2 -0
  20. package/esm2020/lib/_internal/interfaces/users.interface.mjs +2 -0
  21. package/esm2020/lib/_internal/objects/annotations.mjs +30 -0
  22. package/esm2020/lib/_internal/objects/api.mjs +1846 -0
  23. package/esm2020/lib/_internal/objects/attributes.mjs +158 -0
  24. package/esm2020/lib/_internal/objects/field-mask.mjs +27 -0
  25. package/esm2020/lib/_internal/objects/index.mjs +16 -0
  26. package/esm2020/lib/_internal/objects/policies.mjs +264 -0
  27. package/esm2020/lib/_internal/objects/resources.mjs +168 -0
  28. package/esm2020/lib/_internal/objects/security-logs.mjs +42 -0
  29. package/esm2020/lib/_internal/objects/subjects.mjs +352 -0
  30. package/esm2020/lib/_internal/objects/users.mjs +168 -0
  31. package/esm2020/lib/_internal/user-iam.api.service.mjs +65 -0
  32. package/esm2020/lib/http/http.interface.mjs +2 -0
  33. package/esm2020/lib/http/http.mjs +104 -0
  34. package/esm2020/lib/http/iam.http.api.service.mjs +67 -0
  35. package/esm2020/lib/iam.service.mjs +155 -0
  36. package/esm2020/lib/index.mjs +7 -0
  37. package/esm2020/lib/personas/account-group.mjs +9 -0
  38. package/esm2020/lib/personas/base-personas.mjs +93 -0
  39. package/esm2020/lib/personas/developer.mjs +9 -0
  40. package/esm2020/lib/personas/digital-agent.mjs +9 -0
  41. package/esm2020/lib/personas/index.mjs +12 -0
  42. package/esm2020/lib/personas/partner-app.mjs +9 -0
  43. package/esm2020/lib/personas/partner.mjs +25 -0
  44. package/esm2020/lib/personas/persona-type.enum.mjs +13 -0
  45. package/esm2020/lib/personas/personas.mjs +57 -0
  46. package/esm2020/lib/personas/salesperson.mjs +15 -0
  47. package/esm2020/lib/personas/smb.mjs +10 -0
  48. package/esm2020/lib/personas/success.mjs +9 -0
  49. package/esm2020/lib/personas/vendor.mjs +9 -0
  50. package/esm2020/public_api.mjs +2 -0
  51. package/esm2020/vendasta-iam.mjs +5 -0
  52. package/fesm2015/{vendasta-iam.js → vendasta-iam.mjs} +683 -1244
  53. package/fesm2015/vendasta-iam.mjs.map +1 -0
  54. package/fesm2020/vendasta-iam.mjs +3937 -0
  55. package/fesm2020/vendasta-iam.mjs.map +1 -0
  56. package/lib/_generated/host.service.d.ts +5 -9
  57. package/lib/_internal/enums/index.d.ts +2 -1
  58. package/lib/_internal/enums/policies.enum.d.ts +9 -0
  59. package/lib/_internal/enums/resources.enum.d.ts +0 -9
  60. package/lib/_internal/iam.api.service.d.ts +4 -0
  61. package/lib/_internal/index.d.ts +0 -1
  62. package/lib/_internal/interfaces/annotations.interface.d.ts +4 -0
  63. package/lib/_internal/interfaces/api.interface.d.ts +5 -17
  64. package/lib/_internal/interfaces/attributes.interface.d.ts +26 -0
  65. package/lib/_internal/interfaces/index.d.ts +6 -3
  66. package/lib/_internal/interfaces/policies.interface.d.ts +42 -0
  67. package/lib/_internal/interfaces/resources.interface.d.ts +2 -41
  68. package/lib/_internal/interfaces/subjects.interface.d.ts +1 -26
  69. package/lib/_internal/objects/annotations.d.ts +9 -0
  70. package/lib/_internal/objects/api.d.ts +5 -23
  71. package/lib/_internal/objects/attributes.d.ts +43 -0
  72. package/lib/_internal/objects/index.d.ts +6 -3
  73. package/lib/_internal/objects/policies.d.ts +68 -0
  74. package/lib/_internal/objects/resources.d.ts +2 -65
  75. package/lib/_internal/objects/subjects.d.ts +1 -41
  76. package/lib/_internal/user-iam.api.service.d.ts +4 -0
  77. package/lib/http/iam.http.api.service.d.ts +4 -0
  78. package/lib/iam.service.d.ts +3 -0
  79. package/lib/personas/base-personas.d.ts +1 -1
  80. package/lib/personas/partner.d.ts +1 -0
  81. package/package.json +29 -16
  82. package/src/README.md +113 -0
  83. package/vendasta-iam.d.ts +1 -0
  84. package/bundles/vendasta-iam.umd.js +0 -5067
  85. package/bundles/vendasta-iam.umd.js.map +0 -1
  86. package/bundles/vendasta-iam.umd.min.js +0 -16
  87. package/bundles/vendasta-iam.umd.min.js.map +0 -1
  88. package/esm2015/lib/_generated/host.service.js +0 -65
  89. package/esm2015/lib/_generated/index.js +0 -2
  90. package/esm2015/lib/_internal/enums/api.enum.js +0 -22
  91. package/esm2015/lib/_internal/enums/index.js +0 -11
  92. package/esm2015/lib/_internal/enums/resources.enum.js +0 -25
  93. package/esm2015/lib/_internal/enums/subjects.enum.js +0 -17
  94. package/esm2015/lib/_internal/enums/users.enum.js +0 -13
  95. package/esm2015/lib/_internal/iam-sso.api.service.js +0 -42
  96. package/esm2015/lib/_internal/iam.api.service.js +0 -190
  97. package/esm2015/lib/_internal/index.js +0 -13
  98. package/esm2015/lib/_internal/interfaces/api.interface.js +0 -2
  99. package/esm2015/lib/_internal/interfaces/field-mask.interface.js +0 -8
  100. package/esm2015/lib/_internal/interfaces/index.js +0 -2
  101. package/esm2015/lib/_internal/interfaces/resources.interface.js +0 -2
  102. package/esm2015/lib/_internal/interfaces/security-logs.interface.js +0 -8
  103. package/esm2015/lib/_internal/interfaces/subjects.interface.js +0 -8
  104. package/esm2015/lib/_internal/interfaces/users.interface.js +0 -2
  105. package/esm2015/lib/_internal/objects/api.js +0 -2212
  106. package/esm2015/lib/_internal/objects/field-mask.js +0 -30
  107. package/esm2015/lib/_internal/objects/index.js +0 -13
  108. package/esm2015/lib/_internal/objects/resources.js +0 -483
  109. package/esm2015/lib/_internal/objects/security-logs.js +0 -49
  110. package/esm2015/lib/_internal/objects/subjects.js +0 -582
  111. package/esm2015/lib/_internal/objects/users.js +0 -199
  112. package/esm2015/lib/_internal/user-iam.api.service.js +0 -66
  113. package/esm2015/lib/http/http.interface.js +0 -2
  114. package/esm2015/lib/http/http.js +0 -102
  115. package/esm2015/lib/http/iam.http.api.service.js +0 -68
  116. package/esm2015/lib/iam.service.js +0 -156
  117. package/esm2015/lib/index.js +0 -7
  118. package/esm2015/lib/personas/account-group.js +0 -9
  119. package/esm2015/lib/personas/base-personas.js +0 -89
  120. package/esm2015/lib/personas/developer.js +0 -9
  121. package/esm2015/lib/personas/digital-agent.js +0 -9
  122. package/esm2015/lib/personas/index.js +0 -12
  123. package/esm2015/lib/personas/partner-app.js +0 -9
  124. package/esm2015/lib/personas/partner.js +0 -24
  125. package/esm2015/lib/personas/persona-type.enum.js +0 -13
  126. package/esm2015/lib/personas/personas.js +0 -57
  127. package/esm2015/lib/personas/salesperson.js +0 -15
  128. package/esm2015/lib/personas/smb.js +0 -10
  129. package/esm2015/lib/personas/success.js +0 -9
  130. package/esm2015/lib/personas/vendor.js +0 -9
  131. package/esm2015/public_api.js +0 -2
  132. package/esm2015/vendasta-iam.js +0 -5
  133. package/fesm2015/vendasta-iam.js.map +0 -1
  134. package/lib/_internal/iam-sso.api.service.d.ts +0 -12
  135. package/vendasta-iam.metadata.json +0 -1
@@ -1,582 +0,0 @@
1
- import * as e from '../enums';
2
- export function enumStringToValue(enumRef, value) {
3
- if (typeof value === 'number') {
4
- return value;
5
- }
6
- return enumRef[value];
7
- }
8
- export class Attribute {
9
- constructor(kwargs) {
10
- if (!kwargs) {
11
- return;
12
- }
13
- Object.assign(this, kwargs);
14
- }
15
- static fromProto(proto) {
16
- let m = new Attribute();
17
- m = Object.assign(m, proto);
18
- if (proto.intAttribute) {
19
- m.intAttribute = parseInt(proto.intAttribute, 10);
20
- }
21
- if (proto.structAttribute) {
22
- m.structAttribute = StructAttribute.fromProto(proto.structAttribute);
23
- }
24
- if (proto.listAttribute) {
25
- m.listAttribute = ListAttribute.fromProto(proto.listAttribute);
26
- }
27
- if (proto.timestampAttribute) {
28
- m.timestampAttribute = new Date(proto.timestampAttribute);
29
- }
30
- if (proto.geopointAttribute) {
31
- m.geopointAttribute = GeoPointAttribute.fromProto(proto.geopointAttribute);
32
- }
33
- return m;
34
- }
35
- toApiJson() {
36
- if (typeof this.intAttribute === 'undefined' &&
37
- typeof this.doubleAttribute === 'undefined' &&
38
- typeof this.stringAttribute === 'undefined' &&
39
- typeof this.boolAttribute === 'undefined' &&
40
- typeof this.structAttribute === 'undefined' &&
41
- typeof this.listAttribute === 'undefined' &&
42
- typeof this.timestampAttribute === 'undefined' &&
43
- typeof this.geopointAttribute === 'undefined') {
44
- return {};
45
- }
46
- const toReturn = {};
47
- if (typeof this.intAttribute !== 'undefined') {
48
- toReturn['intAttribute'] = this.intAttribute;
49
- }
50
- if (typeof this.doubleAttribute !== 'undefined') {
51
- toReturn['doubleAttribute'] = this.doubleAttribute;
52
- }
53
- if (typeof this.stringAttribute !== 'undefined') {
54
- toReturn['stringAttribute'] = this.stringAttribute;
55
- }
56
- if (typeof this.boolAttribute !== 'undefined') {
57
- toReturn['boolAttribute'] = this.boolAttribute;
58
- }
59
- if (typeof this.structAttribute !== 'undefined' && this.structAttribute !== null) {
60
- toReturn['structAttribute'] = 'toApiJson' in this.structAttribute ? this.structAttribute.toApiJson() : this.structAttribute;
61
- }
62
- if (typeof this.listAttribute !== 'undefined' && this.listAttribute !== null) {
63
- toReturn['listAttribute'] = 'toApiJson' in this.listAttribute ? this.listAttribute.toApiJson() : this.listAttribute;
64
- }
65
- if (typeof this.timestampAttribute !== 'undefined' && this.timestampAttribute !== null) {
66
- toReturn['timestampAttribute'] = 'toApiJson' in this.timestampAttribute ? this.timestampAttribute.toApiJson() : this.timestampAttribute;
67
- }
68
- if (typeof this.geopointAttribute !== 'undefined' && this.geopointAttribute !== null) {
69
- toReturn['geopointAttribute'] = 'toApiJson' in this.geopointAttribute ? this.geopointAttribute.toApiJson() : this.geopointAttribute;
70
- }
71
- return toReturn;
72
- }
73
- }
74
- export class StructAttributeAttributesEntry {
75
- constructor(kwargs) {
76
- if (!kwargs) {
77
- return;
78
- }
79
- Object.assign(this, kwargs);
80
- }
81
- static fromProto(proto) {
82
- let m = new StructAttributeAttributesEntry();
83
- m = Object.assign(m, proto);
84
- if (proto.value) {
85
- m.value = Attribute.fromProto(proto.value);
86
- }
87
- return m;
88
- }
89
- toApiJson() {
90
- if (typeof this.key === 'undefined' &&
91
- typeof this.value === 'undefined') {
92
- return {};
93
- }
94
- const toReturn = {};
95
- if (typeof this.key !== 'undefined') {
96
- toReturn['key'] = this.key;
97
- }
98
- if (typeof this.value !== 'undefined' && this.value !== null) {
99
- toReturn['value'] = 'toApiJson' in this.value ? this.value.toApiJson() : this.value;
100
- }
101
- return toReturn;
102
- }
103
- }
104
- export class Context {
105
- constructor(kwargs) {
106
- if (!kwargs) {
107
- return;
108
- }
109
- Object.assign(this, kwargs);
110
- }
111
- static fromProto(proto) {
112
- let m = new Context();
113
- m = Object.assign(m, proto);
114
- if (proto.namespaced) {
115
- m.namespaced = NamespacedContext.fromProto(proto.namespaced);
116
- }
117
- if (proto.typed) {
118
- m.typed = TypedContext.fromProto(proto.typed);
119
- }
120
- return m;
121
- }
122
- toApiJson() {
123
- if (typeof this.namespaced === 'undefined' &&
124
- typeof this.typed === 'undefined') {
125
- return {};
126
- }
127
- const toReturn = {};
128
- if (typeof this.namespaced !== 'undefined' && this.namespaced !== null) {
129
- toReturn['namespaced'] = 'toApiJson' in this.namespaced ? this.namespaced.toApiJson() : this.namespaced;
130
- }
131
- if (typeof this.typed !== 'undefined' && this.typed !== null) {
132
- toReturn['typed'] = 'toApiJson' in this.typed ? this.typed.toApiJson() : this.typed;
133
- }
134
- return toReturn;
135
- }
136
- }
137
- export class GeoPointAttribute {
138
- constructor(kwargs) {
139
- if (!kwargs) {
140
- return;
141
- }
142
- Object.assign(this, kwargs);
143
- }
144
- static fromProto(proto) {
145
- let m = new GeoPointAttribute();
146
- m = Object.assign(m, proto);
147
- return m;
148
- }
149
- toApiJson() {
150
- if (typeof this.latitude === 'undefined' &&
151
- typeof this.longitude === 'undefined') {
152
- return {};
153
- }
154
- const toReturn = {};
155
- if (typeof this.latitude !== 'undefined') {
156
- toReturn['latitude'] = this.latitude;
157
- }
158
- if (typeof this.longitude !== 'undefined') {
159
- toReturn['longitude'] = this.longitude;
160
- }
161
- return toReturn;
162
- }
163
- }
164
- export class ListAttribute {
165
- constructor(kwargs) {
166
- if (!kwargs) {
167
- return;
168
- }
169
- Object.assign(this, kwargs);
170
- }
171
- static fromProto(proto) {
172
- let m = new ListAttribute();
173
- m = Object.assign(m, proto);
174
- if (proto.attributes) {
175
- m.attributes = proto.attributes.map(Attribute.fromProto);
176
- }
177
- return m;
178
- }
179
- toApiJson() {
180
- if (typeof this.attributes === 'undefined') {
181
- return {};
182
- }
183
- const toReturn = {};
184
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
185
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
186
- }
187
- return toReturn;
188
- }
189
- }
190
- export class MultiValueAttribute {
191
- constructor(kwargs) {
192
- if (!kwargs) {
193
- return;
194
- }
195
- Object.assign(this, kwargs);
196
- }
197
- static fromProto(proto) {
198
- let m = new MultiValueAttribute();
199
- m = Object.assign(m, proto);
200
- return m;
201
- }
202
- toApiJson() {
203
- if (typeof this.key === 'undefined' &&
204
- typeof this.values === 'undefined') {
205
- return {};
206
- }
207
- const toReturn = {};
208
- if (typeof this.key !== 'undefined') {
209
- toReturn['key'] = this.key;
210
- }
211
- if (typeof this.values !== 'undefined') {
212
- toReturn['values'] = this.values;
213
- }
214
- return toReturn;
215
- }
216
- }
217
- export class Mutation {
218
- constructor(kwargs) {
219
- if (!kwargs) {
220
- return;
221
- }
222
- Object.assign(this, kwargs);
223
- }
224
- static fromProto(proto) {
225
- let m = new Mutation();
226
- m = Object.assign(m, proto);
227
- if (proto.add) {
228
- m.add = SingleValueAttribute.fromProto(proto.add);
229
- }
230
- if (proto.replace) {
231
- m.replace = MultiValueAttribute.fromProto(proto.replace);
232
- }
233
- if (proto.remove) {
234
- m.remove = SingleValueAttribute.fromProto(proto.remove);
235
- }
236
- if (proto.replaceAttributes) {
237
- m.replaceAttributes = StructAttribute.fromProto(proto.replaceAttributes);
238
- }
239
- if (proto.addAttributes) {
240
- m.addAttributes = StructAttribute.fromProto(proto.addAttributes);
241
- }
242
- if (proto.removeAttributes) {
243
- m.removeAttributes = StructAttribute.fromProto(proto.removeAttributes);
244
- }
245
- return m;
246
- }
247
- toApiJson() {
248
- if (typeof this.add === 'undefined' &&
249
- typeof this.replace === 'undefined' &&
250
- typeof this.remove === 'undefined' &&
251
- typeof this.dropKey === 'undefined' &&
252
- typeof this.replaceAttributes === 'undefined' &&
253
- typeof this.addAttributes === 'undefined' &&
254
- typeof this.removeAttributes === 'undefined') {
255
- return {};
256
- }
257
- const toReturn = {};
258
- if (typeof this.add !== 'undefined' && this.add !== null) {
259
- toReturn['add'] = 'toApiJson' in this.add ? this.add.toApiJson() : this.add;
260
- }
261
- if (typeof this.replace !== 'undefined' && this.replace !== null) {
262
- toReturn['replace'] = 'toApiJson' in this.replace ? this.replace.toApiJson() : this.replace;
263
- }
264
- if (typeof this.remove !== 'undefined' && this.remove !== null) {
265
- toReturn['remove'] = 'toApiJson' in this.remove ? this.remove.toApiJson() : this.remove;
266
- }
267
- if (typeof this.dropKey !== 'undefined') {
268
- toReturn['dropKey'] = this.dropKey;
269
- }
270
- if (typeof this.replaceAttributes !== 'undefined' && this.replaceAttributes !== null) {
271
- toReturn['replaceAttributes'] = 'toApiJson' in this.replaceAttributes ? this.replaceAttributes.toApiJson() : this.replaceAttributes;
272
- }
273
- if (typeof this.addAttributes !== 'undefined' && this.addAttributes !== null) {
274
- toReturn['addAttributes'] = 'toApiJson' in this.addAttributes ? this.addAttributes.toApiJson() : this.addAttributes;
275
- }
276
- if (typeof this.removeAttributes !== 'undefined' && this.removeAttributes !== null) {
277
- toReturn['removeAttributes'] = 'toApiJson' in this.removeAttributes ? this.removeAttributes.toApiJson() : this.removeAttributes;
278
- }
279
- return toReturn;
280
- }
281
- }
282
- export class NamespacedContext {
283
- constructor(kwargs) {
284
- if (!kwargs) {
285
- return;
286
- }
287
- Object.assign(this, kwargs);
288
- }
289
- static fromProto(proto) {
290
- let m = new NamespacedContext();
291
- m = Object.assign(m, proto);
292
- return m;
293
- }
294
- toApiJson() {
295
- if (typeof this.namespace === 'undefined' &&
296
- typeof this.type === 'undefined') {
297
- return {};
298
- }
299
- const toReturn = {};
300
- if (typeof this.namespace !== 'undefined') {
301
- toReturn['namespace'] = this.namespace;
302
- }
303
- if (typeof this.type !== 'undefined') {
304
- toReturn['type'] = this.type;
305
- }
306
- return toReturn;
307
- }
308
- }
309
- export class Persona {
310
- constructor(kwargs) {
311
- if (!kwargs) {
312
- return;
313
- }
314
- Object.assign(this, kwargs);
315
- }
316
- static fromProto(proto) {
317
- let m = new Persona();
318
- m = Object.assign(m, proto);
319
- if (proto.subject) {
320
- m.subject = Subject.fromProto(proto.subject);
321
- }
322
- if (proto.context) {
323
- m.context = Context.fromProto(proto.context);
324
- }
325
- return m;
326
- }
327
- toApiJson() {
328
- if (typeof this.subject === 'undefined' &&
329
- typeof this.context === 'undefined') {
330
- return {};
331
- }
332
- const toReturn = {};
333
- if (typeof this.subject !== 'undefined' && this.subject !== null) {
334
- toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
335
- }
336
- if (typeof this.context !== 'undefined' && this.context !== null) {
337
- toReturn['context'] = 'toApiJson' in this.context ? this.context.toApiJson() : this.context;
338
- }
339
- return toReturn;
340
- }
341
- }
342
- export class PublicKey {
343
- constructor(kwargs) {
344
- if (!kwargs) {
345
- return;
346
- }
347
- Object.assign(this, kwargs);
348
- }
349
- static fromProto(proto) {
350
- let m = new PublicKey();
351
- m = Object.assign(m, proto);
352
- if (proto.algorithmType) {
353
- m.algorithmType = enumStringToValue(e.AlgorithmType, proto.algorithmType);
354
- }
355
- return m;
356
- }
357
- toApiJson() {
358
- if (typeof this.key === 'undefined' &&
359
- typeof this.id === 'undefined' &&
360
- typeof this.algorithmType === 'undefined') {
361
- return {};
362
- }
363
- const toReturn = {};
364
- if (typeof this.key !== 'undefined') {
365
- toReturn['key'] = this.key;
366
- }
367
- if (typeof this.id !== 'undefined') {
368
- toReturn['id'] = this.id;
369
- }
370
- if (typeof this.algorithmType !== 'undefined') {
371
- toReturn['algorithmType'] = this.algorithmType;
372
- }
373
- return toReturn;
374
- }
375
- }
376
- export class Query {
377
- constructor(kwargs) {
378
- if (!kwargs) {
379
- return;
380
- }
381
- Object.assign(this, kwargs);
382
- }
383
- static fromProto(proto) {
384
- let m = new Query();
385
- m = Object.assign(m, proto);
386
- return m;
387
- }
388
- toApiJson() {
389
- if (typeof this.searchTerm === 'undefined' &&
390
- typeof this.attributeKeys === 'undefined') {
391
- return {};
392
- }
393
- const toReturn = {};
394
- if (typeof this.searchTerm !== 'undefined') {
395
- toReturn['searchTerm'] = this.searchTerm;
396
- }
397
- if (typeof this.attributeKeys !== 'undefined') {
398
- toReturn['attributeKeys'] = this.attributeKeys;
399
- }
400
- return toReturn;
401
- }
402
- }
403
- export class SingleValueAttribute {
404
- constructor(kwargs) {
405
- if (!kwargs) {
406
- return;
407
- }
408
- Object.assign(this, kwargs);
409
- }
410
- static fromProto(proto) {
411
- let m = new SingleValueAttribute();
412
- m = Object.assign(m, proto);
413
- return m;
414
- }
415
- toApiJson() {
416
- if (typeof this.key === 'undefined' &&
417
- typeof this.value === 'undefined') {
418
- return {};
419
- }
420
- const toReturn = {};
421
- if (typeof this.key !== 'undefined') {
422
- toReturn['key'] = this.key;
423
- }
424
- if (typeof this.value !== 'undefined') {
425
- toReturn['value'] = this.value;
426
- }
427
- return toReturn;
428
- }
429
- }
430
- export class StructAttribute {
431
- constructor(kwargs) {
432
- if (!kwargs) {
433
- return;
434
- }
435
- Object.assign(this, kwargs);
436
- }
437
- static fromProto(proto) {
438
- let m = new StructAttribute();
439
- m = Object.assign(m, proto);
440
- if (proto.attributes) {
441
- m.attributes = Object.keys(proto.attributes).reduce((obj, k) => { obj[k] = Attribute.fromProto(proto.attributes[k]); return obj; }, {});
442
- }
443
- return m;
444
- }
445
- toApiJson() {
446
- if (typeof this.attributes === 'undefined') {
447
- return {};
448
- }
449
- const toReturn = {};
450
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
451
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
452
- }
453
- return toReturn;
454
- }
455
- }
456
- export class Subject {
457
- constructor(kwargs) {
458
- if (!kwargs) {
459
- return;
460
- }
461
- Object.assign(this, kwargs);
462
- }
463
- static fromProto(proto) {
464
- let m = new Subject();
465
- m = Object.assign(m, proto);
466
- if (proto.attributes) {
467
- m.attributes = proto.attributes.map(MultiValueAttribute.fromProto);
468
- }
469
- if (proto.created) {
470
- m.created = new Date(proto.created);
471
- }
472
- if (proto.updated) {
473
- m.updated = new Date(proto.updated);
474
- }
475
- if (proto.lastLogin) {
476
- m.lastLogin = new Date(proto.lastLogin);
477
- }
478
- if (proto.publicKeys) {
479
- m.publicKeys = proto.publicKeys.map(PublicKey.fromProto);
480
- }
481
- if (proto.structAttributes) {
482
- m.structAttributes = StructAttribute.fromProto(proto.structAttributes);
483
- }
484
- return m;
485
- }
486
- toApiJson() {
487
- if (typeof this.subjectId === 'undefined' &&
488
- typeof this.email === 'undefined' &&
489
- typeof this.userId === 'undefined' &&
490
- typeof this.partnerId === 'undefined' &&
491
- typeof this.attributes === 'undefined' &&
492
- typeof this.created === 'undefined' &&
493
- typeof this.updated === 'undefined' &&
494
- typeof this.lastLogin === 'undefined' &&
495
- typeof this.publicKeys === 'undefined' &&
496
- typeof this.structAttributes === 'undefined') {
497
- return {};
498
- }
499
- const toReturn = {};
500
- if (typeof this.subjectId !== 'undefined') {
501
- toReturn['subjectId'] = this.subjectId;
502
- }
503
- if (typeof this.email !== 'undefined') {
504
- toReturn['email'] = this.email;
505
- }
506
- if (typeof this.userId !== 'undefined') {
507
- toReturn['userId'] = this.userId;
508
- }
509
- if (typeof this.partnerId !== 'undefined') {
510
- toReturn['partnerId'] = this.partnerId;
511
- }
512
- if (typeof this.attributes !== 'undefined' && this.attributes !== null) {
513
- toReturn['attributes'] = 'toApiJson' in this.attributes ? this.attributes.toApiJson() : this.attributes;
514
- }
515
- if (typeof this.created !== 'undefined' && this.created !== null) {
516
- toReturn['created'] = 'toApiJson' in this.created ? this.created.toApiJson() : this.created;
517
- }
518
- if (typeof this.updated !== 'undefined' && this.updated !== null) {
519
- toReturn['updated'] = 'toApiJson' in this.updated ? this.updated.toApiJson() : this.updated;
520
- }
521
- if (typeof this.lastLogin !== 'undefined' && this.lastLogin !== null) {
522
- toReturn['lastLogin'] = 'toApiJson' in this.lastLogin ? this.lastLogin.toApiJson() : this.lastLogin;
523
- }
524
- if (typeof this.publicKeys !== 'undefined' && this.publicKeys !== null) {
525
- toReturn['publicKeys'] = 'toApiJson' in this.publicKeys ? this.publicKeys.toApiJson() : this.publicKeys;
526
- }
527
- if (typeof this.structAttributes !== 'undefined' && this.structAttributes !== null) {
528
- toReturn['structAttributes'] = 'toApiJson' in this.structAttributes ? this.structAttributes.toApiJson() : this.structAttributes;
529
- }
530
- return toReturn;
531
- }
532
- }
533
- export class SubjectResult {
534
- constructor(kwargs) {
535
- if (!kwargs) {
536
- return;
537
- }
538
- Object.assign(this, kwargs);
539
- }
540
- static fromProto(proto) {
541
- let m = new SubjectResult();
542
- m = Object.assign(m, proto);
543
- if (proto.subject) {
544
- m.subject = Subject.fromProto(proto.subject);
545
- }
546
- return m;
547
- }
548
- toApiJson() {
549
- if (typeof this.subject === 'undefined') {
550
- return {};
551
- }
552
- const toReturn = {};
553
- if (typeof this.subject !== 'undefined' && this.subject !== null) {
554
- toReturn['subject'] = 'toApiJson' in this.subject ? this.subject.toApiJson() : this.subject;
555
- }
556
- return toReturn;
557
- }
558
- }
559
- export class TypedContext {
560
- constructor(kwargs) {
561
- if (!kwargs) {
562
- return;
563
- }
564
- Object.assign(this, kwargs);
565
- }
566
- static fromProto(proto) {
567
- let m = new TypedContext();
568
- m = Object.assign(m, proto);
569
- return m;
570
- }
571
- toApiJson() {
572
- if (typeof this.type === 'undefined') {
573
- return {};
574
- }
575
- const toReturn = {};
576
- if (typeof this.type !== 'undefined') {
577
- toReturn['type'] = this.type;
578
- }
579
- return toReturn;
580
- }
581
- }
582
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViamVjdHMuanMiLCJzb3VyY2VSb290IjoiL2NvZGVmcmVzaC92b2x1bWUvSUFNL3Nka3MvdHlwZXNjcmlwdC9zcmMvaWFtX3Nkay9zcmMvIiwic291cmNlcyI6WyJsaWIvX2ludGVybmFsL29iamVjdHMvc3ViamVjdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxLQUFLLENBQUMsTUFBTSxVQUFVLENBQUM7QUFFOUIsTUFBTSxVQUFVLGlCQUFpQixDQUFJLE9BQVksRUFBRSxLQUFhO0lBQzlELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFxQmxCLFlBQVksTUFBNkI7UUFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU87U0FDVjtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFoQkQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFVO1FBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FBQztRQUM1RSxJQUFJLEtBQUssQ0FBQyxlQUFlLEVBQUU7WUFBQyxDQUFDLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQUM7UUFDbEcsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQUMsQ0FBQyxDQUFDLGFBQWEsR0FB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Z0M7UUFDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU87U0FDVjtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFYRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxDQUFDLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDNUIsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBU0QsU0FBUztRQUNMLElBQ0ksT0FBTyxJQUFJLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtZQUNsQyxPQUFPLEVBQUUsQ0FBQztTQUNiO1FBRUQsTUFBTSxRQUFRLEdBRVYsRUFBRSxDQUFDO1FBRVAsSUFBSSxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7U0FBQztRQUNyRSxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vIENvZGUgZ2VuZXJhdGVkIGJ5IHNka2dlblxuLy8gRE8gTk9UIEVESVQhLlxuLy9cbi8vIE9iamVjdHMuXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmltcG9ydCAqIGFzIGkgZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCAqIGFzIGUgZnJvbSAnLi4vZW51bXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZW51bVN0cmluZ1RvVmFsdWU8RT4oZW51bVJlZjogYW55LCB2YWx1ZTogc3RyaW5nKTogRSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIHJldHVybiBlbnVtUmVmW3ZhbHVlXTtcbn1cblxuZXhwb3J0IGNsYXNzIEF0dHJpYnV0ZSBpbXBsZW1lbnRzIGkuQXR0cmlidXRlSW50ZXJmYWNlIHtcbiAgICBpbnRBdHRyaWJ1dGU6IG51bWJlcjtcbiAgICBkb3VibGVBdHRyaWJ1dGU6IG51bWJlcjtcbiAgICBzdHJpbmdBdHRyaWJ1dGU6IHN0cmluZztcbiAgICBib29sQXR0cmlidXRlOiBib29sZWFuO1xuICAgIHN0cnVjdEF0dHJpYnV0ZTogU3RydWN0QXR0cmlidXRlO1xuICAgIGxpc3RBdHRyaWJ1dGU6IExpc3RBdHRyaWJ1dGU7XG4gICAgdGltZXN0YW1wQXR0cmlidXRlOiBEYXRlO1xuICAgIGdlb3BvaW50QXR0cmlidXRlOiBHZW9Qb2ludEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEF0dHJpYnV0ZSB7XG4gICAgICAgIGxldCBtID0gbmV3IEF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5pbnRBdHRyaWJ1dGUpIHttLmludEF0dHJpYnV0ZSA9IHBhcnNlSW50KHByb3RvLmludEF0dHJpYnV0ZSwgMTApO31cbiAgICAgICAgaWYgKHByb3RvLnN0cnVjdEF0dHJpYnV0ZSkge20uc3RydWN0QXR0cmlidXRlID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5zdHJ1Y3RBdHRyaWJ1dGUpO31cbiAgICAgICAgaWYgKHByb3RvLmxpc3RBdHRyaWJ1dGUpIHttLmxpc3RBdHRyaWJ1dGUgPSBMaXN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5saXN0QXR0cmlidXRlKTt9XG4gICAgICAgIGlmIChwcm90by50aW1lc3RhbXBBdHRyaWJ1dGUpIHttLnRpbWVzdGFtcEF0dHJpYnV0ZSA9IG5ldyBEYXRlKHByb3RvLnRpbWVzdGFtcEF0dHJpYnV0ZSk7fVxuICAgICAgICBpZiAocHJvdG8uZ2VvcG9pbnRBdHRyaWJ1dGUpIHttLmdlb3BvaW50QXR0cmlidXRlID0gR2VvUG9pbnRBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLmdlb3BvaW50QXR0cmlidXRlKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQXR0cmlidXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5pbnRBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5kb3VibGVBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zdHJpbmdBdHRyaWJ1dGUgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5ib29sQXR0cmlidXRlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc3RydWN0QXR0cmlidXRlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMubGlzdEF0dHJpYnV0ZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnRpbWVzdGFtcEF0dHJpYnV0ZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmdlb3BvaW50QXR0cmlidXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaW50QXR0cmlidXRlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpbnRBdHRyaWJ1dGUnXSA9IHRoaXMuaW50QXR0cmlidXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmRvdWJsZUF0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnZG91YmxlQXR0cmlidXRlJ10gPSB0aGlzLmRvdWJsZUF0dHJpYnV0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdHJpbmdBdHRyaWJ1dGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3N0cmluZ0F0dHJpYnV0ZSddID0gdGhpcy5zdHJpbmdBdHRyaWJ1dGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYm9vbEF0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYm9vbEF0dHJpYnV0ZSddID0gdGhpcy5ib29sQXR0cmlidXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnN0cnVjdEF0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5zdHJ1Y3RBdHRyaWJ1dGUgIT09IG51bGwpIHt0b1JldHVyblsnc3RydWN0QXR0cmlidXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnN0cnVjdEF0dHJpYnV0ZSA/ICh0aGlzLnN0cnVjdEF0dHJpYnV0ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdHJ1Y3RBdHRyaWJ1dGU7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubGlzdEF0dHJpYnV0ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5saXN0QXR0cmlidXRlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2xpc3RBdHRyaWJ1dGUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubGlzdEF0dHJpYnV0ZSA/ICh0aGlzLmxpc3RBdHRyaWJ1dGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubGlzdEF0dHJpYnV0ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudGltZXN0YW1wQXR0cmlidXRlICE9PSBudWxsKSB7dG9SZXR1cm5bJ3RpbWVzdGFtcEF0dHJpYnV0ZSddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUgPyAodGhpcy50aW1lc3RhbXBBdHRyaWJ1dGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMudGltZXN0YW1wQXR0cmlidXRlO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdlb3BvaW50QXR0cmlidXRlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmdlb3BvaW50QXR0cmlidXRlICE9PSBudWxsKSB7dG9SZXR1cm5bJ2dlb3BvaW50QXR0cmlidXRlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmdlb3BvaW50QXR0cmlidXRlID8gKHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGUgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuZ2VvcG9pbnRBdHRyaWJ1dGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RydWN0QXR0cmlidXRlQXR0cmlidXRlc0VudHJ5IGltcGxlbWVudHMgaS5TdHJ1Y3RBdHRyaWJ1dGVBdHRyaWJ1dGVzRW50cnlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlOiBBdHRyaWJ1dGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTdHJ1Y3RBdHRyaWJ1dGVBdHRyaWJ1dGVzRW50cnkge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdHJ1Y3RBdHRyaWJ1dGVBdHRyaWJ1dGVzRW50cnkoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8udmFsdWUpIHttLnZhbHVlID0gQXR0cmlidXRlLmZyb21Qcm90byhwcm90by52YWx1ZSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlN0cnVjdEF0dHJpYnV0ZUF0dHJpYnV0ZXNFbnRyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMua2V5ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5rZXkgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2tleSddID0gdGhpcy5rZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudmFsdWUgIT09ICd1bmRlZmluZWQnICYmIHRoaXMudmFsdWUgIT09IG51bGwpIHt0b1JldHVyblsndmFsdWUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMudmFsdWUgPyAodGhpcy52YWx1ZSBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy52YWx1ZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb250ZXh0IGltcGxlbWVudHMgaS5Db250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2VkOiBOYW1lc3BhY2VkQ29udGV4dDtcbiAgICB0eXBlZDogVHlwZWRDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IENvbnRleHQoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8ubmFtZXNwYWNlZCkge20ubmFtZXNwYWNlZCA9IE5hbWVzcGFjZWRDb250ZXh0LmZyb21Qcm90byhwcm90by5uYW1lc3BhY2VkKTt9XG4gICAgICAgIGlmIChwcm90by50eXBlZCkge20udHlwZWQgPSBUeXBlZENvbnRleHQuZnJvbVByb3RvKHByb3RvLnR5cGVkKTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMubmFtZXNwYWNlZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnR5cGVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMubmFtZXNwYWNlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5uYW1lc3BhY2VkICE9PSBudWxsKSB7dG9SZXR1cm5bJ25hbWVzcGFjZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMubmFtZXNwYWNlZCA/ICh0aGlzLm5hbWVzcGFjZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMubmFtZXNwYWNlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy50eXBlZCAhPT0gbnVsbCkge3RvUmV0dXJuWyd0eXBlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy50eXBlZCA/ICh0aGlzLnR5cGVkIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnR5cGVkO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdlb1BvaW50QXR0cmlidXRlIGltcGxlbWVudHMgaS5HZW9Qb2ludEF0dHJpYnV0ZUludGVyZmFjZSB7XG4gICAgbGF0aXR1ZGU6IG51bWJlcjtcbiAgICBsb25naXR1ZGU6IG51bWJlcjtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IEdlb1BvaW50QXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgR2VvUG9pbnRBdHRyaWJ1dGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkdlb1BvaW50QXR0cmlidXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5sYXRpdHVkZSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmxvbmdpdHVkZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxhdGl0dWRlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydsYXRpdHVkZSddID0gdGhpcy5sYXRpdHVkZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5sb25naXR1ZGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ2xvbmdpdHVkZSddID0gdGhpcy5sb25naXR1ZGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGlzdEF0dHJpYnV0ZSBpbXBsZW1lbnRzIGkuTGlzdEF0dHJpYnV0ZUludGVyZmFjZSB7XG4gICAgYXR0cmlidXRlczogQXR0cmlidXRlW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBMaXN0QXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTGlzdEF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5hdHRyaWJ1dGVzKSB7bS5hdHRyaWJ1dGVzID0gcHJvdG8uYXR0cmlidXRlcy5tYXAoQXR0cmlidXRlLmZyb21Qcm90byk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLkxpc3RBdHRyaWJ1dGVJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnYXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hdHRyaWJ1dGVzID8gKHRoaXMuYXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hdHRyaWJ1dGVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpVmFsdWVBdHRyaWJ1dGUgaW1wbGVtZW50cyBpLk11bHRpVmFsdWVBdHRyaWJ1dGVJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIHZhbHVlczogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBNdWx0aVZhbHVlQXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgTXVsdGlWYWx1ZUF0dHJpYnV0ZSgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuTXVsdGlWYWx1ZUF0dHJpYnV0ZUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMua2V5ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudmFsdWVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlcyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWVzJ10gPSB0aGlzLnZhbHVlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbiBpbXBsZW1lbnRzIGkuTXV0YXRpb25JbnRlcmZhY2Uge1xuICAgIGFkZDogU2luZ2xlVmFsdWVBdHRyaWJ1dGU7XG4gICAgcmVwbGFjZTogTXVsdGlWYWx1ZUF0dHJpYnV0ZTtcbiAgICByZW1vdmU6IFNpbmdsZVZhbHVlQXR0cmlidXRlO1xuICAgIGRyb3BLZXk6IHN0cmluZztcbiAgICByZXBsYWNlQXR0cmlidXRlczogU3RydWN0QXR0cmlidXRlO1xuICAgIGFkZEF0dHJpYnV0ZXM6IFN0cnVjdEF0dHJpYnV0ZTtcbiAgICByZW1vdmVBdHRyaWJ1dGVzOiBTdHJ1Y3RBdHRyaWJ1dGU7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBNdXRhdGlvbiB7XG4gICAgICAgIGxldCBtID0gbmV3IE11dGF0aW9uKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmFkZCkge20uYWRkID0gU2luZ2xlVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLmFkZCk7fVxuICAgICAgICBpZiAocHJvdG8ucmVwbGFjZSkge20ucmVwbGFjZSA9IE11bHRpVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnJlcGxhY2UpO31cbiAgICAgICAgaWYgKHByb3RvLnJlbW92ZSkge20ucmVtb3ZlID0gU2luZ2xlVmFsdWVBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnJlbW92ZSk7fVxuICAgICAgICBpZiAocHJvdG8ucmVwbGFjZUF0dHJpYnV0ZXMpIHttLnJlcGxhY2VBdHRyaWJ1dGVzID0gU3RydWN0QXR0cmlidXRlLmZyb21Qcm90byhwcm90by5yZXBsYWNlQXR0cmlidXRlcyk7fVxuICAgICAgICBpZiAocHJvdG8uYWRkQXR0cmlidXRlcykge20uYWRkQXR0cmlidXRlcyA9IFN0cnVjdEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uYWRkQXR0cmlidXRlcyk7fVxuICAgICAgICBpZiAocHJvdG8ucmVtb3ZlQXR0cmlidXRlcykge20ucmVtb3ZlQXR0cmlidXRlcyA9IFN0cnVjdEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8ucmVtb3ZlQXR0cmlidXRlcyk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLk11dGF0aW9uSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5hZGQgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5yZXBsYWNlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMucmVtb3ZlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuZHJvcEtleSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJlcGxhY2VBdHRyaWJ1dGVzID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuYWRkQXR0cmlidXRlcyA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYWRkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2FkZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGQgPyAodGhpcy5hZGQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYWRkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlcGxhY2UgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZXBsYWNlJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlcGxhY2UgPyAodGhpcy5yZXBsYWNlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlcGxhY2U7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVtb3ZlICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnJlbW92ZSAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmUnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVtb3ZlID8gKHRoaXMucmVtb3ZlIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5kcm9wS2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydkcm9wS2V5J10gPSB0aGlzLmRyb3BLZXk7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsncmVwbGFjZUF0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucmVwbGFjZUF0dHJpYnV0ZXMgPyAodGhpcy5yZXBsYWNlQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5yZXBsYWNlQXR0cmlidXRlczt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hZGRBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLmFkZEF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnYWRkQXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5hZGRBdHRyaWJ1dGVzID8gKHRoaXMuYWRkQXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5hZGRBdHRyaWJ1dGVzO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMucmVtb3ZlQXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydyZW1vdmVBdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMgPyAodGhpcy5yZW1vdmVBdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLnJlbW92ZUF0dHJpYnV0ZXM7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTmFtZXNwYWNlZENvbnRleHQgaW1wbGVtZW50cyBpLk5hbWVzcGFjZWRDb250ZXh0SW50ZXJmYWNlIHtcbiAgICBuYW1lc3BhY2U6IHN0cmluZztcbiAgICB0eXBlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBOYW1lc3BhY2VkQ29udGV4dCB7XG4gICAgICAgIGxldCBtID0gbmV3IE5hbWVzcGFjZWRDb250ZXh0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5OYW1lc3BhY2VkQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMubmFtZXNwYWNlID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm5hbWVzcGFjZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnbmFtZXNwYWNlJ10gPSB0aGlzLm5hbWVzcGFjZTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50eXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWyd0eXBlJ10gPSB0aGlzLnR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGVyc29uYSBpbXBsZW1lbnRzIGkuUGVyc29uYUludGVyZmFjZSB7XG4gICAgc3ViamVjdDogU3ViamVjdDtcbiAgICBjb250ZXh0OiBDb250ZXh0O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUGVyc29uYSB7XG4gICAgICAgIGxldCBtID0gbmV3IFBlcnNvbmEoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICBpZiAocHJvdG8uc3ViamVjdCkge20uc3ViamVjdCA9IFN1YmplY3QuZnJvbVByb3RvKHByb3RvLnN1YmplY3QpO31cbiAgICAgICAgaWYgKHByb3RvLmNvbnRleHQpIHttLmNvbnRleHQgPSBDb250ZXh0LmZyb21Qcm90byhwcm90by5jb250ZXh0KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuUGVyc29uYUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbnRleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN1YmplY3QgIT09IG51bGwpIHt0b1JldHVyblsnc3ViamVjdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdWJqZWN0ID8gKHRoaXMuc3ViamVjdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdWJqZWN0O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbnRleHQgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuY29udGV4dCAhPT0gbnVsbCkge3RvUmV0dXJuWydjb250ZXh0J10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmNvbnRleHQgPyAodGhpcy5jb250ZXh0IGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmNvbnRleHQ7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHVibGljS2V5IGltcGxlbWVudHMgaS5QdWJsaWNLZXlJbnRlcmZhY2Uge1xuICAgIGtleTogc3RyaW5nO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgYWxnb3JpdGhtVHlwZTogZS5BbGdvcml0aG1UeXBlO1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogUHVibGljS2V5IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgUHVibGljS2V5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmFsZ29yaXRobVR5cGUpIHttLmFsZ29yaXRobVR5cGUgPSBlbnVtU3RyaW5nVG9WYWx1ZTxlLkFsZ29yaXRobVR5cGU+KGUuQWxnb3JpdGhtVHlwZSwgcHJvdG8uYWxnb3JpdGhtVHlwZSk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlB1YmxpY0tleUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMua2V5ID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuaWQgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5hbGdvcml0aG1UeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMua2V5ICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydrZXknXSA9IHRoaXMua2V5O31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmlkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydpZCddID0gdGhpcy5pZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5hbGdvcml0aG1UeXBlICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydhbGdvcml0aG1UeXBlJ10gPSB0aGlzLmFsZ29yaXRobVR5cGU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnkgaW1wbGVtZW50cyBpLlF1ZXJ5SW50ZXJmYWNlIHtcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlS2V5czogc3RyaW5nW107XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBRdWVyeSB7XG4gICAgICAgIGxldCBtID0gbmV3IFF1ZXJ5KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5RdWVyeUludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2VhcmNoVGVybSA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmF0dHJpYnV0ZUtleXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zZWFyY2hUZXJtICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzZWFyY2hUZXJtJ10gPSB0aGlzLnNlYXJjaFRlcm07fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cmlidXRlS2V5cyAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsnYXR0cmlidXRlS2V5cyddID0gdGhpcy5hdHRyaWJ1dGVLZXlzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZVZhbHVlQXR0cmlidXRlIGltcGxlbWVudHMgaS5TaW5nbGVWYWx1ZUF0dHJpYnV0ZUludGVyZmFjZSB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFNpbmdsZVZhbHVlQXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU2luZ2xlVmFsdWVBdHRyaWJ1dGUoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlNpbmdsZVZhbHVlQXR0cmlidXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5rZXkgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmtleSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsna2V5J10gPSB0aGlzLmtleTt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy52YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHt0b1JldHVyblsndmFsdWUnXSA9IHRoaXMudmFsdWU7fVxuICAgICAgICByZXR1cm4gdG9SZXR1cm47XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgU3RydWN0QXR0cmlidXRlIGltcGxlbWVudHMgaS5TdHJ1Y3RBdHRyaWJ1dGVJbnRlcmZhY2Uge1xuICAgIGF0dHJpYnV0ZXM6IHtba2V5OiBzdHJpbmddOiBBdHRyaWJ1dGV9O1xuXG4gICAgc3RhdGljIGZyb21Qcm90byhwcm90bzogYW55KTogU3RydWN0QXR0cmlidXRlIHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU3RydWN0QXR0cmlidXRlKCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmF0dHJpYnV0ZXMpIHttLmF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhwcm90by5hdHRyaWJ1dGVzKS5yZWR1Y2U8YW55Pigob2JqLCBrKSA9PiB7IG9ialtrXSA9IEF0dHJpYnV0ZS5mcm9tUHJvdG8ocHJvdG8uYXR0cmlidXRlc1trXSk7IHJldHVybiBvYmo7IH0sIHt9KTt9XG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGt3YXJncz86IGkuU3RydWN0QXR0cmlidXRlSW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5hdHRyaWJ1dGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuYXR0cmlidXRlcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hdHRyaWJ1dGVzICE9PSBudWxsKSB7dG9SZXR1cm5bJ2F0dHJpYnV0ZXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuYXR0cmlidXRlcyA/ICh0aGlzLmF0dHJpYnV0ZXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuYXR0cmlidXRlczt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdWJqZWN0IGltcGxlbWVudHMgaS5TdWJqZWN0SW50ZXJmYWNlIHtcbiAgICBzdWJqZWN0SWQ6IHN0cmluZztcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHBhcnRuZXJJZDogc3RyaW5nO1xuICAgIGF0dHJpYnV0ZXM6IE11bHRpVmFsdWVBdHRyaWJ1dGVbXTtcbiAgICBjcmVhdGVkOiBEYXRlO1xuICAgIHVwZGF0ZWQ6IERhdGU7XG4gICAgbGFzdExvZ2luOiBEYXRlO1xuICAgIHB1YmxpY0tleXM6IFB1YmxpY0tleVtdO1xuICAgIHN0cnVjdEF0dHJpYnV0ZXM6IFN0cnVjdEF0dHJpYnV0ZTtcblxuICAgIHN0YXRpYyBmcm9tUHJvdG8ocHJvdG86IGFueSk6IFN1YmplY3Qge1xuICAgICAgICBsZXQgbSA9IG5ldyBTdWJqZWN0KCk7XG4gICAgICAgIG0gPSBPYmplY3QuYXNzaWduKG0sIHByb3RvKTtcbiAgICAgICAgaWYgKHByb3RvLmF0dHJpYnV0ZXMpIHttLmF0dHJpYnV0ZXMgPSBwcm90by5hdHRyaWJ1dGVzLm1hcChNdWx0aVZhbHVlQXR0cmlidXRlLmZyb21Qcm90byk7fVxuICAgICAgICBpZiAocHJvdG8uY3JlYXRlZCkge20uY3JlYXRlZCA9IG5ldyBEYXRlKHByb3RvLmNyZWF0ZWQpO31cbiAgICAgICAgaWYgKHByb3RvLnVwZGF0ZWQpIHttLnVwZGF0ZWQgPSBuZXcgRGF0ZShwcm90by51cGRhdGVkKTt9XG4gICAgICAgIGlmIChwcm90by5sYXN0TG9naW4pIHttLmxhc3RMb2dpbiA9IG5ldyBEYXRlKHByb3RvLmxhc3RMb2dpbik7fVxuICAgICAgICBpZiAocHJvdG8ucHVibGljS2V5cykge20ucHVibGljS2V5cyA9IHByb3RvLnB1YmxpY0tleXMubWFwKFB1YmxpY0tleS5mcm9tUHJvdG8pO31cbiAgICAgICAgaWYgKHByb3RvLnN0cnVjdEF0dHJpYnV0ZXMpIHttLnN0cnVjdEF0dHJpYnV0ZXMgPSBTdHJ1Y3RBdHRyaWJ1dGUuZnJvbVByb3RvKHByb3RvLnN0cnVjdEF0dHJpYnV0ZXMpO31cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3Ioa3dhcmdzPzogaS5TdWJqZWN0SW50ZXJmYWNlKSB7XG4gICAgICAgIGlmICgha3dhcmdzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBrd2FyZ3MpO1xuICAgIH1cblxuICAgIHRvQXBpSnNvbigpOiBvYmplY3Qge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zdWJqZWN0SWQgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5lbWFpbCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnVzZXJJZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnBhcnRuZXJJZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmF0dHJpYnV0ZXMgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5jcmVhdGVkID09PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudXBkYXRlZCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmxhc3RMb2dpbiA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnB1YmxpY0tleXMgPT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCB0b1JldHVybjoge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICB9ID0ge307XG4gICAgICAgIFxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc3ViamVjdElkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydzdWJqZWN0SWQnXSA9IHRoaXMuc3ViamVjdElkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmVtYWlsICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydlbWFpbCddID0gdGhpcy5lbWFpbDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51c2VySWQgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3VzZXJJZCddID0gdGhpcy51c2VySWQ7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFydG5lcklkICE9PSAndW5kZWZpbmVkJykge3RvUmV0dXJuWydwYXJ0bmVySWQnXSA9IHRoaXMucGFydG5lcklkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuYXR0cmlidXRlcyAhPT0gbnVsbCkge3RvUmV0dXJuWydhdHRyaWJ1dGVzJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmF0dHJpYnV0ZXMgPyAodGhpcy5hdHRyaWJ1dGVzIGFzIGFueSkudG9BcGlKc29uKCkgOiB0aGlzLmF0dHJpYnV0ZXM7fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY3JlYXRlZCAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5jcmVhdGVkICE9PSBudWxsKSB7dG9SZXR1cm5bJ2NyZWF0ZWQnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMuY3JlYXRlZCA/ICh0aGlzLmNyZWF0ZWQgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMuY3JlYXRlZDt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy51cGRhdGVkICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnVwZGF0ZWQgIT09IG51bGwpIHt0b1JldHVyblsndXBkYXRlZCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy51cGRhdGVkID8gKHRoaXMudXBkYXRlZCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy51cGRhdGVkO31cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmxhc3RMb2dpbiAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5sYXN0TG9naW4gIT09IG51bGwpIHt0b1JldHVyblsnbGFzdExvZ2luJ10gPSAndG9BcGlKc29uJyBpbiB0aGlzLmxhc3RMb2dpbiA/ICh0aGlzLmxhc3RMb2dpbiBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5sYXN0TG9naW47fVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMucHVibGljS2V5cyAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5wdWJsaWNLZXlzICE9PSBudWxsKSB7dG9SZXR1cm5bJ3B1YmxpY0tleXMnXSA9ICd0b0FwaUpzb24nIGluIHRoaXMucHVibGljS2V5cyA/ICh0aGlzLnB1YmxpY0tleXMgYXMgYW55KS50b0FwaUpzb24oKSA6IHRoaXMucHVibGljS2V5czt9XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN0cnVjdEF0dHJpYnV0ZXMgIT09IG51bGwpIHt0b1JldHVyblsnc3RydWN0QXR0cmlidXRlcyddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzID8gKHRoaXMuc3RydWN0QXR0cmlidXRlcyBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdHJ1Y3RBdHRyaWJ1dGVzO31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFN1YmplY3RSZXN1bHQgaW1wbGVtZW50cyBpLlN1YmplY3RSZXN1bHRJbnRlcmZhY2Uge1xuICAgIHN1YmplY3Q6IFN1YmplY3Q7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBTdWJqZWN0UmVzdWx0IHtcbiAgICAgICAgbGV0IG0gPSBuZXcgU3ViamVjdFJlc3VsdCgpO1xuICAgICAgICBtID0gT2JqZWN0LmFzc2lnbihtLCBwcm90byk7XG4gICAgICAgIGlmIChwcm90by5zdWJqZWN0KSB7bS5zdWJqZWN0ID0gU3ViamVjdC5mcm9tUHJvdG8ocHJvdG8uc3ViamVjdCk7fVxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlN1YmplY3RSZXN1bHRJbnRlcmZhY2UpIHtcbiAgICAgICAgaWYgKCFrd2FyZ3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIGt3YXJncyk7XG4gICAgfVxuXG4gICAgdG9BcGlKc29uKCk6IG9iamVjdCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnN1YmplY3QgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHRvUmV0dXJuOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgIH0gPSB7fTtcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zdWJqZWN0ICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnN1YmplY3QgIT09IG51bGwpIHt0b1JldHVyblsnc3ViamVjdCddID0gJ3RvQXBpSnNvbicgaW4gdGhpcy5zdWJqZWN0ID8gKHRoaXMuc3ViamVjdCBhcyBhbnkpLnRvQXBpSnNvbigpIDogdGhpcy5zdWJqZWN0O31cbiAgICAgICAgcmV0dXJuIHRvUmV0dXJuO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFR5cGVkQ29udGV4dCBpbXBsZW1lbnRzIGkuVHlwZWRDb250ZXh0SW50ZXJmYWNlIHtcbiAgICB0eXBlOiBzdHJpbmc7XG5cbiAgICBzdGF0aWMgZnJvbVByb3RvKHByb3RvOiBhbnkpOiBUeXBlZENvbnRleHQge1xuICAgICAgICBsZXQgbSA9IG5ldyBUeXBlZENvbnRleHQoKTtcbiAgICAgICAgbSA9IE9iamVjdC5hc3NpZ24obSwgcHJvdG8pO1xuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihrd2FyZ3M/OiBpLlR5cGVkQ29udGV4dEludGVyZmFjZSkge1xuICAgICAgICBpZiAoIWt3YXJncykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywga3dhcmdzKTtcbiAgICB9XG5cbiAgICB0b0FwaUpzb24oKTogb2JqZWN0IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIHRoaXMudHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgdG9SZXR1cm46IHtcbiAgICAgICAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgICAgfSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnR5cGUgIT09ICd1bmRlZmluZWQnKSB7dG9SZXR1cm5bJ3R5cGUnXSA9IHRoaXMudHlwZTt9XG4gICAgICAgIHJldHVybiB0b1JldHVybjtcbiAgICB9XG59XG5cbiJdfQ==