@vcd/sdk 15.0.4 → 15.0.6

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.
@@ -5,3 +5,4 @@ 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
+ export * from './types';
@@ -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 { SessionType, AuthorizedLocationType, ResourceType, LinkType, EntityReferenceType, TaskType } from '@vcd/bindings/vcloud/api/rest/schema_v1_5';
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, never>;
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
  }
@@ -77,6 +77,10 @@ export interface AuthTokenHolderService {
77
77
  * The authentication token.
78
78
  */
79
79
  token: string;
80
+ /**
81
+ * JWT token
82
+ */
83
+ jwt?: string;
80
84
  }
81
85
  export declare const AuthTokenHolderService: {
82
86
  token: string;
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FwaS5yZXN1bHQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5odHRwLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ZjZC5hcGkuY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vdmNkLnRyYW5zZmVyLmNsaWVudCc7XG5leHBvcnQgKiBmcm9tICcuL3JlcXVlc3QuaGVhZGVycy5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dpbmcuaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9yZXNwb25zZS5ub3JtYWxpemF0aW9uLmludGVyY2VwdG9yJztcbiJdfQ==
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, of, throwError, merge, ReplaySubject } from 'rxjs';
4
- import { catchError, tap, map, concatMap, skipWhile, switchMap, withLatestFrom, share } from 'rxjs/operators';
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, API_ROOT_URL, SESSION_SCOPE, SESSION_ORG_ID } from '../container-hooks';
6
+ import { API_ROOT_URL, AuthTokenHolderService, SESSION_ORG_ID, SESSION_SCOPE } from '../../common/container-hooks';
7
7
  import { VcdTransferClient } from './vcd.transfer.client';
8
8
  import { HTTP_HEADERS } from './constants';
