@ethlete/query 5.21.1 → 5.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/fesm2022/ethlete-query.mjs +21 -37
  3. package/fesm2022/ethlete-query.mjs.map +1 -1
  4. package/package.json +5 -7
  5. package/esm2022/ethlete-query.mjs +0 -5
  6. package/esm2022/index.mjs +0 -21
  7. package/esm2022/lib/auth/auth-provider.types.mjs +0 -2
  8. package/esm2022/lib/auth/auth-provider.utils.mjs +0 -25
  9. package/esm2022/lib/auth/basic-auth-provider.mjs +0 -15
  10. package/esm2022/lib/auth/bearer-auth-provider.mjs +0 -168
  11. package/esm2022/lib/auth/custom-header-auth-provider.mjs +0 -12
  12. package/esm2022/lib/auth/index.mjs +0 -6
  13. package/esm2022/lib/class-validator/class-validator.types.mjs +0 -2
  14. package/esm2022/lib/class-validator/class-validator.utils.mjs +0 -4
  15. package/esm2022/lib/class-validator/index.mjs +0 -3
  16. package/esm2022/lib/devtools/components/query-devtools/index.mjs +0 -2
  17. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +0 -297
  18. package/esm2022/lib/devtools/pipes/index.mjs +0 -2
  19. package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +0 -24
  20. package/esm2022/lib/devtools/utils/index.mjs +0 -2
  21. package/esm2022/lib/devtools/utils/query-client.utils.mjs +0 -13
  22. package/esm2022/lib/directives/index.mjs +0 -4
  23. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +0 -56
  24. package/esm2022/lib/directives/infinity-query.directive.mjs +0 -147
  25. package/esm2022/lib/directives/query.directive.mjs +0 -123
  26. package/esm2022/lib/entity/entity-store.mjs +0 -127
  27. package/esm2022/lib/entity/entity.types.mjs +0 -2
  28. package/esm2022/lib/entity/entity.utils.mjs +0 -29
  29. package/esm2022/lib/entity/index.mjs +0 -4
  30. package/esm2022/lib/experimental/bearer-auth-provider-config.mjs +0 -19
  31. package/esm2022/lib/experimental/bearer-auth-provider.mjs +0 -245
  32. package/esm2022/lib/experimental/http-request.mjs +0 -154
  33. package/esm2022/lib/experimental/index.mjs +0 -23
  34. package/esm2022/lib/experimental/paged-query.mjs +0 -194
  35. package/esm2022/lib/experimental/query-client-config.mjs +0 -13
  36. package/esm2022/lib/experimental/query-client.mjs +0 -16
  37. package/esm2022/lib/experimental/query-creator-templates.mjs +0 -33
  38. package/esm2022/lib/experimental/query-creator.mjs +0 -28
  39. package/esm2022/lib/experimental/query-dependencies.mjs +0 -14
  40. package/esm2022/lib/experimental/query-errors.mjs +0 -70
  41. package/esm2022/lib/experimental/query-execute-utils.mjs +0 -54
  42. package/esm2022/lib/experimental/query-execute.mjs +0 -14
  43. package/esm2022/lib/experimental/query-features.mjs +0 -126
  44. package/esm2022/lib/experimental/query-repository.mjs +0 -97
  45. package/esm2022/lib/experimental/query-snapshot.mjs +0 -45
  46. package/esm2022/lib/experimental/query-stack.mjs +0 -65
  47. package/esm2022/lib/experimental/query-state.mjs +0 -20
  48. package/esm2022/lib/experimental/query-utils.mjs +0 -176
  49. package/esm2022/lib/experimental/query.mjs +0 -29
  50. package/esm2022/lib/experimental/secure-query-creator.mjs +0 -15
  51. package/esm2022/lib/experimental/secure-query-execute.mjs +0 -80
  52. package/esm2022/lib/experimental/secure-query.mjs +0 -33
  53. package/esm2022/lib/gql/gql.mjs +0 -23
  54. package/esm2022/lib/gql/index.mjs +0 -2
  55. package/esm2022/lib/infinite-query/index.mjs +0 -4
  56. package/esm2022/lib/infinite-query/infinity-query.mjs +0 -171
  57. package/esm2022/lib/infinite-query/infinity-query.types.mjs +0 -2
  58. package/esm2022/lib/infinite-query/infinity-query.utils.mjs +0 -3
  59. package/esm2022/lib/logger/index.mjs +0 -2
  60. package/esm2022/lib/logger/logger.mjs +0 -16
  61. package/esm2022/lib/query/index.mjs +0 -4
  62. package/esm2022/lib/query/query.mjs +0 -431
  63. package/esm2022/lib/query/query.types.mjs +0 -2
  64. package/esm2022/lib/query/query.utils.mjs +0 -253
  65. package/esm2022/lib/query-client/index.mjs +0 -4
  66. package/esm2022/lib/query-client/query-client.mjs +0 -80
  67. package/esm2022/lib/query-client/query-client.types.mjs +0 -2
  68. package/esm2022/lib/query-client/query-client.utils.mjs +0 -20
  69. package/esm2022/lib/query-creator/index.mjs +0 -3
  70. package/esm2022/lib/query-creator/query-creator.mjs +0 -55
  71. package/esm2022/lib/query-creator/query-creator.types.mjs +0 -2
  72. package/esm2022/lib/query-form/index.mjs +0 -4
  73. package/esm2022/lib/query-form/query-form.mjs +0 -412
  74. package/esm2022/lib/query-form/query-form.types.mjs +0 -2
  75. package/esm2022/lib/query-form/query-form.utils.mjs +0 -97
  76. package/esm2022/lib/query-store/index.mjs +0 -2
  77. package/esm2022/lib/query-store/query-store.mjs +0 -144
  78. package/esm2022/lib/request/index.mjs +0 -4
  79. package/esm2022/lib/request/request.mjs +0 -196
  80. package/esm2022/lib/request/request.types.mjs +0 -2
  81. package/esm2022/lib/request/request.util.mjs +0 -252
  82. package/esm2022/lib/symfony/index.mjs +0 -3
  83. package/esm2022/lib/symfony/symfony.types.mjs +0 -2
  84. package/esm2022/lib/symfony/symfony.utils.mjs +0 -31
  85. package/esm2022/lib/utils/data.utils.mjs +0 -138
  86. package/esm2022/lib/utils/deep-freeze.util.mjs +0 -17
  87. package/esm2022/lib/utils/def.util.mjs +0 -8
  88. package/esm2022/lib/utils/index.mjs +0 -4
