@dangl/angular-dangl-identity-client 4.0.0 → 4.0.1-beta0004

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 (33) hide show
  1. package/api-client.d.ts +3 -0
  2. package/dangl-angular-dangl-identity-client.d.ts +1 -0
  3. package/dangl-identity.module.d.ts +5 -0
  4. package/esm2020/api-client.mjs +482 -0
  5. package/{esm2015/dangl-angular-dangl-identity-client.js → esm2020/dangl-angular-dangl-identity-client.mjs} +0 -0
  6. package/esm2020/dangl-identity.module.mjs +21 -0
  7. package/{esm2015/interceptors/dangl-identity-request-validator.js → esm2020/interceptors/dangl-identity-request-validator.mjs} +0 -0
  8. package/esm2020/interceptors/jwt-interceptor.service.mjs +47 -0
  9. package/esm2020/messengers/authentication.messenger.mjs +83 -0
  10. package/{esm2015/models/jwt-storage.js → esm2020/models/jwt-storage.mjs} +0 -0
  11. package/{esm2015/models/user-info.js → esm2020/models/user-info.mjs} +0 -0
  12. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  13. package/esm2020/services/authentication.service.mjs +41 -0
  14. package/esm2020/services/jwt-token.service.mjs +95 -0
  15. package/fesm2015/dangl-angular-dangl-identity-client.mjs +754 -0
  16. package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +1 -0
  17. package/{fesm2015/dangl-angular-dangl-identity-client.js → fesm2020/dangl-angular-dangl-identity-client.mjs} +66 -55
  18. package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +1 -0
  19. package/interceptors/jwt-interceptor.service.d.ts +3 -0
  20. package/messengers/authentication.messenger.d.ts +3 -0
  21. package/package.json +21 -9
  22. package/services/authentication.service.d.ts +3 -0
  23. package/services/jwt-token.service.d.ts +3 -0
  24. package/bundles/dangl-angular-dangl-identity-client.umd.js +0 -1179
  25. package/bundles/dangl-angular-dangl-identity-client.umd.js.map +0 -1
  26. package/dangl-angular-dangl-identity-client.metadata.json +0 -1
  27. package/esm2015/api-client.js +0 -476
  28. package/esm2015/dangl-identity.module.js +0 -14
  29. package/esm2015/interceptors/jwt-interceptor.service.js +0 -43
  30. package/esm2015/messengers/authentication.messenger.js +0 -85
  31. package/esm2015/services/authentication.service.js +0 -45
  32. package/esm2015/services/jwt-token.service.js +0 -97
  33. package/fesm2015/dangl-angular-dangl-identity-client.js.map +0 -1
