@dangl/angular-dangl-identity-client 6.2.0-beta0010 → 6.2.1-beta0010
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.
- package/README.md +25 -0
- package/api-client.d.ts +178 -178
- package/dangl-identity.module.d.ts +6 -7
- package/{esm2020 → esm2022}/api-client.mjs +551 -551
- package/{esm2020 → esm2022}/dangl-angular-dangl-identity-client.mjs +4 -4
- package/esm2022/dangl-identity.module.mjs +30 -0
- package/{esm2020 → esm2022}/interceptors/dangl-identity-request-validator.mjs +1 -1
- package/{esm2020 → esm2022}/interceptors/jwt-interceptor.service.mjs +47 -47
- package/esm2022/messengers/authentication.messenger.mjs +170 -0
- package/{esm2020 → esm2022}/models/jwt-storage.mjs +1 -1
- package/{esm2020 → esm2022}/models/user-info.mjs +1 -1
- package/{esm2020 → esm2022}/public_api.mjs +11 -11
- package/{esm2020 → esm2022}/services/authentication.service.mjs +39 -39
- package/{esm2020 → esm2022}/services/jwt-token.service.mjs +101 -101
- package/{fesm2020 → fesm2022}/dangl-angular-dangl-identity-client.mjs +905 -873
- package/fesm2022/dangl-angular-dangl-identity-client.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/interceptors/dangl-identity-request-validator.d.ts +4 -4
- package/interceptors/jwt-interceptor.service.d.ts +16 -16
- package/messengers/authentication.messenger.d.ts +28 -26
- package/models/jwt-storage.d.ts +5 -5
- package/models/user-info.d.ts +11 -11
- package/package.json +7 -13
- package/public_api.d.ts +8 -8
- package/services/authentication.service.d.ts +14 -14
- package/services/jwt-token.service.d.ts +28 -28
- package/esm2020/dangl-identity.module.mjs +0 -29
- package/esm2020/messengers/authentication.messenger.mjs +0 -146
- package/fesm2015/dangl-angular-dangl-identity-client.mjs +0 -896
- package/fesm2015/dangl-angular-dangl-identity-client.mjs.map +0 -1
- package/fesm2020/dangl-angular-dangl-identity-client.mjs.map +0 -1
|
@@ -1,551 +1,551 @@
|
|
|
1
|
-
//----------------------
|
|
2
|
-
// <auto-generated>
|
|
3
|
-
// Generated using the NSwag toolchain v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
|
|
4
|
-
// </auto-generated>
|
|
5
|
-
//----------------------
|
|
6
|
-
/* tslint:disable */
|
|
7
|
-
/* eslint-disable */
|
|
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 ?? "";
|
|
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 === 400) {
|
|
350
|
-
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
351
|
-
let result400 = null;
|
|
352
|
-
result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
353
|
-
return throwException("A server side error occurred.", status, _responseText, _headers, result400);
|
|
354
|
-
}));
|
|
355
|
-
}
|
|
356
|
-
else if (status !== 200 && status !== 204) {
|
|
357
|
-
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
358
|
-
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
359
|
-
}));
|
|
360
|
-
}
|
|
361
|
-
return _observableOf(null);
|
|
362
|
-
}
|
|
363
|
-
getUserInfo() {
|
|
364
|
-
let url_ = this.baseUrl + "/identity/user-info";
|
|
365
|
-
url_ = url_.replace(/[?&]$/, "");
|
|
366
|
-
let options_ = {
|
|
367
|
-
observe: "response",
|
|
368
|
-
responseType: "blob",
|
|
369
|
-
headers: new HttpHeaders({
|
|
370
|
-
"Accept": "application/json"
|
|
371
|
-
})
|
|
372
|
-
};
|
|
373
|
-
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
374
|
-
return this.processGetUserInfo(response_);
|
|
375
|
-
})).pipe(_observableCatch((response_) => {
|
|
376
|
-
if (response_ instanceof HttpResponseBase) {
|
|
377
|
-
try {
|
|
378
|
-
return this.processGetUserInfo(response_);
|
|
379
|
-
}
|
|
380
|
-
catch (e) {
|
|
381
|
-
return _observableThrow(e);
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
else
|
|
385
|
-
return _observableThrow(response_);
|
|
386
|
-
}));
|
|
387
|
-
}
|
|
388
|
-
processGetUserInfo(response) {
|
|
389
|
-
const status = response.status;
|
|
390
|
-
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
391
|
-
response.error instanceof Blob ? response.error : undefined;
|
|
392
|
-
let _headers = {};
|
|
393
|
-
if (response.headers) {
|
|
394
|
-
for (let key of response.headers.keys()) {
|
|
395
|
-
_headers[key] = response.headers.get(key);
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
if (status === 200) {
|
|
399
|
-
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
400
|
-
let result200 = null;
|
|
401
|
-
result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
402
|
-
return _observableOf(result200);
|
|
403
|
-
}));
|
|
404
|
-
}
|
|
405
|
-
else if (status === 400) {
|
|
406
|
-
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
407
|
-
let result400 = null;
|
|
408
|
-
result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
409
|
-
return throwException("A server side error occurred.", status, _responseText, _headers, result400);
|
|
410
|
-
}));
|
|
411
|
-
}
|
|
412
|
-
else if (status !== 200 && status !== 204) {
|
|
413
|
-
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
414
|
-
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
415
|
-
}));
|
|
416
|
-
}
|
|
417
|
-
return _observableOf(null);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
423
|
-
type: Injectable,
|
|
424
|
-
args: [{
|
|
425
|
-
providedIn: 'root'
|
|
426
|
-
}]
|
|
427
|
-
}], ctorParameters:
|
|
428
|
-
type: Inject,
|
|
429
|
-
args: [HttpClient]
|
|
430
|
-
}] }, { type: undefined, decorators: [{
|
|
431
|
-
type: Optional
|
|
432
|
-
}, {
|
|
433
|
-
type: Inject,
|
|
434
|
-
args: [DANGL_IDENTITY_CLIENT_API_BASE_URL]
|
|
435
|
-
}] }]
|
|
436
|
-
export var HttpStatusCode;
|
|
437
|
-
(function (HttpStatusCode) {
|
|
438
|
-
HttpStatusCode["Continue"] = "Continue";
|
|
439
|
-
HttpStatusCode["SwitchingProtocols"] = "SwitchingProtocols";
|
|
440
|
-
HttpStatusCode["Processing"] = "Processing";
|
|
441
|
-
HttpStatusCode["EarlyHints"] = "EarlyHints";
|
|
442
|
-
HttpStatusCode["OK"] = "OK";
|
|
443
|
-
HttpStatusCode["Created"] = "Created";
|
|
444
|
-
HttpStatusCode["Accepted"] = "Accepted";
|
|
445
|
-
HttpStatusCode["NonAuthoritativeInformation"] = "NonAuthoritativeInformation";
|
|
446
|
-
HttpStatusCode["NoContent"] = "NoContent";
|
|
447
|
-
HttpStatusCode["ResetContent"] = "ResetContent";
|
|
448
|
-
HttpStatusCode["PartialContent"] = "PartialContent";
|
|
449
|
-
HttpStatusCode["MultiStatus"] = "MultiStatus";
|
|
450
|
-
HttpStatusCode["AlreadyReported"] = "AlreadyReported";
|
|
451
|
-
HttpStatusCode["IMUsed"] = "IMUsed";
|
|
452
|
-
HttpStatusCode["MultipleChoices"] = "MultipleChoices";
|
|
453
|
-
HttpStatusCode["Ambiguous"] = "MultipleChoices";
|
|
454
|
-
HttpStatusCode["MovedPermanently"] = "MovedPermanently";
|
|
455
|
-
HttpStatusCode["Moved"] = "MovedPermanently";
|
|
456
|
-
HttpStatusCode["Found"] = "Found";
|
|
457
|
-
HttpStatusCode["Redirect"] = "Found";
|
|
458
|
-
HttpStatusCode["SeeOther"] = "SeeOther";
|
|
459
|
-
HttpStatusCode["RedirectMethod"] = "SeeOther";
|
|
460
|
-
HttpStatusCode["NotModified"] = "NotModified";
|
|
461
|
-
HttpStatusCode["UseProxy"] = "UseProxy";
|
|
462
|
-
HttpStatusCode["Unused"] = "Unused";
|
|
463
|
-
HttpStatusCode["TemporaryRedirect"] = "TemporaryRedirect";
|
|
464
|
-
HttpStatusCode["RedirectKeepVerb"] = "TemporaryRedirect";
|
|
465
|
-
HttpStatusCode["PermanentRedirect"] = "PermanentRedirect";
|
|
466
|
-
HttpStatusCode["BadRequest"] = "BadRequest";
|
|
467
|
-
HttpStatusCode["Unauthorized"] = "Unauthorized";
|
|
468
|
-
HttpStatusCode["PaymentRequired"] = "PaymentRequired";
|
|
469
|
-
HttpStatusCode["Forbidden"] = "Forbidden";
|
|
470
|
-
HttpStatusCode["NotFound"] = "NotFound";
|
|
471
|
-
HttpStatusCode["MethodNotAllowed"] = "MethodNotAllowed";
|
|
472
|
-
HttpStatusCode["NotAcceptable"] = "NotAcceptable";
|
|
473
|
-
HttpStatusCode["ProxyAuthenticationRequired"] = "ProxyAuthenticationRequired";
|
|
474
|
-
HttpStatusCode["RequestTimeout"] = "RequestTimeout";
|
|
475
|
-
HttpStatusCode["Conflict"] = "Conflict";
|
|
476
|
-
HttpStatusCode["Gone"] = "Gone";
|
|
477
|
-
HttpStatusCode["LengthRequired"] = "LengthRequired";
|
|
478
|
-
HttpStatusCode["PreconditionFailed"] = "PreconditionFailed";
|
|
479
|
-
HttpStatusCode["RequestEntityTooLarge"] = "RequestEntityTooLarge";
|
|
480
|
-
HttpStatusCode["RequestUriTooLong"] = "RequestUriTooLong";
|
|
481
|
-
HttpStatusCode["UnsupportedMediaType"] = "UnsupportedMediaType";
|
|
482
|
-
HttpStatusCode["RequestedRangeNotSatisfiable"] = "RequestedRangeNotSatisfiable";
|
|
483
|
-
HttpStatusCode["ExpectationFailed"] = "ExpectationFailed";
|
|
484
|
-
HttpStatusCode["MisdirectedRequest"] = "MisdirectedRequest";
|
|
485
|
-
HttpStatusCode["UnprocessableEntity"] = "UnprocessableEntity";
|
|
486
|
-
HttpStatusCode["UnprocessableContent"] = "UnprocessableEntity";
|
|
487
|
-
HttpStatusCode["Locked"] = "Locked";
|
|
488
|
-
HttpStatusCode["FailedDependency"] = "FailedDependency";
|
|
489
|
-
HttpStatusCode["UpgradeRequired"] = "UpgradeRequired";
|
|
490
|
-
HttpStatusCode["PreconditionRequired"] = "PreconditionRequired";
|
|
491
|
-
HttpStatusCode["TooManyRequests"] = "TooManyRequests";
|
|
492
|
-
HttpStatusCode["RequestHeaderFieldsTooLarge"] = "RequestHeaderFieldsTooLarge";
|
|
493
|
-
HttpStatusCode["UnavailableForLegalReasons"] = "UnavailableForLegalReasons";
|
|
494
|
-
HttpStatusCode["InternalServerError"] = "InternalServerError";
|
|
495
|
-
HttpStatusCode["NotImplemented"] = "NotImplemented";
|
|
496
|
-
HttpStatusCode["BadGateway"] = "BadGateway";
|
|
497
|
-
HttpStatusCode["ServiceUnavailable"] = "ServiceUnavailable";
|
|
498
|
-
HttpStatusCode["GatewayTimeout"] = "GatewayTimeout";
|
|
499
|
-
HttpStatusCode["HttpVersionNotSupported"] = "HttpVersionNotSupported";
|
|
500
|
-
HttpStatusCode["VariantAlsoNegotiates"] = "VariantAlsoNegotiates";
|
|
501
|
-
HttpStatusCode["InsufficientStorage"] = "InsufficientStorage";
|
|
502
|
-
HttpStatusCode["LoopDetected"] = "LoopDetected";
|
|
503
|
-
HttpStatusCode["NotExtended"] = "NotExtended";
|
|
504
|
-
HttpStatusCode["NetworkAuthenticationRequired"] = "NetworkAuthenticationRequired";
|
|
505
|
-
})(HttpStatusCode || (HttpStatusCode = {}));
|
|
506
|
-
/** Various reasons for a protocol endpoint error */
|
|
507
|
-
export var ResponseErrorType;
|
|
508
|
-
(function (ResponseErrorType) {
|
|
509
|
-
ResponseErrorType["None"] = "None";
|
|
510
|
-
ResponseErrorType["Protocol"] = "Protocol";
|
|
511
|
-
ResponseErrorType["Http"] = "Http";
|
|
512
|
-
ResponseErrorType["Exception"] = "Exception";
|
|
513
|
-
ResponseErrorType["PolicyViolation"] = "PolicyViolation";
|
|
514
|
-
})(ResponseErrorType || (ResponseErrorType = {}));
|
|
515
|
-
export class SwaggerException extends Error {
|
|
516
|
-
constructor(message, status, response, headers, result) {
|
|
517
|
-
super();
|
|
518
|
-
this.isSwaggerException = true;
|
|
519
|
-
this.message = message;
|
|
520
|
-
this.status = status;
|
|
521
|
-
this.response = response;
|
|
522
|
-
this.headers = headers;
|
|
523
|
-
this.result = result;
|
|
524
|
-
}
|
|
525
|
-
static isSwaggerException(obj) {
|
|
526
|
-
return obj.isSwaggerException === true;
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
function throwException(message, status, response, headers, result) {
|
|
530
|
-
if (result !== null && result !== undefined)
|
|
531
|
-
return _observableThrow(result);
|
|
532
|
-
else
|
|
533
|
-
return _observableThrow(new SwaggerException(message, status, response, headers, null));
|
|
534
|
-
}
|
|
535
|
-
function blobToText(blob) {
|
|
536
|
-
return new Observable((observer) => {
|
|
537
|
-
if (!blob) {
|
|
538
|
-
observer.next("");
|
|
539
|
-
observer.complete();
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
let reader = new FileReader();
|
|
543
|
-
reader.onload = event => {
|
|
544
|
-
observer.next(event.target.result);
|
|
545
|
-
observer.complete();
|
|
546
|
-
};
|
|
547
|
-
reader.readAsText(blob);
|
|
548
|
-
}
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZGFuZ2wtaWRlbnRpdHktY2xpZW50L3NyYy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QjtBQUN4QixtQkFBbUI7QUFDbkIsMkhBQTJIO0FBQzNILG9CQUFvQjtBQUNwQix3QkFBd0I7QUFFeEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLGNBQWMsQ0FBUyxvQ0FBb0MsQ0FBQyxDQUFDO0FBS25ILE1BQU0sT0FBTyxtQkFBbUI7SUFLNUIsWUFBZ0MsSUFBZ0IsRUFBMEQsT0FBZ0I7UUFGaEgscUJBQWdCLEdBQW1ELFNBQVMsQ0FBQztRQUduRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQixFQUFFLFdBQXNDO1FBQ3BFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFB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QUNoRyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBUztJQUN6QixPQUFPLElBQUksVUFBVSxDQUFTLENBQUMsUUFBYSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFDLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPGF1dG8tZ2VuZXJhdGVkPlxyXG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjE0LjEuMC4wIChOSnNvblNjaGVtYSB2MTEuMC4yLjAgKE5ld3RvbnNvZnQuSnNvbiB2MTMuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcclxuLy8gPC9hdXRvLWdlbmVyYXRlZD5cclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG4vLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmdcclxuXHJcbmltcG9ydCB7IG1lcmdlTWFwIGFzIF9vYnNlcnZhYmxlTWVyZ2VNYXAsIGNhdGNoRXJyb3IgYXMgX29ic2VydmFibGVDYXRjaCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY29uc3QgREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdEQU5HTF9JREVOVElUWV9DTElFTlRfQVBJX0JBU0VfVVJMJyk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhbmdsSWRlbnRpdHlDbGllbnQge1xyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCA/PyBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ2luV2l0aENvb2tpZShtb2RlbDogTG9naW5Qb3N0LCByZWRpcmVjdFVybDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvbG9naW4/XCI7XHJcbiAgICAgICAgaWYgKHJlZGlyZWN0VXJsICE9PSB1bmRlZmluZWQgJiYgcmVkaXJlY3RVcmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZWRpcmVjdFVybD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVkaXJlY3RVcmwpICsgXCImXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShtb2RlbCk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcclxuICAgICAgICAgICAgYm9keTogY29udGVudF8sXHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NMb2dpbldpdGhDb29raWUocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvbG9naW5cIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJkZWxldGVcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduT3V0V2l0aFNpZ25Jbk1hbmFnZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ2luQW5kUmV0dXJuVG9rZW4obW9kZWw6IFRva2VuTG9naW5Qb3N0KTogT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PiB7XHJcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9pZGVudGl0eS90b2tlbi1sb2dpblwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkobW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4ocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9naW5BbmRSZXR1cm5Ub2tlbihyZXNwb25zZV8gYXMgYW55KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+O1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIFRva2VuUmVzcG9uc2VHZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBUb2tlblJlc3BvbnNlR2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VG9rZW5SZXNwb25zZUdldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hUb2tlbihtb2RlbDogVG9rZW5SZWZyZXNoUG9zdCk6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvdG9rZW4tcmVmcmVzaFwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkobW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlZnJlc2hUb2tlbihyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZWZyZXNoVG9rZW4ocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PjtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWZyZXNoVG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIFRva2VuUmVzcG9uc2VHZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBUb2tlblJlc3BvbnNlR2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VG9rZW5SZXNwb25zZUdldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHJlZ2lzdGVyTW9kZWw6IFJlZ2lzdGVyUG9zdCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvcmVnaXN0ZXJcIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyTW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTx2b2lkPjtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWdpc3RlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxyXG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxyXG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0NDAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcikgYXMgQXBpRXJyb3I7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkEgc2VydmVyIHNpZGUgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KGZvcmdvdFBhc3N3b3JkTW9kZWw6IEZvcmdvdFBhc3N3b3JkUG9zdCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvcGFzc3dvcmQtZm9yZ290dGVuXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShmb3Jnb3RQYXNzd29yZE1vZGVsKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xyXG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RQYXNzd29yZFJlc2V0KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RQYXNzd29yZFJlc2V0KHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVxdWVzdFBhc3N3b3JkUmVzZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KG51bGwgYXMgYW55KTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDQwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIEFwaUVycm9yO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KG51bGwgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VySW5mbygpOiBPYnNlcnZhYmxlPFVzZXJJbmZvR2V0PiB7XHJcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9pZGVudGl0eS91c2VyLWluZm9cIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzR2V0VXNlckluZm8ocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzR2V0VXNlckluZm8ocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8VXNlckluZm9HZXQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8VXNlckluZm9HZXQ+O1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFVzZXJJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxVc2VySW5mb0dldD4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxyXG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxyXG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcikgYXMgVXNlckluZm9HZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBBcGlFcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAwKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxVc2VySW5mb0dldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUG9zdCB7XHJcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgc3RheVNpZ25lZEluOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVzcG9uc2VHZXQge1xyXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3JEZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBleHBpcmVzSW46IG51bWJlcjtcclxuICAgIGh0dHBFcnJvclJlYXNvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBodHRwU3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XHJcbiAgICBpZGVudGl0eVRva2VuPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGlzRXJyb3I6IGJvb2xlYW47XHJcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdG9rZW5UeXBlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVycm9yVHlwZTogUmVzcG9uc2VFcnJvclR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEh0dHBTdGF0dXNDb2RlIHtcclxuICAgIENvbnRpbnVlID0gXCJDb250aW51ZVwiLFxyXG4gICAgU3dpdGNoaW5nUHJvdG9jb2xzID0gXCJTd2l0Y2hpbmdQcm90b2NvbHNcIixcclxuICAgIFByb2Nlc3NpbmcgPSBcIlByb2Nlc3NpbmdcIixcclxuICAgIEVhcmx5SGludHMgPSBcIkVhcmx5SGludHNcIixcclxuICAgIE9LID0gXCJPS1wiLFxyXG4gICAgQ3JlYXRlZCA9IFwiQ3JlYXRlZFwiLFxyXG4gICAgQWNjZXB0ZWQgPSBcIkFjY2VwdGVkXCIsXHJcbiAgICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gPSBcIk5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvblwiLFxyXG4gICAgTm9Db250ZW50ID0gXCJOb0NvbnRlbnRcIixcclxuICAgIFJlc2V0Q29udGVudCA9IFwiUmVzZXRDb250ZW50XCIsXHJcbiAgICBQYXJ0aWFsQ29udGVudCA9IFwiUGFydGlhbENvbnRlbnRcIixcclxuICAgIE11bHRpU3RhdHVzID0gXCJNdWx0aVN0YXR1c1wiLFxyXG4gICAgQWxyZWFkeVJlcG9ydGVkID0gXCJBbHJlYWR5UmVwb3J0ZWRcIixcclxuICAgIElNVXNlZCA9IFwiSU1Vc2VkXCIsXHJcbiAgICBNdWx0aXBsZUNob2ljZXMgPSBcIk11bHRpcGxlQ2hvaWNlc1wiLFxyXG4gICAgQW1iaWd1b3VzID0gXCJNdWx0aXBsZUNob2ljZXNcIixcclxuICAgIE1vdmVkUGVybWFuZW50bHkgPSBcIk1vdmVkUGVybWFuZW50bHlcIixcclxuICAgIE1vdmVkID0gXCJNb3ZlZFBlcm1hbmVudGx5XCIsXHJcbiAgICBGb3VuZCA9IFwiRm91bmRcIixcclxuICAgIFJlZGlyZWN0ID0gXCJGb3VuZFwiLFxyXG4gICAgU2VlT3RoZXIgPSBcIlNlZU90aGVyXCIsXHJcbiAgICBSZWRpcmVjdE1ldGhvZCA9IFwiU2VlT3RoZXJcIixcclxuICAgIE5vdE1vZGlmaWVkID0gXCJOb3RNb2RpZmllZFwiLFxyXG4gICAgVXNlUHJveHkgPSBcIlVzZVByb3h5XCIsXHJcbiAgICBVbnVzZWQgPSBcIlVudXNlZFwiLFxyXG4gICAgVGVtcG9yYXJ5UmVkaXJlY3QgPSBcIlRlbXBvcmFyeVJlZGlyZWN0XCIsXHJcbiAgICBSZWRpcmVjdEtlZXBWZXJiID0gXCJUZW1wb3JhcnlSZWRpcmVjdFwiLFxyXG4gICAgUGVybWFuZW50UmVkaXJlY3QgPSBcIlBlcm1hbmVudFJlZGlyZWN0XCIsXHJcbiAgICBCYWRSZXF1ZXN0ID0gXCJCYWRSZXF1ZXN0XCIsXHJcbiAgICBVbmF1dGhvcml6ZWQgPSBcIlVuYXV0aG9yaXplZFwiLFxyXG4gICAgUGF5bWVudFJlcXVpcmVkID0gXCJQYXltZW50UmVxdWlyZWRcIixcclxuICAgIEZvcmJpZGRlbiA9IFwiRm9yYmlkZGVuXCIsXHJcbiAgICBOb3RGb3VuZCA9IFwiTm90Rm91bmRcIixcclxuICAgIE1ldGhvZE5vdEFsbG93ZWQgPSBcIk1ldGhvZE5vdEFsbG93ZWRcIixcclxuICAgIE5vdEFjY2VwdGFibGUgPSBcIk5vdEFjY2VwdGFibGVcIixcclxuICAgIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCA9IFwiUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkXCIsXHJcbiAgICBSZXF1ZXN0VGltZW91dCA9IFwiUmVxdWVzdFRpbWVvdXRcIixcclxuICAgIENvbmZsaWN0ID0gXCJDb25mbGljdFwiLFxyXG4gICAgR29uZSA9IFwiR29uZVwiLFxyXG4gICAgTGVuZ3RoUmVxdWlyZWQgPSBcIkxlbmd0aFJlcXVpcmVkXCIsXHJcbiAgICBQcmVjb25kaXRpb25GYWlsZWQgPSBcIlByZWNvbmRpdGlvbkZhaWxlZFwiLFxyXG4gICAgUmVxdWVzdEVudGl0eVRvb0xhcmdlID0gXCJSZXF1ZXN0RW50aXR5VG9vTGFyZ2VcIixcclxuICAgIFJlcXVlc3RVcmlUb29Mb25nID0gXCJSZXF1ZXN0VXJpVG9vTG9uZ1wiLFxyXG4gICAgVW5zdXBwb3J0ZWRNZWRpYVR5cGUgPSBcIlVuc3VwcG9ydGVkTWVkaWFUeXBlXCIsXHJcbiAgICBSZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlID0gXCJSZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlXCIsXHJcbiAgICBFeHBlY3RhdGlvbkZhaWxlZCA9IFwiRXhwZWN0YXRpb25GYWlsZWRcIixcclxuICAgIE1pc2RpcmVjdGVkUmVxdWVzdCA9IFwiTWlzZGlyZWN0ZWRSZXF1ZXN0XCIsXHJcbiAgICBVbnByb2Nlc3NhYmxlRW50aXR5ID0gXCJVbnByb2Nlc3NhYmxlRW50aXR5XCIsXHJcbiAgICBVbnByb2Nlc3NhYmxlQ29udGVudCA9IFwiVW5wcm9jZXNzYWJsZUVudGl0eVwiLFxyXG4gICAgTG9ja2VkID0gXCJMb2NrZWRcIixcclxuICAgIEZhaWxlZERlcGVuZGVuY3kgPSBcIkZhaWxlZERlcGVuZGVuY3lcIixcclxuICAgIFVwZ3JhZGVSZXF1aXJlZCA9IFwiVXBncmFkZVJlcXVpcmVkXCIsXHJcbiAgICBQcmVjb25kaXRpb25SZXF1aXJlZCA9IFwiUHJlY29uZGl0aW9uUmVxdWlyZWRcIixcclxuICAgIFRvb01hbnlSZXF1ZXN0cyA9IFwiVG9vTWFueVJlcXVlc3RzXCIsXHJcbiAgICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UgPSBcIlJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZVwiLFxyXG4gICAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnMgPSBcIlVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zXCIsXHJcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCIsXHJcbiAgICBOb3RJbXBsZW1lbnRlZCA9IFwiTm90SW1wbGVtZW50ZWRcIixcclxuICAgIEJhZEdhdGV3YXkgPSBcIkJhZEdhdGV3YXlcIixcclxuICAgIFNlcnZpY2VVbmF2YWlsYWJsZSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCIsXHJcbiAgICBHYXRld2F5VGltZW91dCA9IFwiR2F0ZXdheVRpbWVvdXRcIixcclxuICAgIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkID0gXCJIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZFwiLFxyXG4gICAgVmFyaWFudEFsc29OZWdvdGlhdGVzID0gXCJWYXJpYW50QWxzb05lZ290aWF0ZXNcIixcclxuICAgIEluc3VmZmljaWVudFN0b3JhZ2UgPSBcIkluc3VmZmljaWVudFN0b3JhZ2VcIixcclxuICAgIExvb3BEZXRlY3RlZCA9IFwiTG9vcERldGVjdGVkXCIsXHJcbiAgICBOb3RFeHRlbmRlZCA9IFwiTm90RXh0ZW5kZWRcIixcclxuICAgIE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkID0gXCJOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZFwiLFxyXG59XHJcblxyXG4vKiogVmFyaW91cyByZWFzb25zIGZvciBhIHByb3RvY29sIGVuZHBvaW50IGVycm9yICovXHJcbmV4cG9ydCBlbnVtIFJlc3BvbnNlRXJyb3JUeXBlIHtcclxuICAgIE5vbmUgPSBcIk5vbmVcIixcclxuICAgIFByb3RvY29sID0gXCJQcm90b2NvbFwiLFxyXG4gICAgSHR0cCA9IFwiSHR0cFwiLFxyXG4gICAgRXhjZXB0aW9uID0gXCJFeGNlcHRpb25cIixcclxuICAgIFBvbGljeVZpb2xhdGlvbiA9IFwiUG9saWN5VmlvbGF0aW9uXCIsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Mb2dpblBvc3Qge1xyXG4gICAgaWRlbnRpZmllcjogc3RyaW5nO1xyXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlZnJlc2hQb3N0IHtcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogRGF0YSB0cmFuc2ZlciBjbGFzcyB0byBjb252ZXkgYXBpIGVycm9ycyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yIHtcclxuICAgIC8qKiBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgYSBzZXQgb2YgYWxsIGVycm9ycyBhbmQgdGhlaXIgbWVzc2FnZXMgKi9cclxuICAgIGVycm9ycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW107IH0gfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUG9zdCB7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gICAgZW1haWw6IHN0cmluZztcclxuICAgIHBhc3N3b3JkOiBzdHJpbmc7XHJcbiAgICBwcmVmZXJyZWRMYW5ndWFnZXM/OiBzdHJpbmdbXSB8IG51bGw7XHJcbiAgICBzZXJ2aWNlTG9naW5SZWRpcmVjdFVyaT86IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9yZ290UGFzc3dvcmRQb3N0IHtcclxuICAgIGlkZW50aWZpZXI6IHN0cmluZztcclxuICAgIHByZWZlcnJlZExhbmd1YWdlcz86IHN0cmluZ1tdIHwgbnVsbDtcclxuICAgIHNlcnZpY2VMb2dpblJlZGlyZWN0VXJpPzogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VySW5mb0dldCB7XHJcbiAgICB1c2VySXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG4gICAgY2xpZW50SXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG4gICAgY3VycmVudFVzZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjdXJyZW50VXNlcklkZW50aWNvbklkPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGN1cnJlbnRVc2VyTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjdXJyZW50VXNlckVtYWlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGN1cnJlbnRDbGllbnRJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICB1c2VyQ2xhaW1zPzogQ2xhaW1HZXRbXSB8IG51bGw7XHJcbiAgICBjbGllbnRDbGFpbXM/OiBDbGFpbUdldFtdIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbGFpbUdldCB7XHJcbiAgICBpc3N1ZXI/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICB2YWx1ZT86IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTd2FnZ2VyRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICByZXNwb25zZTogc3RyaW5nO1xyXG4gICAgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XHJcbiAgICByZXN1bHQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCByZXNwb25zZTogc3RyaW5nLCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgcmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpc1N3YWdnZXJFeGNlcHRpb24gPSB0cnVlO1xyXG5cclxuICAgIHN0YXRpYyBpc1N3YWdnZXJFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgU3dhZ2dlckV4Y2VwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5pc1N3YWdnZXJFeGNlcHRpb24gPT09IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXN1bHQpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBTd2FnZ2VyRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWJsb2IpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoKGV2ZW50LnRhcmdldCBhcyBhbnkpLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSJdfQ==
|
|
1
|
+
//----------------------
|
|
2
|
+
// <auto-generated>
|
|
3
|
+
// Generated using the NSwag toolchain v14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
|
|
4
|
+
// </auto-generated>
|
|
5
|
+
//----------------------
|
|
6
|
+
/* tslint:disable */
|
|
7
|
+
/* eslint-disable */
|
|
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 ?? "";
|
|
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 === 400) {
|
|
350
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
351
|
+
let result400 = null;
|
|
352
|
+
result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
353
|
+
return throwException("A server side error occurred.", status, _responseText, _headers, result400);
|
|
354
|
+
}));
|
|
355
|
+
}
|
|
356
|
+
else if (status !== 200 && status !== 204) {
|
|
357
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
358
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
359
|
+
}));
|
|
360
|
+
}
|
|
361
|
+
return _observableOf(null);
|
|
362
|
+
}
|
|
363
|
+
getUserInfo() {
|
|
364
|
+
let url_ = this.baseUrl + "/identity/user-info";
|
|
365
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
366
|
+
let options_ = {
|
|
367
|
+
observe: "response",
|
|
368
|
+
responseType: "blob",
|
|
369
|
+
headers: new HttpHeaders({
|
|
370
|
+
"Accept": "application/json"
|
|
371
|
+
})
|
|
372
|
+
};
|
|
373
|
+
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
374
|
+
return this.processGetUserInfo(response_);
|
|
375
|
+
})).pipe(_observableCatch((response_) => {
|
|
376
|
+
if (response_ instanceof HttpResponseBase) {
|
|
377
|
+
try {
|
|
378
|
+
return this.processGetUserInfo(response_);
|
|
379
|
+
}
|
|
380
|
+
catch (e) {
|
|
381
|
+
return _observableThrow(e);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
else
|
|
385
|
+
return _observableThrow(response_);
|
|
386
|
+
}));
|
|
387
|
+
}
|
|
388
|
+
processGetUserInfo(response) {
|
|
389
|
+
const status = response.status;
|
|
390
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
391
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
392
|
+
let _headers = {};
|
|
393
|
+
if (response.headers) {
|
|
394
|
+
for (let key of response.headers.keys()) {
|
|
395
|
+
_headers[key] = response.headers.get(key);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
if (status === 200) {
|
|
399
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
400
|
+
let result200 = null;
|
|
401
|
+
result200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
402
|
+
return _observableOf(result200);
|
|
403
|
+
}));
|
|
404
|
+
}
|
|
405
|
+
else if (status === 400) {
|
|
406
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
407
|
+
let result400 = null;
|
|
408
|
+
result400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
409
|
+
return throwException("A server side error occurred.", status, _responseText, _headers, result400);
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
else if (status !== 200 && status !== 204) {
|
|
413
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
414
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
415
|
+
}));
|
|
416
|
+
}
|
|
417
|
+
return _observableOf(null);
|
|
418
|
+
}
|
|
419
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DanglIdentityClient, deps: [{ token: HttpClient }, { token: DANGL_IDENTITY_CLIENT_API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
420
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DanglIdentityClient, providedIn: 'root' }); }
|
|
421
|
+
}
|
|
422
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: DanglIdentityClient, decorators: [{
|
|
423
|
+
type: Injectable,
|
|
424
|
+
args: [{
|
|
425
|
+
providedIn: 'root'
|
|
426
|
+
}]
|
|
427
|
+
}], ctorParameters: () => [{ type: i1.HttpClient, decorators: [{
|
|
428
|
+
type: Inject,
|
|
429
|
+
args: [HttpClient]
|
|
430
|
+
}] }, { type: undefined, decorators: [{
|
|
431
|
+
type: Optional
|
|
432
|
+
}, {
|
|
433
|
+
type: Inject,
|
|
434
|
+
args: [DANGL_IDENTITY_CLIENT_API_BASE_URL]
|
|
435
|
+
}] }] });
|
|
436
|
+
export var HttpStatusCode;
|
|
437
|
+
(function (HttpStatusCode) {
|
|
438
|
+
HttpStatusCode["Continue"] = "Continue";
|
|
439
|
+
HttpStatusCode["SwitchingProtocols"] = "SwitchingProtocols";
|
|
440
|
+
HttpStatusCode["Processing"] = "Processing";
|
|
441
|
+
HttpStatusCode["EarlyHints"] = "EarlyHints";
|
|
442
|
+
HttpStatusCode["OK"] = "OK";
|
|
443
|
+
HttpStatusCode["Created"] = "Created";
|
|
444
|
+
HttpStatusCode["Accepted"] = "Accepted";
|
|
445
|
+
HttpStatusCode["NonAuthoritativeInformation"] = "NonAuthoritativeInformation";
|
|
446
|
+
HttpStatusCode["NoContent"] = "NoContent";
|
|
447
|
+
HttpStatusCode["ResetContent"] = "ResetContent";
|
|
448
|
+
HttpStatusCode["PartialContent"] = "PartialContent";
|
|
449
|
+
HttpStatusCode["MultiStatus"] = "MultiStatus";
|
|
450
|
+
HttpStatusCode["AlreadyReported"] = "AlreadyReported";
|
|
451
|
+
HttpStatusCode["IMUsed"] = "IMUsed";
|
|
452
|
+
HttpStatusCode["MultipleChoices"] = "MultipleChoices";
|
|
453
|
+
HttpStatusCode["Ambiguous"] = "MultipleChoices";
|
|
454
|
+
HttpStatusCode["MovedPermanently"] = "MovedPermanently";
|
|
455
|
+
HttpStatusCode["Moved"] = "MovedPermanently";
|
|
456
|
+
HttpStatusCode["Found"] = "Found";
|
|
457
|
+
HttpStatusCode["Redirect"] = "Found";
|
|
458
|
+
HttpStatusCode["SeeOther"] = "SeeOther";
|
|
459
|
+
HttpStatusCode["RedirectMethod"] = "SeeOther";
|
|
460
|
+
HttpStatusCode["NotModified"] = "NotModified";
|
|
461
|
+
HttpStatusCode["UseProxy"] = "UseProxy";
|
|
462
|
+
HttpStatusCode["Unused"] = "Unused";
|
|
463
|
+
HttpStatusCode["TemporaryRedirect"] = "TemporaryRedirect";
|
|
464
|
+
HttpStatusCode["RedirectKeepVerb"] = "TemporaryRedirect";
|
|
465
|
+
HttpStatusCode["PermanentRedirect"] = "PermanentRedirect";
|
|
466
|
+
HttpStatusCode["BadRequest"] = "BadRequest";
|
|
467
|
+
HttpStatusCode["Unauthorized"] = "Unauthorized";
|
|
468
|
+
HttpStatusCode["PaymentRequired"] = "PaymentRequired";
|
|
469
|
+
HttpStatusCode["Forbidden"] = "Forbidden";
|
|
470
|
+
HttpStatusCode["NotFound"] = "NotFound";
|
|
471
|
+
HttpStatusCode["MethodNotAllowed"] = "MethodNotAllowed";
|
|
472
|
+
HttpStatusCode["NotAcceptable"] = "NotAcceptable";
|
|
473
|
+
HttpStatusCode["ProxyAuthenticationRequired"] = "ProxyAuthenticationRequired";
|
|
474
|
+
HttpStatusCode["RequestTimeout"] = "RequestTimeout";
|
|
475
|
+
HttpStatusCode["Conflict"] = "Conflict";
|
|
476
|
+
HttpStatusCode["Gone"] = "Gone";
|
|
477
|
+
HttpStatusCode["LengthRequired"] = "LengthRequired";
|
|
478
|
+
HttpStatusCode["PreconditionFailed"] = "PreconditionFailed";
|
|
479
|
+
HttpStatusCode["RequestEntityTooLarge"] = "RequestEntityTooLarge";
|
|
480
|
+
HttpStatusCode["RequestUriTooLong"] = "RequestUriTooLong";
|
|
481
|
+
HttpStatusCode["UnsupportedMediaType"] = "UnsupportedMediaType";
|
|
482
|
+
HttpStatusCode["RequestedRangeNotSatisfiable"] = "RequestedRangeNotSatisfiable";
|
|
483
|
+
HttpStatusCode["ExpectationFailed"] = "ExpectationFailed";
|
|
484
|
+
HttpStatusCode["MisdirectedRequest"] = "MisdirectedRequest";
|
|
485
|
+
HttpStatusCode["UnprocessableEntity"] = "UnprocessableEntity";
|
|
486
|
+
HttpStatusCode["UnprocessableContent"] = "UnprocessableEntity";
|
|
487
|
+
HttpStatusCode["Locked"] = "Locked";
|
|
488
|
+
HttpStatusCode["FailedDependency"] = "FailedDependency";
|
|
489
|
+
HttpStatusCode["UpgradeRequired"] = "UpgradeRequired";
|
|
490
|
+
HttpStatusCode["PreconditionRequired"] = "PreconditionRequired";
|
|
491
|
+
HttpStatusCode["TooManyRequests"] = "TooManyRequests";
|
|
492
|
+
HttpStatusCode["RequestHeaderFieldsTooLarge"] = "RequestHeaderFieldsTooLarge";
|
|
493
|
+
HttpStatusCode["UnavailableForLegalReasons"] = "UnavailableForLegalReasons";
|
|
494
|
+
HttpStatusCode["InternalServerError"] = "InternalServerError";
|
|
495
|
+
HttpStatusCode["NotImplemented"] = "NotImplemented";
|
|
496
|
+
HttpStatusCode["BadGateway"] = "BadGateway";
|
|
497
|
+
HttpStatusCode["ServiceUnavailable"] = "ServiceUnavailable";
|
|
498
|
+
HttpStatusCode["GatewayTimeout"] = "GatewayTimeout";
|
|
499
|
+
HttpStatusCode["HttpVersionNotSupported"] = "HttpVersionNotSupported";
|
|
500
|
+
HttpStatusCode["VariantAlsoNegotiates"] = "VariantAlsoNegotiates";
|
|
501
|
+
HttpStatusCode["InsufficientStorage"] = "InsufficientStorage";
|
|
502
|
+
HttpStatusCode["LoopDetected"] = "LoopDetected";
|
|
503
|
+
HttpStatusCode["NotExtended"] = "NotExtended";
|
|
504
|
+
HttpStatusCode["NetworkAuthenticationRequired"] = "NetworkAuthenticationRequired";
|
|
505
|
+
})(HttpStatusCode || (HttpStatusCode = {}));
|
|
506
|
+
/** Various reasons for a protocol endpoint error */
|
|
507
|
+
export var ResponseErrorType;
|
|
508
|
+
(function (ResponseErrorType) {
|
|
509
|
+
ResponseErrorType["None"] = "None";
|
|
510
|
+
ResponseErrorType["Protocol"] = "Protocol";
|
|
511
|
+
ResponseErrorType["Http"] = "Http";
|
|
512
|
+
ResponseErrorType["Exception"] = "Exception";
|
|
513
|
+
ResponseErrorType["PolicyViolation"] = "PolicyViolation";
|
|
514
|
+
})(ResponseErrorType || (ResponseErrorType = {}));
|
|
515
|
+
export class SwaggerException extends Error {
|
|
516
|
+
constructor(message, status, response, headers, result) {
|
|
517
|
+
super();
|
|
518
|
+
this.isSwaggerException = true;
|
|
519
|
+
this.message = message;
|
|
520
|
+
this.status = status;
|
|
521
|
+
this.response = response;
|
|
522
|
+
this.headers = headers;
|
|
523
|
+
this.result = result;
|
|
524
|
+
}
|
|
525
|
+
static isSwaggerException(obj) {
|
|
526
|
+
return obj.isSwaggerException === true;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function throwException(message, status, response, headers, result) {
|
|
530
|
+
if (result !== null && result !== undefined)
|
|
531
|
+
return _observableThrow(result);
|
|
532
|
+
else
|
|
533
|
+
return _observableThrow(new SwaggerException(message, status, response, headers, null));
|
|
534
|
+
}
|
|
535
|
+
function blobToText(blob) {
|
|
536
|
+
return new Observable((observer) => {
|
|
537
|
+
if (!blob) {
|
|
538
|
+
observer.next("");
|
|
539
|
+
observer.complete();
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
let reader = new FileReader();
|
|
543
|
+
reader.onload = event => {
|
|
544
|
+
observer.next(event.target.result);
|
|
545
|
+
observer.complete();
|
|
546
|
+
};
|
|
547
|
+
reader.readAsText(blob);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZGFuZ2wtaWRlbnRpdHktY2xpZW50L3NyYy9hcGktY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdCQUF3QjtBQUN4QixtQkFBbUI7QUFDbkIsMkhBQTJIO0FBQzNILG9CQUFvQjtBQUNwQix3QkFBd0I7QUFFeEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNwQix1Q0FBdUM7QUFFdkMsT0FBTyxFQUFFLFFBQVEsSUFBSSxtQkFBbUIsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsSUFBSSxnQkFBZ0IsRUFBRSxFQUFFLElBQUksYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7OztBQUUvRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxJQUFJLGNBQWMsQ0FBUyxvQ0FBb0MsQ0FBQyxDQUFDO0FBS25ILE1BQU0sT0FBTyxtQkFBbUI7SUFLNUIsWUFBZ0MsSUFBZ0IsRUFBMEQsT0FBZ0I7UUFGaEgscUJBQWdCLEdBQW1ELFNBQVMsQ0FBQztRQUduRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQixFQUFFLFdBQXNDO1FBQ3BFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUM7UUFDN0MsSUFB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QUNoRyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBUztJQUN6QixPQUFPLElBQUksVUFBVSxDQUFTLENBQUMsUUFBYSxFQUFFLEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDSCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUUsS0FBSyxDQUFDLE1BQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuLy8gPGF1dG8tZ2VuZXJhdGVkPlxyXG4vLyAgICAgR2VuZXJhdGVkIHVzaW5nIHRoZSBOU3dhZyB0b29sY2hhaW4gdjE0LjEuMC4wIChOSnNvblNjaGVtYSB2MTEuMC4yLjAgKE5ld3RvbnNvZnQuSnNvbiB2MTMuMC4wLjApKSAoaHR0cDovL05Td2FnLm9yZylcclxuLy8gPC9hdXRvLWdlbmVyYXRlZD5cclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xyXG4vLyBSZVNoYXJwZXIgZGlzYWJsZSBJbmNvbnNpc3RlbnROYW1pbmdcclxuXHJcbmltcG9ydCB7IG1lcmdlTWFwIGFzIF9vYnNlcnZhYmxlTWVyZ2VNYXAsIGNhdGNoRXJyb3IgYXMgX29ic2VydmFibGVDYXRjaCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciBhcyBfb2JzZXJ2YWJsZVRocm93LCBvZiBhcyBfb2JzZXJ2YWJsZU9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG5leHBvcnQgY29uc3QgREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdEQU5HTF9JREVOVElUWV9DTElFTlRfQVBJX0JBU0VfVVJMJyk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIERhbmdsSWRlbnRpdHlDbGllbnQge1xyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KEh0dHBDbGllbnQpIGh0dHA6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpIEBJbmplY3QoREFOR0xfSURFTlRJVFlfQ0xJRU5UX0FQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7XHJcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCA/PyBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ2luV2l0aENvb2tpZShtb2RlbDogTG9naW5Qb3N0LCByZWRpcmVjdFVybDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvbG9naW4/XCI7XHJcbiAgICAgICAgaWYgKHJlZGlyZWN0VXJsICE9PSB1bmRlZmluZWQgJiYgcmVkaXJlY3RVcmwgIT09IG51bGwpXHJcbiAgICAgICAgICAgIHVybF8gKz0gXCJyZWRpcmVjdFVybD1cIiArIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgcmVkaXJlY3RVcmwpICsgXCImXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShtb2RlbCk7XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcclxuICAgICAgICAgICAgYm9keTogY29udGVudF8sXHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NMb2dpbldpdGhDb29raWUocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzTG9naW5XaXRoQ29va2llKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvbG9naW5cIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJkZWxldGVcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTaWduT3V0V2l0aFNpZ25Jbk1hbmFnZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzU2lnbk91dFdpdGhTaWduSW5NYW5hZ2VyKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XHJcbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XHJcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvZ2luQW5kUmV0dXJuVG9rZW4obW9kZWw6IFRva2VuTG9naW5Qb3N0KTogT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PiB7XHJcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9pZGVudGl0eS90b2tlbi1sb2dpblwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkobW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4ocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTG9naW5BbmRSZXR1cm5Ub2tlbihyZXNwb25zZV8gYXMgYW55KTtcclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+O1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0xvZ2luQW5kUmV0dXJuVG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIFRva2VuUmVzcG9uc2VHZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBUb2tlblJlc3BvbnNlR2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VG9rZW5SZXNwb25zZUdldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2hUb2tlbihtb2RlbDogVG9rZW5SZWZyZXNoUG9zdCk6IE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvdG9rZW4tcmVmcmVzaFwiO1xyXG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkobW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlZnJlc2hUb2tlbihyZXNwb25zZV8pO1xyXG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZWZyZXNoVG9rZW4ocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8VG9rZW5SZXNwb25zZUdldD47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUb2tlblJlc3BvbnNlR2V0PjtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWZyZXNoVG9rZW4ocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPFRva2VuUmVzcG9uc2VHZXQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIFRva2VuUmVzcG9uc2VHZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBUb2tlblJlc3BvbnNlR2V0O1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8VG9rZW5SZXNwb25zZUdldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHJlZ2lzdGVyTW9kZWw6IFJlZ2lzdGVyUG9zdCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvcmVnaXN0ZXJcIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KHJlZ2lzdGVyTW9kZWwpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QoXCJwb3N0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzUmVnaXN0ZXIocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTx2b2lkPjtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NSZWdpc3RlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxyXG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxyXG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0NDAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcikgYXMgQXBpRXJyb3I7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkEgc2VydmVyIHNpZGUgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3RQYXNzd29yZFJlc2V0KGZvcmdvdFBhc3N3b3JkTW9kZWw6IEZvcmdvdFBhc3N3b3JkUG9zdCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvaWRlbnRpdHkvcGFzc3dvcmQtZm9yZ290dGVuXCI7XHJcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShmb3Jnb3RQYXNzd29yZE1vZGVsKTtcclxuXHJcbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xyXG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RQYXNzd29yZFJlc2V0KHJlc3BvbnNlXyk7XHJcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlcXVlc3RQYXNzd29yZFJlc2V0KHJlc3BvbnNlXyBhcyBhbnkpO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBwcm9jZXNzUmVxdWVzdFBhc3N3b3JkUmVzZXQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cclxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcclxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cclxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KG51bGwgYXMgYW55KTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDA6IGFueSA9IG51bGw7XHJcbiAgICAgICAgICAgIHJlc3VsdDQwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpIGFzIEFwaUVycm9yO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBIHNlcnZlciBzaWRlIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDApO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KG51bGwgYXMgYW55KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRVc2VySW5mbygpOiBPYnNlcnZhYmxlPFVzZXJJbmZvR2V0PiB7XHJcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9pZGVudGl0eS91c2VyLWluZm9cIjtcclxuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xyXG5cclxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcclxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzR2V0VXNlckluZm8ocmVzcG9uc2VfKTtcclxuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzR2V0VXNlckluZm8ocmVzcG9uc2VfIGFzIGFueSk7XHJcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8VXNlckluZm9HZXQ+O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2VcclxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8VXNlckluZm9HZXQ+O1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldFVzZXJJbmZvKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxVc2VySW5mb0dldD4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcclxuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxyXG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxyXG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxyXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcclxuICAgICAgICAgICAgcmVzdWx0MjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcikgYXMgVXNlckluZm9HZXQ7XHJcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAwOiBhbnkgPSBudWxsO1xyXG4gICAgICAgICAgICByZXN1bHQ0MDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKSBhcyBBcGlFcnJvcjtcclxuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQSBzZXJ2ZXIgc2lkZSBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAwKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxVc2VySW5mb0dldD4obnVsbCBhcyBhbnkpO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ2luUG9zdCB7XHJcbiAgICBpZGVudGlmaWVyOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgc3RheVNpZ25lZEluOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVzcG9uc2VHZXQge1xyXG4gICAgYWNjZXNzVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgZXJyb3JEZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBleHBpcmVzSW46IG51bWJlcjtcclxuICAgIGh0dHBFcnJvclJlYXNvbj86IHN0cmluZyB8IG51bGw7XHJcbiAgICBodHRwU3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XHJcbiAgICBpZGVudGl0eVRva2VuPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGlzRXJyb3I6IGJvb2xlYW47XHJcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdG9rZW5UeXBlPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGVycm9yVHlwZTogUmVzcG9uc2VFcnJvclR5cGU7XHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEh0dHBTdGF0dXNDb2RlIHtcclxuICAgIENvbnRpbnVlID0gXCJDb250aW51ZVwiLFxyXG4gICAgU3dpdGNoaW5nUHJvdG9jb2xzID0gXCJTd2l0Y2hpbmdQcm90b2NvbHNcIixcclxuICAgIFByb2Nlc3NpbmcgPSBcIlByb2Nlc3NpbmdcIixcclxuICAgIEVhcmx5SGludHMgPSBcIkVhcmx5SGludHNcIixcclxuICAgIE9LID0gXCJPS1wiLFxyXG4gICAgQ3JlYXRlZCA9IFwiQ3JlYXRlZFwiLFxyXG4gICAgQWNjZXB0ZWQgPSBcIkFjY2VwdGVkXCIsXHJcbiAgICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gPSBcIk5vbkF1dGhvcml0YXRpdmVJbmZvcm1hdGlvblwiLFxyXG4gICAgTm9Db250ZW50ID0gXCJOb0NvbnRlbnRcIixcclxuICAgIFJlc2V0Q29udGVudCA9IFwiUmVzZXRDb250ZW50XCIsXHJcbiAgICBQYXJ0aWFsQ29udGVudCA9IFwiUGFydGlhbENvbnRlbnRcIixcclxuICAgIE11bHRpU3RhdHVzID0gXCJNdWx0aVN0YXR1c1wiLFxyXG4gICAgQWxyZWFkeVJlcG9ydGVkID0gXCJBbHJlYWR5UmVwb3J0ZWRcIixcclxuICAgIElNVXNlZCA9IFwiSU1Vc2VkXCIsXHJcbiAgICBNdWx0aXBsZUNob2ljZXMgPSBcIk11bHRpcGxlQ2hvaWNlc1wiLFxyXG4gICAgQW1iaWd1b3VzID0gXCJNdWx0aXBsZUNob2ljZXNcIixcclxuICAgIE1vdmVkUGVybWFuZW50bHkgPSBcIk1vdmVkUGVybWFuZW50bHlcIixcclxuICAgIE1vdmVkID0gXCJNb3ZlZFBlcm1hbmVudGx5XCIsXHJcbiAgICBGb3VuZCA9IFwiRm91bmRcIixcclxuICAgIFJlZGlyZWN0ID0gXCJGb3VuZFwiLFxyXG4gICAgU2VlT3RoZXIgPSBcIlNlZU90aGVyXCIsXHJcbiAgICBSZWRpcmVjdE1ldGhvZCA9IFwiU2VlT3RoZXJcIixcclxuICAgIE5vdE1vZGlmaWVkID0gXCJOb3RNb2RpZmllZFwiLFxyXG4gICAgVXNlUHJveHkgPSBcIlVzZVByb3h5XCIsXHJcbiAgICBVbnVzZWQgPSBcIlVudXNlZFwiLFxyXG4gICAgVGVtcG9yYXJ5UmVkaXJlY3QgPSBcIlRlbXBvcmFyeVJlZGlyZWN0XCIsXHJcbiAgICBSZWRpcmVjdEtlZXBWZXJiID0gXCJUZW1wb3JhcnlSZWRpcmVjdFwiLFxyXG4gICAgUGVybWFuZW50UmVkaXJlY3QgPSBcIlBlcm1hbmVudFJlZGlyZWN0XCIsXHJcbiAgICBCYWRSZXF1ZXN0ID0gXCJCYWRSZXF1ZXN0XCIsXHJcbiAgICBVbmF1dGhvcml6ZWQgPSBcIlVuYXV0aG9yaXplZFwiLFxyXG4gICAgUGF5bWVudFJlcXVpcmVkID0gXCJQYXltZW50UmVxdWlyZWRcIixcclxuICAgIEZvcmJpZGRlbiA9IFwiRm9yYmlkZGVuXCIsXHJcbiAgICBOb3RGb3VuZCA9IFwiTm90Rm91bmRcIixcclxuICAgIE1ldGhvZE5vdEFsbG93ZWQgPSBcIk1ldGhvZE5vdEFsbG93ZWRcIixcclxuICAgIE5vdEFjY2VwdGFibGUgPSBcIk5vdEFjY2VwdGFibGVcIixcclxuICAgIFByb3h5QXV0aGVudGljYXRpb25SZXF1aXJlZCA9IFwiUHJveHlBdXRoZW50aWNhdGlvblJlcXVpcmVkXCIsXHJcbiAgICBSZXF1ZXN0VGltZW91dCA9IFwiUmVxdWVzdFRpbWVvdXRcIixcclxuICAgIENvbmZsaWN0ID0gXCJDb25mbGljdFwiLFxyXG4gICAgR29uZSA9IFwiR29uZVwiLFxyXG4gICAgTGVuZ3RoUmVxdWlyZWQgPSBcIkxlbmd0aFJlcXVpcmVkXCIsXHJcbiAgICBQcmVjb25kaXRpb25GYWlsZWQgPSBcIlByZWNvbmRpdGlvbkZhaWxlZFwiLFxyXG4gICAgUmVxdWVzdEVudGl0eVRvb0xhcmdlID0gXCJSZXF1ZXN0RW50aXR5VG9vTGFyZ2VcIixcclxuICAgIFJlcXVlc3RVcmlUb29Mb25nID0gXCJSZXF1ZXN0VXJpVG9vTG9uZ1wiLFxyXG4gICAgVW5zdXBwb3J0ZWRNZWRpYVR5cGUgPSBcIlVuc3VwcG9ydGVkTWVkaWFUeXBlXCIsXHJcbiAgICBSZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlID0gXCJSZXF1ZXN0ZWRSYW5nZU5vdFNhdGlzZmlhYmxlXCIsXHJcbiAgICBFeHBlY3RhdGlvbkZhaWxlZCA9IFwiRXhwZWN0YXRpb25GYWlsZWRcIixcclxuICAgIE1pc2RpcmVjdGVkUmVxdWVzdCA9IFwiTWlzZGlyZWN0ZWRSZXF1ZXN0XCIsXHJcbiAgICBVbnByb2Nlc3NhYmxlRW50aXR5ID0gXCJVbnByb2Nlc3NhYmxlRW50aXR5XCIsXHJcbiAgICBVbnByb2Nlc3NhYmxlQ29udGVudCA9IFwiVW5wcm9jZXNzYWJsZUVudGl0eVwiLFxyXG4gICAgTG9ja2VkID0gXCJMb2NrZWRcIixcclxuICAgIEZhaWxlZERlcGVuZGVuY3kgPSBcIkZhaWxlZERlcGVuZGVuY3lcIixcclxuICAgIFVwZ3JhZGVSZXF1aXJlZCA9IFwiVXBncmFkZVJlcXVpcmVkXCIsXHJcbiAgICBQcmVjb25kaXRpb25SZXF1aXJlZCA9IFwiUHJlY29uZGl0aW9uUmVxdWlyZWRcIixcclxuICAgIFRvb01hbnlSZXF1ZXN0cyA9IFwiVG9vTWFueVJlcXVlc3RzXCIsXHJcbiAgICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UgPSBcIlJlcXVlc3RIZWFkZXJGaWVsZHNUb29MYXJnZVwiLFxyXG4gICAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnMgPSBcIlVuYXZhaWxhYmxlRm9yTGVnYWxSZWFzb25zXCIsXHJcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gXCJJbnRlcm5hbFNlcnZlckVycm9yXCIsXHJcbiAgICBOb3RJbXBsZW1lbnRlZCA9IFwiTm90SW1wbGVtZW50ZWRcIixcclxuICAgIEJhZEdhdGV3YXkgPSBcIkJhZEdhdGV3YXlcIixcclxuICAgIFNlcnZpY2VVbmF2YWlsYWJsZSA9IFwiU2VydmljZVVuYXZhaWxhYmxlXCIsXHJcbiAgICBHYXRld2F5VGltZW91dCA9IFwiR2F0ZXdheVRpbWVvdXRcIixcclxuICAgIEh0dHBWZXJzaW9uTm90U3VwcG9ydGVkID0gXCJIdHRwVmVyc2lvbk5vdFN1cHBvcnRlZFwiLFxyXG4gICAgVmFyaWFudEFsc29OZWdvdGlhdGVzID0gXCJWYXJpYW50QWxzb05lZ290aWF0ZXNcIixcclxuICAgIEluc3VmZmljaWVudFN0b3JhZ2UgPSBcIkluc3VmZmljaWVudFN0b3JhZ2VcIixcclxuICAgIExvb3BEZXRlY3RlZCA9IFwiTG9vcERldGVjdGVkXCIsXHJcbiAgICBOb3RFeHRlbmRlZCA9IFwiTm90RXh0ZW5kZWRcIixcclxuICAgIE5ldHdvcmtBdXRoZW50aWNhdGlvblJlcXVpcmVkID0gXCJOZXR3b3JrQXV0aGVudGljYXRpb25SZXF1aXJlZFwiLFxyXG59XHJcblxyXG4vKiogVmFyaW91cyByZWFzb25zIGZvciBhIHByb3RvY29sIGVuZHBvaW50IGVycm9yICovXHJcbmV4cG9ydCBlbnVtIFJlc3BvbnNlRXJyb3JUeXBlIHtcclxuICAgIE5vbmUgPSBcIk5vbmVcIixcclxuICAgIFByb3RvY29sID0gXCJQcm90b2NvbFwiLFxyXG4gICAgSHR0cCA9IFwiSHR0cFwiLFxyXG4gICAgRXhjZXB0aW9uID0gXCJFeGNlcHRpb25cIixcclxuICAgIFBvbGljeVZpb2xhdGlvbiA9IFwiUG9saWN5VmlvbGF0aW9uXCIsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5Mb2dpblBvc3Qge1xyXG4gICAgaWRlbnRpZmllcjogc3RyaW5nO1xyXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUb2tlblJlZnJlc2hQb3N0IHtcclxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG59XHJcblxyXG4vKiogRGF0YSB0cmFuc2ZlciBjbGFzcyB0byBjb252ZXkgYXBpIGVycm9ycyAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIEFwaUVycm9yIHtcclxuICAgIC8qKiBUaGlzIGRpY3Rpb25hcnkgY29udGFpbnMgYSBzZXQgb2YgYWxsIGVycm9ycyBhbmQgdGhlaXIgbWVzc2FnZXMgKi9cclxuICAgIGVycm9ycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW107IH0gfCBudWxsO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUG9zdCB7XHJcbiAgICB1c2VybmFtZTogc3RyaW5nO1xyXG4gICAgZW1haWw6IHN0cmluZztcclxuICAgIHBhc3N3b3JkOiBzdHJpbmc7XHJcbiAgICBwcmVmZXJyZWRMYW5ndWFnZXM/OiBzdHJpbmdbXSB8IG51bGw7XHJcbiAgICBzZXJ2aWNlTG9naW5SZWRpcmVjdFVyaT86IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRm9yZ290UGFzc3dvcmRQb3N0IHtcclxuICAgIGlkZW50aWZpZXI6IHN0cmluZztcclxuICAgIHByZWZlcnJlZExhbmd1YWdlcz86IHN0cmluZ1tdIHwgbnVsbDtcclxuICAgIHNlcnZpY2VMb2dpblJlZGlyZWN0VXJpPzogc3RyaW5nIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVc2VySW5mb0dldCB7XHJcbiAgICB1c2VySXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG4gICAgY2xpZW50SXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xyXG4gICAgY3VycmVudFVzZXJJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjdXJyZW50VXNlcklkZW50aWNvbklkPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGN1cnJlbnRVc2VyTmFtZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICBjdXJyZW50VXNlckVtYWlsPzogc3RyaW5nIHwgbnVsbDtcclxuICAgIGN1cnJlbnRDbGllbnRJZD86IHN0cmluZyB8IG51bGw7XHJcbiAgICB1c2VyQ2xhaW1zPzogQ2xhaW1HZXRbXSB8IG51bGw7XHJcbiAgICBjbGllbnRDbGFpbXM/OiBDbGFpbUdldFtdIHwgbnVsbDtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDbGFpbUdldCB7XHJcbiAgICBpc3N1ZXI/OiBzdHJpbmcgfCBudWxsO1xyXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XHJcbiAgICB2YWx1ZT86IHN0cmluZyB8IG51bGw7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTd2FnZ2VyRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgbWVzc2FnZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBudW1iZXI7XHJcbiAgICByZXNwb25zZTogc3RyaW5nO1xyXG4gICAgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH07XHJcbiAgICByZXN1bHQ6IGFueTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCByZXNwb25zZTogc3RyaW5nLCBoZWFkZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueTsgfSwgcmVzdWx0OiBhbnkpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcclxuICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBpc1N3YWdnZXJFeGNlcHRpb24gPSB0cnVlO1xyXG5cclxuICAgIHN0YXRpYyBpc1N3YWdnZXJFeGNlcHRpb24ob2JqOiBhbnkpOiBvYmogaXMgU3dhZ2dlckV4Y2VwdGlvbiB7XHJcbiAgICAgICAgcmV0dXJuIG9iai5pc1N3YWdnZXJFeGNlcHRpb24gPT09IHRydWU7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzOiBudW1iZXIsIHJlc3BvbnNlOiBzdHJpbmcsIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9LCByZXN1bHQ/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcclxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXN1bHQpO1xyXG4gICAgZWxzZVxyXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBTd2FnZ2VyRXhjZXB0aW9uKG1lc3NhZ2UsIHN0YXR1cywgcmVzcG9uc2UsIGhlYWRlcnMsIG51bGwpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmxvYlRvVGV4dChibG9iOiBhbnkpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIWJsb2IpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChcIlwiKTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoKGV2ZW50LnRhcmdldCBhcyBhbnkpLnJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iKTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxufSJdfQ==
|