@@ -1,431 +0,0 @@
1
- import { untracked } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, filter, interval, map, of, ReplaySubject, shareReplay, skip, Subject, switchMap, take, takeUntil, takeWhile, tap, timer, } from 'rxjs';
3
- import { isBearerAuthProvider } from '../auth';
4
- import { shouldCacheQuery } from '../query-client';
5
- import { request } from '../request';
6
- import { computeQueryBody, computeQueryHeaders, computeQueryMethod, filterFailure, filterSuccess, isGqlQueryConfig, isQueryStateCancelled, isQueryStateFailure, isQueryStateLoading, isQueryStatePrepared, isQueryStateSuccess, switchQueryState, takeUntilResponse, } from './query.utils';
7
- let _nextQueryId = 0;
8
- export class Query {
9
- get _nextId() {
10
- return ++this._currentLocalId;
11
- }
12
- get state$() {
13
- return this._state$.pipe(tap((s) => {
14
- if (!this._client.config.logging?.preparedQuerySubscriptions)
15
- return;
16
- if (isQueryStatePrepared(s)) {
17
- console.warn(`Query ${this._routeWithParams} was subscribed to in the prepared state. Did you forget to call .execute()?`);
18
- }
19
- }), switchMap((s) => this._transformState(s)), shareReplay({ bufferSize: 1, refCount: true }));
20
- }
21
- /**
22
- * The current state of the query.
23
- *
24
- * **Warning!** This differs from the `state$` observable in that it does not use the query store. Thus, the response data might be outdated.
25
- * Use `state$` (or `firstValueFrom(state$)`) the most up-to-date data.
26
- */
27
- get rawState() {
28
- return this._state$.value;
29
- }
30
- get isExpired() {
31
- if (isQueryStateLoading(this.rawState)) {
32
- return false;
33
- }
34
- if (isQueryStatePrepared(this.rawState) ||
35
- isQueryStateCancelled(this.rawState) ||
36
- isQueryStateFailure(this.rawState)) {
37
- return true;
38
- }
39
- const ts = this.rawState.meta.expiresAt;
40
- if (!ts) {
41
- return true;
42
- }
43
- return ts < Date.now();
44
- }
45
- get isInUse() {
46
- return this._state$.observed || Object.keys(this._dependents).length > 0;
47
- }
48
- /**
49
- * @internal
50
- */
51
- get _subscriberCount() {
52
- return this._state$.observers.length;
53
- }
54
- get isPolling() {
55
- return !!this._pollingSubscription;
56
- }
57
- get autoRefreshOnConfig() {
58
- const base = this._queryConfig.autoRefreshOn ?? {};
59
- const transformed = {
60
- queryClientDefaultHeadersChange: base.queryClientDefaultHeadersChange ?? true,
61
- windowFocus: base.windowFocus ?? true,
62
- };
63
- return transformed;
64
- }
65
- /**
66
- * @internal
67
- */
68
- get _enableSmartPolling() {
69
- return this._queryConfig.enableSmartPolling ?? true;
70
- }
71
- get store() {
72
- return this._queryConfig.entity?.store ?? null;
73
- }
74
- get canBeCached() {
75
- return shouldCacheQuery(this._queryConfig.method);
76
- }
77
- get _isInMockMode() {
78
- return !!this._arguments?.mock;
79
- }
80
- constructor(_client,
81
- /**
82
- * @internal
83
- */
84
- _queryConfig,
85
- /**
86
- * @internal
87
- */
88
- _routeWithParams,
89
- /**
90
- * @internal
91
- */
92
- _arguments,
93
- /**
94
- * @internal
95
- */
96
- _queryStoreKey) {
97
- this._client = _client;
98
- this._queryConfig = _queryConfig;
99
- this._routeWithParams = _routeWithParams;
100
- this._arguments = _arguments;
101
- this._queryStoreKey = _queryStoreKey;
102
- this._id = _nextQueryId++;
103
- this._currentLocalId = 0;
104
- this._pollingSubscription = null;
105
- this._onAbort$ = new Subject();
106
- this._currentPollConfig = null;
107
- /**
108
- * @internal
109
- * Used to track which components depend on this query.
110
- * The key is the component's _tNode index.
111
- * The value is the number of times the component has subscribed to this query.
112
- * The value might increase since we cant distinguish between a component and a host directive applied to it.
113
- */
114
- this._dependents = {};
115
- /**
116
- * @internal
117
- */
118
- this._dependentsChanged$ = new ReplaySubject();
119
- /**
120
- * @internal
121
- */
122
- this._isPollingPaused = false;
123
- this._state$ = new BehaviorSubject({
124
- type: "PREPARED" /* QueryStateType.Prepared */,
125
- meta: { id: this._currentLocalId, triggeredVia: 'program' },
126
- });
127
- }
128
- execute(options = {}) {
129
- const { skipCache = false, _triggeredVia: triggeredVia = 'program', cancelPrevious = false } = options;
130
- const { authProvider } = this._client;
131
- const queryConfig = this._queryConfig;
132
- if (!this.isExpired && !skipCache && isQueryStateSuccess(this.rawState)) {
133
- return this;
134
- }
135
- if (queryConfig.secure && !authProvider && !this._isInMockMode) {
136
- throw new Error('Cannot execute secure query without auth provider');
137
- }
138
- const id = this._nextId;
139
- const meta = { id, triggeredVia };
140
- if (isQueryStateLoading(this.rawState)) {
141
- if (cancelPrevious) {
142
- this.abort();
143
- }
144
- else {
145
- return this;
146
- }
147
- }
148
- this._updateState({ type: "LOADING" /* QueryStateType.Loading */, meta });
149
- if (this._isInMockMode) {
150
- this._mockRequest({}, meta, options);
151
- }
152
- else {
153
- let goSignal = of(true);
154
- if (authProvider &&
155
- isBearerAuthProvider(authProvider) &&
156
- queryConfig.secure &&
157
- !isQueryStateSuccess(authProvider.currentRefreshQuery?.rawState)) {
158
- // On page load the query might be executed before the auth provider has been initialized.
159
- // In this case we need to wait for the auth provider to be ready before we can execute the query.
160
- goSignal = combineLatest([
161
- // The tokens might get set without a refresh query being created (e.g.) directly after login.
162
- authProvider.currentRefreshQuery$.pipe(switchQueryState(), takeUntilResponse()),
163
- authProvider.tokens$.pipe(take(1)),
164
- ]).pipe(takeUntil(this._onAbort$), filter(([state, tokens]) => {
165
- if (state) {
166
- return !isQueryStateLoading(state);
167
- }
168
- return !!tokens;
169
- }), tap(([state]) => {
170
- if (isQueryStateFailure(state)) {
171
- this._updateEntityState({ type: 'failure', error: state.error, headers: {} }, meta, options);
172
- }
173
- }), map(() => true), take(1));
174
- }
175
- goSignal
176
- .pipe(switchMap(() => {
177
- const method = computeQueryMethod({ config: queryConfig, client: this._client });
178
- const body = computeQueryBody({ config: queryConfig, client: this._client, args: this._arguments, method });
179
- const headers = computeQueryHeaders({ client: this._client, config: queryConfig, args: this._arguments });
180
- return request({
181
- urlWithParams: this._routeWithParams,
182
- method,
183
- body,
184
- headers,
185
- reportProgress: queryConfig.reportProgress,
186
- responseType: queryConfig.responseType,
187
- withCredentials: queryConfig.withCredentials,
188
- cacheAdapter: this._client.config.request?.cacheAdapter,
189
- retryFn: this._client.config.request?.retryFn,
190
- }).pipe(tap((state) => this._updateEntityState(state, meta, options)), takeUntil(this._onAbort$));
191
- }))
192
- .subscribe();
193
- }
194
- return this;
195
- }
196
- abort() {
197
- if (!isQueryStateLoading(this.rawState)) {
198
- return this;
199
- }
200
- this._onAbort$.next();
201
- this._updateState({
202
- type: "CANCELLED" /* QueryStateType.Cancelled */,
203
- meta: { id: this.rawState.meta.id, triggeredVia: this.rawState.meta.triggeredVia },
204
- });
205
- return this;
206
- }
207
- poll(config) {
208
- if (this._pollingSubscription) {
209
- return this;
210
- }
211
- this._currentPollConfig = config;
212
- const interval$ = interval(config.interval);
213
- const poll$ = interval$.pipe(skip(config.triggerImmediately ? 0 : 1), takeUntil(config.takeUntil), takeWhile(() => !this._isPollingPaused), filter(() => !isQueryStateLoading(this._state$.value)));
214
- this._pollingSubscription = poll$.subscribe({
215
- next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),
216
- complete: () => this.stopPolling(),
217
- });
218
- return this;
219
- }
220
- stopPolling() {
221
- this._pollingSubscription?.unsubscribe();
222
- this._pollingSubscription = null;
223
- this._currentPollConfig = null;
224
- return this;
225
- }
226
- pausePolling() {
227
- this._pollingSubscription?.unsubscribe();
228
- this._pollingSubscription = null;
229
- this._isPollingPaused = true;
230
- return this;
231
- }
232
- resumePolling() {
233
- if (!this._isPollingPaused || !this._currentPollConfig) {
234
- return this;
235
- }
236
- this._isPollingPaused = false;
237
- return this.poll({ ...this._currentPollConfig, triggerImmediately: true });
238
- }
239
- onSuccess(callback) {
240
- this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));
241
- return this;
242
- }
243
- onFailure(callback) {
244
- this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));
245
- return this;
246
- }
247
- _getBearerAuthProvider() {
248
- const authProvider = this._client.authProvider;
249
- if (authProvider && isBearerAuthProvider(authProvider)) {
250
- return authProvider;
251
- }
252
- return null;
253
- }
254
- _updateEntityState(requestEvent, meta, options) {
255
- switch (requestEvent.type) {
256
- case 'start':
257
- case 'delay-retry': {
258
- const { type, retryDelay, retryNumber } = requestEvent;
259
- const newMeta = { ...meta, isWaitingForRetry: type === 'delay-retry', retryDelay, retryNumber };
260
- this._updateState({
261
- type: "LOADING" /* QueryStateType.Loading */,
262
- meta: newMeta,
263
- });
264
- break;
265
- }
266
- case 'upload-progress':
267
- case 'download-progress': {
268
- this._updateState({
269
- type: "LOADING" /* QueryStateType.Loading */,
270
- progress: requestEvent.progress,
271
- partialText: 'partialText' in requestEvent ? requestEvent.partialText : undefined,
272
- meta,
273
- });
274
- break;
275
- }
276
- case 'success': {
277
- const { response, expiresInTimestamp, headers } = requestEvent;
278
- const isGql = isGqlQueryConfig(this._queryConfig);
279
- const responseData = isGql && typeof response === 'object' && !!response && 'data' in response
280
- ? response['data']
281
- : response;
282
- if (this._queryConfig.entity && this._queryConfig.entity.set) {
283
- const id = this._queryConfig.entity?.id({ args: this._arguments, response: responseData });
284
- this._queryConfig.entity?.set({
285
- args: this._arguments,
286
- response: responseData,
287
- id,
288
- store: this._queryConfig.entity.store,
289
- });
290
- }
291
- this._updateState({
292
- type: "SUCCESS" /* QueryStateType.Success */,
293
- response: responseData,
294
- headers: headers,
295
- meta: { ...meta, expiresAt: expiresInTimestamp },
296
- });
297
- break;
298
- }
299
- case 'failure': {
300
- const { error } = requestEvent;
301
- const failure = () => this._updateState({ type: "FAILURE" /* QueryStateType.Failure */, error, meta });
302
- const bearerAuthProvider = this._getBearerAuthProvider();
303
- if (!bearerAuthProvider ||
304
- options?._isUnauthorizedRetry ||
305
- error.status !== 401 /* HttpStatusCode.Unauthorized */ ||
306
- !bearerAuthProvider.shouldRefreshOnUnauthorizedResponse) {
307
- return failure();
308
- }
309
- const query = bearerAuthProvider._refreshQuery();
310
- if (!query)
311
- return failure();
312
- query.state$
313
- .pipe(takeUntilResponse(), takeUntil(this._onAbort$), tap((state) => isQueryStateSuccess(state) ? this.execute({ ...options, _isUnauthorizedRetry: true }) : failure()))
314
- .subscribe();
315
- break;
316
- }
317
- case 'cancel': {
318
- this._updateState({
319
- type: "CANCELLED" /* QueryStateType.Cancelled */,
320
- meta,
321
- });
322
- break;
323
- }
324
- }
325
- }
326
- _transformState(s) {
327
- if (!isQueryStateSuccess(s) || !this._queryConfig.entity?.get) {
328
- return of(s);
329
- }
330
- const id = this._queryConfig.entity.id({ args: this._arguments, response: s.response });
331
- return this._queryConfig.entity
332
- .get({ args: this._arguments, id, response: s.response, store: this._queryConfig.entity.store })
333
- .pipe(map((v) => ({ ...s, response: v })));
334
- }
335
- _updateState(s) {
336
- // We need to use untracked here to avoid Angular's "allowSignalWrites is false" error when executing queries inside Angular's computed/effect signal functions.
337
- untracked(() => this._state$.next(s));
338
- }
339
- _mockRequest(headers, meta, options) {
340
- if (!this._arguments?.mock)
341
- return;
342
- const { delay = 200, error, response, retryIntoResponse = false, progress } = this._arguments.mock;
343
- const progressFileSize = progress?.fileSize ?? 1000000;
344
- const progressEventType = progress?.eventType ?? 'upload';
345
- const progressEventCount = progress?.eventCount ?? 5;
346
- const progressOmitTotal = progress?.omitTotal ?? false;
347
- const omitPartialText = progress?.omitPartialText ?? false;
348
- const finalResolveMock = () => {
349
- if (error) {
350
- this._updateEntityState({ error, headers: headers ?? {}, type: 'failure' }, meta, options);
351
- return;
352
- }
353
- this._updateEntityState({ response: response, headers: headers ?? {}, type: 'success' }, meta, options);
354
- };
355
- if (progress) {
356
- interval(delay)
357
- .pipe(tap((a) => {
358
- if (a === progressEventCount + 1) {
359
- finalResolveMock();
360
- }
361
- else {
362
- const current = Math.min(progressFileSize * a, progressFileSize * progressEventCount);
363
- const percentage = (current / (progressFileSize * progressEventCount)) * 100;
364
- this._updateEntityState({
365
- type: progressEventType === 'upload' ? 'upload-progress' : 'download-progress',
366
- headers: headers ?? {},
367
- progress: { current, ...(progressOmitTotal ? {} : { percentage, total: progressFileSize }) },
368
- partialText: omitPartialText ? undefined : `Partial text ${a}`,
369
- }, meta, options);
370
- }
371
- }), takeUntil(this._onAbort$), takeWhile((a) => a < progressEventCount + 1, true))
372
- .subscribe();
373
- }
374
- else if (retryIntoResponse) {
375
- interval(delay)
376
- .pipe(tap((a) => {
377
- if (a === 3) {
378
- finalResolveMock();
379
- }
380
- else {
381
- const aModified = a + 1;
382
- this._updateEntityState({
383
- type: 'delay-retry',
384
- headers: headers ?? {},
385
- retryDelay: 1000 + 1000 * aModified,
386
- retryNumber: aModified,
387
- }, meta, options);
388
- }
389
- }), takeUntil(this._onAbort$), takeWhile((a) => a < 3, true))
390
- .subscribe();
391
- }
392
- else {
393
- timer(delay)
394
- .pipe(tap(() => finalResolveMock()), takeUntil(this._onAbort$))
395
- .subscribe();
396
- }
397
- }
398
- /**
399
- * @internal
400
- */
401
- _addDependent(tNodeIndex) {
402
- if (!this._dependents[tNodeIndex]) {
403
- this._dependents[tNodeIndex] = 0;
404
- }
405
- this._dependents[tNodeIndex]++;
406
- this._dependentsChanged$.next(this._dependents);
407
- }
408
- /**
409
- * @internal
410
- */
411
- _removeDependent(tNodeIndex) {
412
- const count = this._dependents[tNodeIndex];
413
- if (count === undefined) {
414
- return;
415
- }
416
- if (this._dependents[tNodeIndex] !== undefined) {
417
- this._dependents[tNodeIndex]--;
418
- }
419
- if (count <= 1) {
420
- delete this._dependents[tNodeIndex];
421
- }
422
- this._dependentsChanged$.next(this._dependents);
423
- }
424
- /**
425
- * @internal
426
- */
427
- _hasDependents() {
428
- return Object.keys(this._dependents).length > 0;
429
- }
430
- }
431
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBQ04sUUFBUSxFQUNSLEdBQUcsRUFFSCxFQUFFLEVBQ0YsYUFBYSxFQUNiLFdBQVcsRUFDWCxJQUFJLEVBQ0osT0FBTyxFQUVQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEVBQ0gsS0FBSyxHQUNOLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRS9DLE9BQU8sRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBa0IsT0FBTyxFQUE4QyxNQUFNLFlBQVksQ0FBQztBQWFqRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsYUFBYSxFQUNiLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUVyQixNQUFNLE9BQU8sS0FBSztJQXVDaEIsSUFBWSxPQUFPO1FBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN0QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNSLElB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QUFDO0lBQ2xELENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLFVBQWtCO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0MsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBpbnRlcnZhbCxcbiAgbWFwLFxuICBPYnNlcnZhYmxlLFxuICBvZixcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2hhcmVSZXBsYXksXG4gIHNraXAsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRha2VXaGlsZSxcbiAgdGFwLFxuICB0aW1lcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpc0JlYXJlckF1dGhQcm92aWRlciB9IGZyb20gJy4uL2F1dGgnO1xuaW1wb3J0IHsgRW50aXR5U3RvcmUgfSBmcm9tICcuLi9lbnRpdHknO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIHNob3VsZENhY2hlUXVlcnkgfSBmcm9tICcuLi9xdWVyeS1jbGllbnQnO1xuaW1wb3J0IHsgSHR0cFN0YXR1c0NvZGUsIHJlcXVlc3QsIFJlcXVlc3RFcnJvciwgUmVxdWVzdEV2ZW50LCBSZXF1ZXN0SGVhZGVycyB9IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IHtcbiAgQmFzZUFyZ3VtZW50cyxcbiAgRXhlY3V0ZVF1ZXJ5T3B0aW9ucyxcbiAgR3FsUXVlcnlDb25maWcsXG4gIFBvbGxDb25maWcsXG4gIFF1ZXJ5QXV0b1JlZnJlc2hDb25maWcsXG4gIFF1ZXJ5U3RhdGUsXG4gIFF1ZXJ5U3RhdGVNZXRhLFxuICBRdWVyeVN0YXRlVHlwZSxcbiAgUmVzdFF1ZXJ5Q29uZmlnLFxuICBSb3V0ZVR5cGUsXG59IGZyb20gJy4vcXVlcnkudHlwZXMnO1xuaW1wb3J0IHtcbiAgY29tcHV0ZVF1ZXJ5Qm9keSxcbiAgY29tcHV0ZVF1ZXJ5SGVhZGVycyxcbiAgY29tcHV0ZVF1ZXJ5TWV0aG9kLFxuICBmaWx0ZXJGYWlsdXJlLFxuICBmaWx0ZXJTdWNjZXNzLFxuICBpc0dxbFF1ZXJ5Q29uZmlnLFxuICBpc1F1ZXJ5U3RhdGVDYW5jZWxsZWQsXG4gIGlzUXVlcnlTdGF0ZUZhaWx1cmUsXG4gIGlzUXVlcnlTdGF0ZUxvYWRpbmcsXG4gIGlzUXVlcnlTdGF0ZVByZXBhcmVkLFxuICBpc1F1ZXJ5U3RhdGVTdWNjZXNzLFxuICBzd2l0Y2hRdWVyeVN0YXRlLFxuICB0YWtlVW50aWxSZXNwb25zZSxcbn0gZnJvbSAnLi9xdWVyeS51dGlscyc7XG5cbmxldCBfbmV4dFF1ZXJ5SWQgPSAwO1xuXG5leHBvcnQgY2xhc3MgUXVlcnk8XG4gIFJlc3BvbnNlLFxuICBBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkLFxuICBSb3V0ZSBleHRlbmRzIFJvdXRlVHlwZTxBcmd1bWVudHM+LFxuICBTdG9yZSBleHRlbmRzIEVudGl0eVN0b3JlPHVua25vd24+LFxuICBEYXRhLFxuICBJZCxcbj4ge1xuICByZWFkb25seSBfaWQgPSBfbmV4dFF1ZXJ5SWQrKztcblxuICBwcml2YXRlIF9jdXJyZW50TG9jYWxJZCA9IDA7XG4gIHByaXZhdGUgX3BvbGxpbmdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9vbkFib3J0JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX2N1cnJlbnRQb2xsQ29uZmlnOiBQb2xsQ29uZmlnIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBVc2VkIHRvIHRyYWNrIHdoaWNoIGNvbXBvbmVudHMgZGVwZW5kIG9uIHRoaXMgcXVlcnkuXG4gICAqIFRoZSBrZXkgaXMgdGhlIGNvbXBvbmVudCdzIF90Tm9kZSBpbmRleC5cbiAgICogVGhlIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGNvbXBvbmVudCBoYXMgc3Vic2NyaWJlZCB0byB0aGlzIHF1ZXJ5LlxuICAgKiBUaGUgdmFsdWUgbWlnaHQgaW5jcmVhc2Ugc2luY2Ugd2UgY2FudCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgY29tcG9uZW50IGFuZCBhIGhvc3QgZGlyZWN0aXZlIGFwcGxpZWQgdG8gaXQuXG4gICAqL1xuICBfZGVwZW5kZW50czogUmVjb3JkPG51bWJlciwgbnVtYmVyPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9kZXBlbmRlbnRzQ2hhbmdlZCQgPSBuZXcgUmVwbGF5U3ViamVjdDxSZWNvcmQ8bnVtYmVyLCBudW1iZXI+PigpO1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pc1BvbGxpbmdQYXVzZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5U3RhdGU8UmVzcG9uc2U+Pih7XG4gICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuUHJlcGFyZWQsXG4gICAgbWV0YTogeyBpZDogdGhpcy5fY3VycmVudExvY2FsSWQsIHRyaWdnZXJlZFZpYTogJ3Byb2dyYW0nIH0sXG4gIH0pO1xuXG4gIHByaXZhdGUgZ2V0IF9uZXh0SWQoKSB7XG4gICAgcmV0dXJuICsrdGhpcy5fY3VycmVudExvY2FsSWQ7XG4gIH1cblxuICBnZXQgc3RhdGUkKCk6IE9ic2VydmFibGU8UXVlcnlTdGF0ZTxEYXRhPj4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSQucGlwZShcbiAgICAgIHRhcCgocykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2NsaWVudC5jb25maWcubG9nZ2luZz8ucHJlcGFyZWRRdWVyeVN1YnNjcmlwdGlvbnMpIHJldHVybjtcblxuICAgICAgICBpZiAoaXNRdWVyeVN0YXRlUHJlcGFyZWQocykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgUXVlcnkgJHt0aGlzLl9yb3V0ZVdpdGhQYXJhbXN9IHdhcyBzdWJzY3JpYmVkIHRvIGluIHRoZSBwcmVwYXJlZCBzdGF0ZS4gRGlkIHlvdSBmb3JnZXQgdG8gY2FsbCAuZXhlY3V0ZSgpP2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKHMpID0+IHRoaXMuX3RyYW5zZm9ybVN0YXRlKHMpKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcXVlcnkuXG4gICAqXG4gICAqICoqV2FybmluZyEqKiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgYHN0YXRlJGAgb2JzZXJ2YWJsZSBpbiB0aGF0IGl0IGRvZXMgbm90IHVzZSB0aGUgcXVlcnkgc3RvcmUuIFRodXMsIHRoZSByZXNwb25zZSBkYXRhIG1pZ2h0IGJlIG91dGRhdGVkLlxuICAgKiBVc2UgYHN0YXRlJGAgKG9yIGBmaXJzdFZhbHVlRnJvbShzdGF0ZSQpYCkgdGhlIG1vc3QgdXAtdG8tZGF0ZSBkYXRhLlxuICAgKi9cbiAgZ2V0IHJhd1N0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSQudmFsdWU7XG4gIH1cblxuICBnZXQgaXNFeHBpcmVkKCkge1xuICAgIGlmIChpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMucmF3U3RhdGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaXNRdWVyeVN0YXRlUHJlcGFyZWQodGhpcy5yYXdTdGF0ZSkgfHxcbiAgICAgIGlzUXVlcnlTdGF0ZUNhbmNlbGxlZCh0aGlzLnJhd1N0YXRlKSB8fFxuICAgICAgaXNRdWVyeVN0YXRlRmFpbHVyZSh0aGlzLnJhd1N0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgdHMgPSB0aGlzLnJhd1N0YXRlLm1ldGEuZXhwaXJlc0F0O1xuXG4gICAgaWYgKCF0cykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRzIDwgRGF0ZS5ub3coKTtcbiAgfVxuXG4gIGdldCBpc0luVXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSQub2JzZXJ2ZWQgfHwgT2JqZWN0LmtleXModGhpcy5fZGVwZW5kZW50cykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBfc3Vic2NyaWJlckNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZSQub2JzZXJ2ZXJzLmxlbmd0aDtcbiAgfVxuXG4gIGdldCBpc1BvbGxpbmcoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbjtcbiAgfVxuXG4gIGdldCBhdXRvUmVmcmVzaE9uQ29uZmlnKCkge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLl9xdWVyeUNvbmZpZy5hdXRvUmVmcmVzaE9uID8/IHt9O1xuXG4gICAgY29uc3QgdHJhbnNmb3JtZWQ6IFJlYWRvbmx5PFF1ZXJ5QXV0b1JlZnJlc2hDb25maWc+ID0ge1xuICAgICAgcXVlcnlDbGllbnREZWZhdWx0SGVhZGVyc0NoYW5nZTogYmFzZS5xdWVyeUNsaWVudERlZmF1bHRIZWFkZXJzQ2hhbmdlID8/IHRydWUsXG4gICAgICB3aW5kb3dGb2N1czogYmFzZS53aW5kb3dGb2N1cyA/PyB0cnVlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgX2VuYWJsZVNtYXJ0UG9sbGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW5hYmxlU21hcnRQb2xsaW5nID8/IHRydWU7XG4gIH1cblxuICBnZXQgc3RvcmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uc3RvcmUgPz8gbnVsbDtcbiAgfVxuXG4gIGdldCBjYW5CZUNhY2hlZCgpIHtcbiAgICByZXR1cm4gc2hvdWxkQ2FjaGVRdWVyeSh0aGlzLl9xdWVyeUNvbmZpZy5tZXRob2QpO1xuICB9XG5cbiAgZ2V0IF9pc0luTW9ja01vZGUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fYXJndW1lbnRzPy5tb2NrO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfY2xpZW50OiBRdWVyeUNsaWVudCxcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfcXVlcnlDb25maWc6XG4gICAgICB8IFJlc3RRdWVyeUNvbmZpZzxSb3V0ZSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgU3RvcmUsIERhdGEsIElkPlxuICAgICAgfCBHcWxRdWVyeUNvbmZpZzxSb3V0ZSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgU3RvcmUsIERhdGEsIElkPixcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfcm91dGVXaXRoUGFyYW1zOiBSb3V0ZSxcblxuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBfYXJndW1lbnRzOiBBcmd1bWVudHMsXG5cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgX3F1ZXJ5U3RvcmVLZXk6IHN0cmluZyxcbiAgKSB7fVxuXG4gIGV4ZWN1dGUob3B0aW9uczogRXhlY3V0ZVF1ZXJ5T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBza2lwQ2FjaGUgPSBmYWxzZSwgX3RyaWdnZXJlZFZpYTogdHJpZ2dlcmVkVmlhID0gJ3Byb2dyYW0nLCBjYW5jZWxQcmV2aW91cyA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHsgYXV0aFByb3ZpZGVyIH0gPSB0aGlzLl9jbGllbnQ7XG4gICAgY29uc3QgcXVlcnlDb25maWcgPSB0aGlzLl9xdWVyeUNvbmZpZztcblxuICAgIGlmICghdGhpcy5pc0V4cGlyZWQgJiYgIXNraXBDYWNoZSAmJiBpc1F1ZXJ5U3RhdGVTdWNjZXNzKHRoaXMucmF3U3RhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAocXVlcnlDb25maWcuc2VjdXJlICYmICFhdXRoUHJvdmlkZXIgJiYgIXRoaXMuX2lzSW5Nb2NrTW9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXhlY3V0ZSBzZWN1cmUgcXVlcnkgd2l0aG91dCBhdXRoIHByb3ZpZGVyJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaWQgPSB0aGlzLl9uZXh0SWQ7XG4gICAgY29uc3QgbWV0YTogUXVlcnlTdGF0ZU1ldGEgPSB7IGlkLCB0cmlnZ2VyZWRWaWEgfTtcblxuICAgIGlmIChpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMucmF3U3RhdGUpKSB7XG4gICAgICBpZiAoY2FuY2VsUHJldmlvdXMpIHtcbiAgICAgICAgdGhpcy5hYm9ydCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlU3RhdGUoeyB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nLCBtZXRhIH0pO1xuXG4gICAgaWYgKHRoaXMuX2lzSW5Nb2NrTW9kZSkge1xuICAgICAgdGhpcy5fbW9ja1JlcXVlc3Qoe30sIG1ldGEsIG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZ29TaWduYWwgPSBvZih0cnVlKTtcblxuICAgICAgaWYgKFxuICAgICAgICBhdXRoUHJvdmlkZXIgJiZcbiAgICAgICAgaXNCZWFyZXJBdXRoUHJvdmlkZXIoYXV0aFByb3ZpZGVyKSAmJlxuICAgICAgICBxdWVyeUNvbmZpZy5zZWN1cmUgJiZcbiAgICAgICAgIWlzUXVlcnlTdGF0ZVN1Y2Nlc3MoYXV0aFByb3ZpZGVyLmN1cnJlbnRSZWZyZXNoUXVlcnk/LnJhd1N0YXRlKVxuICAgICAgKSB7XG4gICAgICAgIC8vIE9uIHBhZ2UgbG9hZCB0aGUgcXVlcnkgbWlnaHQgYmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBhdXRoIHByb3ZpZGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgYXV0aCBwcm92aWRlciB0byBiZSByZWFkeSBiZWZvcmUgd2UgY2FuIGV4ZWN1dGUgdGhlIHF1ZXJ5LlxuICAgICAgICBnb1NpZ25hbCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIC8vIFRoZSB0b2tlbnMgbWlnaHQgZ2V0IHNldCB3aXRob3V0IGEgcmVmcmVzaCBxdWVyeSBiZWluZyBjcmVhdGVkIChlLmcuKSBkaXJlY3RseSBhZnRlciBsb2dpbi5cbiAgICAgICAgICBhdXRoUHJvdmlkZXIuY3VycmVudFJlZnJlc2hRdWVyeSQucGlwZShzd2l0Y2hRdWVyeVN0YXRlKCksIHRha2VVbnRpbFJlc3BvbnNlKCkpLFxuICAgICAgICAgIGF1dGhQcm92aWRlci50b2tlbnMkLnBpcGUodGFrZSgxKSksXG4gICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uQWJvcnQkKSxcbiAgICAgICAgICBmaWx0ZXIoKFtzdGF0ZSwgdG9rZW5zXSkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhaXNRdWVyeVN0YXRlTG9hZGluZyhzdGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAhIXRva2VucztcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YXAoKFtzdGF0ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChpc1F1ZXJ5U3RhdGVGYWlsdXJlKHN0YXRlKSkge1xuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZSh7IHR5cGU6ICdmYWlsdXJlJywgZXJyb3I6IHN0YXRlLmVycm9yLCBoZWFkZXJzOiB7fSB9LCBtZXRhLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKCkgPT4gdHJ1ZSksXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgZ29TaWduYWxcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IGNvbXB1dGVRdWVyeU1ldGhvZCh7IGNvbmZpZzogcXVlcnlDb25maWcsIGNsaWVudDogdGhpcy5fY2xpZW50IH0pO1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGNvbXB1dGVRdWVyeUJvZHkoeyBjb25maWc6IHF1ZXJ5Q29uZmlnLCBjbGllbnQ6IHRoaXMuX2NsaWVudCwgYXJnczogdGhpcy5fYXJndW1lbnRzLCBtZXRob2QgfSk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gY29tcHV0ZVF1ZXJ5SGVhZGVycyh7IGNsaWVudDogdGhpcy5fY2xpZW50LCBjb25maWc6IHF1ZXJ5Q29uZmlnLCBhcmdzOiB0aGlzLl9hcmd1bWVudHMgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0PFJlc3BvbnNlPih7XG4gICAgICAgICAgICAgIHVybFdpdGhQYXJhbXM6IHRoaXMuX3JvdXRlV2l0aFBhcmFtcyBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHF1ZXJ5Q29uZmlnLnJlcG9ydFByb2dyZXNzLFxuICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IHF1ZXJ5Q29uZmlnLnJlc3BvbnNlVHlwZSxcbiAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiBxdWVyeUNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgIGNhY2hlQWRhcHRlcjogdGhpcy5fY2xpZW50LmNvbmZpZy5yZXF1ZXN0Py5jYWNoZUFkYXB0ZXIsXG4gICAgICAgICAgICAgIHJldHJ5Rm46IHRoaXMuX2NsaWVudC5jb25maWcucmVxdWVzdD8ucmV0cnlGbixcbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgIHRhcCgoc3RhdGUpID0+IHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHN0YXRlLCBtZXRhLCBvcHRpb25zKSksXG4gICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG5cbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWJvcnQoKSB7XG4gICAgaWYgKCFpc1F1ZXJ5U3RhdGVMb2FkaW5nKHRoaXMucmF3U3RhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9vbkFib3J0JC5uZXh0KCk7XG5cbiAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5DYW5jZWxsZWQsXG4gICAgICBtZXRhOiB7IGlkOiB0aGlzLnJhd1N0YXRlLm1ldGEuaWQsIHRyaWdnZXJlZFZpYTogdGhpcy5yYXdTdGF0ZS5tZXRhLnRyaWdnZXJlZFZpYSB9LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwb2xsKGNvbmZpZzogUG9sbENvbmZpZykge1xuICAgIGlmICh0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9jdXJyZW50UG9sbENvbmZpZyA9IGNvbmZpZztcblxuICAgIGNvbnN0IGludGVydmFsJCA9IGludGVydmFsKGNvbmZpZy5pbnRlcnZhbCk7XG4gICAgY29uc3QgcG9sbCQgPSBpbnRlcnZhbCQucGlwZShcbiAgICAgIHNraXAoY29uZmlnLnRyaWdnZXJJbW1lZGlhdGVseSA/IDAgOiAxKSxcbiAgICAgIHRha2VVbnRpbChjb25maWcudGFrZVVudGlsKSxcbiAgICAgIHRha2VXaGlsZSgoKSA9PiAhdGhpcy5faXNQb2xsaW5nUGF1c2VkKSxcbiAgICAgIGZpbHRlcigoKSA9PiAhaXNRdWVyeVN0YXRlTG9hZGluZyh0aGlzLl9zdGF0ZSQudmFsdWUpKSxcbiAgICApO1xuXG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbiA9IHBvbGwkLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLmV4ZWN1dGUoeyBza2lwQ2FjaGU6IHRydWUsIF90cmlnZ2VyZWRWaWE6ICdwb2xsJyB9KSxcbiAgICAgIGNvbXBsZXRlOiAoKSA9PiB0aGlzLnN0b3BQb2xsaW5nKCksXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0b3BQb2xsaW5nKCkge1xuICAgIHRoaXMuX3BvbGxpbmdTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgdGhpcy5fY3VycmVudFBvbGxDb25maWcgPSBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwYXVzZVBvbGxpbmcoKSB7XG4gICAgdGhpcy5fcG9sbGluZ1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9wb2xsaW5nU3Vic2NyaXB0aW9uID0gbnVsbDtcblxuICAgIHRoaXMuX2lzUG9sbGluZ1BhdXNlZCA9IHRydWU7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlc3VtZVBvbGxpbmcoKSB7XG4gICAgaWYgKCF0aGlzLl9pc1BvbGxpbmdQYXVzZWQgfHwgIXRoaXMuX2N1cnJlbnRQb2xsQ29uZmlnKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9pc1BvbGxpbmdQYXVzZWQgPSBmYWxzZTtcblxuICAgIHJldHVybiB0aGlzLnBvbGwoeyAuLi50aGlzLl9jdXJyZW50UG9sbENvbmZpZywgdHJpZ2dlckltbWVkaWF0ZWx5OiB0cnVlIH0pO1xuICB9XG5cbiAgb25TdWNjZXNzKGNhbGxiYWNrOiAocmVzcG9uc2U6IERhdGEpID0+IHZvaWQpIHtcbiAgICB0aGlzLnN0YXRlJC5waXBlKHRha2VVbnRpbFJlc3BvbnNlKCksIGZpbHRlclN1Y2Nlc3MoKSkuc3Vic2NyaWJlKChzdGF0ZSkgPT4gY2FsbGJhY2soc3RhdGUucmVzcG9uc2UpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIG9uRmFpbHVyZShjYWxsYmFjazogKGVycm9yOiBSZXF1ZXN0RXJyb3I8dW5rbm93bj4pID0+IHZvaWQpIHtcbiAgICB0aGlzLnN0YXRlJC5waXBlKHRha2VVbnRpbFJlc3BvbnNlKCksIGZpbHRlckZhaWx1cmUoKSkuc3Vic2NyaWJlKChzdGF0ZSkgPT4gY2FsbGJhY2soc3RhdGUuZXJyb3IpKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByaXZhdGUgX2dldEJlYXJlckF1dGhQcm92aWRlcigpIHtcbiAgICBjb25zdCBhdXRoUHJvdmlkZXIgPSB0aGlzLl9jbGllbnQuYXV0aFByb3ZpZGVyO1xuXG4gICAgaWYgKGF1dGhQcm92aWRlciAmJiBpc0JlYXJlckF1dGhQcm92aWRlcihhdXRoUHJvdmlkZXIpKSB7XG4gICAgICByZXR1cm4gYXV0aFByb3ZpZGVyO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRW50aXR5U3RhdGUoXG4gICAgcmVxdWVzdEV2ZW50OiBSZXF1ZXN0RXZlbnQ8UmVzcG9uc2U+LFxuICAgIG1ldGE6IFF1ZXJ5U3RhdGVNZXRhLFxuICAgIG9wdGlvbnM/OiBFeGVjdXRlUXVlcnlPcHRpb25zLFxuICApIHtcbiAgICBzd2l0Y2ggKHJlcXVlc3RFdmVudC50eXBlKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICBjYXNlICdkZWxheS1yZXRyeSc6IHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCByZXRyeURlbGF5LCByZXRyeU51bWJlciB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBuZXdNZXRhOiBRdWVyeVN0YXRlTWV0YSA9IHsgLi4ubWV0YSwgaXNXYWl0aW5nRm9yUmV0cnk6IHR5cGUgPT09ICdkZWxheS1yZXRyeScsIHJldHJ5RGVsYXksIHJldHJ5TnVtYmVyIH07XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoe1xuICAgICAgICAgIHR5cGU6IFF1ZXJ5U3RhdGVUeXBlLkxvYWRpbmcsXG4gICAgICAgICAgbWV0YTogbmV3TWV0YSxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICd1cGxvYWQtcHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAnZG93bmxvYWQtcHJvZ3Jlc3MnOiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5Mb2FkaW5nLFxuICAgICAgICAgIHByb2dyZXNzOiByZXF1ZXN0RXZlbnQucHJvZ3Jlc3MsXG4gICAgICAgICAgcGFydGlhbFRleHQ6ICdwYXJ0aWFsVGV4dCcgaW4gcmVxdWVzdEV2ZW50ID8gcmVxdWVzdEV2ZW50LnBhcnRpYWxUZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGEsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdzdWNjZXNzJzoge1xuICAgICAgICBjb25zdCB7IHJlc3BvbnNlLCBleHBpcmVzSW5UaW1lc3RhbXAsIGhlYWRlcnMgfSA9IHJlcXVlc3RFdmVudDtcbiAgICAgICAgY29uc3QgaXNHcWwgPSBpc0dxbFF1ZXJ5Q29uZmlnKHRoaXMuX3F1ZXJ5Q29uZmlnKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID1cbiAgICAgICAgICBpc0dxbCAmJiB0eXBlb2YgcmVzcG9uc2UgPT09ICdvYmplY3QnICYmICEhcmVzcG9uc2UgJiYgJ2RhdGEnIGluIHJlc3BvbnNlXG4gICAgICAgICAgICA/IChyZXNwb25zZVsnZGF0YSddIGFzIFJlc3BvbnNlKVxuICAgICAgICAgICAgOiAocmVzcG9uc2UgYXMgUmVzcG9uc2UpO1xuXG4gICAgICAgIGlmICh0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkgJiYgdGhpcy5fcXVlcnlDb25maWcuZW50aXR5LnNldCkge1xuICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5Py5pZCh7IGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgcmVzcG9uc2U6IHJlc3BvbnNlRGF0YSB9KTtcblxuICAgICAgICAgIHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uc2V0KHtcbiAgICAgICAgICAgIGFyZ3M6IHRoaXMuX2FyZ3VtZW50cyxcbiAgICAgICAgICAgIHJlc3BvbnNlOiByZXNwb25zZURhdGEsXG4gICAgICAgICAgICBpZCxcbiAgICAgICAgICAgIHN0b3JlOiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc3RvcmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl91cGRhdGVTdGF0ZSh7XG4gICAgICAgICAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuU3VjY2VzcyxcbiAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2VEYXRhLFxuICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgbWV0YTogeyAuLi5tZXRhLCBleHBpcmVzQXQ6IGV4cGlyZXNJblRpbWVzdGFtcCB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZmFpbHVyZSc6IHtcbiAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcmVxdWVzdEV2ZW50O1xuICAgICAgICBjb25zdCBmYWlsdXJlID0gKCkgPT4gdGhpcy5fdXBkYXRlU3RhdGUoeyB0eXBlOiBRdWVyeVN0YXRlVHlwZS5GYWlsdXJlLCBlcnJvciwgbWV0YSB9KTtcbiAgICAgICAgY29uc3QgYmVhcmVyQXV0aFByb3ZpZGVyID0gdGhpcy5fZ2V0QmVhcmVyQXV0aFByb3ZpZGVyKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFiZWFyZXJBdXRoUHJvdmlkZXIgfHxcbiAgICAgICAgICBvcHRpb25zPy5faXNVbmF1dGhvcml6ZWRSZXRyeSB8fFxuICAgICAgICAgIGVycm9yLnN0YXR1cyAhPT0gSHR0cFN0YXR1c0NvZGUuVW5hdXRob3JpemVkIHx8XG4gICAgICAgICAgIWJlYXJlckF1dGhQcm92aWRlci5zaG91bGRSZWZyZXNoT25VbmF1dGhvcml6ZWRSZXNwb25zZVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFpbHVyZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSBiZWFyZXJBdXRoUHJvdmlkZXIuX3JlZnJlc2hRdWVyeSgpO1xuICAgICAgICBpZiAoIXF1ZXJ5KSByZXR1cm4gZmFpbHVyZSgpO1xuXG4gICAgICAgIHF1ZXJ5LnN0YXRlJFxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsUmVzcG9uc2UoKSxcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgICB0YXAoKHN0YXRlKSA9PlxuICAgICAgICAgICAgICBpc1F1ZXJ5U3RhdGVTdWNjZXNzKHN0YXRlKSA/IHRoaXMuZXhlY3V0ZSh7IC4uLm9wdGlvbnMsIF9pc1VuYXV0aG9yaXplZFJldHJ5OiB0cnVlIH0pIDogZmFpbHVyZSgpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlICdjYW5jZWwnOiB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKHtcbiAgICAgICAgICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5DYW5jZWxsZWQsXG4gICAgICAgICAgbWV0YSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtU3RhdGUoczogUXVlcnlTdGF0ZTxSZXNwb25zZT4pOiBPYnNlcnZhYmxlPFF1ZXJ5U3RhdGU8RGF0YT4+IHtcbiAgICBpZiAoIWlzUXVlcnlTdGF0ZVN1Y2Nlc3MocykgfHwgIXRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eT8uZ2V0KSB7XG4gICAgICByZXR1cm4gb2YocykgYXMgT2JzZXJ2YWJsZTxRdWVyeVN0YXRlPERhdGE+PjtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHRoaXMuX3F1ZXJ5Q29uZmlnLmVudGl0eS5pZCh7IGFyZ3M6IHRoaXMuX2FyZ3VtZW50cywgcmVzcG9uc2U6IHMucmVzcG9uc2UgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5fcXVlcnlDb25maWcuZW50aXR5XG4gICAgICAuZ2V0KHsgYXJnczogdGhpcy5fYXJndW1lbnRzLCBpZCwgcmVzcG9uc2U6IHMucmVzcG9uc2UsIHN0b3JlOiB0aGlzLl9xdWVyeUNvbmZpZy5lbnRpdHkuc3RvcmUgfSlcbiAgICAgIC5waXBlKG1hcCgodikgPT4gKHsgLi4ucywgcmVzcG9uc2U6IHYgfSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVN0YXRlKHM6IFF1ZXJ5U3RhdGU8UmVzcG9uc2U+KSB7XG4gICAgLy8gV2UgbmVlZCB0byB1c2UgdW50cmFja2VkIGhlcmUgdG8gYXZvaWQgQW5ndWxhcidzIFwiYWxsb3dTaWduYWxXcml0ZXMgaXMgZmFsc2VcIiBlcnJvciB3aGVuIGV4ZWN1dGluZyBxdWVyaWVzIGluc2lkZSBBbmd1bGFyJ3MgY29tcHV0ZWQvZWZmZWN0IHNpZ25hbCBmdW5jdGlvbnMuXG4gICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3N0YXRlJC5uZXh0KHMpKTtcbiAgfVxuXG4gIHByaXZhdGUgX21vY2tSZXF1ZXN0KGhlYWRlcnM6IFJlcXVlc3RIZWFkZXJzIHwgdW5kZWZpbmVkLCBtZXRhOiBRdWVyeVN0YXRlTWV0YSwgb3B0aW9uczogRXhlY3V0ZVF1ZXJ5T3B0aW9ucykge1xuICAgIGlmICghdGhpcy5fYXJndW1lbnRzPy5tb2NrKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGRlbGF5ID0gMjAwLCBlcnJvciwgcmVzcG9uc2UsIHJldHJ5SW50b1Jlc3BvbnNlID0gZmFsc2UsIHByb2dyZXNzIH0gPSB0aGlzLl9hcmd1bWVudHMubW9jaztcbiAgICBjb25zdCBwcm9ncmVzc0ZpbGVTaXplID0gcHJvZ3Jlc3M/LmZpbGVTaXplID8/IDEwMDAwMDA7XG4gICAgY29uc3QgcHJvZ3Jlc3NFdmVudFR5cGUgPSBwcm9ncmVzcz8uZXZlbnRUeXBlID8/ICd1cGxvYWQnO1xuICAgIGNvbnN0IHByb2dyZXNzRXZlbnRDb3VudCA9IHByb2dyZXNzPy5ldmVudENvdW50ID8/IDU7XG4gICAgY29uc3QgcHJvZ3Jlc3NPbWl0VG90YWwgPSBwcm9ncmVzcz8ub21pdFRvdGFsID8/IGZhbHNlO1xuICAgIGNvbnN0IG9taXRQYXJ0aWFsVGV4dCA9IHByb2dyZXNzPy5vbWl0UGFydGlhbFRleHQgPz8gZmFsc2U7XG5cbiAgICBjb25zdCBmaW5hbFJlc29sdmVNb2NrID0gKCkgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKHsgZXJyb3IsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdmYWlsdXJlJyB9LCBtZXRhLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgeyByZXNwb25zZTogcmVzcG9uc2UgYXMgUmVzcG9uc2UsIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sIHR5cGU6ICdzdWNjZXNzJyB9LFxuICAgICAgICBtZXRhLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgaWYgKHByb2dyZXNzKSB7XG4gICAgICBpbnRlcnZhbChkZWxheSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKChhKSA9PiB7XG4gICAgICAgICAgICBpZiAoYSA9PT0gcHJvZ3Jlc3NFdmVudENvdW50ICsgMSkge1xuICAgICAgICAgICAgICBmaW5hbFJlc29sdmVNb2NrKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gTWF0aC5taW4ocHJvZ3Jlc3NGaWxlU2l6ZSAqIGEsIHByb2dyZXNzRmlsZVNpemUgKiBwcm9ncmVzc0V2ZW50Q291bnQpO1xuICAgICAgICAgICAgICBjb25zdCBwZXJjZW50YWdlID0gKGN1cnJlbnQgLyAocHJvZ3Jlc3NGaWxlU2l6ZSAqIHByb2dyZXNzRXZlbnRDb3VudCkpICogMTAwO1xuXG4gICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVudGl0eVN0YXRlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IHByb2dyZXNzRXZlbnRUeXBlID09PSAndXBsb2FkJyA/ICd1cGxvYWQtcHJvZ3Jlc3MnIDogJ2Rvd25sb2FkLXByb2dyZXNzJyxcbiAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgPz8ge30sXG4gICAgICAgICAgICAgICAgICBwcm9ncmVzczogeyBjdXJyZW50LCAuLi4ocHJvZ3Jlc3NPbWl0VG90YWwgPyB7fSA6IHsgcGVyY2VudGFnZSwgdG90YWw6IHByb2dyZXNzRmlsZVNpemUgfSkgfSxcbiAgICAgICAgICAgICAgICAgIHBhcnRpYWxUZXh0OiBvbWl0UGFydGlhbFRleHQgPyB1bmRlZmluZWQgOiBgUGFydGlhbCB0ZXh0ICR7YX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgICAgdGFrZVdoaWxlKChhKSA9PiBhIDwgcHJvZ3Jlc3NFdmVudENvdW50ICsgMSwgdHJ1ZSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH0gZWxzZSBpZiAocmV0cnlJbnRvUmVzcG9uc2UpIHtcbiAgICAgIGludGVydmFsKGRlbGF5KVxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKGEpID0+IHtcbiAgICAgICAgICAgIGlmIChhID09PSAzKSB7XG4gICAgICAgICAgICAgIGZpbmFsUmVzb2x2ZU1vY2soKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFNb2RpZmllZCA9IGEgKyAxO1xuICAgICAgICAgICAgICB0aGlzLl91cGRhdGVFbnRpdHlTdGF0ZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZGVsYXktcmV0cnknLFxuICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyA/PyB7fSxcbiAgICAgICAgICAgICAgICAgIHJldHJ5RGVsYXk6IDEwMDAgKyAxMDAwICogYU1vZGlmaWVkLFxuICAgICAgICAgICAgICAgICAgcmV0cnlOdW1iZXI6IGFNb2RpZmllZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25BYm9ydCQpLFxuICAgICAgICAgIHRha2VXaGlsZSgoYSkgPT4gYSA8IDMsIHRydWUpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGltZXIoZGVsYXkpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiBmaW5hbFJlc29sdmVNb2NrKCkpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9vbkFib3J0JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9hZGREZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKSB7XG4gICAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdKys7XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzQ2hhbmdlZCQubmV4dCh0aGlzLl9kZXBlbmRlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZW1vdmVEZXBlbmRlbnQodE5vZGVJbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY291bnQgPSB0aGlzLl9kZXBlbmRlbnRzW3ROb2RlSW5kZXhdO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlcGVuZGVudHNbdE5vZGVJbmRleF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fZGVwZW5kZW50c1t0Tm9kZUluZGV4XS0tO1xuICAgIH1cblxuICAgIGlmIChjb3VudCA8PSAxKSB7XG4gICAgICBkZWxldGUgdGhpcy5fZGVwZW5kZW50c1t0Tm9kZUluZGV4XTtcbiAgICB9XG5cbiAgICB0aGlzLl9kZXBlbmRlbnRzQ2hhbmdlZCQubmV4dCh0aGlzLl9kZXBlbmRlbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9oYXNEZXBlbmRlbnRzKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9kZXBlbmRlbnRzKS5sZW5ndGggPiAwO1xuICB9XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkudHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3F1ZXJ5L3NyYy9saWIvcXVlcnkvcXVlcnkudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEVudGl0eVN0b3JlIH0gZnJvbSAnLi4vZW50aXR5JztcbmltcG9ydCB7IEFueVF1ZXJ5Q3JlYXRvciwgQ29uc3RydWN0UXVlcnksIFF1ZXJ5RGF0YU9mLCBRdWVyeVJlc3BvbnNlT2YgfSBmcm9tICcuLi9xdWVyeS1jcmVhdG9yJztcbmltcG9ydCB7IFF1ZXJ5Rm9ybSB9IGZyb20gJy4uL3F1ZXJ5LWZvcm0nO1xuaW1wb3J0IHsgTWV0aG9kLCBQYXRoUGFyYW1zLCBRdWVyeVBhcmFtcywgUmVxdWVzdEVycm9yLCBSZXF1ZXN0SGVhZGVycywgUmVxdWVzdFByb2dyZXNzIH0gZnJvbSAnLi4vcmVxdWVzdCc7XG5pbXBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5QXV0b1JlZnJlc2hDb25maWcge1xuICAvKipcbiAgICogUmVmcmVzaCB0aGUgcXVlcnkgd2hlbiB0aGUgcXVlcnkgY2xpZW50J3MgaGVhZGVycyBjaGFuZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHF1ZXJ5Q2xpZW50RGVmYXVsdEhlYWRlcnNDaGFuZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRoZSBxdWVyeSB3aGVuIHRoZSB3aW5kb3cgcmVnYWlucyBmb2N1cy5cbiAgICpcbiAgICogVGhpcyBjYW4gb25seSBiZSBkaXNhYmxlZCBpZiBgYXV0b1JlZnJlc2hRdWVyaWVzT25XaW5kb3dGb2N1c2AgaXMgZW5hYmxlZCBvbiB0aGUgcXVlcnkgY2xpZW50LlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICB3aW5kb3dGb2N1cz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2V0UGFyYW1zPFN0b3JlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBJZD4ge1xuICAvKipcbiAgICogVGhlIHJlc3BvbnNlIGRhdGEuXG4gICAqL1xuICByZXNwb25zZTogUmVzcG9uc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBpZChzKSByZXR1cm5lZCBieSB0aGUgYGlkYCBmdW5jdGlvbi5cbiAgICovXG4gIGlkOiBJZDtcblxuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHF1ZXJ5LlxuICAgKi9cbiAgYXJnczogQXJndW1lbnRzO1xuXG4gIC8qKlxuICAgKiBUaGUgZW50aXR5IHN0b3JlLlxuICAgKi9cbiAgc3RvcmU6IFN0b3JlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eUdldFBhcmFtczxTdG9yZSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgSWQ+IHtcbiAgLyoqXG4gICAqIFRoZSByZXNwb25zZSBkYXRhLlxuICAgKi9cbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQocykgcmV0dXJuZWQgYnkgdGhlIGBpZGAgZnVuY3Rpb24uXG4gICAqL1xuICBpZDogSWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBxdWVyeS5cbiAgICovXG4gIGFyZ3M6IEFyZ3VtZW50cztcblxuICAvKipcbiAgICogVGhlIGVudGl0eSBzdG9yZS5cbiAgICovXG4gIHN0b3JlOiBTdG9yZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlJZFBhcmFtczxSZXNwb25zZSwgQXJndW1lbnRzPiB7XG4gIC8qKlxuICAgKiBUaGUgcmVzcG9uc2UgZGF0YS5cbiAgICovXG4gIHJlc3BvbnNlOiBSZXNwb25zZTtcblxuICAvKipcbiAgICogVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHF1ZXJ5LlxuICAgKi9cbiAgYXJnczogQXJndW1lbnRzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5RW50aXR5Q29uZmlnPFN0b3JlLCBEYXRhLCBSZXNwb25zZSwgQXJndW1lbnRzLCBJZD4ge1xuICAvKipcbiAgICogVGhlIGVudGl0eSBzdG9yZSB0byB1c2UgZm9yIHRoZSBxdWVyeS5cbiAgICovXG4gIHN0b3JlOiBTdG9yZTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGlkIG9mIHRoZSBlbnRpdHkuIENhbiBhbHNvIHJldHVybiBhbiBhcnJheSBvZiBpZHMuXG4gICAqL1xuICBpZDogKGRhdGE6IEVudGl0eUlkUGFyYW1zPFJlc3BvbnNlLCBBcmd1bWVudHM+KSA9PiBJZDtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIGRhdGEgKGNhbiBiZSBhIHN1YnNldCBvZiB0aGUgcmVzcG9uc2UpLlxuICAgKi9cbiAgZ2V0PzogKGRhdGE6IEVudGl0eUdldFBhcmFtczxTdG9yZSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgSWQ+KSA9PiBPYnNlcnZhYmxlPERhdGE+O1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgZW50aXR5IHN0b3JlIGV2ZXJ5IHRpbWUgYSBuZXcgcmVzcG9uc2UgaXMgcmVjZWl2ZWQuXG4gICAqL1xuICBzZXQ/OiAoZGF0YTogRW50aXR5U2V0UGFyYW1zPFN0b3JlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBJZD4pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29uZmlnQmFzZTxcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiA9IHtcbiAgLyoqXG4gICAqIFRoZSBodHRwIG1ldGhvZCB0byB1c2UgZm9yIHRoZSBxdWVyeS5cbiAgICovXG4gIG1ldGhvZDogTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBhdXRoIHByb3ZpZGVyIHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIHF1ZXJ5LlxuICAgKiBUaGUgcXVlcnkgKip3aWxsIHRocm93KiogaWYgdGhlIHF1ZXJ5IGNsaWVudCdzIGF1dGggcHJvdmlkZXIgaXMgdW5zZXQuXG4gICAqL1xuICBzZWN1cmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBxdWVyeSBzaG91bGQgZW1pdCBwcm9ncmVzcyBldmVudHMuXG4gICAqL1xuICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHF1ZXJ5J3MgcmVzcG9uc2UgdHlwZS5cbiAgICogQGRlZmF1bHQgJ2pzb24nXG4gICAqL1xuICByZXNwb25zZVR5cGU/OiAnYXJyYXlidWZmZXInIHwgJ2Jsb2InIHwgJ2pzb24nIHwgJ3RleHQnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBzaG91bGQgYmUgc2VudCB3aXRoIG91dGdvaW5nIGNyZWRlbnRpYWxzIChjb29raWVzKS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIGhhbmRsaW5nIGF1dG8gcmVmcmVzaCB0cmlnZ2Vycy5cbiAgICpcbiAgICogKipOb3RlOioqIFRoaXMgaXMgb25seSBhdmFpbGFibGUgZm9yIHF1ZXJpZXMgdGhhdCBjYW4gYmUgcmVmcmVzaGVkLiAoYEdFVGAsIGBIRUFEYCwgYE9QVElPTlNgLCBgR1FMX1FVRVJZYClcbiAgICovXG4gIGF1dG9SZWZyZXNoT24/OiBRdWVyeUF1dG9SZWZyZXNoQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgc3RvcCBwb2xsaW5nIGZvciB0aGlzIHF1ZXJ5IHdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cy5cbiAgICogUG9sbGluZyB3aWxsIHJlc3VtZSB3aGVuIHRoZSB3aW5kb3cgcmVnYWlucyBmb2N1cy5cbiAgICpcbiAgICogVGhpcyBjYW4gb25seSBiZSBkaXNhYmxlZCBpZiBgZW5hYmxlU21hcnRQb2xsaW5nYCBpcyBlbmFibGVkIG9uIHRoZSBxdWVyeSBjbGllbnQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZVNtYXJ0UG9sbGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9iamVjdCBjb250YWluaW5nIHRoZSBxdWVyeSdzIHR5cGUgaW5mb3JtYXRpb24uXG4gICAqL1xuICB0eXBlcz86IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgc3VjY2Vzc2Z1bCByZXNwb25zZS5cbiAgICAgKi9cbiAgICByZXNwb25zZT86IFJlc3BvbnNlO1xuXG4gICAgLyoqXG4gICAgICogQXJndW1lbnRzIGZvciBleGVjdXRpbmcgdGhlIHF1ZXJ5LlxuICAgICAqXG4gICAgICogLSBgcGF0aFBhcmFtc2A6IFRoZSBwYXRoIHBhcmFtZXRlcnMgZm9yIHRoZSBxdWVyeS4gKGluIGZyb250IG9mIHRoZSA/IGluIHRoZSB1cmwpXG4gICAgICogLSBgcXVlcnlQYXJhbXNgOiBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhlIHF1ZXJ5LiAoYWZ0ZXIgdGhlID8gaW4gdGhlIHVybClcbiAgICAgKiAtIGBib2R5YDogVGhlIGJvZHkgZm9yIHRoZSBxdWVyeS4gVW5hdmFpbGFibGUgZm9yIEdFVCwgSEVBRCBhbmQgT1BUSU9OUyByZXF1ZXN0cy5cbiAgICAgKiAtIGBoZWFkZXJzYDogVGhlIGhlYWRlcnMgZm9yIHRoZSBxdWVyeS5cbiAgICAgKiAtIGB2YXJpYWJsZXNgOiBUaGUgdmFyaWFibGVzIGZvciB0aGUgcXVlcnkuIChncmFwaHFsIG9ubHkpXG4gICAgICovXG4gICAgYXJncz86IEFyZ3VtZW50cztcbiAgfTtcblxuICAvKipcbiAgICogT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHF1ZXJ5J3MgZW50aXR5IHN0b3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgZW50aXR5PzogUXVlcnlFbnRpdHlDb25maWc8U3RvcmUsIERhdGEsIFJlc3BvbnNlLCBBcmd1bWVudHMsIElkPjtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc3RRdWVyeUNvbmZpZzxcbiAgUm91dGUgZXh0ZW5kcyBSb3V0ZVR5cGU8QXJndW1lbnRzPixcbiAgUmVzcG9uc2UsXG4gIEFyZ3VtZW50cyBleHRlbmRzIEJhc2VBcmd1bWVudHMgfCB1bmRlZmluZWQsXG4gIFN0b3JlIGV4dGVuZHMgRW50aXR5U3RvcmU8dW5rbm93bj4sXG4gIERhdGEsXG4gIElkLFxuPiA9IFF1ZXJ5Q29uZmlnQmFzZTxSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+ICYge1xuICAvKipcbiAgICogVGhlIGFwaSByb3V0ZSB0byB1c2UgZm9yIHRoZSBxdWVyeS5cbiAgICovXG4gIHJvdXRlOiBSb3V0ZTtcbn07XG5cbmV4cG9ydCB0eXBlIEdxbFRyYW5zZmVyT3B0aW9uID0gJ0dFVCcgfCAnUE9TVCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3FsUXVlcnlDb25maWc8XG4gIFJvdXRlIGV4dGVuZHMgUm91dGVUeXBlPEFyZ3VtZW50cz4gfCB1bmRlZmluZWQsXG4gIFJlc3BvbnNlLFxuICBBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkLFxuICBTdG9yZSBleHRlbmRzIEVudGl0eVN0b3JlPHVua25vd24+LFxuICBEYXRhLFxuICBJZCxcbj4gZXh0ZW5kcyBRdWVyeUNvbmZpZ0Jhc2U8UmVzcG9uc2UsIEFyZ3VtZW50cywgU3RvcmUsIERhdGEsIElkPiB7XG4gIC8qKlxuICAgKiBUaGUgZ3JhcGhxbCBxdWVyeSB0byB1c2UgZm9yIHRoZSBxdWVyeS5cbiAgICovXG4gIHF1ZXJ5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBiZSBzZW50IHZpYSBHRVQgb3IgUE9TVC5cbiAgICogLSBgR0VUYDogVGhlIHF1ZXJ5IHdpbGwgYmUgc2VudCB2aWEgcXVlcnkgcGFyYW1ldGVycy5cbiAgICogLSBgUE9TVGA6IFRoZSBxdWVyeSB3aWxsIGJlIHNlbnQgdmlhIHRoZSBib2R5LlxuICAgKiBAZGVmYXVsdCAnUE9TVCdcbiAgICovXG4gIHRyYW5zZmVyVmlhPzogR3FsVHJhbnNmZXJPcHRpb247XG5cbiAgLyoqXG4gICAqIFN1YnJvdXRlIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgcm91dGU/OiBSb3V0ZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCB0eXBlIEFueVJlc3RRdWVyeUNvbmZpZyA9IFJlc3RRdWVyeUNvbmZpZzxhbnksIGFueSwgYW55LCBhbnksIGFueSwgYW55Pjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBBbnlHcWxRdWVyeUNvbmZpZyA9IEdxbFF1ZXJ5Q29uZmlnPGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNvbmZpZ1dpdGhvdXRNZXRob2Q8XG4gIFJvdXRlIGV4dGVuZHMgUm91dGVUeXBlPEFyZ3VtZW50cz4sXG4gIFJlc3BvbnNlLFxuICBBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkLFxuICBTdG9yZSBleHRlbmRzIEVudGl0eVN0b3JlPHVua25vd24+LFxuICBEYXRhLFxuICBJZCxcbj4gPSBPbWl0PFJlc3RRdWVyeUNvbmZpZzxSb3V0ZSwgUmVzcG9uc2UsIEFyZ3VtZW50cywgU3RvcmUsIERhdGEsIElkPiwgJ21ldGhvZCc+O1xuXG5leHBvcnQgdHlwZSBHcWxRdWVyeUNvbmZpZ1dpdGhvdXRNZXRob2Q8XG4gIFJvdXRlIGV4dGVuZHMgUm91dGVUeXBlPEFyZ3VtZW50cz4sXG4gIFJlc3BvbnNlLFxuICBBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkLFxuICBTdG9yZSBleHRlbmRzIEVudGl0eVN0b3JlPHVua25vd24+LFxuICBEYXRhLFxuICBJZCxcbj4gPSBPbWl0PEdxbFF1ZXJ5Q29uZmlnPFJvdXRlLCBSZXNwb25zZSwgQXJndW1lbnRzLCBTdG9yZSwgRGF0YSwgSWQ+LCAnbWV0aG9kJz47XG5cbmV4cG9ydCB0eXBlIEJhc2VBcmd1bWVudHMgPSBXaXRoSGVhZGVycyAmXG4gIFdpdGhWYXJpYWJsZXMgJlxuICBXaXRoQm9keSAmXG4gIFdpdGhRdWVyeVBhcmFtcyAmXG4gIFdpdGhQYXRoUGFyYW1zICZcbiAgV2l0aE1vY2s8dW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aEhlYWRlcnMge1xuICAvKipcbiAgICogVGhlIGhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZSBxdWVyeS5cbiAgICovXG4gIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5TW9ja0NvbmZpZzxNb2NrUmVzcG9uc2U+IHtcbiAgLyoqXG4gICAqIFRoZSBtb2NrIHJlc3BvbnNlIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgcmVzcG9uc2U/OiBNb2NrUmVzcG9uc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2NrIGVycm9yIHRvIHVzZSBmb3IgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgZXJyb3I/OiBSZXF1ZXN0RXJyb3I7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBtb2NrLlxuICAgKiBJZiBwcm9ncmVzcyBpcyBlbmFibGVkLCB0aGUgZGVsYXkgd2lsbCBiZSB1c2VkIGZvciBlYWNoIHByb2dyZXNzIGV2ZW50LlxuICAgKiBAZGVmYXVsdCAyMDBcbiAgICovXG4gIGRlbGF5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlcG9ydCBwcm9ncmVzcyBmb3IgdGhlIG1vY2suXG4gICAqIEZvciB0ZXN0aW5nIGUuZy4gZmlsZSB1cGxvYWRzLlxuICAgKi9cbiAgcHJvZ3Jlc3M/OiB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwcm9ncmVzcyBldmVudHMgdG8gcmVwb3J0LlxuICAgICAqIEBkZWZhdWx0IDVcbiAgICAgKi9cbiAgICBldmVudENvdW50PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcHJvZ3Jlc3MgZXZlbnQgdG8gcmVwb3J0LlxuICAgICAqIEBkZWZhdWx0ICd1cGxvYWQnXG4gICAgICovXG4gICAgZXZlbnRUeXBlPzogJ2Rvd25sb2FkJyB8ICd1cGxvYWQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGZpbGUgdG8gcmVwb3J0IHByb2dyZXNzIGZvciBpbiBieXRlcy5cbiAgICAgKiBAZGVmYXVsdCAxXzAwMF8wMDAgKDFNQilcbiAgICAgKi9cbiAgICBmaWxlU2l6ZT86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBmaWxlIHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSBwcm9ncmVzcyBldmVudC5cbiAgICAgKiBVc2VmdWwgZm9yIHRlc3RpbmcgZS5nLiBkb3dubG9hZCBwcm9ncmVzcyB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3QgcHJvdmlkZSBhIHRvdGFsIHNpemUuXG4gICAgICovXG4gICAgb21pdFRvdGFsPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIElmIHRydWUsIHRoZSBwYXJ0aWFsIHRleHQgd2lsbCBiZSBvbWl0dGVkIGZyb20gdGhlIHByb2dyZXNzIGV2ZW50LlxuICAgICAqIFVzZWZ1bCBmb3IgdGVzdGluZyBlLmcuIGRvd25sb2FkIHByb2dyZXNzIHdoZW4gdGhlIHNlcnZlciBkb2VzIG5vdCBwcm92aWRlIGEgcGFydGlhbCB0ZXh0LlxuICAgICAqL1xuICAgIG9taXRQYXJ0aWFsVGV4dD86IGJvb2xlYW47XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBtb2NrIHRoZSByZXF1ZXN0IGZhaWxpbmcgYW5kIGdldHRpbmcgcmV0cmllZCAzIHRpbWVzLiBBZnRlciwgdGhlIHJlcXVlc3Qgd2lsbCBzdWNjZWVkIHdpdGggdGhlIHByb3ZpZGVkIHJlc3BvbnNlLlxuICAgKiBDYW4gbm90IGJlIHVzZWQgd2l0aCBgcHJvZ3Jlc3NgIGVuYWJsZWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZXRyeUludG9SZXNwb25zZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aE1vY2s8TW9ja1Jlc3BvbnNlPiB7XG4gIG1vY2s/OiBRdWVyeU1vY2tDb25maWc8TW9ja1Jlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgcXVlcnkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBpbnRlcm5hbCBxdWVyeSBzdG9yZS5cbiAgICpcbiAgICogR2VuZXJhbGx5IHRoaXMgc2hvdWxkIGJlIGxlZnQgb24gYGZhbHNlYCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2tpcFF1ZXJ5U3RvcmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FjaGUga2V5IHRvIHVzZSBmb3IgdGhpcyBxdWVyeS5cbiAgICogVXNlZnVsIGZvciBxdWVyaWVzIHRoYXQgYXJlIGVxdWFsIGJ1dCBzaG91bGQgYmUgc3RvcmVkIHNlcGFyYXRlbHkuXG4gICAqIFdpbGwgYmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgaWYgbm90IHByb3ZpZGVkLlxuICAgKlxuICAgKiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgYmUgbGVmdCBvbiBgdW5kZWZpbmVkYCB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLlxuICAgKi9cbiAgcXVlcnlTdG9yZUNhY2hlS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhDb25maWcge1xuICAvKipcbiAgICogQWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZvciB0aGlzIHF1ZXJ5LlxuICAgKi9cbiAgY29uZmlnPzogUXVlcnlDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFZhcmlhYmxlcyB7XG4gIC8qKlxuICAgKiBUaGUgdmFyaWFibGVzIGZvciB0aGUgcXVlcnkuIChncmFwaHFsIG9ubHkpXG4gICAqL1xuICB2YXJpYWJsZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoQm9keSB7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBmb3IgdGhlIHF1ZXJ5LiBVbmF2YWlsYWJsZSBmb3IgR0VULCBIRUFEIGFuZCBPUFRJT05TIHJlcXVlc3RzLlxuICAgKi9cbiAgYm9keT86IHVua25vd247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2l0aFF1ZXJ5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnkuIChhZnRlciB0aGUgPyBpbiB0aGUgdXJsKVxuICAgKi9cbiAgcXVlcnlQYXJhbXM/OiBRdWVyeVBhcmFtcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXaXRoUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcGF0aCBwYXJhbWV0ZXJzIGZvciB0aGUgcXVlcnkuIChpbiBmcm9udCBvZiB0aGUgPyBpbiB0aGUgdXJsKVxuICAgKi9cbiAgcGF0aFBhcmFtcz86IFBhdGhQYXJhbXM7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5VHJpZ2dlciA9ICdwcm9ncmFtJyB8ICdwb2xsJyB8ICdhdXRvJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZVxuZXhwb3J0IHR5cGUgRW1wdHlPYmplY3QgPSB7fTtcblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUXVlcnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2tpcCB0aGUgY2FjaGUgZm9yIHRoaXMgcXVlcnkuIFRoaXMgd2lsbCBmb3JjZSB0aGUgcXVlcnkgdG8gYmUgZXhlY3V0ZWQuIEl0IG1pZ2h0IHN0aWxsIGJlIGNhdWdodCBieSB0aGUgbmF0aXZlIGJyb3dzZXIgY2FjaGUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBza2lwQ2FjaGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNhbmNlbCB0aGUgcHJldmlvdXMgcmVxdWVzdCBpZiBpdCBpcyBzdGlsbCBsb2FkaW5nLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgY2FuY2VsUHJldmlvdXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJpZ2dlciB0eXBlIGZvciB0aGlzIHF1ZXJ5LlxuICAgKiAtIGBwcm9ncmFtYDogVGhlIHF1ZXJ5IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHVzZXIuXG4gICAqIC0gYHBvbGxgOiBUaGUgcXVlcnkgd2FzIHRyaWdnZXJlZCBieSBwb2xsaW5nLlxuICAgKiAtIGBhdXRvYDogVGhlIHF1ZXJ5IHdhcyB0cmlnZ2VyZWQgYnkgYW4gYXV0byByZWZyZXNoIGV2ZW50LlxuICAgKiBAZGVmYXVsdCAncHJvZ3JhbSdcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdHJpZ2dlcmVkVmlhPzogUXVlcnlUcmlnZ2VyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSByZXRyeSBvZiBhbiB1bmF1dGhvcml6ZWQgcmVxdWVzdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfaXNVbmF1dGhvcml6ZWRSZXRyeT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJvdXRlVHlwZTxBcmd1bWVudHMgZXh0ZW5kcyBCYXNlQXJndW1lbnRzIHwgdW5kZWZpbmVkPiA9IEFyZ3VtZW50cyBleHRlbmRzIHtcbiAgcGF0aFBhcmFtczogaW5mZXIgUGF0aFBhcmFtcztcbn1cbiAgPyAocDogUGF0aFBhcmFtcykgPT4gUm91dGVTdHJpbmdcbiAgOiBSb3V0ZVN0cmluZztcblxuZXhwb3J0IHR5cGUgUm91dGVTdHJpbmcgPSBgLyR7c3RyaW5nfWA7XG5cbmV4cG9ydCB0eXBlIEFueVJvdXRlID0gKChwOiBQYXRoUGFyYW1zKSA9PiBzdHJpbmcpIHwgUm91dGVTdHJpbmc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9sbENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIHBvbGwgdGhlIHF1ZXJ5LlxuICAgKi9cbiAgaW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKipcbiAgICogQSBvYnNlcnZhYmxlIHRoYXQgd2lsbCBzdG9wIHRoZSBwb2xsaW5nIHdoZW4gaXQgZW1pdHMuXG4gICAqL1xuICB0YWtlVW50aWw6IE9ic2VydmFibGU8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdHJpZ2dlciB0aGUgcXVlcnkgaW1tZWRpYXRlbHkgYWZ0ZXIgcG9sbGluZyBzdGFydHMuXG4gICAqL1xuICB0cmlnZ2VySW1tZWRpYXRlbHk/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBRdWVyeVN0YXRlVHlwZSB7XG4gIFByZXBhcmVkID0gJ1BSRVBBUkVEJyxcbiAgTG9hZGluZyA9ICdMT0FESU5HJyxcbiAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgRmFpbHVyZSA9ICdGQUlMVVJFJyxcbiAgQ2FuY2VsbGVkID0gJ0NBTkNFTExFRCcsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJlcGFyZWQge1xuICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5QcmVwYXJlZDtcbiAgbWV0YTogUXVlcnlTdGF0ZU1ldGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VjY2VzczxSZXNwb25zZSA9IHVua25vd24+IHtcbiAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuU3VjY2VzcztcbiAgcmVzcG9uc2U6IFJlc3BvbnNlO1xuICBoZWFkZXJzOiBSZXF1ZXN0SGVhZGVycztcbiAgbWV0YTogUXVlcnlTdGF0ZVN1Y2Nlc3NNZXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWx1cmUge1xuICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5GYWlsdXJlO1xuICBlcnJvcjogUmVxdWVzdEVycm9yO1xuICBtZXRhOiBRdWVyeVN0YXRlTWV0YTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2FkaW5nIHtcbiAgdHlwZTogUXVlcnlTdGF0ZVR5cGUuTG9hZGluZztcbiAgbWV0YTogUXVlcnlTdGF0ZU1ldGE7XG4gIHBhcnRpYWxUZXh0Pzogc3RyaW5nO1xuICBwcm9ncmVzcz86IFJlcXVlc3RQcm9ncmVzcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYW5jZWxsZWQge1xuICB0eXBlOiBRdWVyeVN0YXRlVHlwZS5DYW5jZWxsZWQ7XG4gIG1ldGE6IFF1ZXJ5U3RhdGVNZXRhO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5U3RhdGVNZXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdHJpZ2dlcmVkVmlhOiBRdWVyeVRyaWdnZXI7XG4gIGlzV2FpdGluZ0ZvclJldHJ5PzogYm9vbGVhbjtcbiAgcmV0cnlOdW1iZXI/OiBudW1iZXI7XG4gIHJldHJ5RGVsYXk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlTdGF0ZVN1Y2Nlc3NNZXRhIGV4dGVuZHMgUXVlcnlTdGF0ZU1ldGEge1xuICBleHBpcmVzQXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5U3RhdGU8UmVzcG9uc2UgPSB1bmtub3duPiA9IExvYWRpbmcgfCBTdWNjZXNzPFJlc3BvbnNlPiB8IEZhaWx1cmUgfCBDYW5jZWxsZWQgfCBQcmVwYXJlZDtcblxuZXhwb3J0IHR5cGUgUXVlcnlTdGF0ZVJlc3BvbnNlT2Y8VCBleHRlbmRzIFF1ZXJ5U3RhdGUgPSBRdWVyeVN0YXRlPiA9XG4gIFQgZXh0ZW5kcyBTdWNjZXNzPGluZmVyIFJlc3BvbnNlPiA/IFJlc3BvbnNlIDogbmV2ZXI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgdHlwZSBBbnlRdWVyeSA9IFF1ZXJ5PGFueSwgYW55LCBhbnksIGFueSwgYW55LCBhbnk+O1xuXG5leHBvcnQgdHlwZSBBbnlRdWVyeUNyZWF0b3JDb2xsZWN0aW9uID0geyBbbmFtZTogc3RyaW5nXTogQW55UXVlcnlDcmVhdG9yIH07XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29sbGVjdGlvbk9mPFQgZXh0ZW5kcyB7IFtuYW1lOiBzdHJpbmddOiBBbnlRdWVyeUNyZWF0b3IgfT4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiB7IHR5cGU6IEs7IHF1ZXJ5OiBDb25zdHJ1Y3RRdWVyeTxUW0tdPiB9O1xufVtrZXlvZiBUXTtcblxuZXhwb3J0IHR5cGUgQW55UXVlcnlDb2xsZWN0aW9uID0gUXVlcnlDb2xsZWN0aW9uT2Y8QW55UXVlcnlDcmVhdG9yQ29sbGVjdGlvbj47XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5T2Y8VCBleHRlbmRzIEFueVF1ZXJ5Q29sbGVjdGlvbiB8IEFueVF1ZXJ5IHwgbnVsbD4gPSBUIGV4dGVuZHMgQW55UXVlcnlcbiAgPyBUXG4gIDogVCBleHRlbmRzIEFueVF1ZXJ5Q29sbGVjdGlvblxuICAgID8gVFsncXVlcnknXVxuICAgIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIEFueVF1ZXJ5Q29sbGVjdGlvblJlc3BvbnNlPFQgZXh0ZW5kcyBBbnlRdWVyeUNvbGxlY3Rpb24+ID0gUXVlcnlSZXNwb25zZU9mPFRbJ3F1ZXJ5J10+O1xuZXhwb3J0IHR5cGUgQW55UXVlcnlDb2xsZWN0aW9uRGF0YTxUIGV4dGVuZHMgQW55UXVlcnlDb2xsZWN0aW9uPiA9IFF1ZXJ5RGF0YU9mPFRbJ3F1ZXJ5J10+O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNvbGxlY3Rpb25LZXlzT2Y8VCBleHRlbmRzIEFueVF1ZXJ5Q29sbGVjdGlvbiB8IEFueVF1ZXJ5IHwgbnVsbD4gPSBUIGV4dGVuZHMgQW55UXVlcnlDb2xsZWN0aW9uXG4gID8gVFsndHlwZSddXG4gIDogbmV2ZXI7XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5Q29sbGVjdGlvbldpdGhOdWxsYWJsZVF1ZXJ5PFQgZXh0ZW5kcyBBbnlRdWVyeUNvbGxlY3Rpb24gfCBudWxsPiA9IFQgZXh0ZW5kcyBudWxsXG4gID8gbmV2ZXJcbiAgOiB7XG4gICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIHN0cmluZyA/IFRbS10gOiBUW0tdIHwgbnVsbDtcbiAgICB9O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBSZXNldFBhZ2VPbkVycm9yT3BlcmF0b3JDb25maWc8SiBleHRlbmRzIFF1ZXJ5Rm9ybTxhbnk+PiB7XG4gIC8qKlxuICAgKiBUaGUgcXVlcnkgZm9ybSB0byByZXNldCB0aGUgcGFnZSBvZi5cbiAgICovXG4gIHF1ZXJ5Rm9ybTogSjtcblxuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgcGFnZSBjb250cm9sIGluIHRoZSBxdWVyeSBmb3JtLlxuICAgKiBAZGVmYXVsdCAncGFnZSdcbiAgICovXG4gIHBhZ2VDb250cm9sS2V5Pzogc3RyaW5nO1xufVxuIl19