@@ -1,476 +0,0 @@
1
- /* tslint:disable */
2
- /* eslint-disable */
3
- //----------------------
4
- // <auto-generated>
5
- // Generated using the NSwag toolchain v13.13.2.0 (NJsonSchema v10.5.2.0 (Newtonsoft.Json v12.0.0.0)) (http://NSwag.org)
6
- // </auto-generated>
7
- //----------------------
8
- // ReSharper disable InconsistentNaming
9
- import { mergeMap as _observableMergeMap, catchError as _observableCatch } from 'rxjs/operators';
10
- import { Observable, throwError as _observableThrow, of as _observableOf } from 'rxjs';
11
- import { Injectable, Inject, Optional, InjectionToken } from '@angular/core';
12
- import { HttpClient, HttpHeaders, HttpResponse, HttpResponseBase } from '@angular/common/http';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/common/http";
15
- export const DANGL_IDENTITY_CLIENT_API_BASE_URL = new InjectionToken('DANGL_IDENTITY_CLIENT_API_BASE_URL');
16
- export class DanglIdentityClient {
17
- constructor(http, baseUrl) {
18
- this.jsonParseReviver = undefined;
19
- this.http = http;
20
- this.baseUrl = baseUrl !== undefined && baseUrl !== null ? baseUrl : "";
21
- }
22
- loginWithCookie(model, redirectUrl) {
23
- let url_ = this.baseUrl + "/identity/login?";
24
- if (redirectUrl !== undefined && redirectUrl !== null)
25
- url_ += "redirectUrl=" + encodeURIComponent("" + redirectUrl) + "&";
26
- url_ = url_.replace(/[?&]$/, "");
27
- const content_ = JSON.stringify(model);
28
- let options_ = {
29
- body: content_,
30
- observe: "response",
31
- responseType: "blob",
32
- headers: new HttpHeaders({
33
- "Content-Type": "application/json",
34
- })
35
- };
36
- return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
37
- return this.processLoginWithCookie(response_);
38
- })).pipe(_observableCatch((response_) => {
39
- if (response_ instanceof HttpResponseBase) {
40
- try {
41
- return this.processLoginWithCookie(response_);
42
- }
43
- catch (e) {
44
- return _observableThrow(e);
45
- }
46
- }
47
- else
48
- return _observableThrow(response_);
49
- }));
50
- }
51
- processLoginWithCookie(response) {
52
- const status = response.status;
53
- const responseBlob = response instanceof HttpResponse ? response.body :
54
- response.error instanceof Blob ? response.error : undefined;
55
- let _headers = {};
56
- if (response.headers) {
57
- for (let key of response.headers.keys()) {
58
- _headers[key] = response.headers.get(key);
59
- }
60
- }
61
- if (status === 204) {
62
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
63
- return _observableOf(null);
64
- }));
65
- }
66
- else if (status === 401) {
67
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
68
- return throwException("A server side error occurred.", status, _responseText, _headers);
69
- }));
70
- }
71
- else if (status !== 200 && status !== 204) {
72
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
73
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
74
- }));
75
- }
76
- return _observableOf(null);
77
- }
78
- signOutWithSignInManager() {
79
- let url_ = this.baseUrl + "/identity/login";
80
- url_ = url_.replace(/[?&]$/, "");
81
- let options_ = {
82
- observe: "response",
83
- responseType: "blob",
84
- headers: new HttpHeaders({})
85
- };
86
- return this.http.request("delete", url_, options_).pipe(_observableMergeMap((response_) => {
87
- return this.processSignOutWithSignInManager(response_);
88
- })).pipe(_observableCatch((response_) => {
89
- if (response_ instanceof HttpResponseBase) {
90
- try {
91
- return this.processSignOutWithSignInManager(response_);
92
- }
93
- catch (e) {
94
- return _observableThrow(e);
95
- }
96
- }
97
- else
98
- return _observableThrow(response_);
99
- }));
100
- }
101
- processSignOutWithSignInManager(response) {
102
- const status = response.status;
103
- const responseBlob = response instanceof HttpResponse ? response.body :
104
- response.error instanceof Blob ? response.error : undefined;
105
- let _headers = {};
106
- if (response.headers) {
107
- for (let key of response.headers.keys()) {
108
- _headers[key] = response.headers.get(key);
109
- }
110
- }
111
- if (status === 204) {
112
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
113
- return _observableOf(null);
114
- }));
115
- }
116
- else if (status !== 200 && status !== 204) {
117
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
118
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
119
- }));
120
- }
121
- return _observableOf(null);
122
- }
123
- loginAndReturnToken(model) {
124
- let url_ = this.baseUrl + "/identity/token-login";
125
- url_ = url_.replace(/[?&]$/, "");
126
- const content_ = JSON.stringify(model);
127
- let options_ = {
128
- body: content_,
129
- observe: "response",
130
- responseType: "blob",
131
- headers: new HttpHeaders({
132
- "Content-Type": "application/json",
133
- "Accept": "application/json"
134
- })
135
- };
136
- return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
137
- return this.processLoginAndReturnToken(response_);
138
- })).pipe(_observableCatch((response_) => {
139
- if (response_ instanceof HttpResponseBase) {
140
- try {
141
- return this.processLoginAndReturnToken(response_);
142
- }
143
- catch (e) {
144
- return _observableThrow(e);
145
- }
146
- }
147
- else
148
- return _observableThrow(response_);
149
- }));
150
- }
151
- processLoginAndReturnToken(response) {
152
- const status = response.status;
153
- const responseBlob = response instanceof HttpResponse ? response.body :
154
- response.error instanceof Blob ? response.error : undefined;
155
- let _headers = {};
156
- if (response.headers) {
157
- for (let key of response.headers.keys()) {
158
- _headers[key] = response.headers.get(key);
159
- }
160
- }
161
- if (status === 200) {
162
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
163
- let result200 = null;
164
- result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
165
- return _observableOf(result200);
166
- }));
167
- }
168
- else if (status === 400) {
169
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
170
- let result400 = null;
171
- result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
172
- return throwException("A server side error occurred.", status, _responseText, _headers, result400);
173
- }));
174
- }
175
- else if (status === 401) {
176
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
177
- return throwException("A server side error occurred.", status, _responseText, _headers);
178
- }));
179
- }
180
- else if (status !== 200 && status !== 204) {
181
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
182
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
183
- }));
184
- }
185
- return _observableOf(null);
186
- }
187
- refreshToken(model) {
188
- let url_ = this.baseUrl + "/identity/token-refresh";
189
- url_ = url_.replace(/[?&]$/, "");
190
- const content_ = JSON.stringify(model);
191
- let options_ = {
192
- body: content_,
193
- observe: "response",
194
- responseType: "blob",
195
- headers: new HttpHeaders({
196
- "Content-Type": "application/json",
197
- "Accept": "application/json"
198
- })
199
- };
200
- return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
201
- return this.processRefreshToken(response_);
202
- })).pipe(_observableCatch((response_) => {
203
- if (response_ instanceof HttpResponseBase) {
204
- try {
205
- return this.processRefreshToken(response_);
206
- }
207
- catch (e) {
208
- return _observableThrow(e);
209
- }
210
- }
211
- else
212
- return _observableThrow(response_);
213
- }));
214
- }
215
- processRefreshToken(response) {
216
- const status = response.status;
217
- const responseBlob = response instanceof HttpResponse ? response.body :
218
- response.error instanceof Blob ? response.error : undefined;
219
- let _headers = {};
220
- if (response.headers) {
221
- for (let key of response.headers.keys()) {
222
- _headers[key] = response.headers.get(key);
223
- }
224
- }
225
- if (status === 200) {
226
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
227
- let result200 = null;
228
- result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
229
- return _observableOf(result200);
230
- }));
231
- }
232
- else if (status === 400) {
233
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
234
- let result400 = null;
235
- result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
236
- return throwException("A server side error occurred.", status, _responseText, _headers, result400);
237
- }));
238
- }
239
- else if (status === 401) {
240
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
241
- return throwException("A server side error occurred.", status, _responseText, _headers);
242
- }));
243
- }
244
- else if (status !== 200 && status !== 204) {
245
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
246
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
247
- }));
248
- }
249
- return _observableOf(null);
250
- }
251
- register(registerModel) {
252
- let url_ = this.baseUrl + "/identity/register";
253
- url_ = url_.replace(/[?&]$/, "");
254
- const content_ = JSON.stringify(registerModel);
255
- let options_ = {
256
- body: content_,
257
- observe: "response",
258
- responseType: "blob",
259
- headers: new HttpHeaders({
260
- "Content-Type": "application/json",
261
- })
262
- };
263
- return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
264
- return this.processRegister(response_);
265
- })).pipe(_observableCatch((response_) => {
266
- if (response_ instanceof HttpResponseBase) {
267
- try {
268
- return this.processRegister(response_);
269
- }
270
- catch (e) {
271
- return _observableThrow(e);
272
- }
273
- }
274
- else
275
- return _observableThrow(response_);
276
- }));
277
- }
278
- processRegister(response) {
279
- const status = response.status;
280
- const responseBlob = response instanceof HttpResponse ? response.body :
281
- response.error instanceof Blob ? response.error : undefined;
282
- let _headers = {};
283
- if (response.headers) {
284
- for (let key of response.headers.keys()) {
285
- _headers[key] = response.headers.get(key);
286
- }
287
- }
288
- if (status === 204) {
289
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
290
- return _observableOf(null);
291
- }));
292
- }
293
- else if (status === 400) {
294
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
295
- let result400 = null;
296
- result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
297
- return throwException("A server side error occurred.", status, _responseText, _headers, result400);
298
- }));
299
- }
300
- else if (status !== 200 && status !== 204) {
301
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
302
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
303
- }));
304
- }
305
- return _observableOf(null);
306
- }
307
- requestPasswordReset(forgotPasswordModel) {
308
- let url_ = this.baseUrl + "/identity/password-forgotten";
309
- url_ = url_.replace(/[?&]$/, "");
310
- const content_ = JSON.stringify(forgotPasswordModel);
311
- let options_ = {
312
- body: content_,
313
- observe: "response",
314
- responseType: "blob",
315
- headers: new HttpHeaders({
316
- "Content-Type": "application/json",
317
- })
318
- };
319
- return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
320
- return this.processRequestPasswordReset(response_);
321
- })).pipe(_observableCatch((response_) => {
322
- if (response_ instanceof HttpResponseBase) {
323
- try {
324
- return this.processRequestPasswordReset(response_);
325
- }
326
- catch (e) {
327
- return _observableThrow(e);
328
- }
329
- }
330
- else
331
- return _observableThrow(response_);
332
- }));
333
- }
334
- processRequestPasswordReset(response) {
335
- const status = response.status;
336
- const responseBlob = response instanceof HttpResponse ? response.body :
337
- response.error instanceof Blob ? response.error : undefined;
338
- let _headers = {};
339
- if (response.headers) {
340
- for (let key of response.headers.keys()) {
341
- _headers[key] = response.headers.get(key);
342
- }
343
- }
344
- if (status === 204) {
345
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
346
- return _observableOf(null);
347
- }));
348
- }
349
- else if (status !== 200 && status !== 204) {
350
- return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
351
- return throwException("An unexpected server error occurred.", status, _responseText, _headers);
352
- }));
353
- }
354
- return _observableOf(null);
355
- }
356
- }
357
- DanglIdentityClient.ɵprov = i0.ɵɵdefineInjectable({ factory: function DanglIdentityClient_Factory() { return new DanglIdentityClient(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(DANGL_IDENTITY_CLIENT_API_BASE_URL, 8)); }, token: DanglIdentityClient, providedIn: "root" });
358
- DanglIdentityClient.decorators = [
359
- { type: Injectable, args: [{
360
- providedIn: 'root'
361
- },] }
362
- ];
363
- DanglIdentityClient.ctorParameters = () => [
364
- { type: HttpClient, decorators: [{ type: Inject, args: [HttpClient,] }] },
365
- { type: String, decorators: [{ type: Optional }, { type: Inject, args: [DANGL_IDENTITY_CLIENT_API_BASE_URL,] }] }
366
- ];
367
- export var HttpStatusCode;
368
- (function (HttpStatusCode) {
369
- HttpStatusCode["Continue"] = "Continue";
370
- HttpStatusCode["SwitchingProtocols"] = "SwitchingProtocols";
371
- HttpStatusCode["Processing"] = "Processing";
372
- HttpStatusCode["EarlyHints"] = "EarlyHints";
373
- HttpStatusCode["OK"] = "OK";
374
- HttpStatusCode["Created"] = "Created";
375
- HttpStatusCode["Accepted"] = "Accepted";
376
- HttpStatusCode["NonAuthoritativeInformation"] = "NonAuthoritativeInformation";
377
- HttpStatusCode["NoContent"] = "NoContent";
378
- HttpStatusCode["ResetContent"] = "ResetContent";
379
- HttpStatusCode["PartialContent"] = "PartialContent";
380
- HttpStatusCode["MultiStatus"] = "MultiStatus";
381
- HttpStatusCode["AlreadyReported"] = "AlreadyReported";
382
- HttpStatusCode["IMUsed"] = "IMUsed";
383
- HttpStatusCode["MultipleChoices"] = "Ambiguous";
384
- HttpStatusCode["Ambiguous"] = "Moved";
385
- HttpStatusCode["MovedPermanently"] = "Redirect";
386
- HttpStatusCode["Moved"] = "RedirectMethod";
387
- HttpStatusCode["Found"] = "NotModified";
388
- HttpStatusCode["Redirect"] = "UseProxy";
389
- HttpStatusCode["SeeOther"] = "Unused";
390
- HttpStatusCode["RedirectMethod"] = "TemporaryRedirect";
391
- HttpStatusCode["NotModified"] = "PermanentRedirect";
392
- HttpStatusCode["UseProxy"] = "BadRequest";
393
- HttpStatusCode["Unused"] = "Unauthorized";
394
- HttpStatusCode["TemporaryRedirect"] = "PaymentRequired";
395
- HttpStatusCode["RedirectKeepVerb"] = "Forbidden";
396
- HttpStatusCode["PermanentRedirect"] = "NotFound";
397
- HttpStatusCode["BadRequest"] = "MethodNotAllowed";
398
- HttpStatusCode["Unauthorized"] = "NotAcceptable";
399
- HttpStatusCode["PaymentRequired"] = "ProxyAuthenticationRequired";
400
- HttpStatusCode["Forbidden"] = "RequestTimeout";
401
- HttpStatusCode["NotFound"] = "Conflict";
402
- HttpStatusCode["MethodNotAllowed"] = "Gone";
403
- HttpStatusCode["NotAcceptable"] = "LengthRequired";
404
- HttpStatusCode["ProxyAuthenticationRequired"] = "PreconditionFailed";
405
- HttpStatusCode["RequestTimeout"] = "RequestEntityTooLarge";
406
- HttpStatusCode["Conflict"] = "RequestUriTooLong";
407
- HttpStatusCode["Gone"] = "UnsupportedMediaType";
408
- HttpStatusCode["LengthRequired"] = "RequestedRangeNotSatisfiable";
409
- HttpStatusCode["PreconditionFailed"] = "ExpectationFailed";
410
- HttpStatusCode["RequestEntityTooLarge"] = "MisdirectedRequest";
411
- HttpStatusCode["RequestUriTooLong"] = "UnprocessableEntity";
412
- HttpStatusCode["UnsupportedMediaType"] = "Locked";
413
- HttpStatusCode["RequestedRangeNotSatisfiable"] = "FailedDependency";
414
- HttpStatusCode["ExpectationFailed"] = "UpgradeRequired";
415
- HttpStatusCode["MisdirectedRequest"] = "PreconditionRequired";
416
- HttpStatusCode["UnprocessableEntity"] = "TooManyRequests";
417
- HttpStatusCode["Locked"] = "RequestHeaderFieldsTooLarge";
418
- HttpStatusCode["FailedDependency"] = "UnavailableForLegalReasons";
419
- HttpStatusCode["UpgradeRequired"] = "InternalServerError";
420
- HttpStatusCode["PreconditionRequired"] = "NotImplemented";
421
- HttpStatusCode["TooManyRequests"] = "BadGateway";
422
- HttpStatusCode["RequestHeaderFieldsTooLarge"] = "ServiceUnavailable";
423
- HttpStatusCode["UnavailableForLegalReasons"] = "GatewayTimeout";
424
- HttpStatusCode["InternalServerError"] = "HttpVersionNotSupported";
425
- HttpStatusCode["NotImplemented"] = "VariantAlsoNegotiates";
426
- HttpStatusCode["BadGateway"] = "InsufficientStorage";
427
- HttpStatusCode["ServiceUnavailable"] = "LoopDetected";
428
- HttpStatusCode["GatewayTimeout"] = "NotExtended";
429
- HttpStatusCode["HttpVersionNotSupported"] = "NetworkAuthenticationRequired";
430
- })(HttpStatusCode || (HttpStatusCode = {}));
431
- /** Various reasons for a protocol endpoint error */
432
- export var ResponseErrorType;
433
- (function (ResponseErrorType) {
434
- ResponseErrorType["None"] = "None";
435
- ResponseErrorType["Protocol"] = "Protocol";
436
- ResponseErrorType["Http"] = "Http";
437
- ResponseErrorType["Exception"] = "Exception";
438
- ResponseErrorType["PolicyViolation"] = "PolicyViolation";
439
- })(ResponseErrorType || (ResponseErrorType = {}));
440
- export class SwaggerException extends Error {
441
- constructor(message, status, response, headers, result) {
442
- super();
443
- this.isSwaggerException = true;
444
- this.message = message;
445
- this.status = status;
446
- this.response = response;
447
- this.headers = headers;
448
- this.result = result;
449
- }
450
- static isSwaggerException(obj) {
451
- return obj.isSwaggerException === true;
452
- }
453
- }
454
- function throwException(message, status, response, headers, result) {
455
- if (result !== null && result !== undefined)
456
- return _observableThrow(result);
457
- else
458
- return _observableThrow(new SwaggerException(message, status, response, headers, null));
459
- }
460
- function blobToText(blob) {
461
- return new Observable((observer) => {
462
- if (!blob) {
463
- observer.next("");
464
- observer.complete();
465
- }
466
- else {
467
- let reader = new FileReader();
468
- reader.onload = event => {
469
- observer.next(event.target.result);
470
- observer.complete();
471
- };
472
- reader.readAsText(blob);
473
- }
474
- });
475
- }
476
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZGFuZ2wtaWRlbnRpdHktY2xpZW50L3NyYy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsd0JBQXdCO0FBQ3hCLG1CQUFtQjtBQUNuQiw0SEFBNEg7QUFDNUgsb0JBQW9CO0FBQ3BCLHdCQUF3QjtBQUN4Qix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLGNBQWMsQ0FBUyxvQ0FBb0MsQ0FBQyxDQUFDO0FBS25ILE1BQU0sT0FBTyxtQkFBbUI7SUFLNUIsWUFBZ0MsSUFBZ0IsRUFBMEQsT0FBZ0I7UUFGaEgscUJBQWdCLEdBQW1ELFNBQVMsQ0FBQztRQUduRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQixFQUFFLFdBQXNDO1FB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SUFDM0QseUNBQXVCLENBQUE7SUFDdkIsK0NBQTZCLENBQUE7SUFDN0IsbURBQWlDLENBQUE7SUFDakMsNkNBQTJCLENBQUE7SUFDM0IscURBQW1DLENBQUE7SUFDbkMsbUNBQWlCLENBQUE7SUFDakIsK0NBQTZCLENBQUE7SUFDN0IscUNBQW1CLENBQUE7SUFDbkIsK0NBQTZCLENBQUE7SUFDN0IsMENBQXdCLENBQUE7SUFDeEIsdUNBQXFCLENBQUE7SUFDckIsdUNBQXFCLENBQUE7SUFDckIscUNBQW1CLENBQUE7SUFDbkIsc0RBQW9DLENBQUE7SUFDcEMsbURBQWlDLENBQUE7SUFDakMseUNBQXVCLENBQUE7SUFDdkIseUNBQXVCLENBQUE7SUFDdkIsdURBQXFDLENBQUE7SUFDckMsZ0RBQThCLENBQUE7SUFDOUIsZ0RBQThCLENBQUE7SUFDOUIsaURBQStCLENBQUE7SUFDL0IsZ0RBQThCLENBQUE7SUFDOUIsaUVBQStDLENBQUE7SUFDL0MsOENBQTRCLENBQUE7SUFDNUIsdUNBQXFCLENBQUE7SUFDckIsMkNBQXlCLENBQUE7SUFDekIsa0RBQWdDLENBQUE7SUFDaEMsb0VBQWtELENBQUE7SUFDbEQsMERBQXdDLENBQUE7SUFDeEMsZ0RBQThCLENBQUE7SUFDOUIsK0NBQTZCLENBQUE7SUFDN0IsaUVBQStDLENBQUE7SUFDL0MsMERBQXdDLENBQUE7SUFDeEMsOERBQTRDLENBQUE7SUFDNUMsMkRBQXlDLENBQUE7SUFDekMsaURBQStCLENBQUE7SUFDL0IsbUVBQWlELENBQUE7SUFDakQsdURBQXFDLENBQUE7SUFDckMsNkRBQTJDLENBQUE7SUFDM0MseURBQXVDLENBQUE7SUFDdkMsd0RBQXNDLENBQUE7SUFDdEMsaUVBQStDLENBQUE7SUFDL0MseURBQXVDLENBQUE7SUFDdkMseURBQXVDLENBQUE7SUFDdkMsZ0RBQThCLENBQUE7SUFDOUIsb0VBQWtELENBQUE7SUFDbEQsK0RBQTZDLENBQUE7SUFDN0MsaUVBQStDLENBQUE7SUFDL0MsMERBQXdDLENBQUE7SUFDeEMsb0RBQWtDLENBQUE7SUFDbEMscURBQW1DLENBQUE7SUFDbkMsZ0RBQThCLENBQUE7SUFDOUIsMkVBQXlELENBQUE7QUFDN0QsQ0FBQyxFQTlEVyxjQUFjLEtBQWQsY0FBYyxRQThEekI7QUFFRCxvREFBb0Q7QUFDcEQsTUFBTSxDQUFOLElBQVksaUJBTVg7QUFORCxXQUFZLGlCQUFpQjtJQUN6QixrQ0FBYSxDQUFBO0lBQ2IsMENBQXFCLENBQUE7SUFDckIsa0NBQWEsQ0FBQTtJQUNiLDRDQUF1QixDQUFBO0lBQ3ZCLHdEQUFtQyxDQUFBO0FBQ3ZDLENBQUMsRUFOVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBTTVCO0FBNkJELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBT3ZDLFlBQVksT0FBZSxFQUFFLE1BQWMsRUFBRSxRQUFnQixFQUFFLE9BQWdDLEVBQUUsTUFBVztRQUN4RyxLQUFLLEVBQUUsQ0FBQztRQVNGLHVCQUFrQixHQUFHLElBQUksQ0FBQztRQVBoQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBSUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEdBQVE7UUFDOUIsT0FBTyxHQUFHLENBQUMsa0JBQWtCLEtBQUssSUFBSSxDQUFDO0lBQzNDLENBQUM7Q0FDSjtBQUVELFNBQVMsY0FBYyxDQUFDLE9BQWUsRUFBRSxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxPQUFnQyxFQUFFLE1BQVk7SUFDckgsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQ3ZDLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBRWhDLE9BQU8sZ0JBQWdCLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNoRyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBUztJQUN6QixPQUFPLElBQUksVUFBVSxDQUFTLENBQUMsUUFBYSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQU8sS0FBSyxDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPGF1dG8tZ2VuZXJhdGVkPlxyXG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjEzLjEzLjIuMCAoTkpzb25TY2hlbWEgdjEwLjUuMi4wIChOZXd0b25zb2Z0Lkpzb24gdjEyLjAuMC4wKSkgKGh0dHA6Ly9OU3dhZy5vcmcpXHJcbi8vIDwvYXV0by1nZW5lcmF0ZWQ+XHJcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4vLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmdcclxuXHJcbmltcG9ydCB7IG1lcmdlTWFwIGFzIF9vYnNlcnZhYmxlTWVyZ2VNYXAsIGNhdGNoRXJyb3IgYXMgX29ic2VydmFibGVDYXRjaCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY29uc3QgREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdEQU5HTF9JREVOVElUWV9DTElFTlRfQVBJX0JBU0VfVVJMJyk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhbmdsSWRlbnRpdHlDbGllbnQge1xyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCAhPT0gdW5kZWZpbmVkICYmIGJhc2VVcmwgIT09IG51bGwgPyBiYXNlVXJsIDogXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBsb2dpbldpdGhDb29raWUobW9kZWw6IExvZ2luUG9zdCwgcmVkaXJlY3RVcmw6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2lkZW50aXR5L2xvZ2luP1wiO1xyXG4gICAgICAgIGlmIChyZWRpcmVjdFVybCAhPT0gdW5kZWZpbmVkICYmIHJlZGlyZWN0VXJsICE9PSBudWxsKVxyXG4gICAgICAgICAgICB1cmxfICs9IFwicmVkaXJlY3RVcmw9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHJlZGlyZWN0VXJsKSArIFwiJlwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkobW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvZ2luV2l0aENvb2tpZSg8YW55PnJlc3BvbnNlXyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZ25PdXRXaXRoU2lnbkluTWFuYWdlcigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2lkZW50aXR5L2xvZ2luXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZGVsZXRlXCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1NpZ25PdXRXaXRoU2lnbkluTWFuYWdlcig8YW55PnJlc3BvbnNlXyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2dpbkFuZFJldHVyblRva2VuKG1vZGVsOiBUb2tlbkxvZ2luUG9zdCk6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvdG9rZW4tbG9naW5cIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KG1vZGVsKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xyXG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NMb2dpbkFuZFJldHVyblRva2VuKHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4oPGFueT5yZXNwb25zZV8pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0Pj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VG9rZW5SZXNwb25zZUdldD5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxUb2tlblJlc3BvbnNlR2V0PkpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAwKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkEgc2VydmVyIHNpZGUgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFRva2VuUmVzcG9uc2VHZXQ+KDxhbnk+bnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaFRva2VuKG1vZGVsOiBUb2tlblJlZnJlc2hQb3N0KTogT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PiB7XHJcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9pZGVudGl0eS90b2tlbi1yZWZyZXNoXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShtb2RlbCk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcclxuICAgICAgICAgICAgYm9keTogY29udGVudF8sXHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVmcmVzaFRva2VuKHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlZnJlc2hUb2tlbig8YW55PnJlc3BvbnNlXyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVmcmVzaFRva2VuKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogPFRva2VuUmVzcG9uc2VHZXQ+SlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0NDAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiA8VG9rZW5SZXNwb25zZUdldD5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkEgc2VydmVyIHNpZGUgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUb2tlblJlc3BvbnNlR2V0Pig8YW55Pm51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHJlZ2lzdGVyTW9kZWw6IFJlZ2lzdGVyUG9zdCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvcmVnaXN0ZXJcIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyTW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIoPGFueT5yZXNwb25zZV8pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8T2JzZXJ2YWJsZTx2b2lkPj48YW55Pl9vYnNlcnZhYmxlVGhyb3coZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlZ2lzdGVyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgICg8YW55PnJlc3BvbnNlKS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAoPGFueT5yZXNwb25zZSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KDxhbnk+bnVsbCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IDxBcGlFcnJvcj5KU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkEgc2VydmVyIHNpZGUgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXF1ZXN0UGFzc3dvcmRSZXNldChmb3Jnb3RQYXNzd29yZE1vZGVsOiBGb3Jnb3RQYXNzd29yZFBvc3QpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2lkZW50aXR5L3Bhc3N3b3JkLWZvcmdvdHRlblwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoZm9yZ290UGFzc3dvcmRNb2RlbCk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcclxuICAgICAgICAgICAgYm9keTogY29udGVudF8sXHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXF1ZXN0UGFzc3dvcmRSZXNldChyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXF1ZXN0UGFzc3dvcmRSZXNldCg8YW55PnJlc3BvbnNlXyk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxPYnNlcnZhYmxlPHZvaWQ+Pjxhbnk+X29ic2VydmFibGVUaHJvdyhlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPE9ic2VydmFibGU8dm9pZD4+PGFueT5fb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVxdWVzdFBhc3N3b3JkUmVzZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKDxhbnk+cmVzcG9uc2UpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/ICg8YW55PnJlc3BvbnNlKS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4oPGFueT5udWxsKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPig8YW55Pm51bGwpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUG9zdCB7XHJcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgc3RheVNpZ25lZEluOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVzcG9uc2VHZXQge1xyXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3JEZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBleHBpcmVzSW46IG51bWJlcjtcclxuICAgIGh0dHBFcnJvclJlYXNvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBodHRwU3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XHJcbiAgICBpZGVudGl0eVRva2VuPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGlzRXJyb3I6IGJvb2xlYW47XHJcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdG9rZW5UeXBlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVycm9yVHlwZTogUmVzcG9uc2VFcnJvclR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEh0dHBTdGF0dXNDb2RlIHtcclxuICAgIENvbnRpbnVlID0gXCJDb250aW51ZVwiLFxyXG4gICAgU3dpdGNoaW5nUHJvdG9jb2xzID0gXCJTd2l0Y2hpbmdQcm90b2NvbHNcIixcclxuICAgIFByb2Nlc3NpbmcgPSBcIlByb2Nlc3NpbmdcIixcclxuICAgIEVhcmx5SGludHMgPSBcIkVhcmx5SGludHNcIixcclxuICAgIE9LID0gXCJPS1wiLFxyXG4gICAgQ3JlYXRlZCA9IFwiQ3JlYXRlZFwiLFxyXG4gICAgQWNjZXB0ZWQgPSBcIkFjY2VwdGVkXCIsXHJcbiAgICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gPSBcIk5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvblwiLFxyXG4gICAgTm9Db250ZW50ID0gXCJOb0NvbnRlbnRcIixcclxuICAgIFJlc2V0Q29udGVudCA9IFwiUmVzZXRDb250ZW50XCIsXHJcbiAgICBQYXJ0aWFsQ29udGVudCA9IFwiUGFydGlhbENvbnRlbnRcIixcclxuICAgIE11bHRpU3RhdHVzID0gXCJNdWx0aVN0YXR1c1wiLFxyXG4gICAgQWxyZWFkeVJlcG9ydGVkID0gXCJBbHJlYWR5UmVwb3J0ZWRcIixcclxuICAgIElNVXNlZCA9IFwiSU1Vc2VkXCIsXHJcbiAgICBNdWx0aXBsZUNob2ljZXMgPSBcIkFtYmlndW91c1wiLFxyXG4gICAgQW1iaWd1b3VzID0gXCJNb3ZlZFwiLFxyXG4gICAgTW92ZWRQZXJtYW5lbnRseSA9IFwiUmVkaXJlY3RcIixcclxuICAgIE1vdmVkID0gXCJSZWRpcmVjdE1ldGhvZFwiLFxyXG4gICAgRm91bmQgPSBcIk5vdE1vZGlmaWVkXCIsXHJcbiAgICBSZWRpcmVjdCA9IFwiVXNlUHJveHlcIixcclxuICAgIFNlZU90aGVyID0gXCJVbnVzZWRcIixcclxuICAgIFJlZGlyZWN0TWV0aG9kID0gXCJUZW1wb3JhcnlSZWRpcmVjdFwiLFxyXG4gICAgTm90TW9kaWZpZWQgPSBcIlBlcm1hbmVudFJlZGlyZWN0XCIsXHJcbiAgICBVc2VQcm94eSA9IFwiQmFkUmVxdWVzdFwiLFxyXG4gICAgVW51c2VkID0gXCJVbmF1dGhvcml6ZWRcIixcclxuICAgIFRlbXBvcmFyeVJlZGlyZWN0ID0gXCJQYXltZW50UmVxdWlyZWRcIixcclxuICAgIFJlZGlyZWN0S2VlcFZlcmIgPSBcIkZvcmJpZGRlblwiLFxyXG4gICAgUGVybWFuZW50UmVkaXJlY3QgPSBcIk5vdEZvdW5kXCIsXHJcbiAgICBCYWRSZXF1ZXN0ID0gXCJNZXRob2ROb3RBbGxvd2VkXCIsXHJcbiAgICBVbmF1dGhvcml6ZWQgPSBcIk5vdEFjY2VwdGFibGVcIixcclxuICAgIFBheW1lbnRSZXF1aXJlZCA9IFwiUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkXCIsXHJcbiAgICBGb3JiaWRkZW4gPSBcIlJlcXVlc3RUaW1lb3V0XCIsXHJcbiAgICBOb3RGb3VuZCA9IFwiQ29uZmxpY3RcIixcclxuICAgIE1ldGhvZE5vdEFsbG93ZWQgPSBcIkdvbmVcIixcclxuICAgIE5vdEFjY2VwdGFibGUgPSBcIkxlbmd0aFJlcXVpcmVkXCIsXHJcbiAgICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgPSBcIlByZWNvbmRpdGlvbkZhaWxlZFwiLFxyXG4gICAgUmVxdWVzdFRpbWVvdXQgPSBcIlJlcXVlc3RFbnRpdHlUb29MYXJnZVwiLFxyXG4gICAgQ29uZmxpY3QgPSBcIlJlcXVlc3RVcmlUb29Mb25nXCIsXHJcbiAgICBHb25lID0gXCJVbnN1cHBvcnRlZE1lZGlhVHlwZVwiLFxyXG4gICAgTGVuZ3RoUmVxdWlyZWQgPSBcIlJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGVcIixcclxuICAgIFByZWNvbmRpdGlvbkZhaWxlZCA9IFwiRXhwZWN0YXRpb25GYWlsZWRcIixcclxuICAgIFJlcXVlc3RFbnRpdHlUb29MYXJnZSA9IFwiTWlzZGlyZWN0ZWRSZXF1ZXN0XCIsXHJcbiAgICBSZXF1ZXN0VXJpVG9vTG9uZyA9IFwiVW5wcm9jZXNzYWJsZUVudGl0eVwiLFxyXG4gICAgVW5zdXBwb3J0ZWRNZWRpYVR5cGUgPSBcIkxvY2tlZFwiLFxyXG4gICAgUmVxdWVzdGVkUmFuZ2VOb3RTYXRpc2ZpYWJsZSA9IFwiRmFpbGVkRGVwZW5kZW5jeVwiLFxyXG4gICAgRXhwZWN0YXRpb25GYWlsZWQgPSBcIlVwZ3JhZGVSZXF1aXJlZFwiLFxyXG4gICAgTWlzZGlyZWN0ZWRSZXF1ZXN0ID0gXCJQcmVjb25kaXRpb25SZXF1aXJlZFwiLFxyXG4gICAgVW5wcm9jZXNzYWJsZUVudGl0eSA9IFwiVG9vTWFueVJlcXVlc3RzXCIsXHJcbiAgICBMb2NrZWQgPSBcIlJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZVwiLFxyXG4gICAgRmFpbGVkRGVwZW5kZW5jeSA9IFwiVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnNcIixcclxuICAgIFVwZ3JhZGVSZXF1aXJlZCA9IFwiSW50ZXJuYWxTZXJ2ZXJFcnJvclwiLFxyXG4gICAgUHJlY29uZGl0aW9uUmVxdWlyZWQgPSBcIk5vdEltcGxlbWVudGVkXCIsXHJcbiAgICBUb29NYW55UmVxdWVzdHMgPSBcIkJhZEdhdGV3YXlcIixcclxuICAgIFJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCIsXHJcbiAgICBVbmF2YWlsYWJsZUZvckxlZ2FsUmVhc29ucyA9IFwiR2F0ZXdheVRpbWVvdXRcIixcclxuICAgIEludGVybmFsU2VydmVyRXJyb3IgPSBcIkh0dHBWZXJzaW9uTm90U3VwcG9ydGVkXCIsXHJcbiAgICBOb3RJbXBsZW1lbnRlZCA9IFwiVmFyaWFudEFsc29OZWdvdGlhdGVzXCIsXHJcbiAgICBCYWRHYXRld2F5ID0gXCJJbnN1ZmZpY2llbnRTdG9yYWdlXCIsXHJcbiAgICBTZXJ2aWNlVW5hdmFpbGFibGUgPSBcIkxvb3BEZXRlY3RlZFwiLFxyXG4gICAgR2F0ZXdheVRpbWVvdXQgPSBcIk5vdEV4dGVuZGVkXCIsXHJcbiAgICBIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZCA9IFwiTmV0d29ya0F1dGhlbnRpY2F0aW9uUmVxdWlyZWRcIixcclxufVxyXG5cclxuLyoqIFZhcmlvdXMgcmVhc29ucyBmb3IgYSBwcm90b2NvbCBlbmRwb2ludCBlcnJvciAqL1xyXG5leHBvcnQgZW51bSBSZXNwb25zZUVycm9yVHlwZSB7XHJcbiAgICBOb25lID0gXCJOb25lXCIsXHJcbiAgICBQcm90b2NvbCA9IFwiUHJvdG9jb2xcIixcclxuICAgIEh0dHAgPSBcIkh0dHBcIixcclxuICAgIEV4Y2VwdGlvbiA9IFwiRXhjZXB0aW9uXCIsXHJcbiAgICBQb2xpY3lWaW9sYXRpb24gPSBcIlBvbGljeVZpb2xhdGlvblwiLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuTG9naW5Qb3N0IHtcclxuICAgIGlkZW50aWZpZXI6IHN0cmluZztcclxuICAgIHBhc3N3b3JkOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZWZyZXNoUG9zdCB7XHJcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZztcclxufVxyXG5cclxuLyoqIERhdGEgdHJhbnNmZXIgY2xhc3MgdG8gY29udmV5IGFwaSBlcnJvcnMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBBcGlFcnJvciB7XHJcbiAgICAvKiogVGhpcyBkaWN0aW9uYXJ5IGNvbnRhaW5zIGEgc2V0IG9mIGFsbCBlcnJvcnMgYW5kIHRoZWlyIG1lc3NhZ2VzICovXHJcbiAgICBlcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdOyB9IHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclBvc3Qge1xyXG4gICAgdXNlcm5hbWU6IHN0cmluZztcclxuICAgIGVtYWlsOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgcHJlZmVycmVkTGFuZ3VhZ2VzPzogc3RyaW5nW10gfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEZvcmdvdFBhc3N3b3JkUG9zdCB7XHJcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XHJcbiAgICBwcmVmZXJyZWRMYW5ndWFnZXM/OiBzdHJpbmdbXSB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTd2FnZ2VyRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICByZXNwb25zZTogc3RyaW5nO1xyXG4gICAgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XHJcbiAgICByZXN1bHQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCByZXNwb25zZTogc3RyaW5nLCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgcmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpc1N3YWdnZXJFeGNlcHRpb24gPSB0cnVlO1xyXG5cclxuICAgIHN0YXRpYyBpc1N3YWdnZXJFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgU3dhZ2dlckV4Y2VwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5pc1N3YWdnZXJFeGNlcHRpb24gPT09IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXN1bHQpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBTd2FnZ2VyRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWJsb2IpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoKDxhbnk+ZXZlbnQudGFyZ2V0KS5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYik7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0iXX0=
@@ -1,14 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
3
- import { JwtInterceptorService } from './interceptors/jwt-interceptor.service';
4
- export class DanglIdentityModule {
5
- }
6
- DanglIdentityModule.decorators = [
7
- { type: NgModule, args: [{
8
- imports: [
9
- HttpClientModule
10
- ],
11
- providers: [{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptorService, multi: true }]
12
- },] }
13
- ];
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFuZ2wtaWRlbnRpdHkubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1kYW5nbC1pZGVudGl0eS1jbGllbnQvc3JjL2RhbmdsLWlkZW50aXR5Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBUS9FLE1BQU0sT0FBTyxtQkFBbUI7OztZQU4vQixRQUFRLFNBQUM7Z0JBQ1IsT0FBTyxFQUFFO29CQUNQLGdCQUFnQjtpQkFDakI7Z0JBQ0QsU0FBUyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUMxRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUsIEhUVFBfSU5URVJDRVBUT1JTIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBKd3RJbnRlcmNlcHRvclNlcnZpY2UgfSBmcm9tICcuL2ludGVyY2VwdG9ycy9qd3QtaW50ZXJjZXB0b3Iuc2VydmljZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIEh0dHBDbGllbnRNb2R1bGVcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsIHVzZUNsYXNzOiBKd3RJbnRlcmNlcHRvclNlcnZpY2UsIG11bHRpOiB0cnVlIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYW5nbElkZW50aXR5TW9kdWxlIHsgfVxyXG4iXX0=
@@ -1,43 +0,0 @@
1
- import { Inject, Injectable, InjectionToken, Optional } from "@angular/core";
2
- import { JwtTokenService } from "../services/jwt-token.service";
3
- import { mergeMap } from "rxjs/operators";
4
- export const DANGL_IDENTITY_REQUEST_VALIDATOR = new InjectionToken("Validator to decide whether to include JWT tokens in requests");
5
- export class JwtInterceptorService {
6
- constructor(jwtTokenService, requestValidator) {
7
- this.jwtTokenService = jwtTokenService;
8
- this.requestValidator = requestValidator;
9
- }
10
- intercept(request, next) {
11
- if (request.url.startsWith("/identity")) {
12
- // Requests to the authentication endpoint should not be intercepted
13
- return next.handle(request.clone());
14
- }
15
- if (this.requestValidator &&
16
- !this.requestValidator.validateRequest(request)) {
17
- // In case a request validator is provided but doesn't return true for the
18
- // current request, we're not appending a token
19
- return next.handle(request);
20
- }
21
- return this.jwtTokenService
22
- .getToken()
23
- .pipe(mergeMap((f) => next.handle(this.getHttpRequestWithToken(request, f && f.accessToken))));
24
- }
25
- getHttpRequestWithToken(request, token) {
26
- if (token) {
27
- return request.clone({
28
- setHeaders: {
29
- Authorization: `Bearer ${token}`,
30
- },
31
- });
32
- }
33
- return request.clone();
34
- }
35
- }
36
- JwtInterceptorService.decorators = [
37
- { type: Injectable }
38
- ];
39
- JwtInterceptorService.ctorParameters = () => [
40
- { type: JwtTokenService },
41
- { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DANGL_IDENTITY_REQUEST_VALIDATOR,] }] }
42
- ];
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWRhbmdsLWlkZW50aXR5LWNsaWVudC9zcmMvaW50ZXJjZXB0b3JzL2p3dC1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcxQyxNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FDM0MsSUFBSSxjQUFjLENBQ2hCLCtEQUErRCxDQUNoRSxDQUFDO0FBRUosTUFBTSxPQUFPLHFCQUFxQjtJQUNoQyxZQUNTLGVBQWdDLEVBRy9CLGdCQUFnRDtRQUhqRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFHL0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQztJQUN2RCxDQUFDO0lBQ0osU0FBUyxDQUNQLE9BQXlCLEVBQ3pCLElBQWlCO1FBRWpCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkMsb0VBQW9FO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUNyQztRQUVELElBQ0UsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEVBQy9DO1lBQ0EsMEVBQTBFO1lBQzFFLCtDQUErQztZQUMvQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDN0I7UUFFRCxPQUFPLElBQUksQ0FBQyxlQUFlO2FBQ3hCLFFBQVEsRUFBRTthQUNWLElBQUksQ0FDSCxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQ3ZFLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFTyx1QkFBdUIsQ0FDN0IsT0FBeUIsRUFDekIsS0FBYztRQUVkLElBQUksS0FBSyxFQUFFO1lBQ1QsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUNuQixVQUFVLEVBQUU7b0JBQ1YsYUFBYSxFQUFFLFVBQVUsS0FBSyxFQUFFO2lCQUNqQzthQUNGLENBQUMsQ0FBQztTQUNKO1FBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7O1lBL0NGLFVBQVU7OztZQVRGLGVBQWU7NENBYW5CLFFBQVEsWUFDUixNQUFNLFNBQUMsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBIdHRwRXZlbnQsXHJcbiAgSHR0cEhhbmRsZXIsXHJcbiAgSHR0cEludGVyY2VwdG9yLFxyXG4gIEh0dHBSZXF1ZXN0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBKd3RUb2tlblNlcnZpY2UgfSBmcm9tIFwiLi4vc2VydmljZXMvand0LXRva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IG1lcmdlTWFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7IElEYW5nbElkZW50aXR5UmVxdWVzdFZhbGlkYXRvciB9IGZyb20gXCIuL2RhbmdsLWlkZW50aXR5LXJlcXVlc3QtdmFsaWRhdG9yXCI7XHJcblxyXG5leHBvcnQgY29uc3QgREFOR0xfSURFTlRJVFlfUkVRVUVTVF9WQUxJREFUT1IgPVxyXG4gIG5ldyBJbmplY3Rpb25Ub2tlbjxJRGFuZ2xJZGVudGl0eVJlcXVlc3RWYWxpZGF0b3I+KFxyXG4gICAgXCJWYWxpZGF0b3IgdG8gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSBKV1QgdG9rZW5zIGluIHJlcXVlc3RzXCJcclxuICApO1xyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBKd3RJbnRlcmNlcHRvclNlcnZpY2UgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIGp3dFRva2VuU2VydmljZTogSnd0VG9rZW5TZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBJbmplY3QoREFOR0xfSURFTlRJVFlfUkVRVUVTVF9WQUxJREFUT1IpXHJcbiAgICBwcml2YXRlIHJlcXVlc3RWYWxpZGF0b3I6IElEYW5nbElkZW50aXR5UmVxdWVzdFZhbGlkYXRvclxyXG4gICkge31cclxuICBpbnRlcmNlcHQoXHJcbiAgICByZXF1ZXN0OiBIdHRwUmVxdWVzdDxhbnk+LFxyXG4gICAgbmV4dDogSHR0cEhhbmRsZXJcclxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XHJcbiAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9pZGVudGl0eVwiKSkge1xyXG4gICAgICAvLyBSZXF1ZXN0cyB0byB0aGUgYXV0aGVudGljYXRpb24gZW5kcG9pbnQgc2hvdWxkIG5vdCBiZSBpbnRlcmNlcHRlZFxyXG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdC5jbG9uZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMucmVxdWVzdFZhbGlkYXRvciAmJlxyXG4gICAgICAhdGhpcy5yZXF1ZXN0VmFsaWRhdG9yLnZhbGlkYXRlUmVxdWVzdChyZXF1ZXN0KVxyXG4gICAgKSB7XHJcbiAgICAgIC8vIEluIGNhc2UgYSByZXF1ZXN0IHZhbGlkYXRvciBpcyBwcm92aWRlZCBidXQgZG9lc24ndCByZXR1cm4gdHJ1ZSBmb3IgdGhlXHJcbiAgICAgIC8vIGN1cnJlbnQgcmVxdWVzdCwgd2UncmUgbm90IGFwcGVuZGluZyBhIHRva2VuXHJcbiAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXF1ZXN0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGhpcy5qd3RUb2tlblNlcnZpY2VcclxuICAgICAgLmdldFRva2VuKClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWVyZ2VNYXAoKGYpID0+XHJcbiAgICAgICAgICBuZXh0LmhhbmRsZSh0aGlzLmdldEh0dHBSZXF1ZXN0V2l0aFRva2VuKHJlcXVlc3QsIGYgJiYgZi5hY2Nlc3NUb2tlbikpXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIdHRwUmVxdWVzdFdpdGhUb2tlbihcclxuICAgIHJlcXVlc3Q6IEh0dHBSZXF1ZXN0PGFueT4sXHJcbiAgICB0b2tlbj86IHN0cmluZ1xyXG4gICk6IEh0dHBSZXF1ZXN0PGFueT4ge1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgIHJldHVybiByZXF1ZXN0LmNsb25lKHtcclxuICAgICAgICBzZXRIZWFkZXJzOiB7XHJcbiAgICAgICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dG9rZW59YCxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXF1ZXN0LmNsb25lKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==