9
- import { filter } from 'rxjs/operators';
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 Error(`Response from ${endpoint} did not contain a transfer link`);
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 Error(`An asynchronous request was made to [${httpVerb} ${response.url}], but no task was returned. The operation may still have been successful.`));
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 Error(`No 'remove' link for specified resource.`));
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 Error(`No 'firstPage' link for specified query.`));
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 Error(`No 'previousPage' link for specified query.`));
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 Error(`No 'nextPage' link for specified query.`));
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 Error(`No 'lastPage' link for specified query.`));
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmNkLmFwaS5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92Y2Qvc2RrL3NyYy9jbGllbnQvY2xpZW50L3ZjZC5hcGkuY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQVksUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwSCxPQUFPLEVBT0wsUUFBUSxFQUNULE1BQU0sMkNBQTJDLENBQUM7QUFJbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFFakgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV6QyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQzs7OztBQUVyRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUdsRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBRXJDLCtCQUErQjtBQUUvQjs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWM7SUFDbEQsTUFBTSxPQUFPLEdBQWUsRUFBRSxDQUFDO0lBRS9CLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDVCxPQUFPLE9BQU8sQ0FBQztLQUNsQjtJQUVELE1BQU0sbUJBQW1CLEdBQW9DO1FBQ3pELElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSyxFQUFFLE1BQU07UUFDYixLQUFLLEVBQUUsSUFBSTtRQUNYLEdBQUcsRUFBRSxLQUFLO0tBQ2IsQ0FBQztJQUNGLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXBCLFNBQVMsSUFBSSxDQUFDLEtBQWE7UUFDdkIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELFNBQVMsSUFBSSxDQUFDLEtBQWE7UUFDdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN2QixPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDbkIsSUFBSTtZQUNBLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFhLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUMsQ0FBQztZQUN0RixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDNUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDM0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDekQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLElBQUksVUFBVSxFQUFFO29CQUNaLGFBQWE7b0JBQ2IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBUSxDQUFDO2lCQUN6RDtnQkFDRCxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNsQixTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3pCO1lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QjtRQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUcsOEJBQThCO1lBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdEI7S0FDSjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLENBQU4sSUFBWSxXQUlYO0FBSkQsV0FBWSxXQUFXO0lBQ25CLDBCQUFXLENBQUE7SUFDWCxnQ0FBaUIsQ0FBQTtJQUNqQiw0QkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUgsTUFBTSxPQUFPLFlBQVk7SUFDckIsSUFBSSxPQUFPLENBQUMsUUFBZ0I7UUFDeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUM7SUFDdkQsQ0FBQztJQThDRCxZQUNnQixJQUFtQixFQUNuQixRQUFrQixFQUNOLE1BQXFCO1FBRmpDLFNBQUksR0FBSixJQUFJLENBQWU7UUFDbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNOLFdBQU0sR0FBTixNQUFNLENBQWU7UUE1Q2pEOztXQUVHO1FBQ0ssYUFBUSxHQUFpQyxJQUFJLGVBQWUsQ0FBYyxJQUFJLENBQUMsQ0FBQztRQUNoRix1QkFBa0IsR0FBNEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUU7YUFDN0UsSUFBSSxDQUNELFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQ2pDLENBQUM7UUFHTjs7V0FFRztRQUNLLHFCQUFnQixHQUE2QixJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUNoRiwrQkFBMEIsR0FBd0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRTthQUN6RixJQUFJLENBQ0QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FDakMsQ0FBQztRQVdFLDBCQUFxQixHQUFnQyxJQUFJLGVBQWUsQ0FBYSxFQUFFLENBQUMsQ0FBQztRQU9qRzs7O1dBR0c7UUFDSyxxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFPN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRCxJQUFJLGlCQUFxQyxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUU7WUFDekIsaUJBQWlCLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUMvQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDWixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN6QixPQUFPLE9BQU8sQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FDTCxDQUFDO1NBQ0w7YUFBTTtZQUNILGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUF3QixHQUFHLElBQUksQ0FBQyxRQUFRLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDMUYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQ2hELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FDM0MsQ0FBQztTQUNMO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FDM0MsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUM1SCxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQTJCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckcsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsVUFBVSxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFDaEYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDO2FBQzNDLElBQUksQ0FDRCxLQUFLLENBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQzVILENBQUM7UUFFTixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQzthQUMzRCxJQUFJLENBQ0QsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUM1SCxDQUFDO1FBQ04sMENBQTBDO1FBQzFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUVPLGdCQUFnQixDQUFDLGNBQXFDO1FBQzFELE1BQU0saUJBQWlCLEdBQWEsY0FBYyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkcsOEVBQThFO1FBQzlFLE9BQU8saUJBQWlCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxzQkFBc0I7UUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUM1RCxJQUFJO1FBQ0QsaUZBQWlGO1FBQ2pGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUNwRSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUNwQywyRUFBMkU7WUFDM0UscUVBQXFFO1lBQ3JFLG1FQUFtRTthQUNsRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNyQyxFQUNELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDbEIsQ0FBQztJQUNOLENBQUM7SUFFTDs7OztPQUlHO0lBQ0ssa0NBQWtDO1FBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQ2xFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQztJQUNOLENBQUM7SUFFTSxVQUFVLENBQUMsUUFBZ0I7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksS0FBSyxDQUFDLFFBQTZCLElBQUk7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxpQkFBaUIsQ0FBQyxjQUFzQjtRQUMzQyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QixPQUFPLFVBQVUsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO1NBQ2pGO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQzlELEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNWLHVEQUF1RDtZQUN2RCxJQUFJLE9BQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDM0UsK0NBQStDO2dCQUMvQyxJQUFJO29CQUNBLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUMsQ0FBQyxDQUFDO2lCQUN2RDtnQkFBQyxPQUFPLENBQUMsRUFBRTtvQkFDUixPQUFPLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7aUJBQ3BGO2FBQ0o7UUFDTCxDQUFDLENBQUMsRUFDRixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUM5QyxDQUFDO0lBQ1YsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSx5QkFBeUIsQ0FBQyxjQUFzQjtRQUNuRCxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUV0QyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7YUFDVixJQUFJO1FBQ0Qsa0hBQWtIO1FBQ2xILEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUMsRUFDOUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsa0NBQWtDLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUN2SDthQUNBLElBQUksQ0FDRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FDbEMsQ0FBQztJQUNWLENBQUM7SUFFTSxhQUFhO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUU1QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksS0FBSyxDQUFDLFFBQWdCLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQzNELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3ZCLE9BQU8sVUFBVSxDQUFDLDBEQUEwRCxDQUFDLENBQUM7U0FDakY7UUFDRCxNQUFNLFVBQVUsR0FBVyxJQUFJLENBQUMsR0FBRyxRQUFRLElBQUksTUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFFckUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDakIsR0FBRyxJQUFJLENBQUMsUUFBUSxlQUFlLEVBQy9CLElBQUksRUFDSjtZQUNJLE9BQU8sRUFBRSxVQUFVO1lBQ25CLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLGFBQWEsRUFBRSxTQUFTLFVBQVUsRUFBRSxFQUFDLENBQUM7U0FDcEUsQ0FDSjthQUNBLElBQUksQ0FDRCxHQUFHLENBQUMsQ0FBQyxRQUEyQixFQUFFLEVBQUU7UUFDaEMsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLENBQ3ZLLEVBQ0QsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM5QixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUM5QyxDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxhQUFhLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7UUFDbkUsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFFdEMsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLEdBQUcsUUFBUSxJQUFJLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsMEJBQTBCLENBQUM7UUFDckQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUSxFQUFFO1lBQ25DLEdBQUcsSUFBSSxXQUFXLENBQUM7U0FDdEI7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUNqQixHQUFHLEVBQ0gsSUFBSSxFQUNKO1lBQ0ksT0FBTyxFQUFFLFVBQVU7WUFDbkIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxVQUFVLEVBQUUsRUFBRSxDQUFDO1NBQ3BGLENBQ0osQ0FBQyxJQUFJLENBQ0YsR0FBRyxDQUFDLENBQUMsUUFBK0IsRUFBRSxFQUFFO1lBQ3BDLDJDQUEyQztZQUMzQyxNQUFNLEtBQUssR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRSxDQUFDO1lBQzlILElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUMvRCxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FDbEMsQ0FBQztJQUNOLENBQUM7SUFFRDs7O09BR0c7SUFDSyw4QkFBOEI7UUFDbEMsaURBQWlEO1FBQ2pELGdHQUFnRztRQUNoRyw4R0FBOEc7UUFDOUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixpREFBaUQ7UUFDakQsbUlBQW1JO1FBQ25JLGlFQUFpRTtRQUNqRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSyx3QkFBd0I7UUFDNUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDMUIsR0FBRyxDQUFDLENBQUMsSUFBMkIsRUFBRSxFQUFFO1lBQ2hDLG9CQUFvQjtZQUNwQixJQUFJO2dCQUNBLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDM0Y7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQy9EO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUN0QixHQUFHLENBQUMsQ0FBQyxPQUFnQixFQUFFLEVBQUU7WUFDckIsdUJBQXVCO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsdURBQXVEO1lBQ3ZELElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUMvRiwrQ0FBK0M7Z0JBQy9DLElBQUk7b0JBQ0EsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3pEO2dCQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztpQkFDcEY7YUFDSjtRQUNMLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFDOUQsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVPLDZCQUE2QjtRQUNqQyxzRkFBc0Y7UUFDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3hELDJHQUEyRztRQUMzRyx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxrQkFBa0I7UUFDbEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQyxvQkFBb0I7UUFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBaUI7UUFDN0MsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUN6QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU0sR0FBRyxDQUFJLFFBQWdCLEVBQUcsT0FBbUM7UUFDaEUsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQ3JDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNOLENBQUM7SUFFTSxJQUFJLENBQUksUUFBZ0IsRUFBRSxZQUE0QixFQUFFLFNBQThDLEVBQUUsT0FBbUM7UUFDOUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTFDLElBQUksWUFBWSxFQUFFO1lBQ2QsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1NBQy9DO1FBRUQsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ25IO2lCQUFNLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRTtnQkFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNoRDtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQ3JDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDekQsQ0FBQztJQUNOLENBQUM7SUFFTSxVQUFVLENBQUksUUFBZ0IsRUFBRSxJQUFPLEVBQUUsT0FBbUM7UUFDL0UsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQ3JDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUMvQixJQUFJLEVBQ0osRUFBQyxHQUFHLE9BQU8sRUFBQyxDQUNmLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLFdBQVcsQ0FBSSxRQUFnQixFQUFFLElBQU8sRUFBRSxPQUFtQztRQUNoRixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQy9CLElBQUksRUFDSixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FDdEMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FDbEUsQ0FBQztJQUNOLENBQUM7SUFFTSxlQUFlLENBQUksUUFBZ0IsRUFBRSxJQUFPLEVBQUUsY0FBc0IsaUJBQWlCO1FBQ3hGLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQzthQUNwRSxJQUFJLENBQ0QsR0FBRyxDQUFDLENBQUMsR0FBZ0MsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sV0FBVyxHQUFlLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztnQkFDM0QsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsTUFBTSxLQUFLLEdBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hFLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUM7aUJBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxXQUFXLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNQLE1BQU0sSUFBSSxXQUFXLENBQ25CLGlCQUFpQixRQUFRLGtDQUFrQyxFQUMzRCxlQUFlLENBQUMsa0JBQWtCLENBQ25DLENBQUM7YUFDTDtZQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FDTCxDQUFDO0lBQ1YsQ0FBQztJQUVNLGFBQWEsQ0FBSSxRQUFnQixFQUFFLElBQU8sRUFBRSxjQUFzQixpQkFBaUI7UUFDdEYsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDO2FBQ25ELElBQUksQ0FDRCxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUN0RSxDQUFDO0lBQ1YsQ0FBQztJQUVNLFVBQVUsQ0FBSSxRQUFnQixFQUFFLElBQU8sRUFBRSxPQUFtQztRQUMvRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQy9CLElBQUksRUFDSixFQUFFLEdBQUcsT0FBTyxFQUFFLENBQ2pCLENBQUMsQ0FDTCxDQUFDO0lBQ04sQ0FBQztJQUVNLFdBQVcsQ0FBSSxRQUFnQixFQUFFLElBQU8sRUFBRSxPQUFtQztRQUVoRixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQy9CLElBQUksRUFDSixFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FDdEMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FDakUsQ0FBQztJQUNOLENBQUM7SUFFTSxVQUFVLENBQUMsUUFBZ0IsRUFBRSxPQUFtQztRQUNuRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUMzRixDQUFDO0lBQ04sQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFnQixFQUFFLE9BQW1DO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNyQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFDdkcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUNwRSxDQUFDO0lBQ04sQ0FBQztJQUVPLGlCQUFpQixDQUFDLFFBQTJCLEVBQUUsUUFBZ0I7UUFDbkUsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDcEU7YUFBTSxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHFDQUFxQyxDQUFDLEVBQUU7WUFDOUYsTUFBTSxJQUFJLEdBQWEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQjtRQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksV0FBVyxDQUNyQyx3Q0FBd0MsUUFBUSxJQUFJLFFBQVEsQ0FBQyxHQUFHLDZFQUE2RSxFQUMzSSxlQUFlLENBQUMsZUFBZSxDQUNsQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBS00sU0FBUyxDQUFnQyxjQUE0QztRQUN4RixNQUFNLGNBQWMsR0FBMkIsT0FBTyxjQUFjLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxlQUFlLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBYSxHQUFHLElBQUksQ0FBQyxRQUFRLDBCQUEwQixjQUFjLENBQUMsSUFBSSxJQUFJLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXBILE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNyQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQy9CLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2xFLENBQUM7SUFDTixDQUFDO0lBRU0sVUFBVSxDQUFDLElBQWMsRUFBRSxPQUFtQztRQUNqRSxPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FDckMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFXLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDdEUsQ0FBQztJQUNOLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBYztRQUNoQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU0sVUFBVSxDQUFDLElBQWUsRUFBRSxPQUFtQztRQUNsRSxNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksV0FBVyxDQUNyQywwQ0FBMEMsRUFDMUMsZUFBZSxDQUFDLGtCQUFrQixDQUNuQyxDQUFDLENBQUM7U0FDTjtRQUVELE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNyQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQVcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUN6RSxDQUFDO0lBQ04sQ0FBQztJQW1CTSxLQUFLLENBQUksT0FBc0IsRUFBRSxTQUFlLEVBQUUsT0FBbUM7UUFDeEYsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsYUFBYSxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQW1CTSxTQUFTLENBQUksTUFBUyxFQUFFLFNBQWUsRUFBRSxPQUFtQztRQUMvRSxNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUcsTUFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQ3JDLDBDQUEwQyxFQUMxQyxlQUFlLENBQUMsa0JBQWtCLENBQ25DLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxZQUFZLENBQUksTUFBUztRQUM1QixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUcsTUFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBbUJNLFlBQVksQ0FBSSxNQUFTLEVBQUUsU0FBZSxFQUFFLE9BQW1DO1FBQ2xGLE1BQU0sSUFBSSxHQUFhLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRyxNQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVGLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FDckMsNkNBQTZDLEVBQzdDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FDakMsQ0FBQyxDQUFDO1NBQ1I7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLGVBQWUsQ0FBSSxNQUFTO1FBQy9CLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRyxNQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFtQk0sUUFBUSxDQUFJLE1BQVMsRUFBRSxTQUFlLEVBQUUsT0FBbUM7UUFDOUUsTUFBTSxJQUFJLEdBQWEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFHLE1BQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEYsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNQLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksV0FBVyxDQUNyQyx5Q0FBeUMsRUFDekMsZUFBZSxDQUFDLGtCQUFrQixDQUNqQyxDQUFDLENBQUM7U0FDUjtRQUVELE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRU0sV0FBVyxDQUFJLE1BQVM7UUFDM0IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFHLE1BQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQW1CTSxRQUFRLENBQUksTUFBUyxFQUFFLFNBQWUsRUFBRSxPQUFtQztRQUM5RSxNQUFNLElBQUksR0FBYSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUcsTUFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxXQUFXLENBQ3JDLHlDQUF5QyxFQUN6QyxlQUFlLENBQUMsa0JBQWtCLENBQ25DLENBQUMsQ0FBQztTQUNOO1FBRUQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxXQUFXLENBQUksTUFBUztRQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUcsTUFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8sWUFBWSxDQUFJLElBQVksRUFBRSxTQUFlLEVBQUUsT0FBbUM7UUFDdEYsSUFBSSxTQUFTLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNWLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO2FBQ25IO2lCQUFNLElBQUksT0FBTyxFQUFFLE9BQU8sRUFBRTtnQkFDekIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLElBQUksRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQTthQUNoRDtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxJQUFJLENBQ3JDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxJQUFJLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUNOLENBQUM7SUFFSDs7Ozs7T0FLRztJQUNNLGdCQUFnQixDQUFDLElBQWUsRUFBRSxXQUFpQyxFQUFFLGFBQXNCO1FBQzlGLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sUUFBUSxDQUFDLElBQWUsRUFBRSxHQUFXLEVBQUUsSUFBWTtRQUN2RCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNyQixPQUFPLFNBQVMsQ0FBQztTQUNwQjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQixJQUFJLElBQUksRUFBRTtnQkFDTixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO2FBQ3ZEO1lBRUQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxTQUE2QztRQUNyRSxPQUFPLE9BQU8sU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hJLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsSUFBSSxDQUNyQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQzNDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLGVBQWU7UUFDdEIsT0FBTyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxJQUFJLENBQ2pELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FDbkQsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFXLFFBQVE7UUFDZixPQUFPLEtBQUssQ0FDSixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDckIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNuQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMvRCxFQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNiLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNwQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUMxQyxDQUNKLENBQUM7SUFDVixDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ25CLE9BQU8sS0FBSyxDQUNSLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUNyQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQ25DLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQzdELEVBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2IsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQ3BDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQ3pDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3BCLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FDcEgsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsZ0JBQWdCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzVCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNwQyxpREFBaUQ7Z0JBQ2pELElBQUksQ0FBQyw0QkFBNEIsR0FBRyxJQUFJLENBQUMscUJBQXFCO3FCQUN6RCxJQUFJO2dCQUNELG1DQUFtQztnQkFDbkMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO2dCQUM3RSw2Q0FBNkM7Z0JBQzdDLFNBQVMsQ0FBQyxDQUFDLElBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBc0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlGLGtFQUFrRTtnQkFDbEUsR0FBRyxDQUFDLENBQUMsbUJBQXdDLEVBQUUsRUFBRSxDQUFDLG1CQUFtQixJQUFJLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUN2RztxQkFDQSxJQUFJLENBQ0QsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUM1SCxDQUFDO2FBQ1Q7WUFDRCxPQUFPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztRQUM3QyxDQUFDLENBQUM7UUFFRix3REFBd0Q7UUFDeEQsY0FBYyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDcEMscURBQXFEO1FBQ3JELEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xDLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ2xCLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7WUFDRCxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUM7UUFDekYsQ0FBQyxDQUFDLENBQ0wsQ0FBQztJQUNOLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBb0I7UUFDbkMsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdHLENBQUM7SUFFRDs7O09BR0c7SUFDSyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUNyQyxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3BGLENBQUM7O3lHQXB6QlEsWUFBWTs2R0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQXlERSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWVyZ2UsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBmaWx0ZXIsIG1hcCwgc2hhcmUsIHNraXBXaGlsZSwgc3dpdGNoTWFwLCB0YXAsIHdpdGhMYXRlc3RGcm9tfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBBdXRob3JpemVkTG9jYXRpb25UeXBlLFxuICBFbnRpdHlSZWZlcmVuY2VUeXBlLFxuICBFbnRpdHlUeXBlLFxuICBMaW5rVHlwZSxcbiAgUmVzb3VyY2VUeXBlLFxuICBTZXNzaW9uVHlwZSxcbiAgVGFza1R5cGVcbn0gZnJvbSAnQHZjZC9iaW5kaW5ncy92Y2xvdWQvYXBpL3Jlc3Qvc2NoZW1hX3YxXzUnO1xuaW1wb3J0IHtTdXBwb3J0ZWRWZXJzaW9uc1R5cGV9IGZyb20gJ0B2Y2QvYmluZGluZ3MvdmNsb3VkL2FwaS9yZXN0L3NjaGVtYS92ZXJzaW9uaW5nJztcbmltcG9ydCB7QWNjZXNzaWJsZUxvY2F0aW9uLCBBY2Nlc3NpYmxlTG9jYXRpb25zLCBTZXNzaW9ufSBmcm9tICcuLi9vcGVuYXBpJztcbmltcG9ydCB7UXVlcnl9IGZyb20gJy4uL3F1ZXJ5L2luZGV4JztcbmltcG9ydCB7QVBJX1JPT1RfVVJMLCBBdXRoVG9rZW5Ib2xkZXJTZXJ2aWNlLCBTRVNTSU9OX09SR19JRCwgU0VTU0lPTl9TQ09QRX0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbnRhaW5lci1ob29rcyc7XG5pbXBvcnQge1ZjZEh0dHBDbGllbnR9IGZyb20gJy4vdmNkLmh0dHAuY2xpZW50JztcbmltcG9ydCB7VmNkVHJhbnNmZXJDbGllbnR9IGZyb20gJy4vdmNkLnRyYW5zZmVyLmNsaWVudCc7XG5pbXBvcnQge0hUVFBfSEVBREVSU30gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtWY2RTZGtDb25maWd9IGZyb20gXCIuLi8uLi9jb3JlL3BsdWdpbi5tb2R1bGVcIjtcbmltcG9ydCB7Q2xpZW50RXJyb3IsIENsaWVudEVycm9yVHlwZX0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFRSQU5TRkVSX0xJTktfUkVMID0gJ3VwbG9hZDpkZWZhdWx0JztcbmV4cG9ydCB0eXBlIE5hdmlnYWJsZSA9IFJlc291cmNlVHlwZSB8IHsgbGluaz86IExpbmtUeXBlW10gfTtcblxuZXhwb3J0IGNvbnN0IEhBVEVPQVNfSEVBREVSID0gJ0xpbmsnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTp2YXJpYWJsZS1uYW1lXG5cbi8qKlxuICogUGFyc2Ugb3V0IExpbmsgaGVhZGVycyB1c2luZyBhIHZlcnkgbGF6aWx5IGltcGxlbWVudGVkIHB1bGwgcGFyc2VyXG4gKiBAcGFyYW0gaGVhZGVyICc8dXJsMT47bmFtZTE9XCJ2YWx1ZTFcIixuYW1lMj1cInZhbHVlMlwiLDx1cmwyPjtuYW1lMz1cInZhbHVlMyx2YWx1ZTRcIidcbiAqIEByZXR1cm5zIHBhcnNlZCBsaW5rIGhlYWRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlSGVhZGVySGF0ZW9hc0xpbmtzKGhlYWRlcjogc3RyaW5nKTogTGlua1R5cGVbXSB7XG4gICAgY29uc3QgcmVzdWx0czogTGlua1R5cGVbXSA9IFtdO1xuXG4gICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVyRmllbGRNYXBwaW5nczoge1trZXk6IHN0cmluZ106IGtleW9mIExpbmtUeXBlfSA9IHtcbiAgICAgICAgaHJlZjogJ2hyZWYnLFxuICAgICAgICBtb2RlbDogJ3R5cGUnLFxuICAgICAgICB0aXRsZTogJ2lkJyxcbiAgICAgICAgcmVsOiAncmVsJ1xuICAgIH07XG4gICAgbGV0IHRva2VuSW5kZXggPSAtMTtcblxuICAgIGZ1bmN0aW9uIHBlZWsodG9rZW46IHN0cmluZykge1xuICAgICAgICByZXR1cm4gaGVhZGVyLmluZGV4T2YodG9rZW4sIHRva2VuSW5kZXggKyAxKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0KHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbmV4dEluZGV4ID0gcGVlayh0b2tlbik7XG4gICAgICAgIGlmIChuZXh0SW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkoe2hlYWRlciwgdG9rZW4sIHRva2VuSW5kZXh9KSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5JbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgcmV0dXJuIHRva2VuSW5kZXg7XG4gICAgfVxuXG4gICAgd2hpbGUgKHBlZWsoJzwnKSA+IC0xKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBocmVmU3RhcnQgPSBuZXh0KCc8Jyk7XG4gICAgICAgICAgICBjb25zdCBocmVmRW5kID0gbmV4dCgnPicpO1xuICAgICAgICAgICAgY29uc3QgaHJlZiA9IGhlYWRlci5zdWJzdHJpbmcoaHJlZlN0YXJ0ICsgMSwgaHJlZkVuZCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExpbmtUeXBlID0ge2hyZWYsIHR5cGU6IG51bGwsIGlkOiBudWxsLCByZWw6IG51bGwsIHZDbG91ZEV4dGVuc2lvbjogW119O1xuICAgICAgICAgICAgbGV0IGNvbW1hID0gcGVlaygnLCcpO1xuICAgICAgICAgICAgbGV0IHNlbWljb2xvbiA9IHBlZWsoJzsnKTtcbiAgICAgICAgICAgIHdoaWxlICgoc2VtaWNvbG9uID4gLTEgJiYgY29tbWEgPiAtMSAmJiBzZW1pY29sb24gPCBjb21tYSkgfHwgKHNlbWljb2xvbiA+IC0xICYmIGNvbW1hID09PSAtMSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lU3RhcnQgPSBuZXh0KCc7Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUVuZCA9IG5leHQoJz0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaGVhZGVyLnN1YnN0cmluZyhuYW1lU3RhcnQgKyAxLCBuYW1lRW5kKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVN0YXJ0ID0gbmV4dCgnXCInKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUVuZCA9IG5leHQoJ1wiJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKHZhbHVlU3RhcnQgKyAxLCB2YWx1ZUVuZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkTmFtZSA9IGhlYWRlckZpZWxkTWFwcGluZ3NbbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKG1hcHBlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICByZXN1bHRbbWFwcGVkTmFtZV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29tbWEgPSBwZWVrKCcsJyk7XG4gICAgICAgICAgICAgICAgc2VtaWNvbG9uID0gcGVlaygnOycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7ICAvLyBXZSB3aWxsIHRyeSB0aGUgbmV4dCBvbmUuLi5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xufVxuXG5leHBvcnQgZW51bSBMaW5rUmVsVHlwZSB7XG4gICAgYWRkID0gJ2FkZCcsXG4gICAgcmVtb3ZlID0gJ3JlbW92ZScsXG4gICAgZWRpdCA9ICdlZGl0Jyxcbn1cblxuLyoqXG4gKiBBIGJhc2ljIGNsaWVudCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSXMuXG4gKlxuICogQSBWTXdhcmUgQ2xvdWQgRGlyZWN0b3IgcGx1Z2luIGNhbiBnZXQgYSByZWZlcmVuY2UgdG8gdGhpcyBjbGllbnQgYnkgdXNpbmcgYW5ndWxhciBpbmplY3Rpb24uXG4gKiBgYGBcbiAqICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZjZEFwaTogVmNkQXBpQ2xpZW50KSB7fVxuICogYGBgXG4gKlxuICogVmNkQXBpQ2xpZW50IHJldXNlcyB0aGUgYXV0aGVudGljYXRpb24gZnJvbSB0aGUgVkNEIHBsYXRmb3JtIHNvIGluIGdlbmVyYWwgdGhlcmUgaXNcbiAqIG5vIG5lZWQgb2YgYW4gZXhwbGljaXQgYXV0aGVudGljYXRpb24vbG9naW4uXG4gKlxuICogV2hlbiBkZWFsaW5nIHdpdGggdGhlIHNlc3Npb24gbWFuYWdlbWVudCB0aGVyZSBhcmUgdHdvIEFQSXM6XG4gKiAxLiBEZXByZWNhdGVkIGxlZ2FjeSBBUEkgdGhhdCBpcyB1c2luZyB0aGUgYGFwaS9zZXNzaW9uYCBlbmRwb2ludCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWxzXG4gKiAyLiBOZXdseSBhZGRlZCBBUEkgdGhhdCBpcyB1c2luZyB0aGUgYGNsb3VkYXBpYCBlbmRwb2ludCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kZWxzXG4gKlxuICogTm90ZSB0aGF0IGlmIGEgcGx1Z2luIHBlcmZvcm1zIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoZW50aWNhdGlvbiBjYWxsIHRocm91Z2hcbiAqIHtAbGluayBWY2RBcGlDbGllbnQjc2V0Q2xvdWRBcGlBdXRoZW50aWNhdGlvbn0gb3Ige0BsaW5rIFZjZEFwaUNsaWVudCNjbG91ZEFwaUxvZ2lufVxuICogZnJvbSB0aGF0IG1vbWVudCBvbiB0aGUgVmNkQXBpQ2xpZW50IHVzZXMgb25seSBjbG91ZCBhcGkgc2Vzc2lvbiBtYW5hZ2VtZW50LlxuICogVGhpcyBtZWFucyBjYWxscyB0byB7QGxpbmsgVmNkQXBpQ2xpZW50I3NldEF1dGhlbnRpY2F0aW9ufSBvciB7QGxpbmsgVmNkQXBpQ2xpZW50I2xvZ2lufSBoYXZlIG5vIGVmZmVjdC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZjZEFwaUNsaWVudCB7XG4gICAgc2V0IGJhc2VVcmwoX2Jhc2VVcmw6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9iYXNlVXJsID0gX2Jhc2VVcmw7XG4gICAgfVxuXG4gICAgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLnZlcnNpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbmVnb3RpYXRlVmVyc2lvbjogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgIHByaXZhdGUgX2Jhc2VVcmw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVmNkQXBpQ2xpZW50I19jbG91ZEFwaVNlc3Npb259XG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25UeXBlPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvblR5cGU+KG51bGwpO1xuICAgIHByaXZhdGUgX3Nlc3Npb25PYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiA9IHRoaXMuX3Nlc3Npb24uYXNPYnNlcnZhYmxlKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBza2lwV2hpbGUoc2Vzc2lvbiA9PiAhc2Vzc2lvbilcbiAgICAgICAgKTtcbiAgICBwcml2YXRlIF9nZXRTZXNzaW9uOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPjtcblxuICAgIC8qKlxuICAgICAqIENsb3VkQXBpIFNlc3Npb25cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG91ZEFwaVNlc3Npb246IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Vzc2lvbj4obnVsbCk7XG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlTZXNzaW9uT2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxTZXNzaW9uPiA9IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbi5hc09ic2VydmFibGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHNraXBXaGlsZShzZXNzaW9uID0+ICFzZXNzaW9uKVxuICAgICAgICApO1xuICAgIC8qKlxuICAgICAqIFRoaXMgb2JzZXJ2YWJsZSBoYXMgYSBzcGVjaWFsIHB1cnBvc2Ugd2hlbiBkb2luZyBhdXRvbWF0aWMgbG9naW4gZHVyaW5nIHRoZSBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBJdCBhbGxvd3MgYmFja2VuZCBjYWxsIG9ubHkgYWZ0ZXIgYW4gQVBJIHZlcnNpb24gaXMgc2V0LlxuICAgICAqIEl0IGFsc28gZW5zdXJlcyB0aGF0IGEgYmFja2VuZCBjYWxsIHRvIGdldCB0aGUgY3VycmVudCBzZXNzaW9uIGlzIGRvbmUgb25jZSBwcmlvciB0byBhbnkgb3RoZXIgY2FsbHMuXG4gICAgICpcbiAgICAgKiBJbiBjYXNlIG9mIGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBhdXRoIHJlcXVlc3QgdGhlcmUgaXMgbm8gbmVlZCBvZiB0aGlzIG9ic2VydmFibGVcbiAgICAgKiBzaW5jZSB0aGlzIGF1dGggcmVxdWVzdCB3aWxsIHJldHJpZXZlIHRoZSBzZXNzaW9uIGl0c2VsZlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldENsb3VkQXBpU2Vzc2lvbjogT2JzZXJ2YWJsZTxTZXNzaW9uPjtcblxuICAgIHByaXZhdGUgX2Nsb3VkQXBpU2Vzc2lvbkxpbmtzOiBCZWhhdmlvclN1YmplY3Q8TGlua1R5cGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PExpbmtUeXBlW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqIENhY2hlZCwgbGF6eSBsb2FkZWQgb2JzZXJ2YWJsZSBvZiB0aGUgQWNjZXNzaWJsZUxvY2F0aW9uIGFycmF5XG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2xvdWRBcGlBY2Nlc3NpYmxlTG9jYXRpb25zOiBPYnNlcnZhYmxlPEFjY2Vzc2libGVMb2NhdGlvbltdPjtcblxuICAgIC8qKlxuICAgICAqIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyBpZiBpdCBpcyBhbiBleHBsaWNpdCBjbG91ZCBhcGkgbG9naW4uXG4gICAgICogSW4gdGhpcyBjYXNlIHRoZSBvbGQgQVBJICgvYXBpL3Nlc3Npb24pIHNob3VsZCBub3QgYmUgdXNlZCBhdCBhbGwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfaXNDbG91ZEFwaUxvZ2luID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgICAgIHByaXZhdGUgaHR0cDogVmNkSHR0cENsaWVudCxcbiAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb25maWc/OiBWY2RTZGtDb25maWcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSB0aGlzLmluamVjdG9yLmdldChBUElfUk9PVF9VUkwpO1xuXG4gICAgICAgIGxldCBuZWdvdGlhdGVkVmVyc2lvbjogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAgICAgICBpZiAodGhpcy5jb25maWc/LmFwaVZlcnNpb24pIHtcbiAgICAgICAgICAgIG5lZ290aWF0ZWRWZXJzaW9uID0gb2YodGhpcy5jb25maWcuYXBpVmVyc2lvbikucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKHZlcnNpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWZXJzaW9uKHZlcnNpb24pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5lZ290aWF0ZWRWZXJzaW9uID0gdGhpcy5odHRwLmdldDxTdXBwb3J0ZWRWZXJzaW9uc1R5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS92ZXJzaW9uc2ApLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHZlcnNpb25zID0+IHRoaXMubmVnb3RpYXRlVmVyc2lvbih2ZXJzaW9ucykpLFxuICAgICAgICAgICAgICAgIHRhcCh2ZXJzaW9uID0+IHRoaXMuc2V0VmVyc2lvbih2ZXJzaW9uKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbmVnb3RpYXRlVmVyc2lvbiA9IG5lZ290aWF0ZWRWZXJzaW9uLnBpcGUoXG4gICAgICAgICAgICBzaGFyZSh7IGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksIHJlc2V0T25FcnJvcjogZmFsc2UsIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5Ib2xkZXI6IEF1dGhUb2tlbkhvbGRlclNlcnZpY2UgPSB0aGlzLmluamVjdG9yLmdldChBdXRoVG9rZW5Ib2xkZXJTZXJ2aWNlLCB7IHRva2VuOiAnJyB9KTtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbkhvbGRlci5qd3QgPyBgQmVhcmVyICR7dG9rZW5Ib2xkZXIuand0fWAgOiB0b2tlbkhvbGRlci50b2tlbjtcbiAgICAgICAgdGhpcy5fZ2V0U2Vzc2lvbiA9IHRoaXMuc2V0QXV0aGVudGljYXRpb24odG9rZW4pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzaGFyZSh7IGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksIHJlc2V0T25FcnJvcjogZmFsc2UsIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX2dldENsb3VkQXBpU2Vzc2lvbiA9IHRoaXMuc2V0Q2xvdWRBcGlBdXRoZW50aWNhdGlvbih0b2tlbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGFuIGV4cGxpY2l0IGNsb3VkIGFwaSBsb2dpblxuICAgICAgICB0aGlzLl9pc0Nsb3VkQXBpTG9naW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG5lZ290aWF0ZVZlcnNpb24oc2VydmVyVmVyc2lvbnM6IFN1cHBvcnRlZFZlcnNpb25zVHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnRlZFZlcnNpb25zOiBzdHJpbmdbXSA9IHNlcnZlclZlcnNpb25zLnZlcnNpb25JbmZvLm1hcCh2ZXJzaW9uSW5mbyA9PiB2ZXJzaW9uSW5mby52ZXJzaW9uKTtcblxuICAgICAgICAvLyBEZWZhdWx0IEFQSSBWZXJzaW9uIHVzZWQgaXMgdGhlIExhdGVzdCBBUEkgVmVyc2lvbiBpbiBWTXdhcmUgQ2xvdWQgRGlyZWN0b3JcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFZlcnNpb25zW3N1cHBvcnRlZFZlcnNpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gZW5zdXJlIHRoYXQgcHJpb3IgdG8gc2VuZGluZyBhbnkgY2FsbCB0byB0aGUgYmFja2VuZFxuICAgICAqIHRoZSB2ZXJzaW9uIGhhcyBiZWVuIHNldCBhbmQgdGhlIGN1cnJlbnQgc2Vzc2lvbiBoYXMgYmVlbiByZXRyaWV2ZWQuXG4gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgaW1wb3J0YW50IGR1cmluZyB0aGUgYXV0b21hdGljIGF1dGhlbnRpY2F0aW9uIHRoYXQgaXMgZG9uZSBkdXJpbmcgdGhlXG4gICAgICogY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24sIHdoZW4gdGhlIHBsdWdpbiBpcyBub3QgcmVxdWlyZWQgdG8gcGVyZm9ybSBpdHMgb3duIGV4cGxpY2l0IGF1dGhlbnRpY2F0aW9uXG4gICAgICogYnV0IHJhdGhlciB0aGUgb25lcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGZyYW1ld29yayBpcyB1c2VkLlxuICAgICAqL1xuICAgIHByaXZhdGUgdmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpOiBPYnNlcnZhYmxlPHRydWU+IHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnZlcnNpb24gPyBvZih0aGlzLnZlcnNpb24pIDogdGhpcy5fbmVnb3RpYXRlVmVyc2lvbilcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgYSBjbG91ZCBhcGkgbG9naW4gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSAvYXBpL3Nlc3Npb24gc2Vzc2lvblxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4gPyBvZihudWxsKSA6IHRoaXMuX2dldFNlc3Npb24pLFxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBjbG91ZCBhcGkgZmFpbHVyZSB3ZSBkbyBub3Qgd2FudCB0byBwcmV2ZW50IGZ1cnRoZXIgZXhlY3V0aW9uXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNvbnNpZGVyYXRpb25zIHNpbmNlIHRoaXMgbWF5IGJlIGEgY2FzZVxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIGNsb3VkIGFwaSBpcyBub3Qgc3VwcG9ydGVkIGF0IGFsbCBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGUpID0+IG9mKHRydWUpKSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBGb3IgdXNlIGNhc2VzIHdpY2ggc29sZWx5IGRlcGVuZHMgb24gY2xvdWRhcGkgd2l0aG91dCBhbnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAqIHRoZXJlIHNob3VsZCBiZSBubyBkZXBlbmRlbmNlIG9uIHRoZSBvbGQgL2FwaSBlbmRwb2ludCBhdCBhbGxcbiAgICAgKi9cbiAgICBwcml2YXRlIHZhbGlkYXRlUmVxdWVzdENvbnRleHRDbG91ZEFwaU9ubHkoKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHJldHVybiAodGhpcy52ZXJzaW9uID8gb2YodGhpcy52ZXJzaW9uKSA6IHRoaXMuX25lZ290aWF0ZVZlcnNpb24pLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRWZXJzaW9uKF92ZXJzaW9uOiBzdHJpbmcpOiBWY2RBcGlDbGllbnQge1xuICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci52ZXJzaW9uID0gX3ZlcnNpb247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgc2VydmljZSwgdGhhdCBhbGxvd3MgYSBwcm92aWRlciB1c2VyIHRvIGV4ZWN1dGUgQVBJIHJlcXVlc3RzXG4gICAgICogaW4gdGhlIHNjb3BlIG9mIGEgc3BlY2lmaWMgdGVuYW50LlxuICAgICAqXG4gICAgICogSWYgeW91IHdhbnQgdG8gZXhlY3V0ZSBzaW5nbGUgQVBJIHJlcXVlc3QgaW4gc2NvcGUgb2Ygc3BlY2lmaWMgdGVuYW50IHlvdSBjYW4gZG8gaXRcbiAgICAgKiBieSBwYXNzaW5nIFwiWC1WTVdBUkUtVkNMT1VELVRFTkFOVC1DT05URVhUXCIgaGVhZGVyIHRvIHRoZSBzcGVjaWZpYyBBUEkgUmVxdWVzdC5cbiAgICAgKlxuICAgICAqIFRoaXMgc2NvcGluZyBpcyBhdmFpbGFibGUgdG8gcXVlcnktYmFzZWQgQVBJIGNhbGxzIGFuZCB0byBidWxrIEdFVCBjYWxscyBpbiB0aGVcbiAgICAgKiAvY2xvdWRhcGkgc3BhY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0QXMgYW4gZW50aXR5UmVmIG9mIHRoZSB0ZW5hbnQgKG9yZ2FuaXphdGlvbikgdG8gc2NvcGUgc3Vic2VxdWVudCBjYWxscyB0byBpblxuICAgICAqICB0aGUgVmNkQXBpQ2xpZW50LCBvciBudWxsL25vIHBhcmFtZXRlciB0byByZW1vdmUgdGVuYW50LXNwZWNpZmljIHNjb3BpbmdcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBWY2RBcGlDbGllbnQgaW5zdGFuY2UgKGZvciBjaGFpbmluZylcbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0QXMoYWN0QXM6IEVudGl0eVJlZmVyZW5jZVR5cGUgPSBudWxsKTogVmNkQXBpQ2xpZW50IHtcbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYWN0QXMgPSAhYWN0QXMgPyBudWxsIDogYWN0QXMuaWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgVmNkQXBpQ2xpZW50I3NldENsb3VkQXBpQXV0aGVudGljYXRpb259XG4gICAgICpcbiAgICAgKiBTZXRzIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiB0byB1c2UgZm9yIHRoZSBWY2RBcGlDbGllbnQuXG4gICAgICpcbiAgICAgKiBBZnRlciBzZXR0aW5nIHRoZSB0b2tlbiwgdGhlIGNsaWVudCB3aWxsIGdldCB0aGUgY3VycmVudCBzZXNzaW9uXG4gICAgICogaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGVkIHRva2VuLlxuICAgICAqXG4gICAgICogQHBhcmFtIGF1dGhlbnRpY2F0aW9uIHRoZSBhdXRoZW50aWNhdGlvbiBzdHJpbmcgKHRvIGJlIHVzZWQgaW4gZWl0aGVyIHRoZSAnQXV0aG9yaXphdGlvbidcbiAgICAgKiAgb3IgJ3gtdmNsb3VkLWF1dGhvcml6YXRpb24nIGhlYWRlcilcbiAgICAgKiBAcmV0dXJucyB0aGUgc2Vzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF1dGhlbnRpY2F0aW9uIHRva2VuXG4gICAgICovXG4gICAgcHVibGljIHNldEF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb25UeXBlPiB7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nsb3VkQXBpTG9naW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdPbmx5IGNsb3VkIGFwaSBhdXRoIGlzIGFsbG93ZWQgc2luY2UgaXQgd2FzIGFscmVhZHkgdXNlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5odHRwLnJlcXVlc3RIZWFkZXJzSW50ZXJjZXB0b3IuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U2Vzc2lvblR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uYCkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoc2Vzc2lvbiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgc2V0IGFjdEFzIGZvciBwcm92aWRlciBpbiB0ZW5hbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnID09PSAnU3lzdGVtJyAmJiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX1NDT1BFKSA9PT0gJ3RlbmFudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1dG9tYXRpYyBhY3RBcyBvbmx5IHdvcmtzIGluIHZlcnNpb25zID49OS41XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0QXMoe2lkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCl9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIFNFU1NJT05fT1JHX0lEIHNldCBpbiBjb250YWluZXIuIEF1dG9tYXRpYyBhY3RBcyBpcyBkaXNhYmxlZC4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIGZvciB0aGUgVmNkQXBpQ2xpZW50LlxuICAgICAqXG4gICAgICogQWZ0ZXIgc2V0dGluZyB0aGUgdG9rZW4sIHRoZSBjbGllbnQgd2lsbCBnZXQgdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXV0aGVudGljYXRlZCB0b2tlbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhdXRoZW50aWNhdGlvbiB0aGUgYXV0aGVudGljYXRpb24gc3RyaW5nICh0byBiZSB1c2VkIGluIGVpdGhlciB0aGUgJ0F1dGhvcml6YXRpb24nXG4gICAgICogIG9yICd4LXZjbG91ZC1hdXRob3JpemF0aW9uJyBoZWFkZXIpXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBzZXNzaW9uIG9ic2VydmFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdXRoZW50aWNhdGlvbiB0b2tlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKGF1dGhlbnRpY2F0aW9uOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgdGhpcy5vbkJlZm9yZUNsb3VkQXBpQXV0aGVudGljYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gb2YodHJ1ZSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgYXV0aGVudGljYXRpb24gYXMgcGFydCBvZiB0aGUgb2JzZXJ2YWJsZSBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGNhbGxlciBoYXMgc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGF1dGhlbnRpY2F0aW9uKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxTZXNzaW9uPihgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9ucy9jdXJyZW50YCwgeyBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRoaXMub25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uKClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGVuYWJsZUxvZ2dpbmcoKTogVmNkQXBpQ2xpZW50IHtcbiAgICAgICAgdGhpcy5odHRwLmxvZ2dpbmdJbnRlcmNlcHRvci5lbmFibGVkID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFZjZEFwaUNsaWVudCNjbG91ZEFwaUxvZ2lufVxuICAgICAqXG4gICAgICogQ3JlYXRlcyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbCBkYXRhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCB0ZW5hbnQ6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ2xvdWRBcGlMb2dpbikge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ09ubHkgY2xvdWQgYXBpIGF1dGggaXMgYWxsb3dlZCBzaW5jZSBpdCB3YXMgYWxyZWFkeSB1c2VkJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFNlc3Npb25UeXBlPihcbiAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9zZXNzaW9uc2AsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgQXV0aG9yaXphdGlvbjogYEJhc2ljICR7YXV0aFN0cmluZ31gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxhbnk+KSA9PlxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5KSxcbiAgICAgICAgICAgIHRhcChzZXNzaW9uID0+IHRoaXMuX3Nlc3Npb24ubmV4dChzZXNzaW9uKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGF1dGhlbnRpY2F0ZWQgc2Vzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCBjcmVkZW50aWFsIGRhdGEgdXNpbmcgY2xvdWQgYXBpIGVuZHBvaW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSB1c2VyIHRvIGF1dGhlbnRpY2F0ZVxuICAgICAqIEBwYXJhbSB0ZW5hbnQgdGhlIG9yZ2FuaXphdGlvbiB0aGUgdXNlciBiZWxvbmdzIHRvXG4gICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXJcbiAgICAgKiBAcmV0dXJucyBhbiBhdXRoZW50aWNhdGVkIHNlc3Npb24gZm9yIHRoZSBnaXZlbiBjcmVkZW50aWFsc1xuICAgICAqL1xuICAgIHB1YmxpYyBjbG91ZEFwaUxvZ2luKHVzZXJuYW1lOiBzdHJpbmcsIHRlbmFudDogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxTZXNzaW9uPiB7XG4gICAgICAgIHRoaXMub25CZWZvcmVDbG91ZEFwaUF1dGhlbnRpY2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgYXV0aFN0cmluZzogc3RyaW5nID0gYnRvYShgJHt1c2VybmFtZX1AJHt0ZW5hbnR9OiR7cGFzc3dvcmR9YCk7XG4gICAgICAgIGxldCB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jbG91ZGFwaS8xLjAuMC9zZXNzaW9uc2A7XG4gICAgICAgIGlmICh0ZW5hbnQudG9Mb3dlckNhc2UoKSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgICAgIHVybCArPSAnL3Byb3ZpZGVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8U2Vzc2lvbj4oXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHsgW0hUVFBfSEVBREVSUy5BdXRob3JpemF0aW9uXTogYEJhc2ljICR7YXV0aFN0cmluZ31gIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcCgocmVzcG9uc2U6IEh0dHBSZXNwb25zZTxTZXNzaW9uPikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IGAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtdG9rZW4tdHlwZScpfSAke3Jlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXZtd2FyZS12Y2xvdWQtYWNjZXNzLXRva2VuJyl9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAucmVxdWVzdEhlYWRlcnNJbnRlcmNlcHRvci5hdXRoZW50aWNhdGlvbiA9IHRva2VuO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSXQgaXMgbmVjZXNzYXJ5IHRvIGtub3cgaWYgYW4gZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3YXMgZG9uZS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZsYWdzLCBwcm9wZXJ0aWVzIGV0Yy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQmVmb3JlQ2xvdWRBcGlBdXRoZW50aWNhdGlvbigpIHtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBTZXQgdGhlIGZsYWcgX2lzQ2xvdWRBcGlMb2dpbiBpbiBvcmRlciB0byBrbm93IHRoYXQgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmVcbiAgICAgICAgLy8gVGhpcyB3aWxsIGhlbHAgdXMgc2tpcCBjb2RlIHJlbGF0ZWQgdG8gdGhlIG9sZCBhcGksIGkuZS4gd2Ugc2hvdWxkIG5vdCBhbGxvdyBleHBsaWNpdCBtaXggb2YgYm90aCB0aGUgYXBpLXNcbiAgICAgICAgdGhpcy5faXNDbG91ZEFwaUxvZ2luID0gdHJ1ZTtcbiAgICAgICAgLy8gSW4gY2FzZSBvZiBhbiBleHBsaWNpdCBjbG91ZCBhcGkgYXV0aCByZXF1ZXN0OlxuICAgICAgICAvLyBUaGVyZSBpcyBubyBuZWVkIG9mIF9nZXRDbG91ZEFwaVNlc3Npb24gb2JzZXJ2YWJsZSB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIGF1dG9tYXRpYyBsb2dpbiBkdXJpbmcgdGhlIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uLlxuICAgICAgICAvLyBUaGUgZXhwbGljaXQgY2xvdWQgYXBpIGF1dGggcmVxdWVzdCB3aWxsIHJldHJpZXZlIHRoZSBzZXNzaW9uLlxuICAgICAgICB0aGlzLl9nZXRDbG91ZEFwaVNlc3Npb24gPSBvZihudWxsKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYXV0aGVudGljYXRpb24uXG4gICAgICogVGhpcyBpbmNsdWRlcyBnZXR0aW5nIEhBVEVPQVMgbGlua3MsIHNldHRpbmcgdGhlIHNlc3Npb24sIGhhbmRsaW5nIGVycm9ycyBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkNsb3VkQXBpQXV0aGVudGljYXRpb24oKTogKHNvdXJjZTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8U2Vzc2lvbj4+KSA9PiBPYnNlcnZhYmxlPFNlc3Npb24+IHtcbiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5waXBlKFxuICAgICAgICAgICAgdGFwKChyZXNwOiBIdHRwUmVzcG9uc2U8U2Vzc2lvbj4pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgSEFURU9BUyBsaW5rc1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xvdWRBcGlTZXNzaW9uTGlua3MocGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzcC5oZWFkZXJzLmdldChIQVRFT0FTX0hFQURFUikpKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGVuIHBhcnNpbmcgc2Vzc2lvbiBIQVRFT0FTIGxpbmtzOicsIGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKHJlc3AgPT4gcmVzcC5ib2R5KSxcbiAgICAgICAgICAgIHRhcCgoc2Vzc2lvbjogU2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzIGFjdEFzXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RBcyhudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IHNldCBhY3RBcyBmb3IgcHJvdmlkZXIgaW4gdGVuYW50IHNjb3BlXG4gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUgPT09ICdTeXN0ZW0nICYmIHRoaXMuaW5qZWN0b3IuZ2V0KFNFU1NJT05fU0NPUEUpID09PSAndGVuYW50Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBBdXRvbWF0aWMgYWN0QXMgb25seSB3b3JrcyBpbiB2ZXJzaW9ucyA+PTkuNVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RBcyh7IGlkOiB0aGlzLmluamVjdG9yLmdldChTRVNTSU9OX09SR19JRCkgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTm8gU0VTU0lPTl9PUkdfSUQgc2V0IGluIGNvbnRhaW5lci4gQXV0b21hdGljIGFjdEFzIGlzIGRpc2FibGVkLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKHNlc3Npb246IFNlc3Npb24pID0+IHRoaXMuX2Nsb3VkQXBpU2Vzc2lvbi5uZXh0KHNlc3Npb24pKSxcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2xvdWRBcGlBdXRoZW50aWNhdGlvbkVycm9yKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25DbG91ZEFwaUF1dGhlbnRpY2F0aW9uRXJyb3IoKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSBhdXRoZW50aWNhdGlvbiBzbyB0aGF0IGFueSBzdWJzZXF1ZW50IGJhY2tlbmQgY2FsbHMgYXJlIG5vdCBhdXRoZW50aWNhdGVkXG4gICAgICAgIHRoaXMuaHR0cC5yZXF1ZXN0SGVhZGVyc0ludGVyY2VwdG9yLmF1dGhlbnRpY2F0aW9uID0gJyc7XG4gICAgICAgIC8vIF9nZXRDbG91ZEFwaVNlc3Npb24gaXMgaW4gdGhlIGNlbnRlciBvZiBhbnkgYmFja2VuZCBjYWxsLCBudWxsaWZ5IGl0IGluIG9yZGVyIG5vdCB0byBwcmV2ZW50IHRob3NlIGNhbGxzXG4gICAgICAgIC8vIHNpbmNlIGl0IGlzIGVhc2llciB0byB0cm91Ymxlc2hvb3QgZmFpbGluZyBiYWNrZW5kIHJhdGhlciB0aGFuIG5vIGNhbGxcbiAgICAgICAgdGhpcy5fZ2V0Q2xvdWRBcGlTZXNzaW9uID0gb2YobnVsbCk7XG4gICAgICAgIC8vIENsZWFyIHRoZSBsaW5rc1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KFtdKTtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb25cbiAgICAgICAgdGhpcy5fY2xvdWRBcGlTZXNzaW9uLm5leHQobnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDbG91ZEFwaVNlc3Npb25MaW5rcyhsaW5rczogTGlua1R5cGVbXSkge1xuICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSBudWxsO1xuICAgICAgICB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rcy5uZXh0KGxpbmtzIHx8IFtdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0PFQ+KGVuZHBvaW50OiBzdHJpbmcsICBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsuLi5vcHRpb25zfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgcXVlcnlCdWlsZGVyPzogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCk7XG5cbiAgICAgICAgaWYgKHF1ZXJ5QnVpbGRlcikge1xuICAgICAgICAgICAgdXJsID0gYCR7dXJsfSR7cXVlcnlCdWlsZGVyLmdldENsb3VkQVBJKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtdWx0aXNpdGUpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uaGVhZGVycykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVycy5hcHBlbmQoXCJfbXVsdGlzaXRlXCIsIHRoaXMucGFyc2VNdWx0aXNpdGVWYWx1ZShtdWx0aXNpdGUpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgLi4ub3B0aW9ucyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5nZXQ8VD4odXJsLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZVN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnBvc3Q8VD4oXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSxcbiAgICAgICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgICAgIHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5wb3N0KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMsIG9ic2VydmU6ICdyZXNwb25zZScgfVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb25jYXRNYXAocmVzcG9uc2UgPT4gdGhpcy5tYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZSwgJ1BPU1QnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhbnNmZXJMaW5rPFQ+KGVuZHBvaW50OiBzdHJpbmcsIGl0ZW06IFQsIHRyYW5zZmVyUmVsOiBzdHJpbmcgPSBUUkFOU0ZFUl9MSU5LX1JFTCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAgIC5wb3N0KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIGl0ZW0sIHsgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChyZXM6IEh0dHBSZXNwb25zZTxUICYgTmF2aWdhYmxlPikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJMaW5rczogTGlua1R5cGVbXSA9IHJlcy5oZWFkZXJzLmhhcyhIQVRFT0FTX0hFQURFUilcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VIZWFkZXJIYXRlb2FzTGlua3MocmVzLmhlYWRlcnMuZ2V0KEhBVEVPQVNfSEVBREVSKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtzOiBMaW5rVHlwZVtdID0gcmVzLmJvZHkgPyAocmVzLmJvZHkubGluayB8fCBbXSkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluayA9IFsuLi5oZWFkZXJMaW5rcywgLi4ubGlua3NdXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgobCkgPT4gbC5yZWwgPT09IHRyYW5zZmVyUmVsKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2xpZW50RXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGBSZXNwb25zZSBmcm9tICR7ZW5kcG9pbnR9IGRpZCBub3QgY29udGFpbiBhIHRyYW5zZmVyIGxpbmtgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5rLmhyZWY7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXJ0VHJhbnNmZXI8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgdHJhbnNmZXJSZWw6IHN0cmluZyA9IFRSQU5TRkVSX0xJTktfUkVMKTogT2JzZXJ2YWJsZTxWY2RUcmFuc2ZlckNsaWVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2ZlckxpbmsoZW5kcG9pbnQsIGl0ZW0sIHRyYW5zZmVyUmVsKVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh0cmFuc2ZlclVybCkgPT4gbmV3IFZjZFRyYW5zZmVyQ2xpZW50KHRoaXMuaHR0cCwgdHJhbnNmZXJVcmwpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlU3luYzxUPihlbmRwb2ludDogc3RyaW5nLCBpdGVtOiBULCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAucHV0PFQ+KFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksXG4gICAgICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgICAgICB7IC4uLm9wdGlvbnMgfVxuICAgICAgICAgICAgKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlQXN5bmM8VD4oZW5kcG9pbnQ6IHN0cmluZywgaXRlbTogVCwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLnB1dChcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQpLFxuICAgICAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICAgICAgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH1cbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgY29uY2F0TWFwKHJlc3BvbnNlID0+IHRoaXMubWFwUmVzcG9uc2VUb1Rhc2socmVzcG9uc2UsICdQVVQnKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlU3luYyhlbmRwb2ludDogc3RyaW5nLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZGVsZXRlPHZvaWQ+KHRoaXMuYnVpbGRFbmRwb2ludFVybChlbmRwb2ludCksIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVsZXRlQXN5bmMoZW5kcG9pbnQ6IHN0cmluZywgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGUodGhpcy5idWlsZEVuZHBvaW50VXJsKGVuZHBvaW50KSwgeyAuLi5vcHRpb25zLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pKSxcbiAgICAgICAgICAgIGNvbmNhdE1hcChyZXNwb25zZSA9PiB0aGlzLm1hcFJlc3BvbnNlVG9UYXNrKHJlc3BvbnNlLCAnREVMRVRFJykpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYXBSZXNwb25zZVRvVGFzayhyZXNwb25zZTogSHR0cFJlc3BvbnNlPGFueT4sIGh0dHBWZXJiOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRhc2tUeXBlPiB7XG4gICAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzLmhhcygnTG9jYXRpb24nKSAmJiByZXNwb25zZS5zdGF0dXMgPT09IDIwMikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VGFza1R5cGU+KHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdMb2NhdGlvbicpKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5ib2R5ICYmIHJlc3BvbnNlLmJvZHkudHlwZS5zdGFydHNXaXRoKCdhcHBsaWNhdGlvbi92bmQudm13YXJlLnZjbG91ZC50YXNrKycpKSB7XG4gICAgICAgICAgICBjb25zdCB0YXNrOiBUYXNrVHlwZSA9IE9iamVjdC5hc3NpZ24obmV3IFRhc2tUeXBlKCksIHJlc3BvbnNlLmJvZHkpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRhc2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgIGBBbiBhc3luY2hyb25vdXMgcmVxdWVzdCB3YXMgbWFkZSB0byBbJHtodHRwVmVyYn0gJHtyZXNwb25zZS51cmx9XSwgYnV0IG5vIHRhc2sgd2FzIHJldHVybmVkLiAgVGhlIG9wZXJhdGlvbiBtYXkgc3RpbGwgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWwuYCxcbiAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5UYXNrTGlua01pc3NpbmdcbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4oZW50aXR5UmVmOiBFbnRpdHlSZWZlcmVuY2VUeXBlKTogT2JzZXJ2YWJsZTxUPjtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGdldEVudGl0eTxUIGV4dGVuZHMgRW50aXR5UmVmZXJlbmNlVHlwZT4odXJuOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBnZXRFbnRpdHk8VCBleHRlbmRzIEVudGl0eVJlZmVyZW5jZVR5cGU+KGVudGl0eVJlZk9yVXJuOiBFbnRpdHlSZWZlcmVuY2VUeXBlIHwgc3RyaW5nKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGVudGl0eVJlc29sdmVyOiBPYnNlcnZhYmxlPEVudGl0eVR5cGU+ID0gdHlwZW9mIGVudGl0eVJlZk9yVXJuID09PSAnc3RyaW5nJyA/XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvJHtlbnRpdHlSZWZPclVybn1gKSA6XG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEVudGl0eVR5cGU+KGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9lbnRpdHkvdXJuOnZjbG91ZDoke2VudGl0eVJlZk9yVXJuLnR5cGV9OiR7ZW50aXR5UmVmT3JVcm4uaWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gZW50aXR5UmVzb2x2ZXIpLFxuICAgICAgICAgICAgY29uY2F0TWFwKGVudGl0eSA9PiB0aGlzLmh0dHAuZ2V0PFQ+KGAke2VudGl0eS5saW5rWzBdLmhyZWZ9YCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZVRhc2sodGFzazogVGFza1R5cGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLmh0dHAuZ2V0PFRhc2tUeXBlPih0YXNrLmhyZWYsIHsgLi4ub3B0aW9ucyB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUYXNrQ29tcGxldGUodGFzazogVGFza1R5cGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIFsnc3VjY2VzcycsICdlcnJvcicsICdjYW5jZWxlZCcsICdhYm9ydGVkJ10uaW5kZXhPZih0YXNrLnN0YXR1cykgPiAtMTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlSXRlbShpdGVtOiBOYXZpZ2FibGUsIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUYXNrVHlwZT4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsoaXRlbSwgJ3JlbW92ZScsIG51bGwpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdyZW1vdmUnIGxpbmsgZm9yIHNwZWNpZmllZCByZXNvdXJjZS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlUmVxdWVzdENvbnRleHQoKS5waXBlKFxuICAgICAgICAgICAgY29uY2F0TWFwKCgpID0+IHRoaXMuaHR0cC5kZWxldGU8VGFza1R5cGU+KGxpbmsuaHJlZiwgeyAuLi5vcHRpb25zIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBRdWVyeS5CdWlsZGVyIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1aWxkZXIgQW4gZGVmaW5pdGlvbiBvZiB0aGUgcXVlcnkgdG8gY29uc3RydWN0ICh0eXBlLCBmaWx0ZXIsIHBhZ2Ugc2l6ZSwgZXRjLilcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBxdWVyeTxUPihidWlsZGVyOiBRdWVyeS5CdWlsZGVyLCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIFF1ZXJ5LkJ1aWxkZXIgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYnVpbGRlciBBbiBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSB0byBjb25zdHJ1Y3QgKHR5cGUsIGZpbHRlciwgcGFnZSBzaXplLCBldGMuKVxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyBhIHF1ZXJ5IHJlc3VsdCBmb3IgdGhlIHNwZWNpZmllZCBxdWVyeVxuICAgICAqL1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp1bmlmaWVkLXNpZ25hdHVyZXNcbiAgICBwdWJsaWMgcXVlcnk8VD4oYnVpbGRlcjogUXVlcnkuQnVpbGRlciwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIHF1ZXJ5PFQ+KGJ1aWxkZXI6IFF1ZXJ5LkJ1aWxkZXIsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UXVlcnlQYWdlKGAke3RoaXMuX2Jhc2VVcmx9L2FwaS9xdWVyeSR7YnVpbGRlci5nZXQoKX1gLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gZmFuIHRoZSBxdWVyeSBvdXQgdG8gYWxsIGF2YWlsYWJsZSBzaXRlc1xuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYm9vbGVhbiwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBwcm92aWRlZCByZXN1bHQgc2V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCB0aGUgcmVzdWx0IHNldCB0byByZXRyaWV2ZSB0aGUgZmlyc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHF1ZXJ5XG4gICAgICovXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnVuaWZpZWQtc2lnbmF0dXJlc1xuICAgIHB1YmxpYyBmaXJzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBBdXRob3JpemVkTG9jYXRpb25UeXBlW10sIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPjtcbiAgICBwdWJsaWMgZmlyc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnZmlyc3RQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgICAgICBpZiAoIWxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBDbGllbnRFcnJvcihcbiAgICAgICAgICAgICAgYE5vICdmaXJzdFBhZ2UnIGxpbmsgZm9yIHNwZWNpZmllZCBxdWVyeS5gLFxuICAgICAgICAgICAgICBDbGllbnRFcnJvclR5cGUuSGF0ZW9hc0xpbmtNaXNzaW5nXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZShsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0ZpcnN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdmaXJzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBmYW4gdGhlIHF1ZXJ5IG91dCB0byBhbGwgYXZhaWxhYmxlIHNpdGVzXG4gICAgICogQHJldHVybnMgdGhlIHJlY29yZHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBxdWVyeVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIHByZXZpb3VzIHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBwcmV2aW91cyBwYWdlIG9mIHJlY29yZHMgZm9yXG4gICAgICogQHBhcmFtIG11bHRpc2l0ZSB0aGUgc2V0IG9mIHNpdGUgbG9jYXRpb25zIHRvIGluY2x1ZGUgaW4gdGhlIHF1ZXJ5IGZhbm91dFxuICAgICAqIEByZXR1cm5zIHRoZSByZWNvcmRzIGZvciB0aGUgcHJldmlvdXMgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIHByZXZpb3VzUGFnZTxUPihyZXN1bHQ6IFQsIG11bHRpc2l0ZT86IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+O1xuICAgIHB1YmxpYyBwcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBhbnksIG9wdGlvbnM/OiB7IGhlYWRlcnM/OiBIdHRwSGVhZGVycyB9KTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGNvbnN0IGxpbms6IExpbmtUeXBlID0gdGhpcy5maW5kTGluayhyZXN1bHQsICdwcmV2aW91c1BhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ3ByZXZpb3VzUGFnZScgbGluayBmb3Igc3BlY2lmaWVkIHF1ZXJ5LmAsXG4gICAgICAgICAgICAgIENsaWVudEVycm9yVHlwZS5IYXRlb2FzTGlua01pc3NpbmdcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQcmV2aW91c1BhZ2U8VD4ocmVzdWx0OiBUKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmluZExpbmsocmVzdWx0LCAncHJldmlvdXNQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBuZXh0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIG5leHQgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIG5leHQgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIG5leHRQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbmV4dFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ25leHRQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5UGFnZTxUPihsaW5rLmhyZWYsIG11bHRpc2l0ZSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc05leHRQYWdlPFQ+KHJlc3VsdDogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKHJlc3VsdCwgJ25leHRQYWdlJywgKHJlc3VsdCBhcyBSZXNvdXJjZVR5cGUpLnR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFF1ZXJpZXMgdGhlIFZNd2FyZSBDbG91ZCBEaXJlY3RvciBBUEkgZm9yIHRoZSBsYXN0IHBhZ2Ugb2YgdGhlIHByb3ZpZGVkIHJlc3VsdCBzZXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgc2V0IHRvIHJldHJpZXZlIHRoZSBsYXN0IHBhZ2Ugb2YgcmVjb3JkcyBmb3JcbiAgICAgKiBAcGFyYW0gbXVsdGlzaXRlIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRvIGZhbiB0aGUgcXVlcnkgb3V0IHRvIGFsbCBhdmFpbGFibGUgc2l0ZXNcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGFzdFBhZ2U8VD4ocmVzdWx0OiBULCBtdWx0aXNpdGU/OiBib29sZWFuLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgLyoqXG4gICAgICogUXVlcmllcyB0aGUgVk13YXJlIENsb3VkIERpcmVjdG9yIEFQSSBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcHJvdmlkZWQgcmVzdWx0IHNldC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQgdGhlIHJlc3VsdCBzZXQgdG8gcmV0cmlldmUgdGhlIGxhc3QgcGFnZSBvZiByZWNvcmRzIGZvclxuICAgICAqIEBwYXJhbSBtdWx0aXNpdGUgdGhlIHNldCBvZiBzaXRlIGxvY2F0aW9ucyB0byBpbmNsdWRlIGluIHRoZSBxdWVyeSBmYW5vdXRcbiAgICAgKiBAcmV0dXJucyB0aGUgcmVjb3JkcyBmb3IgdGhlIGxhc3QgcGFnZSBvZiB0aGUgcXVlcnlcbiAgICAgKi9cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dW5pZmllZC1zaWduYXR1cmVzXG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogQXV0aG9yaXplZExvY2F0aW9uVHlwZVtdLCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD47XG4gICAgcHVibGljIGxhc3RQYWdlPFQ+KHJlc3VsdDogVCwgbXVsdGlzaXRlPzogYW55LCBvcHRpb25zPzogeyBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfSk6IE9ic2VydmFibGU8VD4ge1xuICAgICAgICBjb25zdCBsaW5rOiBMaW5rVHlwZSA9IHRoaXMuZmluZExpbmsocmVzdWx0LCAnbGFzdFBhZ2UnLCAocmVzdWx0IGFzIFJlc291cmNlVHlwZSkudHlwZSk7XG4gICAgICAgIGlmICghbGluaykge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IENsaWVudEVycm9yKFxuICAgICAgICAgICAgICBgTm8gJ2xhc3RQYWdlJyBsaW5rIGZvciBzcGVjaWZpZWQgcXVlcnkuYCxcbiAgICAgICAgICAgICAgQ2xpZW50RXJyb3JUeXBlLkhhdGVvYXNMaW5rTWlzc2luZ1xuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVBhZ2UobGluay5ocmVmLCBtdWx0aXNpdGUsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNMYXN0UGFnZTxUPihyZXN1bHQ6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maW5kTGluayhyZXN1bHQsICdsYXN0UGFnZScsIChyZXN1bHQgYXMgUmVzb3VyY2VUeXBlKS50eXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFF1ZXJ5UGFnZTxUPihocmVmOiBzdHJpbmcsIG11bHRpc2l0ZT86IGFueSwgb3B0aW9ucz86IHsgaGVhZGVycz86IEh0dHBIZWFkZXJzIH0pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAgICAgaWYgKG11bHRpc2l0ZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oaHJlZiwgeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoeyBfbXVsdGlzaXRlOiB0aGlzLnBhcnNlTXVsdGlzaXRlVmFsdWUobXVsdGlzaXRlKSB9KSB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zPy5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5oZWFkZXJzLmFwcGVuZChcIl9tdWx0aXNpdGVcIiwgdGhpcy5wYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KGhyZWYsIHsgLi4ub3B0aW9ucyB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5odHRwLmdldDxUPihocmVmLCB7IC4uLm9wdGlvbnMgfSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gIC8qKlxuICAgKiBVc2UgdG8gcGVyZm9ybSBhY3Rpb24gYXZhaWxhYmlsaXR5IGNoZWNrIGJlZm9yZSBjYWxsaW5nIHRoZSBBUElcbiAgICogQHBhcmFtIGl0ZW0gLSB0aGUgbmF2aWdhYmxlIGl0ZW0gKGNvbnRhaW5pbmcgbGluayBjb2xsZWN0aW9uKVxuICAgKiBAcGFyYW0gbGlua1JlbFR5cGUgLSB0aGUgbGluayByZWwgdHlwZSwgcGFzcyBlaXRoZXIgTGlua1JlbFR5cGUgb3Igc3RyaW5nXG4gICAqIEBwYXJhbSBlbnRpdHlSZWZUeXBlIC0gdGhlIGVudGl0eSByZWZlcmVuY2UgdHlwZVxuICAgKi9cbiAgICBwdWJsaWMgY2FuUGVyZm9ybUFjdGlvbihpdGVtOiBOYXZpZ2FibGUsIGxpbmtSZWxUeXBlOiBMaW5rUmVsVHlwZSB8IHN0cmluZywgZW50aXR5UmVmVHlwZT86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLmZpbmRMaW5rKGl0ZW0sIGxpbmtSZWxUeXBlLCBlbnRpdHlSZWZUeXBlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRMaW5rKGl0ZW06IE5hdmlnYWJsZSwgcmVsOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IExpbmtUeXBlIHtcbiAgICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLmxpbmspIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXRlbS5saW5rLmZpbmQoKGxpbmspID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmsucmVsLmluY2x1ZGVzKHJlbCkgJiYgbGluay50eXBlID09PSB0eXBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGluay5yZWwuaW5jbHVkZXMocmVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZU11bHRpc2l0ZVZhbHVlKG11bHRpc2l0ZTogYm9vbGVhbiB8IEF1dGhvcml6ZWRMb2NhdGlvblR5cGVbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbXVsdGlzaXRlID09PSAnYm9vbGVhbicgPyAobXVsdGlzaXRlID8gJ2dsb2JhbCcgOiAnbG9jYWwnKSA6IG11bHRpc2l0ZS5tYXAoc2l0ZSA9PiBzaXRlLmxvY2F0aW9uSWQpLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgY2xvdWRBcGlTZXNzaW9uXG4gICAgICovXG4gICAgcHVibGljIGdldCBzZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvblR5cGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVSZXF1ZXN0Q29udGV4dCgpLnBpcGUoXG4gICAgICAgICAgICBjb25jYXRNYXAoKCkgPT4gdGhpcy5fc2Vzc2lvbk9ic2VydmFibGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IFNlc3Npb24gb2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlTZXNzaW9uKCk6IE9ic2VydmFibGU8U2Vzc2lvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZVJlcXVlc3RDb250ZXh0Q2xvdWRBcGlPbmx5KCkucGlwZShcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB0aGlzLl9jbG91ZEFwaVNlc3Npb25PYnNlcnZhYmxlKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdXNlcm5hbWUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvdWRBcGlTZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24udXNlciAmJiBzZXNzaW9uLnVzZXIubmFtZSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5waXBlKFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuX2lzQ2xvdWRBcGlMb2dpbiksXG4gICAgICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi51c2VyKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvcmdhbml6YXRpb24oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIG1lcmdlKFxuICAgICAgICAgICAgdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faXNDbG91ZEFwaUxvZ2luKSxcbiAgICAgICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uICYmIHNlc3Npb24ub3JnICYmIHNlc3Npb24ub3JnLm5hbWUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+ICF0aGlzLl9pc0Nsb3VkQXBpTG9naW4pLFxuICAgICAgICAgICAgICAgIG1hcChzZXNzaW9uID0+IHNlc3Npb24gJiYgc2Vzc2lvbi5vcmcpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGNsb3VkQXBpTG9jYXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGxvY2F0aW9uKCk6IE9ic2VydmFibGU8QXV0aG9yaXplZExvY2F0aW9uVHlwZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnBpcGUoXG4gICAgICAgICAgICBtYXAoc2Vzc2lvbiA9PiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGxvY2F0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2xvdWRBcGlMb2NhdGlvbigpOiBPYnNlcnZhYmxlPEFjY2Vzc2libGVMb2NhdGlvbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG91ZEFwaVNlc3Npb24ucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNhY2hpbmcgZm9yIGdldHRpbmcgQWNjZXNzaWJsZUxvY2F0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnMgPSB0aGlzLl9jbG91ZEFwaVNlc3Npb25MaW5rc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBBY2Nlc3NpYmxlTG9jYXRpb25zIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKGxpbmtzKSA9PiB0aGlzLmZpbmRMaW5rKHsgbGluazogbGlua3MgfSwgJ2Rvd24nLCAnQWNjZXNzaWJsZUxvY2F0aW9ucycpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGZXRjaCBBY2Nlc3NpYmxlTG9jYXRpb25zIGZyb20gdGhlIGJhY2tlbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGxpbms6IExpbmtUeXBlKSA9PiBsaW5rID8gdGhpcy5odHRwLmdldDxBY2Nlc3NpYmxlTG9jYXRpb25zPihsaW5rLmhyZWYpIDogb2YobnVsbCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYXJyYXkgd2l0aCBhbGwgbG9jYXRpb25zICh3aGF0IGlmIHRoZXJlIGFyZSBtYW55IHBhZ2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoYWNjZXNzaWJsZUxvY2F0aW9uczogQWNjZXNzaWJsZUxvY2F0aW9ucykgPT4gYWNjZXNzaWJsZUxvY2F0aW9ucyAmJiBhY2Nlc3NpYmxlTG9jYXRpb25zLnZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlKHsgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSwgcmVzZXRPbkVycm9yOiBmYWxzZSwgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSwgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jbG91ZEFwaUFjY2Vzc2libGVMb2NhdGlvbnM7XG4gICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgLy8gTmVlZCB0byBoYXZlIHRoZSBzZXNzaW9uIGluIG9yZGVyIHRvIGdldCBpdHMgbG9jYXRpb25cbiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuY2xvdWRBcGlTZXNzaW9uKSxcbiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvY2F0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBzZXNzaW9uXG4gICAgICAgICAgICBtYXAoKFthY2Nlc3NpYmxlTG9jYXRpb25zLCBzZXNzaW9uXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghYWNjZXNzaWJsZUxvY2F0aW9ucyB8fCAhc2Vzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkxvY2F0aW9uID0gc2Vzc2lvbi5sb2NhdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAoIXNlc3Npb25Mb2NhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc2libGVMb2NhdGlvbnMuZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uTG9jYXRpb24pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExvY2F0aW9uKHNlc3Npb246IFNlc3Npb25UeXBlKTogQXV0aG9yaXplZExvY2F0aW9uVHlwZSB7XG4gICAgICAgIHJldHVybiBzZXNzaW9uLmF1dGhvcml6ZWRMb2NhdGlvbnMubG9jYXRpb24uZmluZChsb2NhdGlvbiA9PiBsb2NhdGlvbi5sb2NhdGlvbklkID09PSBzZXNzaW9uLmxvY2F0aW9uSWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkIHRoZSBlbmRwb2ludCB1cmwuIElmIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBhbHJlYWR5IGFuIGFic29sdXRlIFVSTCwgdGhlbiByZXR1cm4gaXQgYXMgaXQgaXMgd2l0aG91dFxuICAgICAqIGFueSBtb2RpZmljYXRpb25zLCBvdGhlcndpc2UgY29uc2lkZXIgaXQgYXMgYSByZWxhdGl2ZSBvbmUgYW5kIHByZXBlbmQgdGhlIGJhc2VVcmwgYXMgZGVmaW5lZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGJ1aWxkRW5kcG9pbnRVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBlbmRwb2ludC5pbmRleE9mKCc6Ly8nKSA+IC0xID8gZW5kcG9pbnQgOiBgJHt0aGlzLl9iYXNlVXJsfS8ke2VuZHBvaW50fWA7XG4gICAgfVxuXG59XG4iXX0=