@vcd/sdk 15.0.3 → 15.0.5
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/VMware-vcd_ui_sdk-15.0.4-ODP.tar.gz +0 -0
- package/client/client/index.d.ts +1 -0
- package/client/client/types.d.ts +9 -0
- package/client/client/vcd.api.client.d.ts +1 -1
- package/client/client/vcd.http.client.d.ts +6 -4
- package/common/container-hooks.d.ts +16 -0
- package/core/plugin.module.d.ts +6 -0
- package/esm2020/client/client/index.mjs +2 -1
- package/esm2020/client/client/types.mjs +13 -0
- package/esm2020/client/client/vcd.api.client.mjs +12 -12
- package/esm2020/client/client/vcd.http.client.mjs +16 -7
- package/esm2020/common/container-hooks.mjs +12 -1
- package/esm2020/core/plugin.module.mjs +6 -1
- package/esm2020/main.mjs +2 -2
- package/fesm2015/vcd-sdk.mjs +158 -120
- package/fesm2015/vcd-sdk.mjs.map +1 -1
- package/fesm2020/vcd-sdk.mjs +156 -120
- package/fesm2020/vcd-sdk.mjs.map +1 -1
- package/main.d.ts +1 -1
- package/{open_source_license_vcd_ui_sdk_15.0.3.txt → open_source_license_@vcdsdk_15.0.4_GA.txt} +33 -28
- package/package.json +1 -1
- package/VMware-vcd_ui_sdk-15.0.3-ODP.tar.gz +0 -0
|
Binary file
|
package/client/client/index.d.ts
CHANGED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class ClientError extends Error {
|
|
2
|
+
message: string;
|
|
3
|
+
type: ClientErrorType;
|
|
4
|
+
constructor(message: string, type: ClientErrorType);
|
|
5
|
+
}
|
|
6
|
+
export declare enum ClientErrorType {
|
|
7
|
+
HateoasLinkMissing = "HateoasLinkMissing",
|
|
8
|
+
TaskLinkMissing = "TaskLinkMissing"
|
|
9
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injector } from '@angular/core';
|
|
2
2
|
import { HttpHeaders } from '@angular/common/http';
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
|
-
import {
|
|
4
|
+
import { AuthorizedLocationType, EntityReferenceType, LinkType, ResourceType, SessionType, TaskType } from '@vcd/bindings/vcloud/api/rest/schema_v1_5';
|
|
5
5
|
import { AccessibleLocation, Session } from '../openapi';
|
|
6
6
|
import { Query } from '../query/index';
|
|
7
7
|
import { VcdHttpClient } from './vcd.http.client';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HttpBackend, HttpClient } from '@angular/common/http';
|
|
1
|
+
import { HttpBackend, HttpClient, HttpInterceptor } from '@angular/common/http';
|
|
2
2
|
import { LoggingInterceptor } from './logging.interceptor';
|
|
3
3
|
import { RequestHeadersInterceptor } from './request.headers.interceptor';
|
|
4
4
|
import { ResponseNormalizationInterceptor } from './response.normalization.interceptor';
|
|
@@ -11,6 +11,7 @@ import * as i0 from "@angular/core";
|
|
|
11
11
|
* @see HttpClient
|
|
12
12
|
*/
|
|
13
13
|
export declare class VcdHttpClient extends HttpClient {
|
|
14
|
+
private customInterceptors;
|
|
14
15
|
/**
|
|
15
16
|
* Provide access to the logging interceptor for enabling/disabling and configuring.
|
|
16
17
|
*/
|
|
@@ -22,11 +23,12 @@ export declare class VcdHttpClient extends HttpClient {
|
|
|
22
23
|
/**
|
|
23
24
|
* Create an HttpClient with the logging and header interceptors in the chain.
|
|
24
25
|
* @param httpBackend backend (likely injected from HttpClientModule)
|
|
25
|
-
* @param hateoasHeaderInterceptor the hateoas header interceptor
|
|
26
26
|
* @param loggingInterceptor the logging interceptor
|
|
27
27
|
* @param requestHeadersInterceptor the request header interceptor
|
|
28
|
+
* @param responseNormalizationInterceptor
|
|
29
|
+
* @param customInterceptors
|
|
28
30
|
*/
|
|
29
|
-
constructor(httpBackend: HttpBackend, loggingInterceptor: LoggingInterceptor, requestHeadersInterceptor: RequestHeadersInterceptor, responseNormalizationInterceptor: ResponseNormalizationInterceptor);
|
|
30
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<VcdHttpClient,
|
|
31
|
+
constructor(httpBackend: HttpBackend, loggingInterceptor: LoggingInterceptor, requestHeadersInterceptor: RequestHeadersInterceptor, responseNormalizationInterceptor: ResponseNormalizationInterceptor, customInterceptors: HttpInterceptor[]);
|
|
32
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<VcdHttpClient, [null, null, null, null, { optional: true; }]>;
|
|
31
33
|
static ɵprov: i0.ɵɵInjectableDeclaration<VcdHttpClient>;
|
|
32
34
|
}
|
|
@@ -163,3 +163,19 @@ export declare abstract class _WizardExtensionWithValidationComponent<P, R, E> e
|
|
|
163
163
|
abstract getState(): Observable<WizardExtensionState>;
|
|
164
164
|
}
|
|
165
165
|
export declare const WizardExtensionWithValidationComponent: typeof _WizardExtensionWithValidationComponent;
|
|
166
|
+
/**
|
|
167
|
+
* Every component-based Extension Point that is renderd in Cloud Director UI Entity Details
|
|
168
|
+
* must extend that class to obtain context about the Entity.
|
|
169
|
+
*
|
|
170
|
+
* See comments of the methods of the abstract class for more information.
|
|
171
|
+
*/
|
|
172
|
+
export declare abstract class _WizardExtensionWithContextComponent<P, R, E> extends _WizardExtensionComponent<P, R, E> {
|
|
173
|
+
/**
|
|
174
|
+
* Define method which will be executed on init and information
|
|
175
|
+
* about context object will be passed to the Extension Point.
|
|
176
|
+
*
|
|
177
|
+
* @param context reference to the context object.
|
|
178
|
+
*/
|
|
179
|
+
abstract onContext(context: string): void;
|
|
180
|
+
}
|
|
181
|
+
export declare const WizardExtensionWithContextComponent: typeof _WizardExtensionWithContextComponent;
|
package/core/plugin.module.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Store } from '@ngrx/store';
|
|
2
2
|
import { ExtensionNavRegistration } from '../common';
|
|
3
|
+
import { InjectionToken } from "@angular/core";
|
|
4
|
+
import { HttpInterceptor } from "@angular/common/http";
|
|
3
5
|
export declare class PluginModule {
|
|
4
6
|
private appStore;
|
|
5
7
|
constructor(appStore: Store<any>);
|
|
@@ -14,3 +16,7 @@ export declare class PluginModule {
|
|
|
14
16
|
export declare class VcdSdkConfig {
|
|
15
17
|
apiVersion: string;
|
|
16
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Use this token for injecting custom HttpInterceptor implementations inside the HttpClient
|
|
21
|
+
*/
|
|
22
|
+
export declare const VCD_HTTP_INTERCEPTORS: InjectionToken<HttpInterceptor[]>;
|
|
@@ -5,4 +5,5 @@ export * from './vcd.transfer.client';
|
|
|
5
5
|
export * from './request.headers.interceptor';
|
|
6
6
|
export * from './logging.interceptor';
|
|
7
7
|
export * from './response.normalization.interceptor';
|
|
8
|
-
|
|
8
|
+
export * from './types';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwaS5yZXN1bHQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5odHRwLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5hcGkuY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vdmNkLnRyYW5zZmVyLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QuaGVhZGVycy5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dpbmcuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNwb25zZS5ub3JtYWxpemF0aW9uLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export class ClientError extends Error {
|
|
2
|
+
constructor(message, type) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.message = message;
|
|
5
|
+
this.type = type;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export var ClientErrorType;
|
|
9
|
+
(function (ClientErrorType) {
|
|
10
|
+
ClientErrorType["HateoasLinkMissing"] = "HateoasLinkMissing";
|
|
11
|
+
ClientErrorType["TaskLinkMissing"] = "TaskLinkMissing";
|
|
12
|
+
})(ClientErrorType || (ClientErrorType = {}));
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFZLFNBQVEsS0FBSztJQUNwQyxZQUNrQixPQUFlLEVBQ3hCLElBQXFCO1FBQzVCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUZDLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDeEIsU0FBSSxHQUFKLElBQUksQ0FBaUI7SUFFOUIsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFOLElBQVksZUFHWDtBQUhELFdBQVksZUFBZTtJQUN6Qiw0REFBeUMsQ0FBQTtJQUN6QyxzREFBbUMsQ0FBQTtBQUNyQyxDQUFDLEVBSFcsZUFBZSxLQUFmLGVBQWUsUUFHMUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ2xpZW50RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBvdmVycmlkZSBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHR5cGU6IENsaWVudEVycm9yVHlwZSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBlbnVtIENsaWVudEVycm9yVHlwZXtcbiAgSGF0ZW9hc0xpbmtNaXNzaW5nID0gXCJIYXRlb2FzTGlua01pc3NpbmdcIixcbiAgVGFza0xpbmtNaXNzaW5nID0gXCJUYXNrTGlua01pc3NpbmdcIixcbn1cbiJdfQ==
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Injectable, Optional } from '@angular/core';
|
|
2
2
|
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { BehaviorSubject,
|
|
4
|
-
import { catchError,
|
|
3
|
+
import { BehaviorSubject, merge, of, ReplaySubject, throwError } from 'rxjs';
|
|
4
|
+
import { catchError, concatMap, filter, map, share, skipWhile, switchMap, tap, withLatestFrom } from 'rxjs/operators';
|
|
5
5
|
import { TaskType } from '@vcd/bindings/vcloud/api/rest/schema_v1_5';
|
|
6
|
-
import { AuthTokenHolderService,
|
|
6
|
+
import { API_ROOT_URL, AuthTokenHolderService, SESSION_ORG_ID, SESSION_SCOPE } from '../container-hooks';
|
|
7
7
|
import { VcdTransferClient } from './vcd.transfer.client';
|
|
8
8
|
import { HTTP_HEADERS } from './constants';
|
|
9
|
-
import {
|
|
9
|
+
import { ClientError, ClientErrorType } from "./types";
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "./vcd.http.client";
|
|
12
12
|
import * as i2 from "../../core/plugin.module";
|
|
@@ -396,7 +396,7 @@ export class VcdApiClient {
|
|
|
396
396
|
const link = [...headerLinks, ...links]
|
|
397
397
|
.find((l) => l.rel === transferRel);
|
|
398
398
|
if (!link) {
|
|
399
|
-
throw new
|
|
399
|
+
throw new ClientError(`Response from ${endpoint} did not contain a transfer link`, ClientErrorType.HateoasLinkMissing);
|
|
400
400
|
}
|
|
401
401
|
return link.href;
|
|
402
402
|
}));
|
|
@@ -425,7 +425,7 @@ export class VcdApiClient {
|
|
|
425
425
|
const task = Object.assign(new TaskType(), response.body);
|
|
426
426
|
return of(task);
|
|
427
427
|
}
|
|
428
|
-
return throwError(() => new
|
|
428
|
+
return throwError(() => new ClientError(`An asynchronous request was made to [${httpVerb} ${response.url}], but no task was returned. The operation may still have been successful.`, ClientErrorType.TaskLinkMissing));
|
|
429
429
|
}
|
|
430
430
|
getEntity(entityRefOrUrn) {
|
|
431
431
|
const entityResolver = typeof entityRefOrUrn === 'string' ?
|
|
@@ -442,7 +442,7 @@ export class VcdApiClient {
|
|
|
442
442
|
removeItem(item, options) {
|
|
443
443
|
const link = this.findLink(item, 'remove', null);
|
|
444
444
|
if (!link) {
|
|
445
|
-
return throwError(() => new
|
|
445
|
+
return throwError(() => new ClientError(`No 'remove' link for specified resource.`, ClientErrorType.HateoasLinkMissing));
|
|
446
446
|
}
|
|
447
447
|
return this.validateRequestContext().pipe(concatMap(() => this.http.delete(link.href, { ...options })));
|
|
448
448
|
}
|
|
@@ -452,7 +452,7 @@ export class VcdApiClient {
|
|
|
452
452
|
firstPage(result, multisite, options) {
|
|
453
453
|
const link = this.findLink(result, 'firstPage', result.type);
|
|
454
454
|
if (!link) {
|
|
455
|
-
return throwError(() => new
|
|
455
|
+
return throwError(() => new ClientError(`No 'firstPage' link for specified query.`, ClientErrorType.HateoasLinkMissing));
|
|
456
456
|
}
|
|
457
457
|
return this.getQueryPage(link.href, multisite, options);
|
|
458
458
|
}
|
|
@@ -462,7 +462,7 @@ export class VcdApiClient {
|
|
|
462
462
|
previousPage(result, multisite, options) {
|
|
463
463
|
const link = this.findLink(result, 'previousPage', result.type);
|
|
464
464
|
if (!link) {
|
|
465
|
-
return throwError(() => new
|
|
465
|
+
return throwError(() => new ClientError(`No 'previousPage' link for specified query.`, ClientErrorType.HateoasLinkMissing));
|
|
466
466
|
}
|
|
467
467
|
return this.getQueryPage(link.href, multisite, options);
|
|
468
468
|
}
|
|
@@ -472,7 +472,7 @@ export class VcdApiClient {
|
|
|
472
472
|
nextPage(result, multisite, options) {
|
|
473
473
|
const link = this.findLink(result, 'nextPage', result.type);
|
|
474
474
|
if (!link) {
|
|
475
|
-
return throwError(() => new
|
|
475
|
+
return throwError(() => new ClientError(`No 'nextPage' link for specified query.`, ClientErrorType.HateoasLinkMissing));
|
|
476
476
|
}
|
|
477
477
|
return this.getQueryPage(link.href, multisite, options);
|
|
478
478
|
}
|
|
@@ -482,7 +482,7 @@ export class VcdApiClient {
|
|
|
482
482
|
lastPage(result, multisite, options) {
|
|
483
483
|
const link = this.findLink(result, 'lastPage', result.type);
|
|
484
484
|
if (!link) {
|
|
485
|
-
return throwError(() => new
|
|
485
|
+
return throwError(() => new ClientError(`No 'lastPage' link for specified query.`, ClientErrorType.HateoasLinkMissing));
|
|
486
486
|
}
|
|
487
487
|
return this.getQueryPage(link.href, multisite, options);
|
|
488
488
|
}
|
|
@@ -599,4 +599,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.0", ngImpor
|
|
|
599
599
|
}], ctorParameters: function () { return [{ type: i1.VcdHttpClient }, { type: i0.Injector }, { type: i2.VcdSdkConfig, decorators: [{
|
|
600
600
|
type: Optional
|
|
601
601
|
}] }]; } });
|
|
602
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmNkLmFwaS5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3ZjZC5hcGkuY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFjLGVBQWUsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RyxPQUFPLEVBS0gsUUFBUSxFQUNYLE1BQU0sMkNBQTJDLENBQUM7QUFJbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFekcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFHeEMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7QUFHbEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUVyQywrQkFBK0I7QUFFL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxNQUFjO0lBQ2xELE1BQU0sT0FBTyxHQUFlLEVBQUUsQ0FBQztJQUUvQixJQUFJLENBQUMsTUFBTSxF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QUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3BGLENBQUM7O3lHQS94QlEsWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQXlERSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgQmVoYXZpb3JTdWJqZWN0LCBvZiwgdGhyb3dFcnJvciwgbWVyZ2UsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCwgbWFwLCBjb25jYXRNYXAsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB3aXRoTGF0ZXN0RnJvbSwgc2hhcmUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTZXNzaW9uVHlwZSxcbiAgICBBdXRob3JpemVkTG9jYXRpb25UeXBlLFxuICAgIFJlc291cmNlVHlwZSwgTGlua1R5cGUsXG4gICAgRW50aXR5UmVmZXJlbmNlVHlwZSxcbiAgICBFbnRpdHlUeXBlLFxuICAgIFRhc2tUeXBlXG59IGZyb20gJ0B2Y2QvYmluZGluZ3MvdmNsb3VkL2FwaS9yZXN0L3NjaGVtYV92MV81JztcbmltcG9ydCB7IFN1cHBvcnRlZFZlcnNpb25zVHlwZSB9IGZyb20gJ0B2Y2QvYmluZGluZ3MvdmNsb3VkL2FwaS9yZXN0L3NjaGVtYS92ZXJzaW9uaW5nJztcbmltcG9ydCB7IEFjY2Vzc2libGVMb2NhdGlvbiwgQWNjZXNzaWJsZUxvY2F0aW9ucywgU2Vzc2lvbiB9IGZyb20gJy4uL29wZW5hcGknO1xuaW1wb3J0IHsgUXVlcnkgfSBmcm9tICcuLi9xdWVyeS9pbmRleCc7XG5pbXBvcnQgeyBBdXRoVG9rZW5Ib2xkZXJTZXJ2aWNlLCBBUElfUk9PVF9VUkwsIFNFU1NJT05fU0NPUEUsIFNFU1NJT05fT1JHX0lEIH0gZnJvbSAnLi4vY29udGFpbmVyLWhvb2tzJztcbmltcG9ydCB7IFZjZEh0dHBDbGllbnQgfSBmcm9tICcuL3ZjZC5odHRwLmNsaWVudCc7XG5pbXBvcnQgeyBWY2RUcmFuc2ZlckNsaWVudCB9IGZyb20gJy4vdmNkLnRyYW5zZmVyLmNsaWVudCc7XG5pbXBvcnQgeyBIVFRQX0hFQURFUlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBWY2RTZGtDb25maWcgfSBmcm9tIFwiLi4vLi4vY29yZS9wbHVnaW4ubW9kdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0ZFUl9MSU5LX1JFTCA9ICd1cGxvYWQ6ZGVmYXVsdCc7XG5leHBvcnQgdHlwZSBOYXZpZ2FibGUgPSBSZXNvdXJjZVR5cGUgfCB7IGxpbms/OiBMaW5rVHlwZVtdIH07XG5cbmV4cG9ydCBjb25zdCBIQVRFT0FTX0hFQURFUiA9ICdMaW5rJztcblxuLy8gdHNsaW50OmRpc2FibGU6dmFyaWFibGUtbmFtZVxuXG4vKipcbiAqIFBhcnNlIG91dCBMaW5rIGhlYWRlcnMgdXNpbmcgYSB2ZXJ5IGxhemlseSBpbXBsZW1lbnRlZCBwdWxsIHBhcnNlclxuICogQHBhcmFtIGhlYWRlciAnPHVybDE+O25hbWUxPVwidmFsdWUxXCIsbmFtZTI9XCJ2YWx1ZTJcIiw8dXJsMj47bmFtZTM9XCJ2YWx1ZTMsdmFsdWU0XCInXG4gKiBAcmV0dXJucyBwYXJzZWQgbGluayBoZWFkZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUhlYWRlckhhdGVvYXNMaW5rcyhoZWFkZXI6IHN0cmluZyk6IExpbmtUeXBlW10ge1xuICAgIGNvbnN0IHJlc3VsdHM6IExpbmtUeXBlW10gPSBbXTtcblxuICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlckZpZWxkTWFwcGluZ3M6IHtba2V5OiBzdHJpbmddOiBrZXlvZiBMaW5rVHlwZX0gPSB7XG4gICAgICAgIGhyZWY6ICdocmVmJyxcbiAgICAgICAgbW9kZWw6ICd0eXBlJyxcbiAgICAgICAgdGl0bGU6ICdpZCcsXG4gICAgICAgIHJlbDogJ3JlbCdcbiAgICB9O1xuICAgIGxldCB0b2tlbkluZGV4ID0gLTE7XG5cbiAgICBmdW5jdGlvbiBwZWVrKHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlci5pbmRleE9mKHRva2VuLCB0b2tlbkluZGV4ICsgMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbmV4dCh0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IHBlZWsodG9rZW4pO1xuICAgICAgICBpZiAobmV4dEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHtoZWFkZXIsIHRva2VuLCB0b2tlbkluZGV4fSkpO1xuICAgICAgICB9XG4gICAgICAgIHRva2VuSW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIHJldHVybiB0b2tlbkluZGV4O1xuICAgIH1cblxuICAgIHdoaWxlIChwZWVrKCc8JykgPiAtMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgaHJlZlN0YXJ0ID0gbmV4dCgnPCcpO1xuICAgICAgICAgICAgY29uc3QgaHJlZkVuZCA9IG5leHQoJz4nKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBoZWFkZXIuc3Vic3RyaW5nKGhyZWZTdGFydCArIDEsIGhyZWZFbmQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMaW5rVHlwZSA9IHtocmVmLCB0eXBlOiBudWxsLCBpZDogbnVsbCwgcmVsOiBudWxsLCB2Q2xvdWRFeHRlbnNpb246IFtdfTtcbiAgICAgICAgICAgIGxldCBjb21tYSA9IHBlZWsoJywnKTtcbiAgICAgICAgICAgIGxldCBzZW1pY29sb24gPSBwZWVrKCc7Jyk7XG4gICAgICAgICAgICB3aGlsZSAoKHNlbWljb2xvbiA+IC0xICYmIGNvbW1hID4gLTEgJiYgc2VtaWNvbG9uIDwgY29tbWEpIHx8IChzZW1pY29sb24gPiAtMSAmJiBjb21tYSA9PT0gLTEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVN0YXJ0ID0gbmV4dCgnOycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVFbmQgPSBuZXh0KCc9Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGhlYWRlci5zdWJzdHJpbmcobmFtZVN0YXJ0ICsgMSwgbmFtZUVuZCkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVTdGFydCA9IG5leHQoJ1wiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVFbmQgPSBuZXh0KCdcIicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaGVhZGVyLnN1YnN0cmluZyh2YWx1ZVN0YXJ0ICsgMSwgdmFsdWVFbmQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZE5hbWUgPSBoZWFkZXJGaWVsZE1hcHBpbmdzW25hbWVdO1xuICAgICAgICAgICAgICAgIGlmIChtYXBwZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W21hcHBlZE5hbWVdID0gZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbW1hID0gcGVlaygnLCcpO1xuICAgICAgICAgICAgICAgIHNlbWljb2xvbiA9IHBlZWsoJzsnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikgeyAgLy8gV2Ugd2lsbCB0cnkgdGhlIG5leHQgb25lLi4uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGVudW0gTGlua1JlbFR5cGUge1xuICAgIGFkZCA9ICdhZGQnLFxuICAgIHJlbW92ZSA9ICdyZW1vdmUnLFxuICAgIGVkaXQgPSAnZWRpdCcsXG59XG5cbi8qKlxuICogQSBiYXNpYyBjbGllbnQgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUElzLlxuICpcbiAqIEEgVk13YXJlIENsb3VkIERpcmVjdG9yIHBsdWdpbiBjYW4gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoaXMgY2xpZW50IGJ5IHVzaW5nIGFuZ3VsYXIgaW5qZWN0aW9uLlxuICogYGBgXG4gKiAgICAgY29uc3RydWN0b3IocHJpdmF0ZSB2Y2RBcGk6IFZjZEFwaUNsaWVudCkge31cbiAqIGBgYFxuICpcbiAqIFZjZEFwaUNsaWVudCByZXVzZXMgdGhlIGF1dGhlbnRpY2F0aW9uIGZyb20gdGhlIFZDRCBwbGF0Zm9ybSBzbyBpbiBnZW5lcmFsIHRoZXJlIGlzXG4gKiBubyBuZWVkIG9mIGFuIGV4cGxpY2l0IGF1dGhlbnRpY2F0aW9uL2xvZ2luLlxuICpcbiAqIFdoZW4gZGVhbGluZyB3aXRoIHRoZSBzZXNzaW9uIG1hbmFnZW1lbnQgdGhlcmUgYXJlIHR3byBBUElzOlxuICogMS4gRGVwcmVjYXRlZCBsZWdhY3kgQVBJIHRoYXQgaXMgdXNpbmcgdGhlIGBhcGkvc2Vzc2lvbmAgZW5kcG9pbnQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsc1xuICogMi4gTmV3bHkgYWRkZWQgQVBJIHRoYXQgaXMgdXNpbmcgdGhlIGBjbG91ZGFwaWAgZW5kcG9pbnQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsc1xuICpcbiAqIE5vdGUgdGhhdCBpZiBhIHBsdWdpbiBwZXJmb3JtcyBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aGVudGljYXRpb24gY2FsbCB0aHJvdWdoXG4gKiB7QGxpbmsgVmNkQXBpQ2xpZW50I3NldENsb3VkQXBpQXV0aGVudGljYXRpb259IG9yIHtAbGluayBWY2RBcGlDbGllbnQjY2xvdWRBcGlMb2dpbn1cbiAqIGZyb20gdGhhdCBtb21lbnQgb24gdGhlIFZjZEFwaUNsaWVudCB1c2VzIG9ubHkgY2xvdWQgYXBpIHNlc3Npb24gbWFuYWdlbWVudC5cbiAqIFRoaXMgbWVhbnMgY2FsbHMgdG8ge0BsaW5rIFZjZEFwaUNsaWVudCNzZXRBdXRoZW50aWNhdGlvbn0gb3Ige0BsaW5rIFZjZEFwaUNsaWVudCNsb2dpbn0gaGF2ZSBubyBlZmZlY3QuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBWY2RBcGlDbGllbnQge1xuICAgIHNldCBiYXNlVXJsKF9iYXNlVXJsOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IF9iYXNlVXJsO1xuICAgIH1cblxuICAgIGdldCB2ZXJzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci52ZXJzaW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgX25lZ290aWF0ZVZlcnNpb246IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFZjZEFwaUNsaWVudCNfY2xvdWRBcGlTZXNzaW9ufVxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nlc3Npb246IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uVHlwZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25UeXBlPihudWxsKTtcbiAgICBwcml2YXRlIF9zZXNzaW9uT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxTZXNzaW9uVHlwZT4gPSB0aGlzLl9zZXNzaW9uLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcFdoaWxlKHNlc3Npb24gPT4gIXNlc3Npb24pXG4gICAgICAgICk7XG4gICAgcHJpdmF0ZSBfZ2V0U2Vzc2lvbjogT2JzZXJ2YWJsZTxTZXNzaW9uVHlwZT47XG5cbiAgICAvKipcbiAgICAgKiBDbG91ZEFwaSBTZXNzaW9uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlTZXNzaW9uOiBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb24+KG51bGwpO1xuICAgIHByaXZhdGUgX2Nsb3VkQXBpU2Vzc2lvbk9ic2VydmFibGU6IE9ic2VydmFibGU8U2Vzc2lvbj4gPSB0aGlzLl9jbG91ZEFwaVNlc3Npb24uYXNPYnNlcnZhYmxlKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBza2lwV2hpbGUoc2Vzc2lvbiA9PiAhc2Vzc2lvbilcbiAgICAgICAgKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIG9ic2VydmFibGUgaGFzIGEgc3BlY2lhbCBwdXJwb3NlIHdoZW4gZG9pbmcgYXV0b21hdGljIGxvZ2luIGR1cmluZyB0aGUgY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24uXG4gICAgICogSXQgYWxsb3dzIGJhY2tlbmQgY2FsbCBvbmx5IGFmdGVyIGFuIEFQSSB2ZXJzaW9uIGlzIHNldC5cbiAgICAgKiBJdCBhbHNvIGVuc3VyZXMgdGhhdCBhIGJhY2tlbmQgY2FsbCB0byBnZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBkb25lIG9uY2UgcHJpb3IgdG8gYW55IG90aGVyIGNhbGxzLlxuICAgICAqXG4gICAgICogSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0IHRoZXJlIGlzIG5vIG5lZWQgb2YgdGhpcyBvYnNlcnZhYmxlXG4gICAgICogc2luY2UgdGhpcyBhdXRoIHJlcXVlc3Qgd2lsbCByZXRyaWV2ZSB0aGUgc2Vzc2lvbiBpdHNlbGZcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRDbG91ZEFwaVNlc3Npb246IE9ic2VydmFibGU8U2Vzc2lvbj47XG5cbiAgICBwcml2YXRlIF9jbG91ZEFwaVNlc3Npb25MaW5rczogQmVoYXZpb3JTdWJqZWN0PExpbmtUeXBlW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMaW5rVHlwZVtdPihbXSk7XG5cbiAgICAvKipcbiAgICAgKiBDYWNoZWQsIGxhenkgbG9hZGVkIG9ic2VydmFibGUgb2YgdGhlIEFjY2Vzc2libGVMb2NhdGlvbiBhcnJheVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3VkQXBpQWNjZXNzaWJsZUxvY2F0aW9uczogT2JzZXJ2YWJsZTxBY2Nlc3NpYmxlTG9jYXRpb25bXT47XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgaWYgaXQgaXMgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGxvZ2luLlxuICAgICAqIEluIHRoaXMgY2FzZSB0aGUgb2xkIEFQSSAoL2FwaS9zZXNzaW9uKSBzaG91bGQgbm90IGJlIHVzZWQgYXQgYWxsLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2lzQ2xvdWRBcGlMb2dpbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgICAgICBwcml2YXRlIGh0dHA6IFZjZEh0dHBDbGllbnQsXG4gICAgICAgICAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgY29uZmlnPzogVmNkU2RrQ29uZmlnLFxuICAgICkge1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gdGhpcy5pbmplY3Rvci5nZXQoQVBJX1JPT1RfVVJMKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBuZWdvdGlhdGVkVmVyc2lvbjogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmFwaVZlcnNpb24pIHtcbiAgICAgICAgICAgIG5lZ290aWF0ZWRWZXJzaW9uID0gb2YodGhpcy5jb25maWcuYXBpVmVyc2lvbikucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHZlcnNpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZ290aWF0ZWRWZXJzaW9uID0gdGhpcy5odHRwLmdldDxTdXBwb3J0ZWRWZXJzaW9uc1R5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS92ZXJzaW9uc2ApLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHZlcnNpb25zID0+IHRoaXMubmVnb3RpYXRlVmVyc2lvbih2ZXJzaW9ucykpLFxuICAgICAgICAgICAgICAgIHRhcCh2ZXJzaW9uID0+IHRoaXMuc2V0VmVyc2lvbih2ZXJzaW9uKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbmVnb3RpYXRlVmVyc2lvbiA9IG5lZ290aWF0ZWRWZXJzaW9uLnBpcGUoXG4gICAgICAgICAgICBzaGFyZSh7IGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksIHJlc2V0T25FcnJvcjogZmFsc2UsIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5Ib2xkZXI6IEF1dGhUb2tlbkhvbGRlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChBdXRoVG9rZW5Ib2xkZXJTZXJ2aWNlLCB7IHRva2VuOiAnJyB9KTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbkhvbGRlci5qd3QgPyBgQmVhcmVyICR7dG9rZW5Ib2xkZXIuand0fWAgOiB0b2tlbkhvbGRlci50b2tlbjtcbiAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbiA9IHRoaXMuc2V0QXV0aGVudGljYXRpb24odG9rZW4pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzaGFyZSh7IGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksIHJlc2V0T25FcnJvcjogZmFsc2UsIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvbiA9IHRoaXMuc2V0Q2xvdWRBcGlBdXRoZW50aWNhdGlvbih0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBsb2dpblxuICAgICAgICB0aGlzLl9pc0Nsb3VkQXBpTG9naW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lZ290aWF0ZVZlcnNpb24oc2VydmVyVmVyc2lvbnM6IFN1cHBvcnRlZFZlcnNpb25zVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZFZlcnNpb25zOiBzdHJpbmdbXSA9IHNlcnZlclZlcnNpb25zLnZlcnNpb25JbmZvLm1hcCh2ZXJzaW9uSW5mbyA9PiB2ZXJzaW9uSW5mby52ZXJzaW9uKTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFQSSBWZXJzaW9uIHVzZWQgaXMgdGhlIExhdGVzdCBBUEkgVmVyc2lvbiBpbiBWTXdhcmUgQ2xvdWQgRGlyZWN0b3JcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFZlcnNpb25zW3N1cHBvcnRlZFZlcnNpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZW5zdXJlIHRoYXQgcHJpb3IgdG8gc2VuZGluZyBhbnkgY2FsbCB0byB0aGUgYmFja2VuZFxuICAgICAqIHRoZSB2ZXJzaW9uIGhhcyBiZWVuIHNldCBhbmQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBoYXMgYmVlbiByZXRyaWV2ZWQuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgaW1wb3J0YW50IGR1cmluZyB0aGUgYXV0b21hdGljIGF1dGhlbnRpY2F0aW9uIHRoYXQgaXMgZG9uZSBkdXJpbmcgdGhlXG4gICAgICogY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24sIHdoZW4gdGhlIHBsdWdpbiBpcyBub3QgcmVxdWlyZWQgdG8gcGVyZm9ybSBpdHMgb3duIGV4cGxpY2l0IGF1dGhlbnRpY2F0aW9uXG4gICAgICogYnV0IHJhdGhlciB0aGUgb25lcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGZyYW1ld29yayBpcyB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpOiBPYnNlcnZhYmxlPHRydWU+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZlcnNpb24gPyBvZih0aGlzLnZlcnNpb24pIDogdGhpcy5fbmVnb3RpYXRlVmVyc2lvbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBjbG91ZCBhcGkgbG9naW4gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSAvYXBpL3Nlc3Npb24gc2Vzc2lvblxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4gPyBvZihudWxsKSA6IHRoaXMuX2dldFNlc3Npb24pLFxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBjbG91ZCBhcGkgZmFpbHVyZSB3ZSBkbyBub3Qgd2FudCB0byBwcmV2ZW50IGZ1cnRoZXIgZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNvbnNpZGVyYXRpb25zIHNpbmNlIHRoaXMgbWF5IGJlIGEgY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGNsb3VkIGFwaSBpcyBub3Qgc3VwcG9ydGVkIGF0IGFsbCBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGUpID0+IG9mKHRydWUpKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBGb3IgdXNlIGNhc2VzIHdpY2ggc29sZWx5IGRlcGVuZHMgb24gY2xvdWRhcGkgd2l0aG91dCBhbnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAqIHRoZXJlIHNob3VsZCBiZSBubyBkZXBlbmRlbmNlIG9uIHRoZSBvbGQgL2FwaSBlbmRwb2ludCBhdCBhbGxcbiAgICAgKi9cbiAgICBwcml2YXRlIHZhbGlkYXRlUmVxdWVzdENvbnRleHRDbG91ZEFwaU9ubHkoKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHJldHVybiAodGhpcy52ZXJzaW9uID8gb2YodGhpcy52ZXJzaW9uKSA6IHRoaXMuX25lZ290aWF0ZVZlcnNpb24pLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWZXJzaW9uKF92ZXJzaW9uOiBzdHJpbmcpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci52ZXJzaW9uID0gX3ZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmljZSwgdGhhdCBhbGxvd3MgYSBwcm92aWRlciB1c2VyIHRvIGV4ZWN1dGUgQVBJIHJlcXVlc3RzXG4gICAgICogaW4gdGhlIHNjb3BlIG9mIGEgc3BlY2lmaWMgdGVuYW50LlxuICAgICAqIFxuICAgICAqIElmIHlvdSB3YW50IHRvIGV4ZWN1dGUgc2luZ2xlIEFQSSByZXF1ZXN0IGluIHNjb3BlIG9mIHNwZWNpZmljIHRlbmFudCB5b3UgY2FuIGRvIGl0XG4gICAgICogYnkgcGFzc2luZyBcIlgtVk1XQVJFLVZDTE9VRC1URU5BTlQtQ09OVEVYVFwiIGhlYWRlciB0byB0aGUgc3BlY2lmaWMgQVBJIFJlcXVlc3QuXG4gICAgICpcbiAgICAgKiBUaGlzIHNjb3BpbmcgaXMgYXZhaWxhYmxlIHRvIHF1ZXJ5LWJhc2VkIEFQSSBjYWxscyBhbmQgdG8gYnVsayBHRVQgY2FsbHMgaW4gdGhlXG4gICAgICogL2Nsb3VkYXBpIHNwYWNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdEFzIGFuIGVudGl0eVJlZiBvZiB0aGUgdGVuYW50IChvcmdhbml6YXRpb24pIHRvIHNjb3BlIHN1YnNlcXVlbnQgY2FsbHMgdG8gaW5cbiAgICAgKiAgdGhlIFZjZEFwaUNsaWVudCwgb3IgbnVsbC9ubyBwYXJhbWV0ZXIgdG8gcmVtb3ZlIHRlbmFudC1zcGVjaWZpYyBzY29waW5nXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgVmNkQXBpQ2xpZW50IGluc3RhbmNlIChmb3IgY2hhaW5pbmcpXG4gICAgICovXG4gICAgcHVibGljIGFjdEFzKGFjdEFzOiBFbnRpdHlSZWZlcmVuY2VUeXBlID0gbnVsbCk6IFZjZEFwaUNsaWVudCB7XG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmFjdEFzID0gIWFjdEFzID8gbnVsbCA6IGFjdEFzLmlkO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFZjZEFwaUNsaWVudCNzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9ufVxuICAgICAqXG4gICAgICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIGZvciB0aGUgVmNkQXBpQ2xpZW50LlxuICAgICAqXG4gICAgICogQWZ0ZXIgc2V0dGluZyB0aGUgdG9rZW4sIHRoZSBjbGllbnQgd2lsbCBnZXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRlZCB0b2tlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nICh0byBiZSB1c2VkIGluIGVpdGhlciB0aGUgJ0F1dGhvcml6YXRpb24nXG4gICAgICogIG9yICd4LXZjbG91ZC1hdXRob3JpemF0aW9uJyBoZWFkZXIpXG4gICAgICogQHJldHVybnMgdGhlIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uVHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5faXNDbG91ZEFwaUxvZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcignT25seSBjbG91ZCBhcGkgYXV0aCBpcyBhbGxvd2VkIHNpbmNlIGl0IHdhcyBhbHJlYWR5IHVzZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gYXV0aGVudGljYXRpb247XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFNlc3Npb25UeXBlPihgJHt0aGlzLl9iYXNlVXJsfS9hcGkvc2Vzc2lvbmApLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKHNlc3Npb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNldCBhY3RBcyBmb3IgcHJvdmlkZXIgaW4gdGVuYW50IHNjb3BlXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLm9yZyA9PT0gJ1N5c3RlbScgJiYgdGhpcy5pbmplY3Rvci5nZXQoU0VTU0lPTl9TQ09QRSkgPT09ICd0ZW5hbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgYWN0QXMgb25seSB3b3JrcyBpbiB2ZXJzaW9ucyA+PTkuNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdEFzKHtpZDogdGhpcy5pbmplY3Rvci5nZXQoU0VTU0lPTl9PUkdfSUQpfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBTRVNTSU9OX09SR19JRCBzZXQgaW4gY29udGFpbmVyLiBBdXRvbWF0aWMgYWN0QXMgaXMgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YXAoc2Vzc2lvbiA9PiB0aGlzLl9zZXNzaW9uLm5leHQoc2Vzc2lvbikpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHVzZSBmb3IgdGhlIFZjZEFwaUNsaWVudC5cbiAgICAgKlxuICAgICAqIEFmdGVyIHNldHRpbmcgdGhlIHRva2VuLCB0aGUgY2xpZW50IHdpbGwgZ2V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICAgKiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0ZWQgdG9rZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXV0aGVudGljYXRpb24gdGhlIGF1dGhlbnRpY2F0aW9uIHN0cmluZyAodG8gYmUgdXNlZCBpbiBlaXRoZXIgdGhlICdBdXRob3JpemF0aW9uJ1xuICAgICAqICBvciAneC12Y2xvdWQtYXV0aG9yaXphdGlvbicgaGVhZGVyKVxuICAgICAqXG4gICAgICogQHJldHVybnMgc2Vzc2lvbiBvYnNlcnZhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0Q2xvdWRBcGlBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbjogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHRoaXMub25CZWZvcmVDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCk7XG5cbiAgICAgICAgcmV0dXJuIG9mKHRydWUpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGF1dGhlbnRpY2F0aW9uIGFzIHBhcnQgb2YgdGhlIG9ic2VydmFibGUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBjYWxsZXIgaGFzIHN1YnNjcmliZWQgdG8gdGhlIG9ic2VydmFibGVcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbiksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8U2Vzc2lvbj4oYCR7dGhpcy5fYmFzZVVybH0vY2xvdWRhcGkvMS4wLjAvc2Vzc2lvbnMvY3VycmVudGAsIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbmFibGVMb2dnaW5nKCk6IFZjZEFwaUNsaWVudCB7XG4gICAgICAgIHRoaXMuaHR0cC5sb2dnaW5nSW50ZXJjZXB0b3IuZW5hYmxlZCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBWY2RBcGlDbGllbnQjY2xvdWRBcGlMb2dpbn1cbiAgICAgKlxuICAgICAqIENyZWF0ZXMgYW4gYXV0aGVudGljYXRlZCBzZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIGNyZWRlbnRpYWwgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VybmFtZSB0aGUgbmFtZSBvZiB0aGUgdXNlciB0byBhdXRoZW50aWNhdGVcbiAgICAgKiBAcGFyYW0gdGVuYW50IHRoZSBvcmdhbml6YXRpb24gdGhlIHVzZXIgYmVsb25ncyB0b1xuICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyXG4gICAgICogQHJldHVybnMgYW4gYXV0aGVudGljYXRlZCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbHNcbiAgICAgKi9cbiAgICBwdWJsaWMgbG9naW4odXNlcm5hbWU6IHN0cmluZywgdGVuYW50OiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nsb3VkQXBpTG9naW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdPbmx5IGNsb3VkIGFwaSBhdXRoIGlzIGFsbG93ZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgdXNlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGF1dGhTdHJpbmc6IHN0cmluZyA9IGJ0b2EoYCR7dXNlcm5hbWV9QCR7dGVuYW50fToke3Bhc3N3b3JkfWApO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTZXNzaW9uVHlwZT4oXG4gICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9hcGkvc2Vzc2lvbnNgLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IEF1dGhvcml6YXRpb246IGBCYXNpYyAke2F1dGhTdHJpbmd9YH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PikgPT5cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSBgJHtyZXNwb25zZS5oZWFkZXJzLmdldCgneC12bXdhcmUtdmNsb3VkLXRva2VuLXR5cGUnKX0gJHtyZXNwb25zZS5oZWFkZXJzLmdldCgneC12bXdhcmUtdmNsb3VkLWFjY2Vzcy10b2tlbicpfWBcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSksXG4gICAgICAgICAgICB0YXAoc2Vzc2lvbiA9PiB0aGlzLl9zZXNzaW9uLm5leHQoc2Vzc2lvbikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbCBkYXRhIHVzaW5nIGNsb3VkIGFwaSBlbmRwb2ludC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1c2VybmFtZSB0aGUgbmFtZSBvZiB0aGUgdXNlciB0byBhdXRoZW50aWNhdGVcbiAgICAgKiBAcGFyYW0gdGVuYW50IHRoZSBvcmdhbml6YXRpb24gdGhlIHVzZXIgYmVsb25ncyB0b1xuICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgZm9yIHRoZSB1c2VyXG4gICAgICogQHJldHVybnMgYW4gYXV0aGVudGljYXRlZCBzZXNzaW9uIGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbHNcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xvdWRBcGlMb2dpbih1c2VybmFtZTogc3RyaW5nLCB0ZW5hbnQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICB0aGlzLm9uQmVmb3JlQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGF1dGhTdHJpbmc6IHN0cmluZyA9IGJ0b2EoYCR7dXNlcm5hbWV9QCR7dGVuYW50fToke3Bhc3N3b3JkfWApO1xuICAgICAgICBsZXQgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY2xvdWRhcGkvMS4wLjAvc2Vzc2lvbnNgO1xuICAgICAgICBpZiAodGVuYW50LnRvTG93ZXJDYXNlKCkgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgICAgICB1cmwgKz0gJy9wcm92aWRlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNlc3Npb24+KFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IFtIVFRQX0hFQURFUlMuQXV0aG9yaXphdGlvbl06IGBCYXNpYyAke2F1dGhTdHJpbmd9YCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8U2Vzc2lvbj4pID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgY29uc3QgdG9rZW4gPSBgJHtyZXNwb25zZS5oZWFkZXJzLmdldCgneC12bXdhcmUtdmNsb3VkLXRva2VuLXR5cGUnKX0gJHtyZXNwb25zZS5oZWFkZXJzLmdldCgneC12bXdhcmUtdmNsb3VkLWFjY2Vzcy10b2tlbicpfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSB0b2tlbjtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcy5vbkNsb3VkQXBpQXV0aGVudGljYXRpb24oKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEl0IGlzIG5lY2Vzc2FyeSB0byBrbm93IGlmIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoIHJlcXVlc3Qgd2FzIGRvbmUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZyBmbGFncywgcHJvcGVydGllcyBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkJlZm9yZUNsb3VkQXBpQXV0aGVudGljYXRpb24oKSB7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdDpcbiAgICAgICAgLy8gU2V0IHRoZSBmbGFnIF9pc0Nsb3VkQXBpTG9naW4gaW4gb3JkZXIgdG8ga25vdyB0aGF0IGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoZW50aWNhdGlvbiBpcyBkb25lXG4gICAgICAgIC8vIFRoaXMgd2lsbCBoZWxwIHVzIHNraXAgY29kZSByZWxhdGVkIHRvIHRoZSBvbGQgYXBpLCBpLmUuIHdlIHNob3VsZCBub3QgYWxsb3cgZXhwbGljaXQgbWl4IG9mIGJvdGggdGhlIGFwaS1zXG4gICAgICAgIHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA9IHRydWU7XG4gICAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdDpcbiAgICAgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCBvZiBfZ2V0Q2xvdWRBcGlTZXNzaW9uIG9ic2VydmFibGUgd2hpY2ggaXMgbmVlZGVkIGluIHRoZSBhdXRvbWF0aWMgbG9naW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbi5cbiAgICAgICAgLy8gVGhlIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoIHJlcXVlc3Qgd2lsbCByZXRyaWV2ZSB0aGUgc2Vzc2lvbi5cbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gb2YobnVsbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAqIFRoaXMgaW5jbHVkZXMgZ2V0dGluZyBIQVRFT0FTIGxpbmtzLCBzZXR0aW5nIHRoZSBzZXNzaW9uLCBoYW5kbGluZyBlcnJvcnMgZXRjLlxuICAgICAqL1xuICAgIHByaXZhdGUgb25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCk6IChzb3VyY2U6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFNlc3Npb24+PikgPT4gT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcDogSHR0cFJlc3BvbnNlPFNlc3Npb24+KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IEhBVEVPQVMgbGlua3NcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENsb3VkQXBpU2Vzc2lvbkxpbmtzKHBhcnNlSGVhZGVySGF0ZW9hc0xpbmtzKHJlc3AuaGVhZGVycy5nZXQoSEFURU9BU19IRUFERVIpKSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hlbiBwYXJzaW5nIHNlc3Npb24gSEFURU9BUyBsaW5rczonLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcChyZXNwID0+IHJlc3AuYm9keSksXG4gICAgICAgICAgICB0YXAoKHNlc3Npb246IFNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBhY3RBc1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0QXMobnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBzZXQgYWN0QXMgZm9yIHByb3ZpZGVyIGluIHRlbmFudCBzY29wZVxuICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLm9yZyAmJiBzZXNzaW9uLm9yZy5uYW1lID09PSAnU3lzdGVtJyAmJiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX1NDT1BFKSA9PT0gJ3RlbmFudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXV0b21hdGljIGFjdEFzIG9ubHkgd29ya3MgaW4gdmVyc2lvbnMgPj05LjVcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0QXMoeyBpZDogdGhpcy5pbmplY3Rvci5nZXQoU0VTU0lPTl9PUkdfSUQpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIFNFU1NJT05fT1JHX0lEIHNldCBpbiBjb250YWluZXIuIEF1dG9tYXRpYyBhY3RBcyBpcyBkaXNhYmxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChzZXNzaW9uOiBTZXNzaW9uKSA9PiB0aGlzLl9jbG91ZEFwaVNlc3Npb24ubmV4dChzZXNzaW9uKSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNsb3VkQXBpQXV0aGVudGljYXRpb25FcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbkVycm9yKCkge1xuICAgICAgICAvLyBDbGVhciB0aGUgYXV0aGVudGljYXRpb24gc28gdGhhdCBhbnkgc3Vic2VxdWVudCBiYWNrZW5kIGNhbGxzIGFyZSBub3QgYXV0aGVudGljYXRlZFxuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9ICcnO1xuICAgICAgICAvLyBfZ2V0Q2xvdWRBcGlTZXNzaW9uIGlzIGluIHRoZSBjZW50ZXIgb2YgYW55IGJhY2tlbmQgY2FsbCwgbnVsbGlmeSBpdCBpbiBvcmRlciBub3QgdG8gcHJldmVudCB0aG9zZSBjYWxsc1xuICAgICAgICAvLyBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gdHJvdWJsZXNob290IGZhaWxpbmcgYmFja2VuZCByYXRoZXIgdGhhbiBubyBjYWxsXG4gICAgICAgIHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvbiA9IG9mKG51bGwpO1xuICAgICAgICAvLyBDbGVhciB0aGUgbGlua3NcbiAgICAgICAgdGhpcy5fY2xvdWRBcGlTZXNzaW9uTGlua3MubmV4dChbXSk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uXG4gICAgICAgIHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Q2xvdWRBcGlTZXNzaW9uTGlua3MobGlua3M6IExpbmtUeXBlW10pIHtcbiAgICAgICAgdGhpcy5fY2xvdWRBcGlBY2Nlc3NpYmxlTG9jYXRpb25zID0gbnVsbDtcbiAgICAgICAgdGhpcy5fY2xvdWRBcGlTZXNzaW9uTGlua3MubmV4dChsaW5rcyB8fCBbXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldDxUPihlbmRwb2ludDogc3RyaW5nLCAgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxUPih0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLCB7Li4ub3B0aW9uc30pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaXN0PFQ+KGVuZHBvaW50OiBzdHJpbmcsIHF1ZXJ5QnVpbGRlcj86IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGJvb2xlYW4gfCBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KSB7XG4gICAgICAgIGxldCB1cmwgPSB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpO1xuXG4gICAgICAgIGlmIChxdWVyeUJ1aWxkZXIpIHtcbiAgICAgICAgICAgIHVybCA9IGAke3VybH0ke3F1ZXJ5QnVpbGRlci5nZXRDbG91ZEFQSSgpfWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobXVsdGlzaXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgX211bHRpc2l0ZTogdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkgfSkgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKFwiX211bHRpc2l0ZVwiLCB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IC4uLm9wdGlvbnMgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVTeW5jPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wb3N0PFQ+KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUFzeW5jPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucG9zdChcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH1cbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgY29uY2F0TWFwKHJlc3BvbnNlID0+IHRoaXMubWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2UsICdQT1NUJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYW5zZmVyTGluazxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCB0cmFuc2ZlclJlbDogc3RyaW5nID0gVFJBTlNGRVJfTElOS19SRUwpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAucG9zdCh0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLCBpdGVtLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgocmVzOiBIdHRwUmVzcG9uc2U8VCAmIE5hdmlnYWJsZT4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyTGlua3M6IExpbmtUeXBlW10gPSByZXMuaGVhZGVycy5oYXMoSEFURU9BU19IRUFERVIpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSGVhZGVySGF0ZW9hc0xpbmtzKHJlcy5oZWFkZXJzLmdldChIQVRFT0FTX0hFQURFUikpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rczogTGlua1R5cGVbXSA9IHJlcy5ib2R5ID8gKHJlcy5ib2R5LmxpbmsgfHwgW10pIDogW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBbLi4uaGVhZGVyTGlua3MsIC4uLmxpbmtzXVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKGwpID0+IGwucmVsID09PSB0cmFuc2ZlclJlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXNwb25zZSBmcm9tICR7ZW5kcG9pbnR9IGRpZCBub3QgY29udGFpbiBhIHRyYW5zZmVyIGxpbmtgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluay5ocmVmO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFRyYW5zZmVyPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIHRyYW5zZmVyUmVsOiBzdHJpbmcgPSBUUkFOU0ZFUl9MSU5LX1JFTCk6IE9ic2VydmFibGU8VmNkVHJhbnNmZXJDbGllbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNmZXJMaW5rKGVuZHBvaW50LCBpdGVtLCB0cmFuc2ZlclJlbClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgodHJhbnNmZXJVcmwpID0+IG5ldyBWY2RUcmFuc2ZlckNsaWVudCh0aGlzLmh0dHAsIHRyYW5zZmVyVXJsKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnB1dDxUPihcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgeyAuLi5vcHRpb25zIH1cbiAgICAgICAgICAgICkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZUFzeW5jPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wdXQoXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsgLi4ub3B0aW9ucywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIGNvbmNhdE1hcChyZXNwb25zZSA9PiB0aGlzLm1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlLCAnUFVUJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZVN5bmMoZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmRlbGV0ZTx2b2lkPih0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZUFzeW5jKGVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZGVsZXRlKHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsgLi4ub3B0aW9ucywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KSksXG4gICAgICAgICAgICBjb25jYXRNYXAocmVzcG9uc2UgPT4gdGhpcy5tYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZSwgJ0RFTEVURScpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+LCBodHRwVmVyYjogc3RyaW5nKTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICBpZiAocmVzcG9uc2UuaGVhZGVycy5oYXMoJ0xvY2F0aW9uJykgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSAyMDIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFRhc2tUeXBlPihyZXNwb25zZS5oZWFkZXJzLmdldCgnTG9jYXRpb24nKSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuYm9keSAmJiByZXNwb25zZS5ib2R5LnR5cGUuc3RhcnRzV2l0aCgnYXBwbGljYXRpb24vdm5kLnZtd2FyZS52Y2xvdWQudGFzaysnKSkge1xuICAgICAgICAgICAgY29uc3QgdGFzazogVGFza1R5cGUgPSBPYmplY3QuYXNzaWduKG5ldyBUYXNrVHlwZSgpLCByZXNwb25zZS5ib2R5KTtcbiAgICAgICAgICAgIHJldHVybiBvZih0YXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihgQW4gYXN5bmNocm9ub3VzIHJlcXVlc3Qgd2FzIG1hZGUgdG8gWyR7aHR0cFZlcmJ9ICR7cmVzcG9uc2UudXJsfV0sIGJ1dCBubyB0YXNrIHdhcyByZXR1cm5lZC4gIFRoZSBvcGVyYXRpb24gbWF5IHN0aWxsIGhhdmUgYmVlbiBzdWNjZXNzZnVsLmApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50aXR5PFQgZXh0ZW5kcyBFbnRpdHlSZWZlcmVuY2VUeXBlPihlbnRpdHlSZWY6IEVudGl0eVJlZmVyZW5jZVR5cGUpOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgZ2V0RW50aXR5PFQgZXh0ZW5kcyBFbnRpdHlSZWZlcmVuY2VUeXBlPih1cm46IHN0cmluZyk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4oZW50aXR5UmVmT3JVcm46IEVudGl0eVJlZmVyZW5jZVR5cGUgfCBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzb2x2ZXI6IE9ic2VydmFibGU8RW50aXR5VHlwZT4gPSB0eXBlb2YgZW50aXR5UmVmT3JVcm4gPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL2VudGl0eS8ke2VudGl0eVJlZk9yVXJufWApIDpcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL2VudGl0eS91cm46dmNsb3VkOiR7ZW50aXR5UmVmT3JVcm4udHlwZX06JHtlbnRpdHlSZWZPclVybi5pZH1gKTtcblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBlbnRpdHlSZXNvbHZlciksXG4gICAgICAgICAgICBjb25jYXRNYXAoZW50aXR5ID0+IHRoaXMuaHR0cC5nZXQ8VD4oYCR7ZW50aXR5LmxpbmtbMF0uaHJlZn1gKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlVGFzayh0YXNrOiBUYXNrVHlwZSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHRhc2suaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Rhc2tDb21wbGV0ZSh0YXNrOiBUYXNrVHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gWydzdWNjZXNzJywgJ2Vycm9yJywgJ2NhbmNlbGVkJywgJ2Fib3J0ZWQnXS5pbmRleE9mKHRhc2suc3RhdHVzKSA+IC0xO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVJdGVtKGl0ZW06IE5hdmlnYWJsZSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhpdGVtLCAncmVtb3ZlJywgbnVsbCk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBObyAncmVtb3ZlJyBsaW5rIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmRlbGV0ZTxUYXNrVHlwZT4obGluay5ocmVmLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFF1ZXJ5LkJ1aWxkZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVpbGRlciBBbiBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSB0byBjb25zdHJ1Y3QgKHR5cGUsIGZpbHRlciwgcGFnZSBzaXplLCBldGMuKVxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIGEgcXVlcnkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIHF1ZXJ5PFQ+KGJ1aWxkZXI6IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgUXVlcnkuQnVpbGRlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWlsZGVyIEFuIGRlZmluaXRpb24gb2YgdGhlIHF1ZXJ5IHRvIGNvbnN0cnVjdCAodHlwZSwgZmlsdGVyLCBwYWdlIHNpemUsIGV0Yy4pXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIGEgcXVlcnkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBxdWVyeTxUPihidWlsZGVyOiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgcXVlcnk8VD4oYnVpbGRlcjogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UoYCR7dGhpcy5fYmFzZVVybH0vYXBpL3F1ZXJ5JHtidWlsZGVyLmdldCgpfWAsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBmaXJzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBmaXJzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGZpcnN0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdmaXJzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBObyAnZmlyc3RQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGxpbmsuaHJlZiwgbXVsdGlzaXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRmlyc3RQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ2ZpcnN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIHRoZSBzZXQgb2Ygc2l0ZSBsb2NhdGlvbnMgdG8gaW5jbHVkZSBpbiB0aGUgcXVlcnkgZmFub3V0XG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgbGluazogTGlua1R5cGUgPSB0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ3ByZXZpb3VzUGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoYE5vICdwcmV2aW91c1BhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAncHJldmlvdXNQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIG5leHQgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbmV4dFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGBObyAnbmV4dFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2U8VD4obGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNOZXh0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICduZXh0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgbGFzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgbGFzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYm9vbGVhbiwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBsYXN0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIHRoZSBzZXQgb2Ygc2l0ZSBsb2NhdGlvbnMgdG8gaW5jbHVkZSBpbiB0aGUgcXVlcnkgZmFub3V0XG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBsYXN0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBsYXN0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgbGluazogTGlua1R5cGUgPSB0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ2xhc3RQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcihgTm8gJ2xhc3RQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGxpbmsuaHJlZiwgbXVsdGlzaXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzTGFzdFBhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAnbGFzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRRdWVyeVBhZ2U8VD4oaHJlZjogc3RyaW5nLCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGlmIChtdWx0aXNpdGUpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KGhyZWYsIHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgX211bHRpc2l0ZTogdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkgfSkgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5hcHBlbmQoXCJfbXVsdGlzaXRlXCIsIHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPihocmVmLCB7IC4uLm9wdGlvbnMgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VD4oaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAvKipcbiAgICogVXNlIHRvIHBlcmZvcm0gYWN0aW9uIGF2YWlsYWJpbGl0eSBjaGVjayBiZWZvcmUgY2FsbGluZyB0aGUgQVBJXG4gICAqIEBwYXJhbSBpdGVtIC0gdGhlIG5hdmlnYWJsZSBpdGVtIChjb250YWluaW5nIGxpbmsgY29sbGVjdGlvbilcbiAgICogQHBhcmFtIGxpbmtSZWxUeXBlIC0gdGhlIGxpbmsgcmVsIHR5cGUsIHBhc3MgZWl0aGVyIExpbmtSZWxUeXBlIG9yIHN0cmluZ1xuICAgKiBAcGFyYW0gZW50aXR5UmVmVHlwZSAtIHRoZSBlbnRpdHkgcmVmZXJlbmNlIHR5cGVcbiAgICovXG4gICAgcHVibGljIGNhblBlcmZvcm1BY3Rpb24oaXRlbTogTmF2aWdhYmxlLCBsaW5rUmVsVHlwZTogTGlua1JlbFR5cGUgfCBzdHJpbmcsIGVudGl0eVJlZlR5cGU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhpdGVtLCBsaW5rUmVsVHlwZSwgZW50aXR5UmVmVHlwZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kTGluayhpdGVtOiBOYXZpZ2FibGUsIHJlbDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBMaW5rVHlwZSB7XG4gICAgICAgIGlmICghaXRlbSB8fCAhaXRlbS5saW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW0ubGluay5maW5kKChsaW5rKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsaW5rLnJlbC5pbmNsdWRlcyhyZWwpICYmIGxpbmsudHlwZSA9PT0gdHlwZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxpbmsucmVsLmluY2x1ZGVzKHJlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGU6IGJvb2xlYW4gfCBBdXRob3JpemVkTG9jYXRpb25UeXBlW10pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG11bHRpc2l0ZSA9PT0gJ2Jvb2xlYW4nID8gKG11bHRpc2l0ZSA/ICdnbG9iYWwnIDogJ2xvY2FsJykgOiBtdWx0aXNpdGUubWFwKHNpdGUgPT4gc2l0ZS5sb2NhdGlvbklkKS5qb2luKCcsJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGNsb3VkQXBpU2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2Vzc2lvbigpOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX3Nlc3Npb25PYnNlcnZhYmxlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBTZXNzaW9uIG9ic2VydmFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNsb3VkQXBpU2Vzc2lvbigpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dENsb3VkQXBpT25seSgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fY2xvdWRBcGlTZXNzaW9uT2JzZXJ2YWJsZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHVzZXJuYW1lKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgICAgICB0aGlzLmNsb3VkQXBpU2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKHNlc3Npb24gPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLnVzZXIgJiYgc2Vzc2lvbi51c2VyLm5hbWUpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24udXNlcilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgb3JnYW5pemF0aW9uKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgIHRoaXMuY2xvdWRBcGlTZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgbWFwKHNlc3Npb24gPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLm9yZyAmJiBzZXNzaW9uLm9yZy5uYW1lKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24ub3JnKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBjbG91ZEFwaUxvY2F0aW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBsb2NhdGlvbigpOiBPYnNlcnZhYmxlPEF1dGhvcml6ZWRMb2NhdGlvblR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgbWFwKHNlc3Npb24gPT4gc2Vzc2lvbi5hdXRob3JpemVkTG9jYXRpb25zLmxvY2F0aW9uLmZpbmQobG9jYXRpb24gPT4gbG9jYXRpb24ubG9jYXRpb25JZCA9PT0gc2Vzc2lvbi5sb2NhdGlvbklkKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNsb3VkQXBpTG9jYXRpb24oKTogT2JzZXJ2YWJsZTxBY2Nlc3NpYmxlTG9jYXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvdWRBcGlTZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2xvdWRBcGlBY2Nlc3NpYmxlTG9jYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBjYWNoaW5nIGZvciBnZXR0aW5nIEFjY2Vzc2libGVMb2NhdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xvdWRBcGlBY2Nlc3NpYmxlTG9jYXRpb25zID0gdGhpcy5fY2xvdWRBcGlTZXNzaW9uTGlua3NcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgQWNjZXNzaWJsZUxvY2F0aW9ucyBsaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChsaW5rcykgPT4gdGhpcy5maW5kTGluayh7IGxpbms6IGxpbmtzIH0sICdkb3duJywgJ0FjY2Vzc2libGVMb2NhdGlvbnMnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmV0Y2ggQWNjZXNzaWJsZUxvY2F0aW9ucyBmcm9tIHRoZSBiYWNrZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKChsaW5rOiBMaW5rVHlwZSkgPT4gbGluayA/IHRoaXMuaHR0cC5nZXQ8QWNjZXNzaWJsZUxvY2F0aW9ucz4obGluay5ocmVmKSA6IG9mKG51bGwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGFycmF5IHdpdGggYWxsIGxvY2F0aW9ucyAod2hhdCBpZiB0aGVyZSBhcmUgbWFueSBwYWdlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGFjY2Vzc2libGVMb2NhdGlvbnM6IEFjY2Vzc2libGVMb2NhdGlvbnMpID0+IGFjY2Vzc2libGVMb2NhdGlvbnMgJiYgYWNjZXNzaWJsZUxvY2F0aW9ucy52YWx1ZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZSh7IGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksIHJlc2V0T25FcnJvcjogZmFsc2UsIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY2xvdWRBcGlBY2Nlc3NpYmxlTG9jYXRpb25zO1xuICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgIC8vIE5lZWQgdG8gaGF2ZSB0aGUgc2Vzc2lvbiBpbiBvcmRlciB0byBnZXQgaXRzIGxvY2F0aW9uXG4gICAgICAgICAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLmNsb3VkQXBpU2Vzc2lvbiksXG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBsb2NhdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgc2Vzc2lvblxuICAgICAgICAgICAgbWFwKChbYWNjZXNzaWJsZUxvY2F0aW9ucywgc2Vzc2lvbl0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWFjY2Vzc2libGVMb2NhdGlvbnMgfHwgIXNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlc3Npb25Mb2NhdGlvbiA9IHNlc3Npb24ubG9jYXRpb247XG4gICAgICAgICAgICAgICAgaWYgKCFzZXNzaW9uTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NpYmxlTG9jYXRpb25zLmZpbmQobG9jYXRpb24gPT4gbG9jYXRpb24ubG9jYXRpb25JZCA9PT0gc2Vzc2lvbkxvY2F0aW9uKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMb2NhdGlvbihzZXNzaW9uOiBTZXNzaW9uVHlwZSk6IEF1dGhvcml6ZWRMb2NhdGlvblR5cGUge1xuICAgICAgICByZXR1cm4gc2Vzc2lvbi5hdXRob3JpemVkTG9jYXRpb25zLmxvY2F0aW9uLmZpbmQobG9jYXRpb24gPT4gbG9jYXRpb24ubG9jYXRpb25JZCA9PT0gc2Vzc2lvbi5sb2NhdGlvbklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZCB0aGUgZW5kcG9pbnQgdXJsLiBJZiB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgYWxyZWFkeSBhbiBhYnNvbHV0ZSBVUkwsIHRoZW4gcmV0dXJuIGl0IGFzIGl0IGlzIHdpdGhvdXRcbiAgICAgKiBhbnkgbW9kaWZpY2F0aW9ucywgb3RoZXJ3aXNlIGNvbnNpZGVyIGl0IGFzIGEgcmVsYXRpdmUgb25lIGFuZCBwcmVwZW5kIHRoZSBiYXNlVXJsIGFzIGRlZmluZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBidWlsZEVuZHBvaW50VXJsKGVuZHBvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZW5kcG9pbnQuaW5kZXhPZignOi8vJykgPiAtMSA/IGVuZHBvaW50IDogYCR7dGhpcy5fYmFzZVVybH0vJHtlbmRwb2ludH1gO1xuICAgIH1cblxufVxuIl19
|
|
602
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmNkLmFwaS5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3ZjZC5hcGkuY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBT0wsUUFBUSxFQUNULE1BQU0sMkNBQTJDLENBQUM7QUFJbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV6QyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQzs7OztBQUVyRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUdsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRXJDLCtCQUErQjtBQUUvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDbEQsTUFBTSxPQUFPLEdBQWUsRUFBRSxDQUFDO0lBRS9C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bkMsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3BGLENBQUM7O3lHQXB6QlEsWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQXlERSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBmaWx0ZXIsIG1hcCwgc2hhcmUsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB0YXAsIHdpdGhMYXRlc3RGcm9tfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBdXRob3JpemVkTG9jYXRpb25UeXBlLFxuICBFbnRpdHlSZWZlcmVuY2VUeXBlLFxuICBFbnRpdHlUeXBlLFxuICBMaW5rVHlwZSxcbiAgUmVzb3VyY2VUeXBlLFxuICBTZXNzaW9uVHlwZSxcbiAgVGFza1R5cGVcbn0gZnJvbSAnQHZjZC9iaW5kaW5ncy92Y2xvdWQvYXBpL3Jlc3Qvc2NoZW1hX3YxXzUnO1xuaW1wb3J0IHtTdXBwb3J0ZWRWZXJzaW9uc1R5cGV9IGZyb20gJ0B2Y2QvYmluZGluZ3MvdmNsb3VkL2FwaS9yZXN0L3NjaGVtYS92ZXJzaW9uaW5nJztcbmltcG9ydCB7QWNjZXNzaWJsZUxvY2F0aW9uLCBBY2Nlc3NpYmxlTG9jYXRpb25zLCBTZXNzaW9ufSBmcm9tICcuLi9vcGVuYXBpJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL3F1ZXJ5L2luZGV4JztcbmltcG9ydCB7QVBJX1JPT1RfVVJMLCBBdXRoVG9rZW5Ib2xkZXJTZXJ2aWNlLCBTRVNTSU9OX09SR19JRCwgU0VTU0lPTl9TQ09QRX0gZnJvbSAnLi4vY29udGFpbmVyLWhvb2tzJztcbmltcG9ydCB7VmNkSHR0cENsaWVudH0gZnJvbSAnLi92Y2QuaHR0cC5jbGllbnQnO1xuaW1wb3J0IHtWY2RUcmFuc2ZlckNsaWVudH0gZnJvbSAnLi92Y2QudHJhbnNmZXIuY2xpZW50JztcbmltcG9ydCB7SFRUUF9IRUFERVJTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1ZjZFNka0NvbmZpZ30gZnJvbSBcIi4uLy4uL2NvcmUvcGx1Z2luLm1vZHVsZVwiO1xuaW1wb3J0IHtDbGllbnRFcnJvciwgQ2xpZW50RXJyb3JUeXBlfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgVFJBTlNGRVJfTElOS19SRUwgPSAndXBsb2FkOmRlZmF1bHQnO1xuZXhwb3J0IHR5cGUgTmF2aWdhYmxlID0gUmVzb3VyY2VUeXBlIHwgeyBsaW5rPzogTGlua1R5cGVbXSB9O1xuXG5leHBvcnQgY29uc3QgSEFURU9BU19IRUFERVIgPSAnTGluayc7XG5cbi8vIHRzbGludDpkaXNhYmxlOnZhcmlhYmxlLW5hbWVcblxuLyoqXG4gKiBQYXJzZSBvdXQgTGluayBoZWFkZXJzIHVzaW5nIGEgdmVyeSBsYXppbHkgaW1wbGVtZW50ZWQgcHVsbCBwYXJzZXJcbiAqIEBwYXJhbSBoZWFkZXIgJzx1cmwxPjtuYW1lMT1cInZhbHVlMVwiLG5hbWUyPVwidmFsdWUyXCIsPHVybDI+O25hbWUzPVwidmFsdWUzLHZhbHVlNFwiJ1xuICogQHJldHVybnMgcGFyc2VkIGxpbmsgaGVhZGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MoaGVhZGVyOiBzdHJpbmcpOiBMaW5rVHlwZVtdIHtcbiAgICBjb25zdCByZXN1bHRzOiBMaW5rVHlwZVtdID0gW107XG5cbiAgICBpZiAoIWhlYWRlcikge1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJGaWVsZE1hcHBpbmdzOiB7W2tleTogc3RyaW5nXToga2V5b2YgTGlua1R5cGV9ID0ge1xuICAgICAgICBocmVmOiAnaHJlZicsXG4gICAgICAgIG1vZGVsOiAndHlwZScsXG4gICAgICAgIHRpdGxlOiAnaWQnLFxuICAgICAgICByZWw6ICdyZWwnXG4gICAgfTtcbiAgICBsZXQgdG9rZW5JbmRleCA9IC0xO1xuXG4gICAgZnVuY3Rpb24gcGVlayh0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBoZWFkZXIuaW5kZXhPZih0b2tlbiwgdG9rZW5JbmRleCArIDEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5leHQodG9rZW46IHN0cmluZykge1xuICAgICAgICBjb25zdCBuZXh0SW5kZXggPSBwZWVrKHRva2VuKTtcbiAgICAgICAgaWYgKG5leHRJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeSh7aGVhZGVyLCB0b2tlbiwgdG9rZW5JbmRleH0pKTtcbiAgICAgICAgfVxuICAgICAgICB0b2tlbkluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdG9rZW5JbmRleDtcbiAgICB9XG5cbiAgICB3aGlsZSAocGVlaygnPCcpID4gLTEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZTdGFydCA9IG5leHQoJzwnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWZFbmQgPSBuZXh0KCc+Jyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gaGVhZGVyLnN1YnN0cmluZyhocmVmU3RhcnQgKyAxLCBocmVmRW5kKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTGlua1R5cGUgPSB7aHJlZiwgdHlwZTogbnVsbCwgaWQ6IG51bGwsIHJlbDogbnVsbCwgdkNsb3VkRXh0ZW5zaW9uOiBbXX07XG4gICAgICAgICAgICBsZXQgY29tbWEgPSBwZWVrKCcsJyk7XG4gICAgICAgICAgICBsZXQgc2VtaWNvbG9uID0gcGVlaygnOycpO1xuICAgICAgICAgICAgd2hpbGUgKChzZW1pY29sb24gPiAtMSAmJiBjb21tYSA+IC0xICYmIHNlbWljb2xvbiA8IGNvbW1hKSB8fCAoc2VtaWNvbG9uID4gLTEgJiYgY29tbWEgPT09IC0xKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVTdGFydCA9IG5leHQoJzsnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lRW5kID0gbmV4dCgnPScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBoZWFkZXIuc3Vic3RyaW5nKG5hbWVTdGFydCArIDEsIG5hbWVFbmQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlU3RhcnQgPSBuZXh0KCdcIicpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlRW5kID0gbmV4dCgnXCInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcodmFsdWVTdGFydCArIDEsIHZhbHVlRW5kKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWROYW1lID0gaGVhZGVyRmllbGRNYXBwaW5nc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAobWFwcGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFttYXBwZWROYW1lXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21tYSA9IHBlZWsoJywnKTtcbiAgICAgICAgICAgICAgICBzZW1pY29sb24gPSBwZWVrKCc7Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgIC8vIFdlIHdpbGwgdHJ5IHRoZSBuZXh0IG9uZS4uLlxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBlbnVtIExpbmtSZWxUeXBlIHtcbiAgICBhZGQgPSAnYWRkJyxcbiAgICByZW1vdmUgPSAncmVtb3ZlJyxcbiAgICBlZGl0ID0gJ2VkaXQnLFxufVxuXG4vKipcbiAqIEEgYmFzaWMgY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJcy5cbiAqXG4gKiBBIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBwbHVnaW4gY2FuIGdldCBhIHJlZmVyZW5jZSB0byB0aGlzIGNsaWVudCBieSB1c2luZyBhbmd1bGFyIGluamVjdGlvbi5cbiAqIGBgYFxuICogICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdmNkQXBpOiBWY2RBcGlDbGllbnQpIHt9XG4gKiBgYGBcbiAqXG4gKiBWY2RBcGlDbGllbnQgcmV1c2VzIHRoZSBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZSBWQ0QgcGxhdGZvcm0gc28gaW4gZ2VuZXJhbCB0aGVyZSBpc1xuICogbm8gbmVlZCBvZiBhbiBleHBsaWNpdCBhdXRoZW50aWNhdGlvbi9sb2dpbi5cbiAqXG4gKiBXaGVuIGRlYWxpbmcgd2l0aCB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50IHRoZXJlIGFyZSB0d28gQVBJczpcbiAqIDEuIERlcHJlY2F0ZWQgbGVnYWN5IEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgYXBpL3Nlc3Npb25gIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqIDIuIE5ld2x5IGFkZGVkIEFQSSB0aGF0IGlzIHVzaW5nIHRoZSBgY2xvdWRhcGlgIGVuZHBvaW50IGFuZCB0aGUgY29ycmVzcG9uZGluZyBtb2RlbHNcbiAqXG4gKiBOb3RlIHRoYXQgaWYgYSBwbHVnaW4gcGVyZm9ybXMgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGNhbGwgdGhyb3VnaFxuICoge0BsaW5rIFZjZEFwaUNsaWVudCNzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9ufSBvciB7QGxpbmsgVmNkQXBpQ2xpZW50I2Nsb3VkQXBpTG9naW59XG4gKiBmcm9tIHRoYXQgbW9tZW50IG9uIHRoZSBWY2RBcGlDbGllbnQgdXNlcyBvbmx5IGNsb3VkIGFwaSBzZXNzaW9uIG1hbmFnZW1lbnQuXG4gKiBUaGlzIG1lYW5zIGNhbGxzIHRvIHtAbGluayBWY2RBcGlDbGllbnQjc2V0QXV0aGVudGljYXRpb259IG9yIHtAbGluayBWY2RBcGlDbGllbnQjbG9naW59IGhhdmUgbm8gZWZmZWN0LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmNkQXBpQ2xpZW50IHtcbiAgICBzZXQgYmFzZVVybChfYmFzZVVybDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBfYmFzZVVybDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IudmVyc2lvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9uZWdvdGlhdGVWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgcHJpdmF0ZSBfYmFzZVVybDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBWY2RBcGlDbGllbnQjX2Nsb3VkQXBpU2Vzc2lvbn1cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZXNzaW9uOiBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvblR5cGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uVHlwZT4obnVsbCk7XG4gICAgcHJpdmF0ZSBfc2Vzc2lvbk9ic2VydmFibGU6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+ID0gdGhpcy5fc2Vzc2lvbi5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHNraXBXaGlsZShzZXNzaW9uID0+ICFzZXNzaW9uKVxuICAgICAgICApO1xuICAgIHByaXZhdGUgX2dldFNlc3Npb246IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+O1xuXG4gICAgLyoqXG4gICAgICogQ2xvdWRBcGkgU2Vzc2lvblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3VkQXBpU2Vzc2lvbjogQmVoYXZpb3JTdWJqZWN0PFNlc3Npb24+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uPihudWxsKTtcbiAgICBwcml2YXRlIF9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFNlc3Npb24+ID0gdGhpcy5fY2xvdWRBcGlTZXNzaW9uLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcFdoaWxlKHNlc3Npb24gPT4gIXNlc3Npb24pXG4gICAgICAgICk7XG4gICAgLyoqXG4gICAgICogVGhpcyBvYnNlcnZhYmxlIGhhcyBhIHNwZWNpYWwgcHVycG9zZSB3aGVuIGRvaW5nIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEl0IGFsbG93cyBiYWNrZW5kIGNhbGwgb25seSBhZnRlciBhbiBBUEkgdmVyc2lvbiBpcyBzZXQuXG4gICAgICogSXQgYWxzbyBlbnN1cmVzIHRoYXQgYSBiYWNrZW5kIGNhbGwgdG8gZ2V0IHRoZSBjdXJyZW50IHNlc3Npb24gaXMgZG9uZSBvbmNlIHByaW9yIHRvIGFueSBvdGhlciBjYWxscy5cbiAgICAgKlxuICAgICAqIEluIGNhc2Ugb2YgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB0aGVyZSBpcyBubyBuZWVkIG9mIHRoaXMgb2JzZXJ2YWJsZVxuICAgICAqIHNpbmNlIHRoaXMgYXV0aCByZXF1ZXN0IHdpbGwgcmV0cmlldmUgdGhlIHNlc3Npb24gaXRzZWxmXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2xvdWRBcGlTZXNzaW9uOiBPYnNlcnZhYmxlPFNlc3Npb24+O1xuXG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlTZXNzaW9uTGlua3M6IEJlaGF2aW9yU3ViamVjdDxMaW5rVHlwZVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TGlua1R5cGVbXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogQ2FjaGVkLCBsYXp5IGxvYWRlZCBvYnNlcnZhYmxlIG9mIHRoZSBBY2Nlc3NpYmxlTG9jYXRpb24gYXJyYXlcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM6IE9ic2VydmFibGU8QWNjZXNzaWJsZUxvY2F0aW9uW10+O1xuXG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIGl0IGlzIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBsb2dpbi5cbiAgICAgKiBJbiB0aGlzIGNhc2UgdGhlIG9sZCBBUEkgKC9hcGkvc2Vzc2lvbikgc2hvdWxkIG5vdCBiZSB1c2VkIGF0IGFsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9pc0Nsb3VkQXBpTG9naW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgcHJpdmF0ZSBodHRwOiBWY2RIdHRwQ2xpZW50LFxuICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGNvbmZpZz86IFZjZFNka0NvbmZpZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IHRoaXMuaW5qZWN0b3IuZ2V0KEFQSV9ST09UX1VSTCk7XG5cbiAgICAgICAgbGV0IG5lZ290aWF0ZWRWZXJzaW9uOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZz8uYXBpVmVyc2lvbikge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSBvZih0aGlzLmNvbmZpZy5hcGlWZXJzaW9uKS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgodmVyc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZlcnNpb24odmVyc2lvbik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmVnb3RpYXRlZFZlcnNpb24gPSB0aGlzLmh0dHAuZ2V0PFN1cHBvcnRlZFZlcnNpb25zVHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL3ZlcnNpb25zYCkucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodmVyc2lvbnMgPT4gdGhpcy5uZWdvdGlhdGVWZXJzaW9uKHZlcnNpb25zKSksXG4gICAgICAgICAgICAgICAgdGFwKHZlcnNpb24gPT4gdGhpcy5zZXRWZXJzaW9uKHZlcnNpb24pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uID0gbmVnb3RpYXRlZFZlcnNpb24ucGlwZShcbiAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0b2tlbkhvbGRlcjogQXV0aFRva2VuSG9sZGVyU2VydmljZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KEF1dGhUb2tlbkhvbGRlclNlcnZpY2UsIHsgdG9rZW46ICcnIH0pO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2VuSG9sZGVyLmp3dCA/IGBCZWFyZXIgJHt0b2tlbkhvbGRlci5qd3R9YCA6IHRva2VuSG9sZGVyLnRva2VuO1xuICAgICAgICB0aGlzLl9nZXRTZXNzaW9uID0gdGhpcy5zZXRBdXRoZW50aWNhdGlvbih0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gdGhpcy5zZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKHRva2VuKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc2hhcmUoeyBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLCByZXNldE9uRXJyb3I6IGZhbHNlLCByZXNldE9uQ29tcGxldGU6IGZhbHNlLCByZXNldE9uUmVmQ291bnRaZXJvOiBmYWxzZSB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGxvZ2luXG4gICAgICAgIHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgbmVnb3RpYXRlVmVyc2lvbihzZXJ2ZXJWZXJzaW9uczogU3VwcG9ydGVkVmVyc2lvbnNUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbnM6IHN0cmluZ1tdID0gc2VydmVyVmVyc2lvbnMudmVyc2lvbkluZm8ubWFwKHZlcnNpb25JbmZvID0+IHZlcnNpb25JbmZvLnZlcnNpb24pO1xuXG4gICAgICAgIC8vIERlZmF1bHQgQVBJIFZlcnNpb24gdXNlZCBpcyB0aGUgTGF0ZXN0IEFQSSBWZXJzaW9uIGluIFZNd2FyZSBDbG91ZCBEaXJlY3RvclxuICAgICAgICByZXR1cm4gc3VwcG9ydGVkVmVyc2lvbnNbc3VwcG9ydGVkVmVyc2lvbnMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBlbnN1cmUgdGhhdCBwcmlvciB0byBzZW5kaW5nIGFueSBjYWxsIHRvIHRoZSBiYWNrZW5kXG4gICAgICogdGhlIHZlcnNpb24gaGFzIGJlZW4gc2V0IGFuZCB0aGUgY3VycmVudCBzZXNzaW9uIGhhcyBiZWVuIHJldHJpZXZlZC5cbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBpbXBvcnRhbnQgZHVyaW5nIHRoZSBhdXRvbWF0aWMgYXV0aGVudGljYXRpb24gdGhhdCBpcyBkb25lIGR1cmluZyB0aGVcbiAgICAgKiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiwgd2hlbiB0aGUgcGx1Z2luIGlzIG5vdCByZXF1aXJlZCB0byBwZXJmb3JtIGl0cyBvd24gZXhwbGljaXQgYXV0aGVudGljYXRpb25cbiAgICAgKiBidXQgcmF0aGVyIHRoZSBvbmVzIGZyb20gdGhlIHVuZGVybHlpbmcgZnJhbWV3b3JrIGlzIHVzZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCk6IE9ic2VydmFibGU8dHJ1ZT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMudmVyc2lvbiA/IG9mKHRoaXMudmVyc2lvbikgOiB0aGlzLl9uZWdvdGlhdGVWZXJzaW9uKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIGNsb3VkIGFwaSBsb2dpbiB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlIC9hcGkvc2Vzc2lvbiBzZXNzaW9uXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiA/IG9mKG51bGwpIDogdGhpcy5fZ2V0U2Vzc2lvbiksXG4gICAgICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvblxuICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGNsb3VkIGFwaSBmYWlsdXJlIHdlIGRvIG5vdCB3YW50IHRvIHByZXZlbnQgZnVydGhlciBleGVjdXRpb25cbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgY29uc2lkZXJhdGlvbnMgc2luY2UgdGhpcyBtYXkgYmUgYSBjYXNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gY2xvdWQgYXBpIGlzIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcigoZSkgPT4gb2YodHJ1ZSkpKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHRydWUpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEZvciB1c2UgY2FzZXMgd2ljaCBzb2xlbHkgZGVwZW5kcyBvbiBjbG91ZGFwaSB3aXRob3V0IGFueSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICogdGhlcmUgc2hvdWxkIGJlIG5vIGRlcGVuZGVuY2Ugb24gdGhlIG9sZCAvYXBpIGVuZHBvaW50IGF0IGFsbFxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0Q29udGV4dENsb3VkQXBpT25seSgpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZlcnNpb24gPyBvZih0aGlzLnZlcnNpb24pIDogdGhpcy5fbmVnb3RpYXRlVmVyc2lvbikucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZlcnNpb24oX3ZlcnNpb246IHN0cmluZyk6IFZjZEFwaUNsaWVudCB7XG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLnZlcnNpb24gPSBfdmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2xvYmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZXJ2aWNlLCB0aGF0IGFsbG93cyBhIHByb3ZpZGVyIHVzZXIgdG8gZXhlY3V0ZSBBUEkgcmVxdWVzdHNcbiAgICAgKiBpbiB0aGUgc2NvcGUgb2YgYSBzcGVjaWZpYyB0ZW5hbnQuXG4gICAgICpcbiAgICAgKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNpbmdsZSBBUEkgcmVxdWVzdCBpbiBzY29wZSBvZiBzcGVjaWZpYyB0ZW5hbnQgeW91IGNhbiBkbyBpdFxuICAgICAqIGJ5IHBhc3NpbmcgXCJYLVZNV0FSRS1WQ0xPVUQtVEVOQU5ULUNPTlRFWFRcIiBoZWFkZXIgdG8gdGhlIHNwZWNpZmljIEFQSSBSZXF1ZXN0LlxuICAgICAqXG4gICAgICogVGhpcyBzY29waW5nIGlzIGF2YWlsYWJsZSB0byBxdWVyeS1iYXNlZCBBUEkgY2FsbHMgYW5kIHRvIGJ1bGsgR0VUIGNhbGxzIGluIHRoZVxuICAgICAqIC9jbG91ZGFwaSBzcGFjZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3RBcyBhbiBlbnRpdHlSZWYgb2YgdGhlIHRlbmFudCAob3JnYW5pemF0aW9uKSB0byBzY29wZSBzdWJzZXF1ZW50IGNhbGxzIHRvIGluXG4gICAgICogIHRoZSBWY2RBcGlDbGllbnQsIG9yIG51bGwvbm8gcGFyYW1ldGVyIHRvIHJlbW92ZSB0ZW5hbnQtc3BlY2lmaWMgc2NvcGluZ1xuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IFZjZEFwaUNsaWVudCBpbnN0YW5jZSAoZm9yIGNoYWluaW5nKVxuICAgICAqL1xuICAgIHB1YmxpYyBhY3RBcyhhY3RBczogRW50aXR5UmVmZXJlbmNlVHlwZSA9IG51bGwpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hY3RBcyA9ICFhY3RBcyA/IG51bGwgOiBhY3RBcy5pZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBWY2RBcGlDbGllbnQjc2V0Q2xvdWRBcGlBdXRoZW50aWNhdGlvbn1cbiAgICAgKlxuICAgICAqIFNldHMgdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuIHRvIHVzZSBmb3IgdGhlIFZjZEFwaUNsaWVudC5cbiAgICAgKlxuICAgICAqIEFmdGVyIHNldHRpbmcgdGhlIHRva2VuLCB0aGUgY2xpZW50IHdpbGwgZ2V0IHRoZSBjdXJyZW50IHNlc3Npb25cbiAgICAgKiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0ZWQgdG9rZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYXV0aGVudGljYXRpb24gdGhlIGF1dGhlbnRpY2F0aW9uIHN0cmluZyAodG8gYmUgdXNlZCBpbiBlaXRoZXIgdGhlICdBdXRob3JpemF0aW9uJ1xuICAgICAqICBvciAneC12Y2xvdWQtYXV0aG9yaXphdGlvbicgaGVhZGVyKVxuICAgICAqIEByZXR1cm5zIHRoZSBzZXNzaW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb246IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvdWRBcGlMb2dpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09ubHkgY2xvdWQgYXBpIGF1dGggaXMgYWxsb3dlZCBzaW5jZSBpdCB3YXMgYWxyZWFkeSB1c2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGF1dGhlbnRpY2F0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxTZXNzaW9uVHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL3Nlc3Npb25gKS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBzZXQgYWN0QXMgZm9yIHByb3ZpZGVyIGluIHRlbmFudCBzY29wZVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5vcmcgPT09ICdTeXN0ZW0nICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fU0NPUEUpID09PSAndGVuYW50Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXV0b21hdGljIGFjdEFzIG9ubHkgd29ya3MgaW4gdmVyc2lvbnMgPj05LjVcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RBcyh7aWQ6IHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fT1JHX0lEKX0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gU0VTU0lPTl9PUkdfSUQgc2V0IGluIGNvbnRhaW5lci4gQXV0b21hdGljIGFjdEFzIGlzIGRpc2FibGVkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFwKHNlc3Npb24gPT4gdGhpcy5fc2Vzc2lvbi5uZXh0KHNlc3Npb24pKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byB1c2UgZm9yIHRoZSBWY2RBcGlDbGllbnQuXG4gICAgICpcbiAgICAgKiBBZnRlciBzZXR0aW5nIHRoZSB0b2tlbiwgdGhlIGNsaWVudCB3aWxsIGdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIHRva2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgKHRvIGJlIHVzZWQgaW4gZWl0aGVyIHRoZSAnQXV0aG9yaXphdGlvbidcbiAgICAgKiAgb3IgJ3gtdmNsb3VkLWF1dGhvcml6YXRpb24nIGhlYWRlcilcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHNlc3Npb24gb2JzZXJ2YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgcHVibGljIHNldENsb3VkQXBpQXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb246IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICB0aGlzLm9uQmVmb3JlQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpO1xuXG4gICAgICAgIHJldHVybiBvZih0cnVlKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBhdXRoZW50aWNhdGlvbiBhcyBwYXJ0IG9mIHRoZSBvYnNlcnZhYmxlIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY2FsbGVyIGhhcyBzdWJzY3JpYmVkIHRvIHRoZSBvYnNlcnZhYmxlXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gYXV0aGVudGljYXRpb24pLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFNlc3Npb24+KGAke3RoaXMuX2Jhc2VVcmx9L2Nsb3VkYXBpLzEuMC4wL3Nlc3Npb25zL2N1cnJlbnRgLCB7IG9ic2VydmU6ICdyZXNwb25zZScgfSkpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNsb3VkQXBpQXV0aGVudGljYXRpb24oKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZW5hYmxlTG9nZ2luZygpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAubG9nZ2luZ0ludGVyY2VwdG9yLmVuYWJsZWQgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVmNkQXBpQ2xpZW50I2Nsb3VkQXBpTG9naW59XG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlXG4gICAgICogQHBhcmFtIHRlbmFudCB0aGUgb3JnYW5pemF0aW9uIHRoZSB1c2VyIGJlbG9uZ3MgdG9cbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIGZvciB0aGUgdXNlclxuICAgICAqIEByZXR1cm5zIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWxzXG4gICAgICovXG4gICAgcHVibGljIGxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHRlbmFudDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uVHlwZT4ge1xuICAgICAgICBpZiAodGhpcy5faXNDbG91ZEFwaUxvZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcignT25seSBjbG91ZCBhcGkgYXV0aCBpcyBhbGxvd2VkIHNpbmNlIGl0IHdhcyBhbHJlYWR5IHVzZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdXRoU3RyaW5nOiBzdHJpbmcgPSBidG9hKGAke3VzZXJuYW1lfUAke3RlbmFudH06JHtwYXNzd29yZH1gKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2Vzc2lvblR5cGU+KFxuICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vYXBpL3Nlc3Npb25zYCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBBdXRob3JpemF0aW9uOiBgQmFzaWMgJHthdXRoU3RyaW5nfWB9KVxuICAgICAgICAgICAgfVxuICAgICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4pID0+XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gYCR7cmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdm13YXJlLXZjbG91ZC10b2tlbi10eXBlJyl9ICR7cmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdm13YXJlLXZjbG91ZC1hY2Nlc3MtdG9rZW4nKX1gXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJvZHkpLFxuICAgICAgICAgICAgdGFwKHNlc3Npb24gPT4gdGhpcy5fc2Vzc2lvbi5uZXh0KHNlc3Npb24pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYXV0aGVudGljYXRlZCBzZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIGNyZWRlbnRpYWwgZGF0YSB1c2luZyBjbG91ZCBhcGkgZW5kcG9pbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIG5hbWUgb2YgdGhlIHVzZXIgdG8gYXV0aGVudGljYXRlXG4gICAgICogQHBhcmFtIHRlbmFudCB0aGUgb3JnYW5pemF0aW9uIHRoZSB1c2VyIGJlbG9uZ3MgdG9cbiAgICAgKiBAcGFyYW0gcGFzc3dvcmQgdGhlIHBhc3N3b3JkIGZvciB0aGUgdXNlclxuICAgICAqIEByZXR1cm5zIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIGdpdmVuIGNyZWRlbnRpYWxzXG4gICAgICovXG4gICAgcHVibGljIGNsb3VkQXBpTG9naW4odXNlcm5hbWU6IHN0cmluZywgdGVuYW50OiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgdGhpcy5vbkJlZm9yZUNsb3VkQXBpQXV0aGVudGljYXRpb24oKTtcblxuICAgICAgICBjb25zdCBhdXRoU3RyaW5nOiBzdHJpbmcgPSBidG9hKGAke3VzZXJuYW1lfUAke3RlbmFudH06JHtwYXNzd29yZH1gKTtcbiAgICAgICAgbGV0IHVybCA9IGAke3RoaXMuX2Jhc2VVcmx9L2Nsb3VkYXBpLzEuMC4wL3Nlc3Npb25zYDtcbiAgICAgICAgaWYgKHRlbmFudC50b0xvd2VyQ2FzZSgpID09PSAnc3lzdGVtJykge1xuICAgICAgICAgICAgdXJsICs9ICcvcHJvdmlkZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxTZXNzaW9uPihcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBbSFRUUF9IRUFERVJTLkF1dGhvcml6YXRpb25dOiBgQmFzaWMgJHthdXRoU3RyaW5nfWAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgdGFwKChyZXNwb25zZTogSHR0cFJlc3BvbnNlPFNlc3Npb24+KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gYCR7cmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdm13YXJlLXZjbG91ZC10b2tlbi10eXBlJyl9ICR7cmVzcG9uc2UuaGVhZGVycy5nZXQoJ3gtdm13YXJlLXZjbG91ZC1hY2Nlc3MtdG9rZW4nKX1gO1xuICAgICAgICAgICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gdG9rZW47XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMub25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJdCBpcyBuZWNlc3NhcnkgdG8ga25vdyBpZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0IHdhcyBkb25lLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgZmxhZ3MsIHByb3BlcnRpZXMgZXRjLlxuICAgICAqL1xuICAgIHByaXZhdGUgb25CZWZvcmVDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoIHJlcXVlc3Q6XG4gICAgICAgIC8vIFNldCB0aGUgZmxhZyBfaXNDbG91ZEFwaUxvZ2luIGluIG9yZGVyIHRvIGtub3cgdGhhdCBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aGVudGljYXRpb24gaXMgZG9uZVxuICAgICAgICAvLyBUaGlzIHdpbGwgaGVscCB1cyBza2lwIGNvZGUgcmVsYXRlZCB0byB0aGUgb2xkIGFwaSwgaS5lLiB3ZSBzaG91bGQgbm90IGFsbG93IGV4cGxpY2l0IG1peCBvZiBib3RoIHRoZSBhcGktc1xuICAgICAgICB0aGlzLl9pc0Nsb3VkQXBpTG9naW4gPSB0cnVlO1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoIHJlcXVlc3Q6XG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgb2YgX2dldENsb3VkQXBpU2Vzc2lvbiBvYnNlcnZhYmxlIHdoaWNoIGlzIG5lZWRlZCBpbiB0aGUgYXV0b21hdGljIGxvZ2luIGR1cmluZyB0aGUgY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24uXG4gICAgICAgIC8vIFRoZSBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0IHdpbGwgcmV0cmlldmUgdGhlIHNlc3Npb24uXG4gICAgICAgIHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvbiA9IG9mKG51bGwpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBhdXRoZW50aWNhdGlvbi5cbiAgICAgKiBUaGlzIGluY2x1ZGVzIGdldHRpbmcgSEFURU9BUyBsaW5rcywgc2V0dGluZyB0aGUgc2Vzc2lvbiwgaGFuZGxpbmcgZXJyb3JzIGV0Yy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpOiAoc291cmNlOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxTZXNzaW9uPj4pID0+IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUoXG4gICAgICAgICAgICB0YXAoKHJlc3A6IEh0dHBSZXNwb25zZTxTZXNzaW9uPikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBIQVRFT0FTIGxpbmtzXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDbG91ZEFwaVNlc3Npb25MaW5rcyhwYXJzZUhlYWRlckhhdGVvYXNMaW5rcyhyZXNwLmhlYWRlcnMuZ2V0KEhBVEVPQVNfSEVBREVSKSkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoZW4gcGFyc2luZyBzZXNzaW9uIEhBVEVPQVMgbGlua3M6JywgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtYXAocmVzcCA9PiByZXNwLmJvZHkpLFxuICAgICAgICAgICAgdGFwKChzZXNzaW9uOiBTZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgYWN0QXNcbiAgICAgICAgICAgICAgICB0aGlzLmFjdEFzKG51bGwpO1xuICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2V0IGFjdEFzIGZvciBwcm92aWRlciBpbiB0ZW5hbnQgc2NvcGVcbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5vcmcgJiYgc2Vzc2lvbi5vcmcubmFtZSA9PT0gJ1N5c3RlbScgJiYgdGhpcy5pbmplY3Rvci5nZXQoU0VTU0lPTl9TQ09QRSkgPT09ICd0ZW5hbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBhY3RBcyBvbmx5IHdvcmtzIGluIHZlcnNpb25zID49OS41XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdEFzKHsgaWQ6IHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fT1JHX0lEKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdObyBTRVNTSU9OX09SR19JRCBzZXQgaW4gY29udGFpbmVyLiBBdXRvbWF0aWMgYWN0QXMgaXMgZGlzYWJsZWQuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgoc2Vzc2lvbjogU2Vzc2lvbikgPT4gdGhpcy5fY2xvdWRBcGlTZXNzaW9uLm5leHQoc2Vzc2lvbikpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uRXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNsb3VkQXBpQXV0aGVudGljYXRpb25FcnJvcigpIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGF1dGhlbnRpY2F0aW9uIHNvIHRoYXQgYW55IHN1YnNlcXVlbnQgYmFja2VuZCBjYWxscyBhcmUgbm90IGF1dGhlbnRpY2F0ZWRcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSAnJztcbiAgICAgICAgLy8gX2dldENsb3VkQXBpU2Vzc2lvbiBpcyBpbiB0aGUgY2VudGVyIG9mIGFueSBiYWNrZW5kIGNhbGwsIG51bGxpZnkgaXQgaW4gb3JkZXIgbm90IHRvIHByZXZlbnQgdGhvc2UgY2FsbHNcbiAgICAgICAgLy8gc2luY2UgaXQgaXMgZWFzaWVyIHRvIHRyb3VibGVzaG9vdCBmYWlsaW5nIGJhY2tlbmQgcmF0aGVyIHRoYW4gbm8gY2FsbFxuICAgICAgICB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24gPSBvZihudWxsKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGxpbmtzXG4gICAgICAgIHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbkxpbmtzLm5leHQoW10pO1xuICAgICAgICAvLyBDbGVhciB0aGUgc2Vzc2lvblxuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb24ubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENsb3VkQXBpU2Vzc2lvbkxpbmtzKGxpbmtzOiBMaW5rVHlwZVtdKSB7XG4gICAgICAgIHRoaXMuX2Nsb3VkQXBpQWNjZXNzaWJsZUxvY2F0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbkxpbmtzLm5leHQobGlua3MgfHwgW10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VD4odGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgey4uLm9wdGlvbnN9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbGlzdDxUPihlbmRwb2ludDogc3RyaW5nLCBxdWVyeUJ1aWxkZXI/OiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBib29sZWFuIHwgQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSkge1xuICAgICAgICBsZXQgdXJsID0gdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KTtcblxuICAgICAgICBpZiAocXVlcnlCdWlsZGVyKSB7XG4gICAgICAgICAgICB1cmwgPSBgJHt1cmx9JHtxdWVyeUJ1aWxkZXIuZ2V0Q2xvdWRBUEkoKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG11bHRpc2l0ZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IF9tdWx0aXNpdGU6IHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpIH0pIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLmFwcGVuZChcIl9tdWx0aXNpdGVcIiwgdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyAuLi5vcHRpb25zIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlU3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucG9zdDxUPihcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgey4uLm9wdGlvbnN9XG4gICAgICAgICAgICApKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVBc3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VGFza1R5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnBvc3QoXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsgLi4ub3B0aW9ucywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIGNvbmNhdE1hcChyZXNwb25zZSA9PiB0aGlzLm1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlLCAnUE9TVCcpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFuc2Zlckxpbms8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgdHJhbnNmZXJSZWw6IHN0cmluZyA9IFRSQU5TRkVSX0xJTktfUkVMKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgICAgICAgLnBvc3QodGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgaXRlbSwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHJlczogSHR0cFJlc3BvbnNlPFQgJiBOYXZpZ2FibGU+KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlckxpbmtzOiBMaW5rVHlwZVtdID0gcmVzLmhlYWRlcnMuaGFzKEhBVEVPQVNfSEVBREVSKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZUhlYWRlckhhdGVvYXNMaW5rcyhyZXMuaGVhZGVycy5nZXQoSEFURU9BU19IRUFERVIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlua3M6IExpbmtUeXBlW10gPSByZXMuYm9keSA/IChyZXMuYm9keS5saW5rIHx8IFtdKSA6IFtdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsaW5rID0gWy4uLmhlYWRlckxpbmtzLCAuLi5saW5rc11cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKChsKSA9PiBsLnJlbCA9PT0gdHJhbnNmZXJSZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYFJlc3BvbnNlIGZyb20gJHtlbmRwb2ludH0gZGlkIG5vdCBjb250YWluIGEgdHJhbnNmZXIgbGlua2AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsuaHJlZjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnRUcmFuc2ZlcjxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCB0cmFuc2ZlclJlbDogc3RyaW5nID0gVFJBTlNGRVJfTElOS19SRUwpOiBPYnNlcnZhYmxlPFZjZFRyYW5zZmVyQ2xpZW50PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFRyYW5zZmVyTGluayhlbmRwb2ludCwgaXRlbSwgdHJhbnNmZXJSZWwpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHRyYW5zZmVyVXJsKSA9PiBuZXcgVmNkVHJhbnNmZXJDbGllbnQodGhpcy5odHRwLCB0cmFuc2ZlclVybCkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVTeW5jPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wdXQ8VD4oXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsgLi4ub3B0aW9ucyB9XG4gICAgICAgICAgICApKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVBc3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VGFza1R5cGU+IHtcblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucHV0KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMsIG9ic2VydmU6ICdyZXNwb25zZScgfVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb25jYXRNYXAocmVzcG9uc2UgPT4gdGhpcy5tYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZSwgJ1BVVCcpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVTeW5jKGVuZHBvaW50OiBzdHJpbmcsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGU8dm9pZD4odGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWxldGVBc3luYyhlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VGFza1R5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmRlbGV0ZSh0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLCB7IC4uLm9wdGlvbnMsIG9ic2VydmU6ICdyZXNwb25zZScgfSkpLFxuICAgICAgICAgICAgY29uY2F0TWFwKHJlc3BvbnNlID0+IHRoaXMubWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2UsICdERUxFVEUnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2U8YW55PiwgaHR0cFZlcmI6IHN0cmluZyk6IE9ic2VydmFibGU8VGFza1R5cGU+IHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMuaGFzKCdMb2NhdGlvbicpICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUYXNrVHlwZT4ocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJykpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmJvZHkgJiYgcmVzcG9uc2UuYm9keS50eXBlLnN0YXJ0c1dpdGgoJ2FwcGxpY2F0aW9uL3ZuZC52bXdhcmUudmNsb3VkLnRhc2srJykpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhc2s6IFRhc2tUeXBlID0gT2JqZWN0LmFzc2lnbihuZXcgVGFza1R5cGUoKSwgcmVzcG9uc2UuYm9keSk7XG4gICAgICAgICAgICByZXR1cm4gb2YodGFzayk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgYEFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHdhcyBtYWRlIHRvIFske2h0dHBWZXJifSAke3Jlc3BvbnNlLnVybH1dLCBidXQgbm8gdGFzayB3YXMgcmV0dXJuZWQuICBUaGUgb3BlcmF0aW9uIG1heSBzdGlsbCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bC5gLFxuICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLlRhc2tMaW5rTWlzc2luZ1xuICAgICAgICApKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RW50aXR5PFQgZXh0ZW5kcyBFbnRpdHlSZWZlcmVuY2VUeXBlPihlbnRpdHlSZWY6IEVudGl0eVJlZmVyZW5jZVR5cGUpOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgZ2V0RW50aXR5PFQgZXh0ZW5kcyBFbnRpdHlSZWZlcmVuY2VUeXBlPih1cm46IHN0cmluZyk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4oZW50aXR5UmVmT3JVcm46IEVudGl0eVJlZmVyZW5jZVR5cGUgfCBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgZW50aXR5UmVzb2x2ZXI6IE9ic2VydmFibGU8RW50aXR5VHlwZT4gPSB0eXBlb2YgZW50aXR5UmVmT3JVcm4gPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL2VudGl0eS8ke2VudGl0eVJlZk9yVXJufWApIDpcbiAgICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8RW50aXR5VHlwZT4oYCR7dGhpcy5fYmFzZVVybH0vYXBpL2VudGl0eS91cm46dmNsb3VkOiR7ZW50aXR5UmVmT3JVcm4udHlwZX06JHtlbnRpdHlSZWZPclVybi5pZH1gKTtcblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiBlbnRpdHlSZXNvbHZlciksXG4gICAgICAgICAgICBjb25jYXRNYXAoZW50aXR5ID0+IHRoaXMuaHR0cC5nZXQ8VD4oYCR7ZW50aXR5LmxpbmtbMF0uaHJlZn1gKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlVGFzayh0YXNrOiBUYXNrVHlwZSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHRhc2suaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Rhc2tDb21wbGV0ZSh0YXNrOiBUYXNrVHlwZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gWydzdWNjZXNzJywgJ2Vycm9yJywgJ2NhbmNlbGVkJywgJ2Fib3J0ZWQnXS5pbmRleE9mKHRhc2suc3RhdHVzKSA+IC0xO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVJdGVtKGl0ZW06IE5hdmlnYWJsZSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhpdGVtLCAncmVtb3ZlJywgbnVsbCk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ3JlbW92ZScgbGluayBmb3Igc3BlY2lmaWVkIHJlc291cmNlLmAsXG4gICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmRlbGV0ZTxUYXNrVHlwZT4obGluay5ocmVmLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFF1ZXJ5LkJ1aWxkZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVpbGRlciBBbiBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSB0byBjb25zdHJ1Y3QgKHR5cGUsIGZpbHRlciwgcGFnZSBzaXplLCBldGMuKVxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIGEgcXVlcnkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIHF1ZXJ5PFQ+KGJ1aWxkZXI6IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgUXVlcnkuQnVpbGRlciBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBidWlsZGVyIEFuIGRlZmluaXRpb24gb2YgdGhlIHF1ZXJ5IHRvIGNvbnN0cnVjdCAodHlwZSwgZmlsdGVyLCBwYWdlIHNpemUsIGV0Yy4pXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIGEgcXVlcnkgcmVzdWx0IGZvciB0aGUgc3BlY2lmaWVkIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBxdWVyeTxUPihidWlsZGVyOiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgcXVlcnk8VD4oYnVpbGRlcjogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UoYCR7dGhpcy5fYmFzZVVybH0vYXBpL3F1ZXJ5JHtidWlsZGVyLmdldCgpfWAsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBmaXJzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBmaXJzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGZpcnN0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdmaXJzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ2ZpcnN0UGFnZScgbGluayBmb3Igc3BlY2lmaWVkIHF1ZXJ5LmAsXG4gICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGxpbmsuaHJlZiwgbXVsdGlzaXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzRmlyc3RQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ2ZpcnN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIHRoZSBzZXQgb2Ygc2l0ZSBsb2NhdGlvbnMgdG8gaW5jbHVkZSBpbiB0aGUgcXVlcnkgZmFub3V0XG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgY29uc3QgbGluazogTGlua1R5cGUgPSB0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ3ByZXZpb3VzUGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBObyAncHJldmlvdXNQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZShsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1ByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdwcmV2aW91c1BhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIG5leHQgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgbmV4dCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgbmV4dCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgbmV4dCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgbmV4dCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICduZXh0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBObyAnbmV4dFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlPFQ+KGxpbmsuaHJlZiwgbXVsdGlzaXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzTmV4dFBhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAnbmV4dFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIGxhc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgbGFzdCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBsYXN0UGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IGJvb2xlYW4sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvKipcbiAgICAgKiBRdWVyaWVzIHRoZSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgQVBJIGZvciB0aGUgbGFzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgbGFzdCBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgbGFzdCBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgbGFzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgbGFzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdsYXN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgIGBObyAnbGFzdFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZShsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0xhc3RQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ2xhc3RQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UXVlcnlQYWdlPFQ+KGhyZWY6IHN0cmluZywgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBpZiAobXVsdGlzaXRlKSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPihocmVmLCB7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7IF9tdWx0aXNpdGU6IHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpIH0pIH0pXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMuYXBwZW5kKFwiX211bHRpc2l0ZVwiLCB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oaHJlZiwgeyAuLi5vcHRpb25zIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KGhyZWYsIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0byBwZXJmb3JtIGFjdGlvbiBhdmFpbGFiaWxpdHkgY2hlY2sgYmVmb3JlIGNhbGxpbmcgdGhlIEFQSVxuICAgKiBAcGFyYW0gaXRlbSAtIHRoZSBuYXZpZ2FibGUgaXRlbSAoY29udGFpbmluZyBsaW5rIGNvbGxlY3Rpb24pXG4gICAqIEBwYXJhbSBsaW5rUmVsVHlwZSAtIHRoZSBsaW5rIHJlbCB0eXBlLCBwYXNzIGVpdGhlciBMaW5rUmVsVHlwZSBvciBzdHJpbmdcbiAgICogQHBhcmFtIGVudGl0eVJlZlR5cGUgLSB0aGUgZW50aXR5IHJlZmVyZW5jZSB0eXBlXG4gICAqL1xuICAgIHB1YmxpYyBjYW5QZXJmb3JtQWN0aW9uKGl0ZW06IE5hdmlnYWJsZSwgbGlua1JlbFR5cGU6IExpbmtSZWxUeXBlIHwgc3RyaW5nLCBlbnRpdHlSZWZUeXBlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsoaXRlbSwgbGlua1JlbFR5cGUsIGVudGl0eVJlZlR5cGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZExpbmsoaXRlbTogTmF2aWdhYmxlLCByZWw6IHN0cmluZywgdHlwZTogc3RyaW5nKTogTGlua1R5cGUge1xuICAgICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0ubGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtLmxpbmsuZmluZCgobGluaykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbGluay5yZWwuaW5jbHVkZXMocmVsKSAmJiBsaW5rLnR5cGUgPT09IHR5cGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBsaW5rLnJlbC5pbmNsdWRlcyhyZWwpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlOiBib29sZWFuIHwgQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBtdWx0aXNpdGUgPT09ICdib29sZWFuJyA/IChtdWx0aXNpdGUgPyAnZ2xvYmFsJyA6ICdsb2NhbCcpIDogbXVsdGlzaXRlLm1hcChzaXRlID0+IHNpdGUubG9jYXRpb25JZCkuam9pbignLCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBjbG91ZEFwaVNlc3Npb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlc3Npb24oKTogT2JzZXJ2YWJsZTxTZXNzaW9uVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9zZXNzaW9uT2JzZXJ2YWJsZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgU2Vzc2lvbiBvYnNlcnZhYmxlXG4gICAgICovXG4gICAgcHVibGljIGdldCBjbG91ZEFwaVNlc3Npb24oKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHRDbG91ZEFwaU9ubHkoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbk9ic2VydmFibGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB1c2VybmFtZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgICAgdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi51c2VyICYmIHNlc3Npb24udXNlci5uYW1lKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKHNlc3Npb24gPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLnVzZXIpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9yZ2FuaXphdGlvbigpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICB0aGlzLmNsb3VkQXBpU2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5vcmcgJiYgc2Vzc2lvbi5vcmcubmFtZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgbWFwKHNlc3Npb24gPT4gc2Vzc2lvbiAmJiBzZXNzaW9uLm9yZylcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgY2xvdWRBcGlMb2NhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbG9jYXRpb24oKTogT2JzZXJ2YWJsZTxBdXRob3JpemVkTG9jYXRpb25UeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24ucGlwZShcbiAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24uYXV0aG9yaXplZExvY2F0aW9ucy5sb2NhdGlvbi5maW5kKGxvY2F0aW9uID0+IGxvY2F0aW9uLmxvY2F0aW9uSWQgPT09IHNlc3Npb24ubG9jYXRpb25JZCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBjbG91ZEFwaUxvY2F0aW9uKCk6IE9ic2VydmFibGU8QWNjZXNzaWJsZUxvY2F0aW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3VkQXBpU2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2Nsb3VkQXBpQWNjZXNzaWJsZUxvY2F0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgY2FjaGluZyBmb3IgZ2V0dGluZyBBY2Nlc3NpYmxlTG9jYXRpb25zXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3VkQXBpQWNjZXNzaWJsZUxvY2F0aW9ucyA9IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbkxpbmtzXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIEFjY2Vzc2libGVMb2NhdGlvbnMgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgobGlua3MpID0+IHRoaXMuZmluZExpbmsoeyBsaW5rOiBsaW5rcyB9LCAnZG93bicsICdBY2Nlc3NpYmxlTG9jYXRpb25zJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZldGNoIEFjY2Vzc2libGVMb2NhdGlvbnMgZnJvbSB0aGUgYmFja2VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgobGluazogTGlua1R5cGUpID0+IGxpbmsgPyB0aGlzLmh0dHAuZ2V0PEFjY2Vzc2libGVMb2NhdGlvbnM+KGxpbmsuaHJlZikgOiBvZihudWxsKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhcnJheSB3aXRoIGFsbCBsb2NhdGlvbnMgKHdoYXQgaWYgdGhlcmUgYXJlIG1hbnkgcGFnZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKChhY2Nlc3NpYmxlTG9jYXRpb25zOiBBY2Nlc3NpYmxlTG9jYXRpb25zKSA9PiBhY2Nlc3NpYmxlTG9jYXRpb25zICYmIGFjY2Vzc2libGVMb2NhdGlvbnMudmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmUoeyBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLCByZXNldE9uRXJyb3I6IGZhbHNlLCByZXNldE9uQ29tcGxldGU6IGZhbHNlLCByZXNldE9uUmVmQ291bnRaZXJvOiBmYWxzZSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3VkQXBpQWNjZXNzaWJsZUxvY2F0aW9ucztcbiAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAvLyBOZWVkIHRvIGhhdmUgdGhlIHNlc3Npb24gaW4gb3JkZXIgdG8gZ2V0IGl0cyBsb2NhdGlvblxuICAgICAgICAgICAgd2l0aExhdGVzdEZyb20odGhpcy5jbG91ZEFwaVNlc3Npb24pLFxuICAgICAgICAgICAgLy8gRmluZCB0aGUgbG9jYXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHNlc3Npb25cbiAgICAgICAgICAgIG1hcCgoW2FjY2Vzc2libGVMb2NhdGlvbnMsIHNlc3Npb25dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3NpYmxlTG9jYXRpb25zIHx8ICFzZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uTG9jYXRpb24gPSBzZXNzaW9uLmxvY2F0aW9uO1xuICAgICAgICAgICAgICAgIGlmICghc2Vzc2lvbkxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzaWJsZUxvY2F0aW9ucy5maW5kKGxvY2F0aW9uID0+IGxvY2F0aW9uLmxvY2F0aW9uSWQgPT09IHNlc3Npb25Mb2NhdGlvbik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9jYXRpb24oc2Vzc2lvbjogU2Vzc2lvblR5cGUpOiBBdXRob3JpemVkTG9jYXRpb25UeXBlIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb24uYXV0aG9yaXplZExvY2F0aW9ucy5sb2NhdGlvbi5maW5kKGxvY2F0aW9uID0+IGxvY2F0aW9uLmxvY2F0aW9uSWQgPT09IHNlc3Npb24ubG9jYXRpb25JZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGQgdGhlIGVuZHBvaW50IHVybC4gSWYgdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIGFscmVhZHkgYW4gYWJzb2x1dGUgVVJMLCB0aGVuIHJldHVybiBpdCBhcyBpdCBpcyB3aXRob3V0XG4gICAgICogYW55IG1vZGlmaWNhdGlvbnMsIG90aGVyd2lzZSBjb25zaWRlciBpdCBhcyBhIHJlbGF0aXZlIG9uZSBhbmQgcHJlcGVuZCB0aGUgYmFzZVVybCBhcyBkZWZpbmVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYnVpbGRFbmRwb2ludFVybChlbmRwb2ludDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGVuZHBvaW50LmluZGV4T2YoJzovLycpID4gLTEgPyBlbmRwb2ludCA6IGAke3RoaXMuX2Jhc2VVcmx9LyR7ZW5kcG9pbnR9YDtcbiAgICB9XG5cbn1cbiJdfQ==
|