@decaf-ts/for-nest 0.11.2-refactor → 0.11.2-refactor.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-nest.cjs +201 -182
- package/dist/for-nest.js +226 -207
- package/lib/cjs/auth/AuthInterceptor.cjs +9 -4
- package/lib/cjs/auth/DecafAuthModule.cjs +2 -8
- package/lib/cjs/auth/constants.cjs +4 -3
- package/lib/cjs/cli-module.cjs +19 -4
- package/lib/cjs/constants.cjs +3 -4
- package/lib/cjs/controllers.cjs +5 -9
- package/lib/cjs/decaf-model/DecafModelModule.cjs +7 -3
- package/lib/cjs/decaf-model/FromModelController.cjs +22 -5
- package/lib/cjs/decaf-model/decorators/decorators.cjs +4 -4
- package/lib/cjs/decaf-model/index.cjs +2 -2
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/interceptors/DecafRequestHandlerInterceptor.cjs +2 -4
- package/lib/cjs/module.cjs +3 -2
- package/lib/cjs/request/DecafRequestContext.cjs +5 -2
- package/lib/esm/auth/AuthInterceptor.js +9 -4
- package/lib/esm/auth/DecafAuthModule.js +1 -7
- package/lib/esm/auth/constants.js +2 -1
- package/lib/esm/cli-module.js +18 -3
- package/lib/esm/constants.js +1 -2
- package/lib/esm/controllers.js +4 -8
- package/lib/esm/decaf-model/DecafModelModule.js +6 -2
- package/lib/esm/decaf-model/FromModelController.js +22 -5
- package/lib/esm/decaf-model/decorators/decorators.js +2 -2
- package/lib/esm/decaf-model/index.js +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/interceptors/DecafRequestHandlerInterceptor.js +1 -3
- package/lib/esm/module.js +2 -1
- package/lib/esm/request/DecafRequestContext.js +4 -1
- package/lib/types/auth/constants.d.cts +1 -0
- package/lib/types/auth/constants.d.mts +1 -0
- package/lib/types/constants.d.cts +0 -1
- package/lib/types/constants.d.mts +0 -1
- package/lib/types/decaf-model/FromModelController.d.cts +1 -1
- package/lib/types/decaf-model/FromModelController.d.mts +1 -1
- package/lib/types/decaf-model/decorators/decorators.d.cts +1 -1
- package/lib/types/decaf-model/decorators/decorators.d.mts +1 -1
- package/lib/types/decaf-model/index.d.cts +1 -0
- package/lib/types/decaf-model/index.d.mts +1 -0
- package/lib/types/index.d.cts +3 -3
- package/lib/types/index.d.mts +3 -3
- package/lib/types/request/DecafRequestContext.d.cts +1 -0
- package/lib/types/request/DecafRequestContext.d.mts +1 -0
- package/package.json +1 -1
package/dist/for-nest.js
CHANGED
|
@@ -2,11 +2,11 @@ import { apply, Metadata, Decoration, DecorationKeys } from "@decaf-ts/decoratio
|
|
|
2
2
|
|
|
3
3
|
import { InjectablesKeys, DefaultInjectablesConfig } from "@decaf-ts/injectable-decorators";
|
|
4
4
|
|
|
5
|
-
import { Delete, Patch, Put, Post, Get, applyDecorators, createParamDecorator as createParamDecorator$1, InternalServerErrorException, Injectable, Scope, Inject, Optional, UseInterceptors, SetMetadata,
|
|
5
|
+
import { Delete, Patch, Put, Post, Get, applyDecorators, createParamDecorator as createParamDecorator$1, InternalServerErrorException, Injectable, Scope, Inject, Optional, UseInterceptors, SetMetadata, Query, Module, Controller, Response, Param, NotFoundException, NotAcceptableException, Catch, UseFilters, Logger, Global, Sse } from "@nestjs/common";
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { Model, ValidationKeys, ModelBuilder } from "@decaf-ts/decorator-validation";
|
|
8
8
|
|
|
9
|
-
import { isOperationBlocked, PreparedStatementKeys, UUID, Adapter,
|
|
9
|
+
import { isOperationBlocked, PreparedStatementKeys, UUID, Adapter, OrderDirection, ModelService, AuthorizationError, Service as Service$1, Repository as Repository$1, TransactionOperationKeys, Context, PersistenceKeys, ForbiddenError, UnsupportedError, DefaultAdapterFlags, injectableServiceKey, PersistenceService } from "@decaf-ts/core";
|
|
10
10
|
|
|
11
11
|
import { pickBy, negate, isUndefined as isUndefined$1, isArray, isString } from "lodash";
|
|
12
12
|
|
|
@@ -420,8 +420,6 @@ const DECAF_ROUTE = "DecafRoute";
|
|
|
420
420
|
|
|
421
421
|
const DECAF_HANDLERS = Symbol("DecafHandlers");
|
|
422
422
|
|
|
423
|
-
const DECAF_ADAPTER_OPTIONS = Symbol("DecafAdapterForOptions");
|
|
424
|
-
|
|
425
423
|
const DECAF_EXPOSE = "DecafExpose";
|
|
426
424
|
|
|
427
425
|
const DECAF_CONTROLLER_CONFIG = "DecafControllerConfig";
|
|
@@ -450,6 +448,8 @@ const IS_PUBLIC_KEY = "isPublic";
|
|
|
450
448
|
|
|
451
449
|
const REQUIRED_ROLES_KEY = "requiredRoles";
|
|
452
450
|
|
|
451
|
+
const SKIP_MODEL_ROLES_KEY = "skipModelRoles";
|
|
452
|
+
|
|
453
453
|
let DecafRequestContext = class DecafRequestContext extends RequestContext {
|
|
454
454
|
constructor(req) {
|
|
455
455
|
super({
|
|
@@ -459,6 +459,9 @@ let DecafRequestContext = class DecafRequestContext extends RequestContext {
|
|
|
459
459
|
this.uuid = UUID.instance.generate();
|
|
460
460
|
this.request = req;
|
|
461
461
|
}
|
|
462
|
+
get headers() {
|
|
463
|
+
return this.getOrUndefined("headers");
|
|
464
|
+
}
|
|
462
465
|
put(record) {
|
|
463
466
|
let overrides;
|
|
464
467
|
try {
|
|
@@ -487,11 +490,13 @@ let AuthInterceptor = class AuthInterceptor {
|
|
|
487
490
|
const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [ ctx.getHandler(), ctx.getClass() ]);
|
|
488
491
|
const modelName = this.reflector.get(AUTH_META_KEY, ctx.getHandler()) ?? this.reflector.get(AUTH_META_KEY, ctx.getClass());
|
|
489
492
|
const requiredRoles = this.reflector.getAllAndOverride(REQUIRED_ROLES_KEY, [ ctx.getHandler(), ctx.getClass() ]);
|
|
493
|
+
const skipModelRoles = this.reflector.getAllAndOverride(SKIP_MODEL_ROLES_KEY, [ ctx.getHandler(), ctx.getClass() ]);
|
|
494
|
+
const effectiveModel = skipModelRoles ? undefined : modelName;
|
|
490
495
|
log.verbose(`Intercepted request${modelName ? ` for ${modelName}` : ""}`);
|
|
491
496
|
if (isPublic) {
|
|
492
497
|
log.debug(`Public route — skipping auth`);
|
|
493
498
|
} else if (this.authHandler) {
|
|
494
|
-
await this.authHandler.authorize(ctx,
|
|
499
|
+
await this.authHandler.authorize(ctx, effectiveModel, requiredRoles, this.requestContext);
|
|
495
500
|
} else {
|
|
496
501
|
log.debug(`No auth handler registered`);
|
|
497
502
|
}
|
|
@@ -516,7 +521,8 @@ let AuthInterceptor = class AuthInterceptor {
|
|
|
516
521
|
for (const flavour of flavours) {
|
|
517
522
|
const transformer = Adapter.transformerFor(flavour);
|
|
518
523
|
if (!transformer) continue;
|
|
519
|
-
const
|
|
524
|
+
const instance = transformer.from ? transformer : new transformer;
|
|
525
|
+
const from = await instance.from(this.requestContext);
|
|
520
526
|
if (from) this.requestContext.accumulate(from);
|
|
521
527
|
}
|
|
522
528
|
}
|
|
@@ -526,24 +532,6 @@ AuthInterceptor = __decorate([ Injectable({
|
|
|
526
532
|
scope: Scope.REQUEST
|
|
527
533
|
}), __param(2, Optional()), __param(2, Inject(AUTH_HANDLER)), __metadata("design:paramtypes", [ Reflector, DecafRequestContext, Object ]) ], AuthInterceptor);
|
|
528
534
|
|
|
529
|
-
class DecafAuthHandler extends AuthHandler {
|
|
530
|
-
parseRequest(req) {
|
|
531
|
-
const userRole = req.headers.authorization?.split(" ")[1];
|
|
532
|
-
return userRole;
|
|
533
|
-
}
|
|
534
|
-
extractFromAuth(ctx) {
|
|
535
|
-
const req = ctx.switchToHttp().getRequest();
|
|
536
|
-
const userRole = this.parseRequest(req);
|
|
537
|
-
if (!userRole) throw new AuthorizationError("Unauthenticated");
|
|
538
|
-
return {
|
|
539
|
-
user: userRole,
|
|
540
|
-
roles: [ userRole ]
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
class DecafRoleAuthHandler extends DecafAuthHandler {}
|
|
546
|
-
|
|
547
535
|
function Auth(model) {
|
|
548
536
|
const resource = model ? typeof model === "string" ? model : model.name : undefined;
|
|
549
537
|
const decs = [ ApiBearerAuth(), UseInterceptors(AuthInterceptor) ];
|
|
@@ -559,174 +547,6 @@ function RequireRoles(...roles) {
|
|
|
559
547
|
return applyDecorators(ApiSecurity("bearer"), SetMetadata(REQUIRED_ROLES_KEY, roles), UseInterceptors(AuthInterceptor));
|
|
560
548
|
}
|
|
561
549
|
|
|
562
|
-
var DecafHandlerExecutor_1;
|
|
563
|
-
|
|
564
|
-
let DecafHandlerExecutor = DecafHandlerExecutor_1 = class DecafHandlerExecutor {
|
|
565
|
-
constructor(handlers, context) {
|
|
566
|
-
this.handlers = handlers;
|
|
567
|
-
this.context = context;
|
|
568
|
-
}
|
|
569
|
-
async exec(req, res) {
|
|
570
|
-
const log = Logging.for(DecafHandlerExecutor_1.name).for(this.exec);
|
|
571
|
-
log.debug(`CONTEXT ${this.context.uuid} running ${this.handlers.length} handlers for request ${req.method} ${req.url}`);
|
|
572
|
-
for (const handler of this.handlers) {
|
|
573
|
-
await handler.handle(this.context, req, res);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
};
|
|
577
|
-
|
|
578
|
-
DecafHandlerExecutor = DecafHandlerExecutor_1 = __decorate([ Injectable({
|
|
579
|
-
scope: Scope.REQUEST
|
|
580
|
-
}), __param(0, Inject(DECAF_HANDLERS)), __metadata("design:paramtypes", [ Array, DecafRequestContext ]) ], DecafHandlerExecutor);
|
|
581
|
-
|
|
582
|
-
let DecafResponseInterceptor = class DecafResponseInterceptor {
|
|
583
|
-
constructor(ctx) {
|
|
584
|
-
this.ctx = ctx;
|
|
585
|
-
}
|
|
586
|
-
intercept(context, next) {
|
|
587
|
-
let response = context.switchToHttp().getResponse();
|
|
588
|
-
return next.handle().pipe(tap(data => {
|
|
589
|
-
response = this.ctx.toResponse(response);
|
|
590
|
-
}));
|
|
591
|
-
}
|
|
592
|
-
};
|
|
593
|
-
|
|
594
|
-
DecafResponseInterceptor = __decorate([ Injectable(), __metadata("design:paramtypes", [ DecafRequestContext ]) ], DecafResponseInterceptor);
|
|
595
|
-
|
|
596
|
-
Adapter.transformerFor = function toContextFlags(adapter) {
|
|
597
|
-
const alias = typeof adapter === "string" ? adapter : adapter.alias;
|
|
598
|
-
return Metadata["innerGet"](Symbol.for("transformers"), alias);
|
|
599
|
-
}.bind(Adapter);
|
|
600
|
-
|
|
601
|
-
Adapter.flavoursToTransform = function requestTransformers() {
|
|
602
|
-
const meta = Metadata["innerGet"](Symbol.for("transformers"));
|
|
603
|
-
if (!meta) return undefined;
|
|
604
|
-
return Object.keys(meta);
|
|
605
|
-
}.bind(Adapter);
|
|
606
|
-
|
|
607
|
-
Context.prototype.toResponse = function toResponse(res) {
|
|
608
|
-
const pending = this.pending();
|
|
609
|
-
if (pending) res.header("x-pending-task", JSON.stringify(pending));
|
|
610
|
-
return res;
|
|
611
|
-
};
|
|
612
|
-
|
|
613
|
-
const prototype = ModelBuilder.prototype;
|
|
614
|
-
|
|
615
|
-
if (!prototype.decorateClass) {
|
|
616
|
-
prototype.decorateClass = function(decorator) {
|
|
617
|
-
if (!this._classDecorators) {
|
|
618
|
-
this._classDecorators = [];
|
|
619
|
-
}
|
|
620
|
-
this._classDecorators.push(decorator);
|
|
621
|
-
return this;
|
|
622
|
-
};
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
prototype.Auth = function(model) {
|
|
626
|
-
return this.decorateClass(Auth(model));
|
|
627
|
-
};
|
|
628
|
-
|
|
629
|
-
if (!prototype.__hasClassDecoratorSupport) {
|
|
630
|
-
const originalBuild = prototype.build;
|
|
631
|
-
prototype.build = function() {
|
|
632
|
-
let result = originalBuild.call(this);
|
|
633
|
-
const decorators = this._classDecorators;
|
|
634
|
-
if (decorators?.length) {
|
|
635
|
-
for (const decorator of decorators) {
|
|
636
|
-
const decorated = decorator(result);
|
|
637
|
-
if (decorated) {
|
|
638
|
-
result = decorated;
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
return result;
|
|
643
|
-
};
|
|
644
|
-
prototype.__hasClassDecoratorSupport = true;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
var DecafRequestHandlerInterceptor_1;
|
|
648
|
-
|
|
649
|
-
let DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
|
|
650
|
-
constructor(requestContext, executor) {
|
|
651
|
-
this.requestContext = requestContext;
|
|
652
|
-
this.executor = executor;
|
|
653
|
-
}
|
|
654
|
-
async contextualize(req) {
|
|
655
|
-
const headers = req.headers;
|
|
656
|
-
const flags = {
|
|
657
|
-
headers: headers,
|
|
658
|
-
overrides: {}
|
|
659
|
-
};
|
|
660
|
-
Object.assign(flags.overrides, req?.[DECAF_ADAPTER_OPTIONS] ?? {});
|
|
661
|
-
const ip = extractIp(req);
|
|
662
|
-
const logger = Logging.get().for({
|
|
663
|
-
ip: ip
|
|
664
|
-
});
|
|
665
|
-
this.requestContext.accumulate(Object.assign({}, DefaultAdapterFlags, {
|
|
666
|
-
logger: logger,
|
|
667
|
-
timestamp: new Date,
|
|
668
|
-
operation: `${req.method} ${req.url}`
|
|
669
|
-
}, flags));
|
|
670
|
-
}
|
|
671
|
-
async intercept(context, next) {
|
|
672
|
-
const req = context.switchToHttp().getRequest();
|
|
673
|
-
const res = context.switchToHttp().getResponse();
|
|
674
|
-
const log = Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
|
|
675
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
|
|
676
|
-
await this.contextualize(req);
|
|
677
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
|
|
678
|
-
await this.executor.exec(req, res);
|
|
679
|
-
log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
|
|
680
|
-
return next.handle();
|
|
681
|
-
}
|
|
682
|
-
};
|
|
683
|
-
|
|
684
|
-
DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = __decorate([ Injectable({
|
|
685
|
-
scope: Scope.REQUEST
|
|
686
|
-
}), __metadata("design:paramtypes", [ DecafRequestContext, DecafHandlerExecutor ]) ], DecafRequestHandlerInterceptor);
|
|
687
|
-
|
|
688
|
-
function extractIp(req) {
|
|
689
|
-
const headers = req.headers;
|
|
690
|
-
function parseIpHeader(value) {
|
|
691
|
-
if (!value) return undefined;
|
|
692
|
-
const candidate = Array.isArray(value) ? value[0] : value;
|
|
693
|
-
return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
|
|
694
|
-
}
|
|
695
|
-
return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
var DecafAuthModule_1;
|
|
699
|
-
|
|
700
|
-
let DecafAuthModule = DecafAuthModule_1 = class DecafAuthModule {
|
|
701
|
-
static forRoot(options = {}) {
|
|
702
|
-
const providers = [ AuthInterceptor, DecafRequestHandlerInterceptor, {
|
|
703
|
-
provide: APP_INTERCEPTOR,
|
|
704
|
-
useClass: DecafRequestHandlerInterceptor
|
|
705
|
-
} ];
|
|
706
|
-
if (options.handler) {
|
|
707
|
-
providers.push(options.handler);
|
|
708
|
-
providers.push({
|
|
709
|
-
provide: AUTH_HANDLER,
|
|
710
|
-
useClass: options.handler
|
|
711
|
-
});
|
|
712
|
-
}
|
|
713
|
-
if (options.global) {
|
|
714
|
-
providers.push({
|
|
715
|
-
provide: APP_INTERCEPTOR,
|
|
716
|
-
useExisting: AuthInterceptor
|
|
717
|
-
});
|
|
718
|
-
}
|
|
719
|
-
return {
|
|
720
|
-
module: DecafAuthModule_1,
|
|
721
|
-
global: options.global ?? false,
|
|
722
|
-
providers: providers,
|
|
723
|
-
exports: [ AuthInterceptor, AUTH_HANDLER ]
|
|
724
|
-
};
|
|
725
|
-
}
|
|
726
|
-
};
|
|
727
|
-
|
|
728
|
-
DecafAuthModule = DecafAuthModule_1 = __decorate([ Module({}) ], DecafAuthModule);
|
|
729
|
-
|
|
730
550
|
function HttpVerbToDecorator(verb) {
|
|
731
551
|
const httpToCrud = {
|
|
732
552
|
GET: Get,
|
|
@@ -819,6 +639,87 @@ function defineRouteMethod(ControllerClass, methodName, handler) {
|
|
|
819
639
|
return Object.getOwnPropertyDescriptor(ControllerClass.prototype || ControllerClass, methodName);
|
|
820
640
|
}
|
|
821
641
|
|
|
642
|
+
class DecafAuthHandler extends AuthHandler {
|
|
643
|
+
parseRequest(req) {
|
|
644
|
+
const userRole = req.headers.authorization?.split(" ")[1];
|
|
645
|
+
return userRole;
|
|
646
|
+
}
|
|
647
|
+
extractFromAuth(ctx) {
|
|
648
|
+
const req = ctx.switchToHttp().getRequest();
|
|
649
|
+
const userRole = this.parseRequest(req);
|
|
650
|
+
if (!userRole) throw new AuthorizationError("Unauthenticated");
|
|
651
|
+
return {
|
|
652
|
+
user: userRole,
|
|
653
|
+
roles: [ userRole ]
|
|
654
|
+
};
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
class DecafRoleAuthHandler extends DecafAuthHandler {}
|
|
659
|
+
|
|
660
|
+
var DecafAuthModule_1;
|
|
661
|
+
|
|
662
|
+
let DecafAuthModule = DecafAuthModule_1 = class DecafAuthModule {
|
|
663
|
+
static forRoot(options = {}) {
|
|
664
|
+
const providers = [ AuthInterceptor ];
|
|
665
|
+
if (options.handler) {
|
|
666
|
+
providers.push(options.handler);
|
|
667
|
+
providers.push({
|
|
668
|
+
provide: AUTH_HANDLER,
|
|
669
|
+
useClass: options.handler
|
|
670
|
+
});
|
|
671
|
+
}
|
|
672
|
+
if (options.global) {
|
|
673
|
+
providers.push({
|
|
674
|
+
provide: APP_INTERCEPTOR,
|
|
675
|
+
useExisting: AuthInterceptor
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
return {
|
|
679
|
+
module: DecafAuthModule_1,
|
|
680
|
+
global: options.global ?? false,
|
|
681
|
+
providers: providers,
|
|
682
|
+
exports: [ AuthInterceptor, AUTH_HANDLER ]
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
DecafAuthModule = DecafAuthModule_1 = __decorate([ Module({}) ], DecafAuthModule);
|
|
688
|
+
|
|
689
|
+
var DecafHandlerExecutor_1;
|
|
690
|
+
|
|
691
|
+
let DecafHandlerExecutor = DecafHandlerExecutor_1 = class DecafHandlerExecutor {
|
|
692
|
+
constructor(handlers, context) {
|
|
693
|
+
this.handlers = handlers;
|
|
694
|
+
this.context = context;
|
|
695
|
+
}
|
|
696
|
+
async exec(req, res) {
|
|
697
|
+
const log = Logging.for(DecafHandlerExecutor_1.name).for(this.exec);
|
|
698
|
+
log.debug(`CONTEXT ${this.context.uuid} running ${this.handlers.length} handlers for request ${req.method} ${req.url}`);
|
|
699
|
+
for (const handler of this.handlers) {
|
|
700
|
+
await handler.handle(this.context, req, res);
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
};
|
|
704
|
+
|
|
705
|
+
DecafHandlerExecutor = DecafHandlerExecutor_1 = __decorate([ Injectable({
|
|
706
|
+
scope: Scope.REQUEST
|
|
707
|
+
}), __param(0, Inject(DECAF_HANDLERS)), __metadata("design:paramtypes", [ Array, DecafRequestContext ]) ], DecafHandlerExecutor);
|
|
708
|
+
|
|
709
|
+
let DecafResponseInterceptor = class DecafResponseInterceptor {
|
|
710
|
+
constructor(ctx) {
|
|
711
|
+
this.ctx = ctx;
|
|
712
|
+
}
|
|
713
|
+
intercept(context, next) {
|
|
714
|
+
let response = context.switchToHttp().getResponse();
|
|
715
|
+
return next.handle().pipe(tap(data => {
|
|
716
|
+
response = this.ctx.toResponse(response);
|
|
717
|
+
}));
|
|
718
|
+
}
|
|
719
|
+
};
|
|
720
|
+
|
|
721
|
+
DecafResponseInterceptor = __decorate([ Injectable(), __metadata("design:paramtypes", [ DecafRequestContext ]) ], DecafResponseInterceptor);
|
|
722
|
+
|
|
822
723
|
class DecafController extends DecafController$1 {
|
|
823
724
|
constructor(clientContext, _name) {
|
|
824
725
|
super(clientContext);
|
|
@@ -841,11 +742,8 @@ class DecafModelController extends DecafController {
|
|
|
841
742
|
this._persistence = Repository$1.forModel(this.class);
|
|
842
743
|
}
|
|
843
744
|
}
|
|
844
|
-
const
|
|
845
|
-
|
|
846
|
-
this.clientContext.put(certs);
|
|
847
|
-
}
|
|
848
|
-
return ctx ? this._persistence instanceof Repository$1 ? this._persistence.override(certs) : this._persistence.for(certs) : this._persistence;
|
|
745
|
+
const overrides = this.clientContext.toOverrides();
|
|
746
|
+
return ctx ? this._persistence instanceof Repository$1 ? this._persistence.override(overrides) : this._persistence.for(overrides) : this._persistence;
|
|
849
747
|
}
|
|
850
748
|
}
|
|
851
749
|
|
|
@@ -1054,6 +952,57 @@ function getDtoCache(op) {
|
|
|
1054
952
|
return dtoCache.get(op);
|
|
1055
953
|
}
|
|
1056
954
|
|
|
955
|
+
Adapter.transformerFor = function toContextFlags(adapter) {
|
|
956
|
+
const alias = typeof adapter === "string" ? adapter : adapter.alias;
|
|
957
|
+
return Metadata["innerGet"](Symbol.for("transformers"), alias);
|
|
958
|
+
}.bind(Adapter);
|
|
959
|
+
|
|
960
|
+
Adapter.flavoursToTransform = function requestTransformers() {
|
|
961
|
+
const meta = Metadata["innerGet"](Symbol.for("transformers"));
|
|
962
|
+
if (!meta) return undefined;
|
|
963
|
+
return Object.keys(meta);
|
|
964
|
+
}.bind(Adapter);
|
|
965
|
+
|
|
966
|
+
Context.prototype.toResponse = function toResponse(res) {
|
|
967
|
+
const pending = this.pending();
|
|
968
|
+
if (pending) res.header("x-pending-task", JSON.stringify(pending));
|
|
969
|
+
return res;
|
|
970
|
+
};
|
|
971
|
+
|
|
972
|
+
const prototype = ModelBuilder.prototype;
|
|
973
|
+
|
|
974
|
+
if (!prototype.decorateClass) {
|
|
975
|
+
prototype.decorateClass = function(decorator) {
|
|
976
|
+
if (!this._classDecorators) {
|
|
977
|
+
this._classDecorators = [];
|
|
978
|
+
}
|
|
979
|
+
this._classDecorators.push(decorator);
|
|
980
|
+
return this;
|
|
981
|
+
};
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
prototype.Auth = function(model) {
|
|
985
|
+
return this.decorateClass(Auth(model));
|
|
986
|
+
};
|
|
987
|
+
|
|
988
|
+
if (!prototype.__hasClassDecoratorSupport) {
|
|
989
|
+
const originalBuild = prototype.build;
|
|
990
|
+
prototype.build = function() {
|
|
991
|
+
let result = originalBuild.call(this);
|
|
992
|
+
const decorators = this._classDecorators;
|
|
993
|
+
if (decorators?.length) {
|
|
994
|
+
for (const decorator of decorators) {
|
|
995
|
+
const decorated = decorator(result);
|
|
996
|
+
if (decorated) {
|
|
997
|
+
result = decorated;
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return result;
|
|
1002
|
+
};
|
|
1003
|
+
prototype.__hasClassDecoratorSupport = true;
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1057
1006
|
var DynamicModelController_1;
|
|
1058
1007
|
|
|
1059
1008
|
class FromModelController {
|
|
@@ -1103,7 +1052,7 @@ class FromModelController {
|
|
|
1103
1052
|
}
|
|
1104
1053
|
return QueryController;
|
|
1105
1054
|
}
|
|
1106
|
-
static create(ModelConstr, moduleConfigOverrides) {
|
|
1055
|
+
static create(ModelConstr, moduleConfigOverrides, globalDefaults) {
|
|
1107
1056
|
const log = FromModelController.log.for(FromModelController.create);
|
|
1108
1057
|
const tableName = Model.tableName(ModelConstr);
|
|
1109
1058
|
const routePath = toKebabCase(tableName);
|
|
@@ -1113,6 +1062,7 @@ class FromModelController {
|
|
|
1113
1062
|
const decoratorConfig = Metadata.get(ModelConstr, Metadata.key(DECAF_CONTROLLER_CONFIG));
|
|
1114
1063
|
const moduleOverride = moduleConfigOverrides?.[ModelConstr.name];
|
|
1115
1064
|
const mergedConfig = {
|
|
1065
|
+
...globalDefaults || {},
|
|
1116
1066
|
...decoratorConfig || {},
|
|
1117
1067
|
...moduleOverride || {}
|
|
1118
1068
|
};
|
|
@@ -1120,6 +1070,19 @@ class FromModelController {
|
|
|
1120
1070
|
const factoryRoutes = FactoryController.__routes__;
|
|
1121
1071
|
const {getPK: getPK, apiProperties: apiProperties, path: pkPath} = FromModelController.getRouteParametersFromModel(ModelConstr);
|
|
1122
1072
|
log.debug(`Creating controller for model: ${modelClazzName} with ${factoryRoutes?.length ?? 0} factory routes`);
|
|
1073
|
+
const authConfig = mergedConfig.auth;
|
|
1074
|
+
function applyClassAuth(target) {
|
|
1075
|
+
if (authConfig?.public) {
|
|
1076
|
+
Public()(target);
|
|
1077
|
+
} else if (authConfig?.roles?.length) {
|
|
1078
|
+
RequireRoles(...authConfig.roles)(target);
|
|
1079
|
+
} else {
|
|
1080
|
+
Auth(ModelConstr)(target);
|
|
1081
|
+
}
|
|
1082
|
+
if (authConfig?.skipModelRoles) {
|
|
1083
|
+
SetMetadata(SKIP_MODEL_ROLES_KEY, true)(target);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1123
1086
|
let DynamicModelController = DynamicModelController_1 = class DynamicModelController extends DecafModelController {
|
|
1124
1087
|
static get class() {
|
|
1125
1088
|
return ModelConstr;
|
|
@@ -1133,7 +1096,8 @@ class FromModelController {
|
|
|
1133
1096
|
log.info(`Registering dynamic controller for model: ${this.class.name} route: /${routePath}`);
|
|
1134
1097
|
}
|
|
1135
1098
|
};
|
|
1136
|
-
DynamicModelController = DynamicModelController_1 = __decorate([ Controller(routePath), ApiTags(modelClazzName), ApiExtraModels(ModelConstr),
|
|
1099
|
+
DynamicModelController = DynamicModelController_1 = __decorate([ Controller(routePath), ApiTags(modelClazzName), ApiExtraModels(ModelConstr), __metadata("design:paramtypes", [ DecafRequestContext ]) ], DynamicModelController);
|
|
1100
|
+
applyClassAuth(DynamicModelController);
|
|
1137
1101
|
if (factoryRoutes) {
|
|
1138
1102
|
const sortedRoutes = [ ...factoryRoutes ].sort((a, b) => {
|
|
1139
1103
|
const aSegments = a.path.split("/").filter(Boolean);
|
|
@@ -2019,7 +1983,11 @@ function getModuleFor(flavour) {
|
|
|
2019
1983
|
modelServices = this.createModelServices(trackedModels);
|
|
2020
1984
|
log.info(`Auto-services completed. ${modelServices.length} services initialized.`);
|
|
2021
1985
|
}
|
|
2022
|
-
const
|
|
1986
|
+
const globalDefaults = {};
|
|
1987
|
+
if (options.aggregations === false) {
|
|
1988
|
+
globalDefaults.allowGroupingQueries = false;
|
|
1989
|
+
}
|
|
1990
|
+
const controllers = trackedModels.map(model => FromModelController.create(model, options.controllerConfig, globalDefaults));
|
|
2023
1991
|
log.info(`Generated ${controllers.length} controllers`);
|
|
2024
1992
|
return {
|
|
2025
1993
|
module: DecafModelModule_1,
|
|
@@ -2386,6 +2354,56 @@ class NestBootstraper {
|
|
|
2386
2354
|
}
|
|
2387
2355
|
}
|
|
2388
2356
|
|
|
2357
|
+
var DecafRequestHandlerInterceptor_1;
|
|
2358
|
+
|
|
2359
|
+
let DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = class DecafRequestHandlerInterceptor {
|
|
2360
|
+
constructor(requestContext, executor) {
|
|
2361
|
+
this.requestContext = requestContext;
|
|
2362
|
+
this.executor = executor;
|
|
2363
|
+
}
|
|
2364
|
+
async contextualize(req) {
|
|
2365
|
+
const headers = req.headers;
|
|
2366
|
+
const flags = {
|
|
2367
|
+
headers: headers,
|
|
2368
|
+
overrides: {}
|
|
2369
|
+
};
|
|
2370
|
+
const ip = extractIp(req);
|
|
2371
|
+
const logger = Logging.get().for({
|
|
2372
|
+
ip: ip
|
|
2373
|
+
});
|
|
2374
|
+
this.requestContext.accumulate(Object.assign({}, DefaultAdapterFlags, {
|
|
2375
|
+
logger: logger,
|
|
2376
|
+
timestamp: new Date,
|
|
2377
|
+
operation: `${req.method} ${req.url}`
|
|
2378
|
+
}, flags));
|
|
2379
|
+
}
|
|
2380
|
+
async intercept(context, next) {
|
|
2381
|
+
const req = context.switchToHttp().getRequest();
|
|
2382
|
+
const res = context.switchToHttp().getResponse();
|
|
2383
|
+
const log = Logging.for(DecafRequestHandlerInterceptor_1).for(this.intercept);
|
|
2384
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} - request: ${req.method} ${req.url}`);
|
|
2385
|
+
await this.contextualize(req);
|
|
2386
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} contextualized - request: ${req.method} ${req.url}`);
|
|
2387
|
+
await this.executor.exec(req, res);
|
|
2388
|
+
log.debug(`CONTEXT ${this.requestContext.uuid} executors finished - request: ${req.method} ${req.url}`);
|
|
2389
|
+
return next.handle();
|
|
2390
|
+
}
|
|
2391
|
+
};
|
|
2392
|
+
|
|
2393
|
+
DecafRequestHandlerInterceptor = DecafRequestHandlerInterceptor_1 = __decorate([ Injectable({
|
|
2394
|
+
scope: Scope.REQUEST
|
|
2395
|
+
}), __metadata("design:paramtypes", [ DecafRequestContext, DecafHandlerExecutor ]) ], DecafRequestHandlerInterceptor);
|
|
2396
|
+
|
|
2397
|
+
function extractIp(req) {
|
|
2398
|
+
const headers = req.headers;
|
|
2399
|
+
function parseIpHeader(value) {
|
|
2400
|
+
if (!value) return undefined;
|
|
2401
|
+
const candidate = Array.isArray(value) ? value[0] : value;
|
|
2402
|
+
return candidate.split(",").map(segment => segment.trim()).filter(Boolean)[0];
|
|
2403
|
+
}
|
|
2404
|
+
return parseIpHeader(headers?.["x-forwarded-for"]) ?? parseIpHeader(headers?.["x-real-ip"]) ?? parseIpHeader(headers?.["X-Forwarded-For"]) ?? parseIpHeader(headers?.["X-Real-IP"]) ?? req.ip;
|
|
2405
|
+
}
|
|
2406
|
+
|
|
2389
2407
|
const pendingProviders = new Map;
|
|
2390
2408
|
|
|
2391
2409
|
function getRegisteredDecafProviders() {
|
|
@@ -2695,7 +2713,8 @@ let DecafModule = DecafModule_1 = class DecafModule {
|
|
|
2695
2713
|
imports.push(getModuleFor(flavour).forRoot(flavour, {
|
|
2696
2714
|
autoServices: autoServices,
|
|
2697
2715
|
controllerExposure: options.controllerExposure,
|
|
2698
|
-
controllerConfig: options.controllerConfig
|
|
2716
|
+
controllerConfig: options.controllerConfig,
|
|
2717
|
+
aggregations: options.aggregations
|
|
2699
2718
|
}));
|
|
2700
2719
|
});
|
|
2701
2720
|
}
|
|
@@ -2720,11 +2739,11 @@ function repoForModel(model) {
|
|
|
2720
2739
|
return repo;
|
|
2721
2740
|
}
|
|
2722
2741
|
|
|
2723
|
-
const VERSION = "0.11.2";
|
|
2742
|
+
const VERSION = "0.11.2-refactor.3";
|
|
2724
2743
|
|
|
2725
|
-
const COMMIT = "
|
|
2744
|
+
const COMMIT = "d657fc5";
|
|
2726
2745
|
|
|
2727
|
-
const FULL_VERSION = "0.11.2-
|
|
2746
|
+
const FULL_VERSION = "0.11.2-refactor.3-d657fc5";
|
|
2728
2747
|
|
|
2729
2748
|
const PACKAGE_NAME = "@decaf-ts/for-nest";
|
|
2730
2749
|
|
|
@@ -2734,5 +2753,5 @@ Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
|
2734
2753
|
|
|
2735
2754
|
Metadata.allowReregistration(false);
|
|
2736
2755
|
|
|
2737
|
-
export { AUTH_HANDLER, AUTH_META_KEY, ApiOperationFromModel, ApiParamsFromModel, ApiProperty, Auth, AuthInterceptor, BulkApiOperationFromModel, COMMIT, CorsError, DECAF_ADAPTER_ID,
|
|
2738
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9hdXRoL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZkhhbmRsZXJFeGVjdXRvci50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmUmVzcG9uc2VJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9vdmVycmlkZXMvb3ZlcnJpZGVzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9Nb2RlbEJ1aWxkZXJFeHRlbnNpb25zLnRzIiwiLi4vc3JjL2ludGVyY2VwdG9ycy9EZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IudHMiLCIuLi9zcmMvYXV0aC9EZWNhZkF1dGhNb2R1bGUudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy91dGlscy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC91dGlscy50cyIsIi4uL3NyYy9jb250cm9sbGVycy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9Gcm9tTW9kZWxDb250cm9sbGVyLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL0RlY2FmTW9kZWxNb2R1bGUudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy9jb3JzLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXJyb3JzL3Rocm90dGxpbmcudHMiLCIuLi9zcmMvZmFjdG9yeS9leGNlcHRpb25zL0RlY2FmRXJyb3JGaWx0ZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9leGNlcHRpb25zL2RlY29yYXRvcnMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL2NvbnN0YW50cy50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckN1c3RvbVVJLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9Td2FnZ2VyQnVpbGRlci50cyIsIi4uL3NyYy9mYWN0b3J5L05lc3RCb290c3RyYXBlci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1RhcmdldChcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0FEQVBURVJfT1BUSU9OUyA9IFN5bWJvbChcIkRlY2FmQWRhcHRlckZvck9wdGlvbnNcIik7XG5leHBvcnQgY29uc3QgREVDQUZfRVhQT1NFID0gXCJEZWNhZkV4cG9zZVwiO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0NPTlRST0xMRVJfQ09ORklHID0gXCJEZWNhZkNvbnRyb2xsZXJDb25maWdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX0NPTlRFWFRfS0VZID0gU3ltYm9sKFwiZGVjYWY6Y29udGV4dFwiKTtcblxuZXhwb3J0IHR5cGUgRGVjYWZTZXJ2ZXJGbGFnczxMT0cgZXh0ZW5kcyBMb2dnZXIgPSBMb2dnZXI+ID1cbiAgQWRhcHRlckZsYWdzPExPRz4gJiB7XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBvdmVycmlkZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIH07XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyQ3R4ID0gQ29udGV4dDxEZWNhZlNlcnZlckZsYWdzPjtcbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmltcG9ydCB7IERFQ0FGX0VYUE9TRSB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9zZSguLi5mbGF2b3Vyczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGV4cG9zZSh0YXJnZXQ6IGFueSkge1xuICAgIE1ldGFkYXRhLnNldChcbiAgICAgIHRhcmdldCxcbiAgICAgIERFQ0FGX0VYUE9TRSxcbiAgICAgIChmbGF2b3Vycy5sZW5ndGggPyBmbGF2b3VycyA6IHRydWUpIGFzIGFueVxuICAgICk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBDbGFzcyBkZWNvcmF0b3IgdGhhdCBhdHRhY2hlcyBhIHtAbGluayBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnfSB0byBhIE1vZGVsLFxuICogc28gYEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKClgIGNhbiBwYXNzIGl0IHRvIGBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LmNyZWF0ZSgpYC5cbiAqXG4gKiBUaGUgcGVyLW1vZGVsIGNvbmZpZyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgbW9kdWxlLWxldmVsIGBjb250cm9sbGVyQ29uZmlnYFxuICogb3B0aW9uIGluIGBEZWNhZk1vZHVsZU9wdGlvbnNgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogQGNvbnRyb2xsZXJDb25maWcoeyBhbGxvd0dyb3VwaW5nUXVlcmllczogdHJ1ZSwgYWxsb3dCdWxrU3RhdGVtZW50OiB7IGNyZWF0ZTogdHJ1ZSwgcmVhZDogdHJ1ZSwgdXBkYXRlOiBmYWxzZSwgZGVsZXRlOiB0cnVlIH0gfSlcbiAqIEBtb2RlbCgpXG4gKiBjbGFzcyBPcmRlciBleHRlbmRzIE1vZGVsPE9yZGVyPiB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gRmFjdG9yeSBjb25maWd1cmF0aW9uIGtub2JzIChhbGxvd1N0YXRlbWVudGxlc3NRdWVyeSwgYWxsb3dHcm91cGluZ1F1ZXJpZXMsIGFsbG93QnVsa1N0YXRlbWVudCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyQ29uZmlnKGNvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZykge1xuICByZXR1cm4gZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZ0RlY29yYXRvcih0YXJnZXQ6IGFueSkge1xuICAgIE1ldGFkYXRhLnNldCh0YXJnZXQsIERFQ0FGX0NPTlRST0xMRVJfQ09ORklHLCBjb25maWcgYXMgYW55KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuIiwiZXhwb3J0IGNvbnN0IEFVVEhfSEFORExFUiA9IFN5bWJvbChcIkFVVEhfSEFORExFUlwiKTtcbmV4cG9ydCBjb25zdCBBVVRIX01FVEFfS0VZID0gXCJhdXRoOm1ldGFcIjtcbmV4cG9ydCBjb25zdCBJU19QVUJMSUNfS0VZID0gXCJpc1B1YmxpY1wiO1xuZXhwb3J0IGNvbnN0IFJFUVVJUkVEX1JPTEVTX0tFWSA9IFwicmVxdWlyZWRSb2xlc1wiO1xuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgUkVRVUVTVCB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IFVVSUQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IHR5cGUgUmVxdWVzdCB9IGZyb20gXCJleHByZXNzXCI7XG5cbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0Q29udGV4dDxDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eD4gZXh0ZW5kcyBSZXF1ZXN0Q29udGV4dDxSZXF1ZXN0PiB7XG4gIHV1aWQgPSBVVUlELmluc3RhbmNlLmdlbmVyYXRlKCk7XG4gIG92ZXJyaWRlIHJlYWRvbmx5IHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChSRVFVRVNUKSBwcml2YXRlIHJlYWRvbmx5IHJlcTogUmVxdWVzdCkge1xuICAgIHN1cGVyKFxuICAgICAge1xuICAgICAgICBoZWFkZXJzT2Y6IChyZXF1ZXN0OiBSZXF1ZXN0KSA9PiAocmVxdWVzdCBhcyBhbnkpPy5oZWFkZXJzIHx8IHVuZGVmaW5lZCxcbiAgICAgIH0gYXMgYW55LFxuICAgICAgcmVxXG4gICAgKTtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXE7XG4gIH1cblxuICBwdXQocmVjb3JkOiBSZWNvcmQ8YW55LCBhbnk+KSB7XG4gICAgbGV0IG92ZXJyaWRlczogYW55O1xuICAgIHRyeSB7XG4gICAgICBvdmVycmlkZXMgPSB0aGlzLmdldChcIm92ZXJyaWRlc1wiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBvdmVycmlkZXMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLmFjY3VtdWxhdGUoe1xuICAgICAgb3ZlcnJpZGVzOiBPYmplY3QuYXNzaWduKG92ZXJyaWRlcywgcmVjb3JkKSxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBDYWxsSGFuZGxlcixcbiAgSW5qZWN0LFxuICBPcHRpb25hbCxcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgUmVmbGVjdG9yIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIsIEFVVEhfTUVUQV9LRVksIElTX1BVQkxJQ19LRVksIFJFUVVJUkVEX1JPTEVTX0tFWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoSGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIEF1dGhJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmbGVjdG9yOiBSZWZsZWN0b3IsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVVUSF9IQU5ETEVSKSBwcml2YXRlIHJlYWRvbmx5IGF1dGhIYW5kbGVyPzogQXV0aEhhbmRsZXJcbiAgKSB7fVxuXG4gIGFzeW5jIGludGVyY2VwdChcbiAgICBjdHg6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgbmV4dDogQ2FsbEhhbmRsZXJcbiAgKTogUHJvbWlzZTxPYnNlcnZhYmxlPGFueT4+IHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcih0aGlzIGFzIGFueSkuZm9yKHRoaXMuaW50ZXJjZXB0KTtcblxuICAgIGNvbnN0IGlzUHVibGljID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oSVNfUFVCTElDX0tFWSwgW1xuICAgICAgY3R4LmdldEhhbmRsZXIoKSxcbiAgICAgIGN0eC5nZXRDbGFzcygpLFxuICAgIF0pO1xuXG4gICAgY29uc3QgbW9kZWxOYW1lID1cbiAgICAgIHRoaXMucmVmbGVjdG9yLmdldDxzdHJpbmcgfCBDb25zdHJ1Y3Rvcj4oXG4gICAgICAgIEFVVEhfTUVUQV9LRVksXG4gICAgICAgIGN0eC5nZXRIYW5kbGVyKClcbiAgICAgICkgPz9cbiAgICAgIHRoaXMucmVmbGVjdG9yLmdldDxzdHJpbmcgfCBDb25zdHJ1Y3Rvcj4oQVVUSF9NRVRBX0tFWSwgY3R4LmdldENsYXNzKCkpO1xuXG4gICAgY29uc3QgcmVxdWlyZWRSb2xlcyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPHN0cmluZ1tdPihcbiAgICAgIFJFUVVJUkVEX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgbG9nLnZlcmJvc2UoYEludGVyY2VwdGVkIHJlcXVlc3Qke21vZGVsTmFtZSA/IGAgZm9yICR7bW9kZWxOYW1lfWAgOiBcIlwifWApO1xuXG4gICAgaWYgKGlzUHVibGljKSB7XG4gICAgICBsb2cuZGVidWcoYFB1YmxpYyByb3V0ZSDigJQgc2tpcHBpbmcgYXV0aGApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5hdXRoSGFuZGxlcikge1xuICAgICAgYXdhaXQgdGhpcy5hdXRoSGFuZGxlci5hdXRob3JpemUoXG4gICAgICAgIGN0eCxcbiAgICAgICAgbW9kZWxOYW1lIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcIm9yZ2FuaXphdGlvblwiIGFzIGFueSk7XG4gICAgaWYgKHVzZXIgfHwgb3JnYW5pemF0aW9uKSB7XG4gICAgICBjb25zdCBjdXJyZW50TG9nID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXQoXCJsb2dnZXJcIiBhcyBhbnkpO1xuICAgICAgY29uc3QgY2hpbGRMb2cgPSBjdXJyZW50TG9nLmZvcih7IHVzZXIsIG9yZ2FuaXphdGlvbiB9KTtcbiAgICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZSh7IGxvZ2dlcjogY2hpbGRMb2cgfSBhcyBhbnkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGFwcGx5VHJhbnNmb3JtZXJzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZsYXZvdXJzID0gQWRhcHRlci5mbGF2b3Vyc1RvVHJhbnNmb3JtKCk7XG4gICAgaWYgKCFmbGF2b3VycykgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBmbGF2b3VyIG9mIGZsYXZvdXJzKSB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoXG4gICAgICAgIGZsYXZvdXJcbiAgICAgICkgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT47XG4gICAgICBpZiAoIXRyYW5zZm9ybWVyKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCB0cmFuc2Zvcm1lci5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIsIEF1dGhEYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbi8qKlxuICogU2ltcGxlIGF1dGggaGFuZGxlciB0aGF0IHJlYWRzIGEgcm9sZSBzdHJpbmcgZnJvbSB0aGUgYEF1dGhvcml6YXRpb246IEJlYXJlciA8cm9sZT5gIGhlYWRlci5cbiAqXG4gKiBPbmx5IG92ZXJyaWRlcyB7QGxpbmsgQXV0aEhhbmRsZXIuZXh0cmFjdEZyb21BdXRofSB0byByZXR1cm4gdGhlIGJlYXJlciB0b2tlbiBhc1xuICogYm90aCB0aGUgdXNlciBpZGVudGlmaWVyIGFuZCB0aGUgc2luZ2xlIHJvbGUuIFRoZSBiYXNlIGNsYXNzIGBiaW5kVG9Db250ZXh0YFxuICogKGBjdHguYWNjdW11bGF0ZShkYXRhKWApIGlzIHN1ZmZpY2llbnQg4oCUIHRoZSB0cmFuc2Zvcm1lci9hZGFwdGVyIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgbWFwcGluZyBjb250ZXh0IGZpZWxkcyB0byBhZGFwdGVyLXNwZWNpZmljIGtleXMgbGlrZSBgVVVJRGAuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhIYW5kbGVyIGV4dGVuZHMgQXV0aEhhbmRsZXI8XG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIERlY2FmUmVxdWVzdENvbnRleHQsXG4gIEF1dGhEYXRhXG4+IHtcbiAgcHJvdGVjdGVkIHBhcnNlUmVxdWVzdChyZXE6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgdXNlclJvbGUgPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uPy5zcGxpdChcIiBcIilbMV0gYXMgc3RyaW5nO1xuICAgIHJldHVybiB1c2VyUm9sZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHRyYWN0RnJvbUF1dGgoY3R4OiBFeGVjdXRpb25Db250ZXh0KTogQXV0aERhdGEge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgdXNlclJvbGUgPSB0aGlzLnBhcnNlUmVxdWVzdChyZXEpO1xuICAgIGlmICghdXNlclJvbGUpIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXCJVbmF1dGhlbnRpY2F0ZWRcIik7XG4gICAgcmV0dXJuIHsgdXNlcjogdXNlclJvbGUsIHJvbGVzOiBbdXNlclJvbGVdIH07XG4gIH1cbn1cblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIERlY2FmQXV0aEhhbmRsZXJ9IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gKiBUaGUgXCJyb2xlXCIgdmFyaWFudCBwcmV2aW91c2x5IHJldHVybmVkIHJvbGVzIGZyb20gYGF1dGhvcml6ZWA7IHdpdGggdGhlIGJhc2VcbiAqIGNsYXNzIG5vdyBvcmNoZXN0cmF0aW5nIHJvbGUgY2hlY2tzIGludGVybmFsbHksIHRoZSB0d28gY2xhc3NlcyBhcmUgZXF1aXZhbGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmUm9sZUF1dGhIYW5kbGVyIGV4dGVuZHMgRGVjYWZBdXRoSGFuZGxlciB7fVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzLCBTZXRNZXRhZGF0YSwgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlCZWFyZXJBdXRoLCBBcGlTZWN1cml0eSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmltcG9ydCB7IEFVVEhfTUVUQV9LRVksIElTX1BVQkxJQ19LRVksIFJFUVVJUkVEX1JPTEVTX0tFWSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoKG1vZGVsPzogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgY29uc3QgcmVzb3VyY2UgPSBtb2RlbFxuICAgID8gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiXG4gICAgICA/IG1vZGVsXG4gICAgICA6IG1vZGVsLm5hbWVcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVjcyA9IFtBcGlCZWFyZXJBdXRoKCksIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXTtcbiAgaWYgKHJlc291cmNlKSBkZWNzLnB1c2goU2V0TWV0YWRhdGEoQVVUSF9NRVRBX0tFWSwgcmVzb3VyY2UpKTtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyguLi5kZWNzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFB1YmxpYygpIHtcbiAgcmV0dXJuIGFwcGx5RGVjb3JhdG9ycyhTZXRNZXRhZGF0YShJU19QVUJMSUNfS0VZLCB0cnVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlUm9sZXMoLi4ucm9sZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoXG4gICAgQXBpU2VjdXJpdHkoXCJiZWFyZXJcIiksXG4gICAgU2V0TWV0YWRhdGEoUkVRVUlSRURfUk9MRVNfS0VZLCByb2xlcyksXG4gICAgVXNlSW50ZXJjZXB0b3JzKEF1dGhJbnRlcmNlcHRvcilcbiAgKTtcbn1cbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5pbXBvcnQgeyB0eXBlIERlY2FmUmVxdWVzdEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFQ0FGX0hBTkRMRVJTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRXhlY3V0ZXMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCxcbiAqIHByb3ZpZGluZyB0aGVtIHdpdGggYSBzaGFyZWQge0BsaW5rIERlY2FmUmVxdWVzdENvbnRleHR9LlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUge0BsaW5rIERlY2FmSGFuZGxlckV4ZWN1dG9yfSBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3Igb3JjaGVzdHJhdGluZyBhbmQgZXhlY3V0aW5nXG4gKiBhIHNlcXVlbmNlIG9mIHJlcXVlc3QgaGFuZGxlcnMuIEVhY2ggaGFuZGxlciByZWNlaXZlcyB0aGUgc2FtZSByZXF1ZXN0LXNjb3BlZCBjb250ZXh0LFxuICogYWxsb3dpbmcgY29vcmRpbmF0ZWQgcHJvY2Vzc2luZyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBtZXRhZGF0YSBleHRyYWN0aW9uLCBhdWRpdGluZyxcbiAqIGFuZCBjdXN0b20gcGlwZWxpbmUgYmVoYXZpb3IuIEhhbmRsZXJzIGFyZSBpbmplY3RlZCB2aWEgdGhlIHtAbGluayBERUNBRl9IQU5ETEVSU30gdG9rZW4sXG4gKiBlbnN1cmluZyBleHRlbnNpYmlsaXR5IGFuZCBsb29zZSBjb3VwbGluZy5cbiAqXG4gKiBAY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIEV4YW1wbGUgaGFuZGxlcjpcbiAqIGNsYXNzIEF1dGhIYW5kbGVyIGltcGxlbWVudHMgRGVjYWZSZXF1ZXN0SGFuZGxlciB7XG4gKiAgIGFzeW5jIGhhbmRsZShjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCByZXE6IFJlcXVlc3QpIHtcbiAqICAgICBjb25zdCB0b2tlbiA9IHJlcS5oZWFkZXJzW1wiYXV0aG9yaXphdGlvblwiXTtcbiAqICAgICBjb25zdCByZXN1bHQgPSBNeVNlcnZpY2UuZG9Tb21ldGhpbmcodG9rZW4pO1xuICogICAgIGNvbnRleHQuc2V0KFwibXkta2V5XCIsIHJlc3VsdCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBFeGVjdXRvciB1c2FnZSBpbiBhIHJlcXVlc3Q6XG4gKiBhd2FpdCBleGVjdXRvci5leGVjKHJlcXVlc3QpO1xuICogLy8gQWxsIGhhbmRsZXJzIHdpbGwgcnVuIGluIHNlcXVlbmNlXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQVxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJCXG4gKlxuICogICAgIENsaWVudC0+PkV4ZWN1dG9yOiBleGVjKHJlcSlcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJBOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJBLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0+PkhhbmRsZXJCOiBoYW5kbGUoY29udGV4dCwgcmVxKVxuICogICAgIEhhbmRsZXJCLS0+PkV4ZWN1dG9yOiBjb21wbGV0ZWRcbiAqICAgICBFeGVjdXRvci0tPj5DbGllbnQ6IHByb2Nlc3NpbmcgZmluaXNoZWRcbiAqL1xuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9IQU5ETEVSUykgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogRGVjYWZSZXF1ZXN0SGFuZGxlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dFxuICApIHt9XG5cbiAgYXN5bmMgZXhlYyhyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpIHtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZkhhbmRsZXJFeGVjdXRvci5uYW1lKS5mb3IodGhpcy5leGVjKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMuY29udGV4dC51dWlkfSBydW5uaW5nICR7dGhpcy5oYW5kbGVycy5sZW5ndGh9IGhhbmRsZXJzIGZvciByZXF1ZXN0ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLmhhbmRsZXJzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVyLmhhbmRsZSh0aGlzLmNvbnRleHQsIHJlcSwgcmVzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgY3R4OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7fVxuXG4gIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgbGV0IHJlc3BvbnNlID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCkucGlwZShcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuICAgICAgICByZXNwb25zZSA9IHRoaXMuY3R4LnRvUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIENhbGxIYW5kbGVyLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IERlZmF1bHRBZGFwdGVyRmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIERFQ0FGX0FEQVBURVJfT1BUSU9OUyxcbiAgRGVjYWZTZXJ2ZXJGbGFncyxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnRlcmNlcHRvciByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIGFsbCByZWdpc3RlcmVkIERlY2FmIHJlcXVlc3QgaGFuZGxlcnNcbiAqIGJlZm9yZSB0aGUgY29udHJvbGxlciBtZXRob2QgaXMgaW52b2tlZC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3J9IGludGVncmF0ZXMgdGhlIERlY2FmIHJlcXVlc3QtaGFuZGxpbmcgcGlwZWxpbmVcbiAqIGludG8gTmVzdEpTJyBpbnRlcmNlcHRvciBtZWNoYW5pc20uIEJlZm9yZSBwYXNzaW5nIGV4ZWN1dGlvbiB0byB0aGUgbmV4dCBoYW5kbGVyIGluIHRoZVxuICogTmVzdEpTIGNoYWluLCBpdCBkZWxlZ2F0ZXMgcmVxdWVzdCBwcm9jZXNzaW5nIHRvIHRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9LCB3aGljaFxuICogc2VxdWVudGlhbGx5IHJ1bnMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcy4gVGhpcyBhbGxvd3NcbiAqIGJlaGF2aW9ycyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBsb2dnaW5nLCB0ZW5hbnQgcmVzb2x1dGlvbiwgb3IgbWV0YWRhdGEgZW5yaWNobWVudFxuICogdG8gb2NjdXIgcHJpb3IgdG8gY29udHJvbGxlciBleGVjdXRpb24uXG4gKlxuICogQGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQXBwbHkgZ2xvYmFsbHk6XG4gKiBhcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKG5ldyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IoZXhlY3V0b3IpKTtcbiAqXG4gKiAvLyBPciBpbiBhIG1vZHVsZTpcbiAqIEBNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gKiAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEludGVyY2VwdG9yXG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBDb250cm9sbGVyXG4gKlxuICogICAgIENsaWVudC0+PkludGVyY2VwdG9yOiBIVFRQIFJlcXVlc3RcbiAqICAgICBJbnRlcmNlcHRvci0+PkV4ZWN1dG9yOiBleGVjKHJlcXVlc3QpXG4gKiAgICAgRXhlY3V0b3ItLT4+SW50ZXJjZXB0b3I6IGhhbmRsZXJzIGNvbXBsZXRlZFxuICogICAgIEludGVyY2VwdG9yLT4+Q29udHJvbGxlcjogbmV4dC5oYW5kbGUoKVxuICogICAgIENvbnRyb2xsZXItLT4+Q2xpZW50OiBSZXNwb25zZVxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRvcjogRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb250ZXh0dWFsaXplKHJlcTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICAgIGNvbnN0IGZsYWdzOiBEZWNhZlNlcnZlckZsYWdzID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSBhcyBhbnk7XG4gICAgT2JqZWN0LmFzc2lnbihmbGFncy5vdmVycmlkZXMsIHJlcT8uW0RFQ0FGX0FEQVBURVJfT1BUSU9OU10gPz8ge30pO1xuXG4gICAgY29uc3QgaXAgPSBleHRyYWN0SXAocmVxKTtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmdldCgpLmZvcih7IGlwIH0pO1xuXG4gICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKFxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAge30sXG4gICAgICAgIERlZmF1bHRBZGFwdGVyRmxhZ3MsXG4gICAgICAgIHtcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIG9wZXJhdGlvbjogYCR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWAsXG4gICAgICAgIH0sXG4gICAgICAgIGZsYWdzXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGludGVyY2VwdChjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBuZXh0OiBDYWxsSGFuZGxlcikge1xuICAgIGNvbnN0IHJlcSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHJlcyA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IpLmZvcih0aGlzLmludGVyY2VwdCk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jb250ZXh0dWFsaXplKHJlcSk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGNvbnRleHR1YWxpemVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG5cbiAgICBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWMocmVxLCByZXMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBleGVjdXRvcnMgZmluaXNoZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRyYWN0SXAocmVxOiBhbnkpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gIGZ1bmN0aW9uIHBhcnNlSXBIZWFkZXIodmFsdWU/OiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlWzBdIDogdmFsdWU7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgoc2VnbWVudCkgPT4gc2VnbWVudC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pWzBdO1xuICB9XG4gIHJldHVybiAoXG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LWZvcndhcmRlZC1mb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJ4LXJlYWwtaXBcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLUZvcndhcmRlZC1Gb3JcIl0pID8/XG4gICAgcGFyc2VJcEhlYWRlcihoZWFkZXJzPy5bXCJYLVJlYWwtSVBcIl0pID8/XG4gICAgcmVxLmlwXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcblxuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciB9IGZyb20gXCIuLi9pbnRlcmNlcHRvcnMvRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge1xuICBnbG9iYWw/OiBib29sZWFuO1xuICBoYW5kbGVyPzogVHlwZTxBdXRoSGFuZGxlcj47XG59O1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQXV0aE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KFxuICAgIG9wdGlvbnM6IERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7fVxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBwcm92aWRlcnM6IER5bmFtaWNNb2R1bGVbXCJwcm92aWRlcnNcIl0gPSBbXG4gICAgICBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKG9wdGlvbnMuaGFuZGxlcik7XG4gICAgICBwcm92aWRlcnMucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFVVEhfSEFORExFUixcbiAgICAgICAgdXNlQ2xhc3M6IG9wdGlvbnMuaGFuZGxlcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmdsb2JhbCkge1xuICAgICAgKHByb3ZpZGVycyBhcyBhbnlbXSkucHVzaCh7XG4gICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IEF1dGhJbnRlcmNlcHRvcixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQXV0aE1vZHVsZSxcbiAgICAgIGdsb2JhbDogb3B0aW9ucy5nbG9iYWwgPz8gZmFsc2UsXG4gICAgICBwcm92aWRlcnMsXG4gICAgICBleHBvcnRzOiBbQXV0aEludGVyY2VwdG9yLCBBVVRIX0hBTkRMRVJdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IERlbGV0ZSwgR2V0LCBQYXRjaCwgUG9zdCwgUHV0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIE1hcHMgYW4gSFRUUCB2ZXJiIHRvIGl0cyBjb3JyZXNwb25kaW5nIE5lc3RKUyBtZXRob2QgZGVjb3JhdG9yLlxuICpcbiAqIEBwYXJhbSB2ZXJiIC0gSFRUUCB2ZXJiIHRvIGJlIGNvbnZlcnRlZCAoZS5nLiBHRVQsIFBPU1QsIFBVVCwgUEFUQ0gsIERFTEVURSkuXG4gKiBAcmV0dXJucyBBIE5lc3RKUyBtZXRob2QgZGVjb3JhdG9yIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBIVFRQIHZlcmIuXG4gKlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm92aWRlZCBIVFRQIHZlcmIgaXMgbm90IHN1cHBvcnRlZCBvciBub3QgbWFwcGVkXG4gKiB0byBhIE5lc3RKUyBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBIdHRwVmVyYlRvRGVjb3JhdG9yKFxuICB2ZXJiOiBIdHRwVmVyYnNcbik6IChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8SHR0cFZlcmJzLCAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yPiA9IHtcbiAgICBHRVQ6IEdldCxcbiAgICBQT1NUOiBQb3N0LFxuICAgIFBVVDogUHV0LFxuICAgIFBBVENIOiBQYXRjaCxcbiAgICBERUxFVEU6IERlbGV0ZSxcbiAgfTtcblxuICBjb25zdCBkZWNvcmF0b3IgPSBodHRwVG9DcnVkW3ZlcmJdO1xuXG4gIGlmICghZGVjb3JhdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuXG5jb25zdCBleHRyYWN0UGF0aFBhcmFtcyA9IChyb3V0ZVBhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIHJvdXRlUGF0aFxuICAgIC5zcGxpdChcIi9cIilcbiAgICAuZmlsdGVyKChwKSA9PiBwLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgIC5tYXAoKHApID0+IHAuc2xpY2UoMSkpO1xufTtcblxuY29uc3QgYXBpUGFyYW1TcGVjID0gKG5hbWU6IHN0cmluZyk6IERlY2FmQXBpUHJvcGVydHkgPT4gKHtcbiAgbmFtZSxcbiAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgcmVxdWlyZWQ6IHRydWUsXG4gIHR5cGU6IFN0cmluZyxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJvdXRlSGFuZGxlcjxUPihtZXRob2ROYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIChcbiAgICB0aGlzOiBEZWNhZk1vZGVsQ29udHJvbGxlcjxhbnk+LFxuICAgIHBhdGhQYXJhbXM6IERlY2FmUGFyYW1Qcm9wcyxcbiAgICBxdWVyeVBhcmFtczogRGlyZWN0aW9uTGltaXRPZmZzZXRcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgY29uc3QgbG9nOiBMb2dnZXIgPSB0aGlzLmxvZy5mb3IobWV0aG9kTmFtZSk7XG5cbiAgICB0cnkge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgSW52b2tpbmcgcGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIGdpdmVuIHBhcmFtZXRlcnM6ICR7SlNPTi5zdHJpbmdpZnkocGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyKX1gXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkaXJlY3Rpb24sIGxpbWl0LCBvZmZzZXQgfSA9IHF1ZXJ5UGFyYW1zO1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZChcbiAgICAgICAgdGhpcy5wZXJzaXN0ZW5jZSgpLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAuLi5wYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIsXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgbGltaXQsXG4gICAgICAgIG9mZnNldFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIGFzIEh0dHBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHtcbiAgQ29udGV4dCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBSZXBvLFxuICBSZXBvc2l0b3J5LFxuICBTZXJ2aWNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCB0eXBlIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmltcG9ydCB7IERFQ0FGX0FEQVBURVJfT1BUSU9OUywgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29udHJvbGxlcjxcbiAgQ09OVEVYVCBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgSHR0cERlY2FmQ29udHJvbGxlcjxSZXF1ZXN0LCBhbnksIERlY2FmUmVxdWVzdENvbnRleHQ+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmTW9kZWxDb250cm9sbGVyPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxDPiB7XG4gIHByaXZhdGUgX3BlcnNpc3RlbmNlPzogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBfbmFtZSk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxNPjtcblxuICBwZXJzaXN0ZW5jZShjdHg/OiBDb250ZXh0PGFueT4pOiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBTZXJ2aWNlLmdldDxNb2RlbFNlcnZpY2U8TT4+KHRoaXMuY2xhc3MpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBNb2RlbFNlcnZpY2UuZ2V0U2VydmljZShcbiAgICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgICApIGFzIE1vZGVsU2VydmljZTxNPjtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5jbGFzcykgYXMgUmVwbzxNPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY29uc3QgY2VydHMgPSAodGhpcy5jbGllbnRDb250ZXh0LnJlcXVlc3QgYXMgYW55KVtERUNBRl9BREFQVEVSX09QVElPTlNdIHx8IHt9O1xuICAgIGlmIChjdHgpIHtcbiAgICAgIHRoaXMuY2xpZW50Q29udGV4dC5wdXQoY2VydHMpO1xuICAgIH1cblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUoY2VydHMpXG4gICAgICAgIDogdGhpcy5fcGVyc2lzdGVuY2UuZm9yKGNlcnRzKVxuICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9jb25zdGFudHNcIjtcblxuY29uc3QgZHRvQ2FjaGUgPSBuZXcgTWFwPFxuICBPcGVyYXRpb25LZXlzLFxuICBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+XG4+KCk7XG5cbi8qKlxuICogQnVpbGRzIGEgTmVzdC9Td2FnZ2VyIERUTyBjbGFzcyBmb3IgdGhlIGdpdmVuIG1vZGVsIGFuZCBDUlVEIG9wZXJhdGlvbi5cbiAqXG4gKiBSdWxlczpcbiAqICAtIE9ubHkgQ1JFQVRFIGFuZCBVUERBVEUgKGFuZCB0aGVpciBidWxrIHZhcmlhbnRzKSBwcm9kdWNlIGEgRFRPO1xuICogICAgYWxsIG90aGVyIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBvcmlnaW5hbCBtb2RlbCBjbGFzcyB1bmNoYW5nZWQuXG4gKiAgLSBAZ2VuZXJhdGVkKCkgcHJvcGVydGllcyAoY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGNyZWF0ZWRCeSwgdXBkYXRlZEJ5LFxuICogICAgdXVpZCwgdmVyc2lvbiwgQGNvbXBvc2VkIHBrcywg4oCmKSBhcmUgKipuZXZlcioqIGV4cG9zZWQgaW4gYW55IERUTy5cbiAqICAtIFRoZSBAcGsoKSBwcm9wZXJ0eTpcbiAqICAgICAg4oCiIFVQREFURSDigJMgYWx3YXlzIGluY2x1ZGVkLlxuICogICAgICDigKIgQ1JFQVRFICDigJMgaW5jbHVkZWQgb25seSB3aGVuIHRoZSBwayBpcyBOT1QgYXV0by1nZW5lcmF0ZWRcbiAqICAgICAgICAgICAgICAgICAgKGNoZWNrZWQgdmlhIE1vZGVsLnBrUHJvcHMoKS5nZW5lcmF0ZWQgQU5EIE1vZGVsLmdlbmVyYXRlZCgpKS5cbiAqICAtIFJlbGF0aW9uIHByb3BlcnRpZXMgKEBvbmVUb09uZSwgQG9uZVRvTWFueSwg4oCmKTpcbiAqICAgICAg4oCiIENSRUFURSAg4oCTIG5lc3RlZCBhcyBEdG9Gb3IoQ1JFQVRFLCBSZWxhdGVkTW9kZWwpLiBXaGVuIHRoZSByZWxhdGlvblxuICogICAgICAgICAgICAgICAgICBjcmVhdGVzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIChtb2RlbCBBIOKGkiBtb2RlbCBCIOKGkiBtb2RlbCBBKSxcbiAqICAgICAgICAgICAgICAgICAgdGhlIGJhY2stcmVmZXJlbmNlIHVzZXMgdGhlIHJlbGF0ZWQgbW9kZWwncyBQSyB0eXBlXG4gKiAgICAgICAgICAgICAgICAgIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWsgdGhlIGN5Y2xlLlxuICogICAgICDigKIgVVBEQVRFICDigJMgdW5pb24gb2YgRHRvRm9yKFVQREFURSwgUmVsYXRlZE1vZGVsKSAqKm9yKiogdGhlXG4gKiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgbW9kZWwncyBwcmltYXJ5LWtleSB0eXBlIChzdHJpbmcgLyBpbnRlZ2VyKSxcbiAqICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgU3dhZ2dlciBvbmVPZi4gQ2lyY3VsYXIgYmFjay1yZWZlcmVuY2VzXG4gKiAgICAgICAgICAgICAgICAgIG9taXQgdGhlIERUTyAkcmVmIGFuZCBvbmx5IGluY2x1ZGUgdGhlIFBLIHR5cGUuXG4gKlxuICogTWV0YWRhdGEucHJvcGVydGllcygpIG5vdyByZXR1cm5zIEFMTCBwcm9wZXJ0aWVzIGFjcm9zcyB0aGUgcHJvdG90eXBlIGNoYWluLFxuICogc28gRFRPIGluaGVyaXRhbmNlIGlzIG5vIGxvbmdlciBuZWVkZWQ7IGV2ZXJ5IERUTyBpcyBhIGZsYXQgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEdG9Gb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgc3RhY2s6IFNldDxDb25zdHJ1Y3Rvcjxhbnk+PiA9IG5ldyBTZXQoKVxuKTogQ29uc3RydWN0b3I8YW55PiB7XG4gIGlmICghVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLmluY2x1ZGVzKG9wKSkge1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RHRvQ2FjaGUob3ApO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobW9kZWwpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IGlzVXBkYXRlT3AgPSBbXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gIF0uaW5jbHVkZXMob3AgYXMgYW55KTtcblxuICBjbGFzcyBEeW5hbWljRFRPIHt9XG4gIGNhY2hlLnNldChtb2RlbCwgRHluYW1pY0RUTyk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8sIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGAke3RvUGFzY2FsQ2FzZShtb2RlbC5uYW1lKX0ke3RvUGFzY2FsQ2FzZShvcCl9RFRPYCxcbiAgfSk7XG5cbiAgY29uc3QgcGtQcm9wID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE1vZGVsLnBrKG1vZGVsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KSgpO1xuXG4gIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IHBrUHJvcCA/IE1vZGVsLnBrUHJvcHMobW9kZWwgYXMgYW55KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtEZXNpZ25UeXBlID0gcGtQcm9wXG4gICAgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwa1Byb3AgYXMgc3RyaW5nKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa1R5cGVJc051bWVyaWMgPVxuICAgIHBrRGVzaWduVHlwZSA9PT0gTnVtYmVyIHx8IHBrRGVzaWduVHlwZSA9PT0gQmlnSW50O1xuICBjb25zdCBwa0lzR2VuZXJhdGVkID1cbiAgICAhIXBrUHJvcHNNZXRhZGF0YT8uZ2VuZXJhdGVkIHx8XG4gICAgKHBrUHJvcFxuICAgICAgPyBNb2RlbC5nZW5lcmF0ZWRCeVNlcXVlbmNlKG1vZGVsIGFzIGFueSwgcGtQcm9wIGFzIGFueSkgfHxcbiAgICAgICAgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwa1Byb3AgYXMgc3RyaW5nKSB8fFxuICAgICAgICBwa1R5cGVJc051bWVyaWNcbiAgICAgIDogZmFsc2UpO1xuXG4gIGNvbnN0IGFsbFByb3BzID0gQXJyYXkuZnJvbShuZXcgU2V0KE1ldGFkYXRhLnByb3BlcnRpZXMobW9kZWwpIHx8IFtdKSk7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigoTW9kZWwucmVsYXRpb25zKG1vZGVsKSBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICBjb25zdCBzY2FsYXJQcm9wczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgYWxsUHJvcHMpIHtcbiAgICBpZiAoIXByb3ApIGNvbnRpbnVlO1xuICAgIGlmIChyZWxhdGlvbnMuaGFzKHByb3ApKSBjb250aW51ZTtcblxuICAgIGlmIChwcm9wID09PSBwa1Byb3AgJiYgIWlzVXBkYXRlT3AgJiYgcGtJc0dlbmVyYXRlZCkgY29udGludWU7XG4gICAgaWYgKHByb3AgIT09IHBrUHJvcCAmJiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApKVxuICAgICAgY29udGludWU7XG5cbiAgICBzY2FsYXJQcm9wcy5wdXNoKHByb3ApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHNjYWxhclByb3BzKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhdmFsaWRhdGlvbj8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcbiAgICBjb25zdCB0eXBlSGludCA9XG4gICAgICBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApID8/XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIH07XG4gICAgaWYgKHR5cGVIaW50KSBhcGlPcHRpb25zLnR5cGUgPSB0eXBlSGludDtcblxuICAgIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGRlc2lnblR5cGUgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCkgPz8gdHlwZUhpbnQ7XG4gICAgaWYgKHR5cGVvZiBkZXNpZ25UeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIGRlc2lnblR5cGUsXG4gICAgICAgIER5bmFtaWNEVE8ucHJvdG90eXBlLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmVsYXRpb24gb2YgcmVsYXRpb25zKSB7XG4gICAgY29uc3QgcmVsYXRpb25NZXRhID0gTWV0YWRhdGEucmVsYXRpb25zKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGlmICghcmVsYXRpb25NZXRhKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTWV0YWRhdGEgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGxldCByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPVxuICAgICAgcmVsYXRpb25NZXRhLmNsYXNzIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgaWYgKHR5cGVvZiByZWxhdGlvblR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhcmVsYXRpb25UeXBlLm5hbWUpIHtcbiAgICAgIHJlbGF0aW9uVHlwZSA9IChyZWxhdGlvblR5cGUgYXMgYW55KSgpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0aW9uVHlwZSB8fCB0eXBlb2YgcmVsYXRpb25UeXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUeXBlIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKCFNb2RlbC5nZXQocmVsYXRpb25UeXBlLm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBjb25zdCBpc0FycmF5ID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuTElTVF07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcblxuICAgIC8vIERldGVjdCBjaXJjdWxhciByZWZlcmVuY2U6IGlmIHRoZSByZWxhdGVkIG1vZGVsIGlzIGFscmVhZHkgaW4gdGhlXG4gICAgLy8gcmVjdXJzaW9uIHN0YWNrLCB1c2UgdGhlIFBLIHR5cGUgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWtcbiAgICAvLyB0aGUgY3ljbGUuIFRoaXMgcHJldmVudHMgQG5lc3Rqcy9zd2FnZ2VyJ3MgU2NoZW1hT2JqZWN0RmFjdG9yeSBmcm9tXG4gICAgLy8gaW5maW5pdGVseSByZWN1cnNpbmcgd2hlbiBleHBsb3JpbmcgdGhlIHNjaGVtYXMuXG4gICAgY29uc3QgaXNDaXJjdWxhciA9IHN0YWNrLmhhcyhyZWxhdGlvblR5cGUpO1xuXG4gICAgaWYgKGlzQ2lyY3VsYXIpIHtcbiAgICAgIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gICAgICBhZGRSZWxhdGlvblBrUmVmKER5bmFtaWNEVE8sIHJlbGF0aW9uLCBwa1R5cGVOYW1lLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uRHRvID0gRHRvRm9yKG9wLCByZWxhdGlvblR5cGUsIG5ldyBTZXQoc3RhY2spLmFkZChtb2RlbCkpO1xuXG4gICAgaWYgKGlzVXBkYXRlT3ApIHtcbiAgICAgIGFkZFJlbGF0aW9uVXBkYXRlKFxuICAgICAgICBEeW5hbWljRFRPLFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICAgcmVsYXRpb25UeXBlLFxuICAgICAgICByZWxhdGlvbkR0byxcbiAgICAgICAgaXNBcnJheSxcbiAgICAgICAgaXNSZXF1aXJlZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUmVsYXRpb24oRHluYW1pY0RUTywgcmVsYXRpb24sIHJlbGF0aW9uRHRvLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHluYW1pY0RUTztcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb24oXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgdHlwZTogcmVsYXRpb25EdG8sXG4gICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgaXNBcnJheSxcbiAgfTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IHJlbGF0aW9uRHRvLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgYSByZWxhdGlvbiBwcm9wZXJ0eSB0aGF0IHVzZXMgdGhlIFBLIHR5cGUgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mXG4gKiBhIGZ1bGwgRFRPIGNsYXNzLiBVc2VkIHRvIGJyZWFrIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gQ3VzdG9tZXIg4oaSIE9yZGVyIOKGkiBDdXN0b21lcikuXG4gKi9cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uUGtSZWYoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHBrVHlwZU5hbWU6IHN0cmluZyxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogcGtUeXBlTmFtZSB9LCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nLCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSk7XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiAocGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcpLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvblVwZGF0ZShcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFNb2RlbHMgPVxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLCBEdG9DbGFzcykgfHwgW107XG4gIGlmICghZXh0cmFNb2RlbHMuaW5jbHVkZXMocmVsYXRpb25EdG8pKSB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUyxcbiAgICAgIFsuLi5leHRyYU1vZGVscywgcmVsYXRpb25EdG9dLFxuICAgICAgRHRvQ2xhc3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZHRvUmVmID0gYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7cmVsYXRpb25EdG8ubmFtZX1gO1xuICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICBjb25zdCBvbmVPZkl0ZW1zID0gW3sgJHJlZjogZHRvUmVmIH0sIHsgdHlwZTogcGtUeXBlTmFtZSB9XTtcblxuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KTtcblxuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogT2JqZWN0LFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gTW9kZWwucGtQcm9wcyhyZWxhdGlvblR5cGUgYXMgYW55KTtcbiAgICBjb25zdCBwa1R5cGUgPSBwa1Byb3BzTWV0YWRhdGE/LnR5cGU7XG4gICAgaWYgKHBrVHlwZSA9PT0gTnVtYmVyIHx8IHBrVHlwZSA9PT0gQmlnSW50KSByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgaWYgKE1vZGVsLmdlbmVyYXRlZChjdXJyZW50LCBwcm9wIGFzIGFueSkpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKGN1cnJlbnQsIHByb3AgYXMgYW55KTtcbiAgICBpZiAodmFsaWRhdGlvbikgcmV0dXJuIHZhbGlkYXRpb24gYXMgYW55O1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpOiBhbnkge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKGN1cnJlbnQsIHByb3ApO1xuICAgIGlmICh0eXBlKSByZXR1cm4gdHlwZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldER0b0NhY2hlKFxuICBvcDogT3BlcmF0aW9uS2V5c1xuKTogV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PiB7XG4gIGlmICghZHRvQ2FjaGUuaGFzKG9wKSkge1xuICAgIGR0b0NhY2hlLnNldChvcCwgbmV3IFdlYWtNYXAoKSk7XG4gIH1cbiAgcmV0dXJuIGR0b0NhY2hlLmdldChvcCkhO1xufVxuIiwiaW1wb3J0IHsgQ29udHJvbGxlciwgUGFyYW0sIFF1ZXJ5LCBSZXNwb25zZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpTm90Rm91bmRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIHR5cGUgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvS2ViYWJDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIERCS2V5cyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsLFxuICBBcGlQYXJhbXNGcm9tTW9kZWwsXG4gIHR5cGUgRGVjYWZBcGlQcm9wZXJ0eSxcbiAgRGVjYWZCb2R5LFxuICBEZWNhZlBhcmFtcyxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBzdGF0aWMgZ2V0UGVyc2lzdGVuY2U8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBNb2RlbENsYXp6OiBNb2RlbENvbnN0cnVjdG9yPFQ+XG4gICk6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPFQ+PihNb2RlbENsYXp6KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoTW9kZWxDbGF6eikgYXMgTW9kZWxTZXJ2aWNlPFQ+O1xuICAgICAgfSBjYXRjaCAoZTI6IHVua25vd24pIHtcbiAgICAgICAgcmV0dXJuIFJlcG9zaXRvcnkuZm9yTW9kZWwoTW9kZWxDbGF6eikgYXMgUmVwbzxUPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIHBlcnNpc3RlbmNlOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+LFxuICAgIHByZWZpeDogc3RyaW5nID0gUGVyc2lzdGVuY2VLZXlzLlFVRVJZXG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgcmVwbzogUmVwbzxUPiA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcbiAgICBjb25zdCBNb2RlbENvbnN0cjogQ29uc3RydWN0b3IgPSByZXBvLmNsYXNzO1xuICAgIGNvbnN0IHF1ZXJ5TWV0aG9kczogUmVjb3JkPHN0cmluZywgeyBmaWVsZHM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB9PiA9XG4gICAgICBNZXRhZGF0YS5nZXQoXG4gICAgICAgIHJlcG8uY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShQZXJzaXN0ZW5jZUtleXMuUVVFUlkpXG4gICAgICApID8/IHt9O1xuXG4gICAgY29uc3Qgcm91dGVNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcGVyc2lzdGVuY2UuY29uc3RydWN0b3IgYXMgQ29uc3RydWN0b3IsXG4gICAgICAgIE1ldGFkYXRhLmtleShERUNBRl9ST1VURSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjbGFzcyBRdWVyeUNvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxUPiB7XG4gICAgICBvdmVycmlkZSBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxUPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgICAgY29uc3RydWN0b3IoY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgbmFtZTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIG5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIHBhcmFtc10gb2YgT2JqZWN0LmVudHJpZXMocm91dGVNZXRob2RzKSkge1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3BhcmFtcy5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50OiBzdHJpbmcpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihwYXJhbXMuaHR0cE1ldGhvZCBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIHBhcmFtcy5odHRwTWV0aG9kXG4gICAgICApO1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgW2h0dHBEZWNvcmF0b3IsIC4uLmRlY29yYXRvcnNdXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW21ldGhvZE5hbWUsIG9ialZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMocXVlcnlNZXRob2RzKSkge1xuICAgICAgY29uc3QgZmllbGRzID0gb2JqVmFsdWVzLmZpZWxkcyA/PyBbXTtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwcmVmaXgsIG1ldGhvZE5hbWUsIC4uLmZpZWxkcy5tYXAoKGYpID0+IGA6JHtmfWApXVxuICAgICAgICAuZmlsdGVyKChzZWdtZW50KSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgIFF1ZXJ5Q29udHJvbGxlcixcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IoXCJHRVRcIiBhcyBIdHRwVmVyYnMpKHJvdXRlUGF0aCB8fCB1bmRlZmluZWQpO1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICByb3V0ZVBhdGgsXG4gICAgICAgIFwiR0VUXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihkZWNvcmF0b3JDb25maWcgfHwge30pLFxuICAgICAgLi4uKG1vZHVsZU92ZXJyaWRlIHx8IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgRmFjdG9yeUNvbnRyb2xsZXIgPSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LmNyZWF0ZTxUPihcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgZmFjdG9yeVBlcnNpc3RlbmNlLFxuICAgICAgbWVyZ2VkQ29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBmYWN0b3J5Um91dGVzID0gKEZhY3RvcnlDb250cm9sbGVyIGFzIGFueSkuX19yb3V0ZXNfXyBhc1xuICAgICAgfCBTZXJ2ZXJSb3V0ZVtdXG4gICAgICB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHsgZ2V0UEssIGFwaVByb3BlcnRpZXMsIHBhdGg6IHBrUGF0aCB9ID1cbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsKE1vZGVsQ29uc3RyKTtcblxuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke2ZhY3RvcnlSb3V0ZXM/Lmxlbmd0aCA/PyAwfSBmYWN0b3J5IHJvdXRlc2BcbiAgICApO1xuXG4gICAgQENvbnRyb2xsZXIocm91dGVQYXRoKVxuICAgIEBBcGlUYWdzKG1vZGVsQ2xhenpOYW1lKVxuICAgIEBBcGlFeHRyYU1vZGVscyhNb2RlbENvbnN0cilcbiAgICBAQXV0aChNb2RlbENvbnN0cilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZNb2RlbENvbnRyb2xsZXI8VD4ge1xuICAgICAgcHJpdmF0ZSByZWFkb25seSBwazogc3RyaW5nID0gTW9kZWwucGsoTW9kZWxDb25zdHIpIGFzIHN0cmluZztcblxuICAgICAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgY2xhc3MoKSB7XG4gICAgICAgIHJldHVybiBNb2RlbENvbnN0cjtcbiAgICAgIH1cblxuICAgICAgb3ZlcnJpZGUgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8VD4ge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRHluYW1pY01vZGVsQ29udHJvbGxlci5uYW1lKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYFJlZ2lzdGVyaW5nIGR5bmFtaWMgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7dGhpcy5jbGFzcy5uYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudClcbiAgICAgICAgICByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IEZyb21Nb2RlbENvbnRyb2xsZXIubWF0Y2hSb3V0ZShcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBmYWN0b3J5UGVyc2lzdGVuY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH0gPVxuICAgICAgICAgIHJlZ2lzdHJhdGlvbjtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHJvdXRlLm1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICAgICAgcm91dGUucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc10sXG4gICAgICAgICAgICBwYXJhbURlY29yYXRvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgYXMgYW55O1xuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdO1xuICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoTW9kZWxDbGF6eikgYXMga2V5b2YgTW9kZWw8YW55PjtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ2xhenosXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLkNPTVBPU0VELCBwaylcbiAgICApO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5cyA9IGNvbXBvc2VkPy5hcmdzID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9XG4gICAgICBBcnJheS5pc0FycmF5KGNvbXBvc2VkS2V5cykgJiYgY29tcG9zZWRLZXlzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmNvbXBvc2VkS2V5c10pKVxuICAgICAgICA6IEFycmF5LmZyb20obmV3IFNldChbcGtdKSk7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenopID8/IFwiXCI7XG4gICAgY29uc3QgcGF0aCA9IGA6JHt1bmlxdWVLZXlzLmpvaW4oXCIvOlwiKX1gO1xuICAgIGNvbnN0IGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSA9IHVuaXF1ZUtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgZGVzY3JpcHRpb246IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenosIGtleSksXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT5cbiAgICAgICAgY29tcG9zZWQ/LnNlcGFyYXRvciA/IHBhcmFtcy5qb2luKGNvbXBvc2VkLnNlcGFyYXRvcikgOiBwYXJhbXMuam9pbihcIlwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmaW5lTWV0aG9kKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdXG4gICkge1xuICAgIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2ROYW1lKTtcbiAgICBtZXRob2REZWNvcmF0b3JzLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgICBwYXJhbURlY29yYXRvcnMuZm9yRWFjaCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+XG4gICAgICBkZWNvcmF0b3IocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaFJvdXRlKFxuICAgIHJvdXRlOiBTZXJ2ZXJSb3V0ZSxcbiAgICBwa1BhdGg6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBlcnNpc3RlbmNlPzogYW55XG4gICk6IHtcbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPjtcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT47XG4gIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoIH0gPSByb3V0ZTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNyZWF0ZUhhbmRsZXIoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrUmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtVcGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcyksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtEZWxldGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcyksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWFkSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhhcGlQcm9wZXJ0aWVzKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVVwZGF0ZUhhbmRsZXIoZ2V0UEssIE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZURlbGV0ZUhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhhcGlQcm9wZXJ0aWVzKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2VkIFBLIGZhbGxiYWNrIHJvdXRlcyAoZmlsdGVyRW1wdHkpIOKAlCBwYXRoIGRpZmZlcnMgZnJvbSBwa1BhdGhcbiAgICBjb25zdCBmYWxsYmFja1NlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpc0FsbFBhcmFtcyA9IGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJiBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgcmVhZEJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlYWRIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGB1cGRhdGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVVcGRhdGVIYW5kbGVyKGdldFBLLCBNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoZmFsbGJhY2tBcGlQcm9wcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgZGVsZXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlRGVsZXRlSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoZmFsbGJhY2tBcGlQcm9wcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVTdGF0ZW1lbnRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyKHN0YXRlbWVudEtleSwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIG5vcm1hbGl6ZWRQYXRoLCBzdGF0ZW1lbnRLZXkpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXnF1ZXJ5XFwvLywgXCJcIikuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKHF1ZXJ5TWV0aG9kKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMocXVlcnlNZXRob2QsIG5vcm1hbGl6ZWRQYXRoLCBcIkdFVFwiLCB0cnVlKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBjdXN0b20gQHJvdXRlKCkgcGF0aHMgKGUuZy4gXCJtZXRhZGF0YS9mb3ItcHJvZHVjdC86cHJvZHVjdENvZGVcIilcbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIiwgXCJmaW5kQnlcIiwgXCJmaW5kQnlQYWdpbmF0ZVwiLCBcImZpbmRPbmVCeVwiLCBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLCBcInBhZ2VcIiwgXCJjb3VudE9mXCIsIFwibWF4T2ZcIiwgXCJtaW5PZlwiLCBcImF2Z09mXCIsIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLCBcImdyb3VwT2ZcIiwgXCJzdGF0ZW1lbnRcIiwgXCJidWxrXCIsIFwicXVlcnlcIixcbiAgICBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikgJiZcbiAgICAgICFrbm93blByZWZpeGVzLmhhcyhwYXRoU2VnbWVudHNbMF0pXG4gICAgKSB7XG4gICAgICAvLyBMb29rIHVwIHRoZSBhY3R1YWwgbWV0aG9kIG5hbWUgZnJvbSBAcm91dGUgbWV0YWRhdGEgYnkgbWF0Y2hpbmcgdGhlIHBhdGguXG4gICAgICAvLyBUaGUgQHJvdXRlIGRlY29yYXRvciBzdG9yZXMgeyBwYXRoLCBodHRwTWV0aG9kLCBoYW5kbGVyIH0ga2V5ZWQgYnkgbWV0aG9kIG5hbWVcbiAgICAgIC8vIG9uIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgICAgY29uc3Qgcm91dGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgICAocGVyc2lzdGVuY2UgYXMgYW55KT8uY29uc3RydWN0b3IsXG4gICAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgICApID8/IHt9O1xuICAgICAgY29uc3QgbWF0Y2hlZEVudHJ5ID0gT2JqZWN0LmVudHJpZXMocm91dGVNZXRhZGF0YSkuZmluZChcbiAgICAgICAgKFssIGluZm9dKSA9PlxuICAgICAgICAgIGluZm8gJiZcbiAgICAgICAgICB0eXBlb2YgaW5mbyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIGluZm8ucGF0aD8ucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgPT09IG5vcm1hbGl6ZWRQYXRoXG4gICAgICApO1xuICAgICAgY29uc3QgYWN0dWFsTWV0aG9kTmFtZSA9IG1hdGNoZWRFbnRyeT8uWzBdIHx8IHBhdGhTZWdtZW50c1swXTtcblxuICAgICAgY29uc3QgcGFyYW1TZWdtZW50cyA9IHBhdGhTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IHBhcmFtU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIoYWN0dWFsTWV0aG9kTmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHthY3R1YWxNZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgICAgICBdLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNvbXBsZXhRdWVyeVBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT5cbiAgKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRNZXRob2ROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlyc3RTZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIilbMF07XG4gICAgcmV0dXJuIGZpcnN0U2VnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb21wbGV4UXVlcnlQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNyZWF0ZUhhbmRsZXIoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjcmVhdGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBkYXRhOiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbDxhbnk+PiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICAgICkuZm9yKGNyZWF0ZSk7XG4gICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBsZXQgY3JlYXRlZDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmNyZWF0ZShkYXRhLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjcmVhdGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBkYXRhOiBhbnlbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IoY3JlYXRlQWxsKTtcbiAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGxldCBjcmVhdGVkOiBhbnlbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuY3JlYXRlQWxsKFxuICAgICAgICAgIGRhdGEubWFwKChkKSA9PiBuZXcgTW9kZWxDb25zdHIoZCkpLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZEFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWRBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHtub3JtYWxpemVkSWRzfSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWRBbGwobm9ybWFsaXplZElkcyBhcyBhbnksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGByZWFkICR7cmVhZC5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICByZXR1cm4gcmVhZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiB1cGRhdGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBib2R5OiBhbnlbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHVwZGF0ZUFsbCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55W107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtib2R5Lmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS51cGRhdGVBbGwoYm9keSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtEZWxldGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgaWRzOiBzdHJpbmdbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IoZGVsZXRlQWxsKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZHMgPSBBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXTtcbiAgICAgIGxldCByZWFkOiBNb2RlbFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBkZWxldGluZyAke25vcm1hbGl6ZWRJZHMubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmRlbGV0ZUFsbChub3JtYWxpemVkSWRzLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBkZWxldGVkICR7cmVhZC5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gcmVhZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVhZEhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpXG4gICAgICApLmZvcihyZWFkKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgcmVhZFJlc3VsdDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGt9ICR7aWR9YCk7XG4gICAgICAgIHJlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkucmVhZChpZCwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KHJlYWRSZXN1bHQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIHJldHVybiByZWFkUmVzdWx0O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVVcGRhdGVIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIGJvZHk6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5VUERBVEUsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGUpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCB1cGRhdGVkOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGt9ICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbiAgICAgICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS51cGRhdGUoXG4gICAgICAgICAgbmV3IE1vZGVsQ29uc3RyKHsgLi4ucGF5bG9hZCwgW3RoaXMucGtdOiBpZCB9KSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZURlbGV0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlbW92ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IGRlbDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBkZWwgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGRlbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50SGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICBkZXRhaWxzOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudCk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgb2Zmc2V0LCBsaW1pdCwgYm9va21hcmsgfSA9IGRldGFpbHM7XG4gICAgICBhcmdzID0gYXJncy5tYXAoXG4gICAgICAgIChhKSA9PiAodHlwZW9mIGEgPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChhIGFzIHN0cmluZykgOiBhKSB8fCBhXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgcGF0aERpcmVjdGlvbiA9IGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvbHZlZERpcmVjdGlvbiA9IChkaXJlY3Rpb24gPz8gcGF0aERpcmVjdGlvbikgYXNcbiAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVzb2x2ZWREaXJlY3Rpb24gJiYgYXJncy5sZW5ndGggPiAxKSBhcmdzWzFdID0gcmVzb2x2ZWREaXJlY3Rpb247XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgICAgYXJncyA9IFtcbiAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICByZXNvbHZlZERpcmVjdGlvbiBhcyBhbnksXG4gICAgICAgICAgICB7IGxpbWl0LCBvZmZzZXQsIGJvb2ttYXJrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRjpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuc3RhdGVtZW50KG5hbWUsIC4uLmFyZ3MsIGN0eCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlcihcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBzdGF0ZW1lbnRTaG9ydGN1dChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBzdGF0ZW1lbnRLZXksIHRydWUpXG4gICAgICApLmZvcihzdGF0ZW1lbnRTaG9ydGN1dCk7XG5cbiAgICAgIHN3aXRjaCAoc3RhdGVtZW50S2V5KSB7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5saXN0QnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBwYWdlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5wYWdpbmF0ZUJ5KFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW1pdDogKGRldGFpbHMgYXMgYW55KT8ubGltaXQsXG4gICAgICAgICAgICAgIG9mZnNldDogKGRldGFpbHMgYXMgYW55KT8ub2Zmc2V0LFxuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLmZpbmQgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5maW5kKHZhbHVlLCBkaXJlY3Rpb24sIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOiB7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3QgcmVmID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQgPz8gMSxcbiAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCA/PyAxMCxcbiAgICAgICAgICAgIGJvb2ttYXJrOiAoZGV0YWlscyBhcyBhbnkpPy5ib29rbWFyayxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiA/PyBPcmRlckRpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5wYWdlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucGFnZSh2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdmFsdWUsIGRpcmVjdGlvbiwgcmVmLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmZpbmRPbmVCeShrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eClcbiAgICAgICAgICAgIC5mb3IoY3R4LnRvT3ZlcnJpZGVzKCkpXG4gICAgICAgICAgICAuZmluZEJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0ZcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IFtmaWVsZF0gPSBhcmdzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQoc3RhdGVtZW50S2V5LCBmaWVsZCwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlbWVudDogJHtzdGF0ZW1lbnRLZXl9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXhRdWVyeShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGNvbXBsZXhRdWVyeSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZGVidWcoYEludm9raW5nIGN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cImApO1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgICApLmZvcihjb21wbGV4UXVlcnkpO1xuICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZXh0cmFjdFF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGN1c3RvbVJvdXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgbG9nOiBhbnkgPSB0aGlzLmxvZz8uZm9yPy4oY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIG1ldGhvZE5hbWUsIHRydWUpXG4gICAgICApLmZvcihjdXN0b21Sb3V0ZSk7XG4gICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG5cbiAgICAgIC8vIFRyeSB0aGUgcGVyc2lzdGVuY2UgZGlyZWN0bHkgKHdvcmtzIHdoZW4gaXQncyBhIGN1c3RvbSBSZXBvc2l0b3J5KVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgfVxuICAgICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIG1ldGhvZCBsaXZlcyBvbiB0aGUgdW5kZXJseWluZyByZXBvXG4gICAgICBpZiAocGVyc2lzdGVuY2U/LnJlcG8gJiYgdHlwZW9mIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXRlbWVudCBnYXRld2F5XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9IG9yIGl0cyByZXBvYFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKFxuICAgICAgbGFzdCAmJlxuICAgICAgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGxhc3QpXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeU9iaiA9IGFyZ3MucG9wKCk7XG4gICAgICBjb25zdCBoYXNEaXJlY3Rpb24gPSBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0xpbWl0ID0gcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc09mZnNldCA9IHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFoYXNEaXJlY3Rpb24gJiYgIWhhc0xpbWl0ICYmICFoYXNPZmZzZXQpIHJldHVybiBhcmdzO1xuICAgICAgY29uc3QgZXh0cmFzOiBhbnlbXSA9IFtdO1xuICAgICAgaWYgKGhhc0RpcmVjdGlvbikgZXh0cmFzLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICAgIGVsc2UgaWYgKGhhc0xpbWl0IHx8IGhhc09mZnNldCkgZXh0cmFzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYXNMaW1pdCkgZXh0cmFzLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgICAgaWYgKGhhc09mZnNldCkgZXh0cmFzLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICAgIHJldHVybiBbLi4uYXJncywgLi4uZXh0cmFzXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oeyBuYW1lOiBcIm1ldGhvZFwiLCBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIiB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJhcmdzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGxpc3RlZCBmb3VuZC5gIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBiYXNlOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwYXRoKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImJvb2ttYXJrXCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiYm9va21hcmsgZm9yIGN1cnNvciBwYWdpbmF0aW9uXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogTnVtYmVyIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GKSB7XG4gICAgICBiYXNlLnB1c2goQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgRGlzdGluY3QgdmFsdWVzIGZvciAke21vZGVsQ2xhenpOYW1lfS5gLCB0eXBlOiBbU3RyaW5nXSB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHAuc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIiB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGcm9tTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4vRnJvbU1vZGVsQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVGb3IoZmxhdm91cjogc3RyaW5nKSB7XG4gIEBNb2R1bGUoe30pXG4gIGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICAgIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlLm5hbWUpLmZvcihmbGF2b3VyKTtcblxuICAgIHN0YXRpYyBjcmVhdGVNb2RlbFNlcnZpY2VzPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgICBtb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8VD5bXVxuICAgICk6IFByb3ZpZGVyW10ge1xuICAgICAgcmV0dXJuIG1vZGVscy5tYXAoKG1vZGVsKSA9PiAoe1xuICAgICAgICBwcm92aWRlOiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFeHBvc2VkKFxuICAgICAgbW9kZWw6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgIGV4cG9zdXJlPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZ1tdPlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHBvc3VyZT8uW21vZGVsLm5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IG92ZXJyaWRlXG4gICAgICAgICAgOiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShERUNBRl9FWFBPU0UpKTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmxhdm91cik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgICBvcHRpb25zOiBQYXJ0aWFsPERlY2FmTW9kdWxlT3B0aW9ucz4gPSB7fVxuICAgICk6IER5bmFtaWNNb2R1bGUge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgICBjb25zdCB0cmFja2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHMoZmxhdm91cikuZmlsdGVyKChtb2RlbCkgPT5cbiAgICAgICAgdGhpcy5pc0V4cG9zZWQobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlKVxuICAgICAgKTtcblxuICAgICAgbGV0IG1vZGVsU2VydmljZXM6IFByb3ZpZGVyW10gPSBbXTtcbiAgICAgIGlmIChvcHRpb25zLmF1dG9TZXJ2aWNlcykge1xuICAgICAgICBsb2cuaW5mbyhcIkF1dG8tc2VydmljZXMgZW5hYmxlZC4gSW5pdGlhbGl6aW5nIHNlcnZpY2UgZ2VuZXJhdGlvbi5cIik7XG4gICAgICAgIG1vZGVsU2VydmljZXMgPSB0aGlzLmNyZWF0ZU1vZGVsU2VydmljZXModHJhY2tlZE1vZGVscyk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBBdXRvLXNlcnZpY2VzIGNvbXBsZXRlZC4gJHttb2RlbFNlcnZpY2VzLmxlbmd0aH0gc2VydmljZXMgaW5pdGlhbGl6ZWQuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKChtb2RlbCkgPT5cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGUobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckNvbmZpZylcbiAgICAgICk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb2R1bGU6IERlY2FmTW9kZWxNb2R1bGUsXG4gICAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAuLi5tb2RlbFNlcnZpY2VzLFxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihEZWNhZk1vZGVsTW9kdWxlLCBcIm5hbWVcIiwge1xuICAgIHZhbHVlOiBgRGVjYWZNb2R1bGUke2ZsYXZvdXJ9YCxcbiAgfSk7XG4gIHJldHVybiBEZWNhZk1vZGVsTW9kdWxlO1xufVxuIiwiaW1wb3J0IHtcbiAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLFxuICBJbmplY3RhYmxlQ29uZmlnLFxuICBJbmplY3RhYmxlc0tleXMsXG4gIEluamVjdE9wdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciwgRGVjb3JhdGlvbiwgRGVjb3JhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL292ZXJyaWRlcy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcblxuRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdGFibGUoXG4gICAgICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICBjZmc/OiBJbmplY3RhYmxlQ29uZmlnXG4gICAgKSB7XG4gICAgICBjZmcgPVxuICAgICAgICBjZmcgfHxcbiAgICAgICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgID8gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PixcbiAgICAgICAgICAgICAgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXgsIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUlOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkRlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluaW11bTogbWluLCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4TGVuZ3RoRGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhMZW5ndGg6IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKFxuICAgICAgdHlwZTpcbiAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdXG4gICAgICAgIHwgQ29uc3RydWN0b3JcbiAgICAgICAgfCAoKCkgPT4gQ29uc3RydWN0b3IpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbiAgICAgICAgdHlwZSA9IEFycmF5LmlzQXJyYXkodHlwZSkgPyB0eXBlWzBdIDogdHlwZTtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIgJiYgIXR5cGUubmFtZSlcbiAgICAgICAgICB0eXBlID0gKHR5cGUgYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4gICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgICAgdHlwZTogdHlwZSBhcyBhbnksXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICB9KSh0YXJnZXQsIHByb3ApO1xuICAgICAgfTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4vLyAgICAgICBjbGF6ejpcbi8vICAgICAgICAgfCBDb25zdHJ1Y3RvclxuLy8gICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3Rvcilcbi8vICAgICAgICAgfCAoQ29uc3RydWN0b3IgfCAoKCkgPT4gQ29uc3RydWN0b3IpKVtdLFxuLy8gICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuLy8gICAgICAgY29sbGVjdGlvbjogXCJBcnJheVwiIHwgXCJTZXRcIiA9IFwiQXJyYXlcIlxuLy8gICAgICkge1xuLy8gICAgICAgcmV0dXJuICh0YXJnZXQ6IG9iamVjdCwgcHJvcDogYW55KSA9PiB7XG4vLyAgICAgICAgIGNsYXp6ID0gQXJyYXkuaXNBcnJheShjbGF6eikgPyBjbGF6elswXSA6IGNsYXp6O1xuLy8gICAgICAgICBpZiAodHlwZW9mIGNsYXp6ID09PSBcImZ1bmN0aW9uXCIgJiYgIWNsYXp6Lm5hbWUpXG4vLyAgICAgICAgICAgY2xhenogPSAoY2xhenogYXMgKCkgPT4gQ29uc3RydWN0b3IpKCk7XG4vLyAgICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IHR5cGU6IFtjbGF6eiBhcyBhbnldIH0pKHRhcmdldCwgcHJvcCk7XG4vLyAgICAgICB9O1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuLy8gLy9cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkRBVEUpXG4gIC5leHRlbmQoe1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoZm9ybWF0OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgZm9ybWF0OiBcImRhdGUtdGltZVwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIC8vIGV4YW1wbGU6IHBhcnNlRGF0ZShmb3JtYXQsIG5ldyBEYXRlKCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkVOVU0pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGVudW06IG9wdHMsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5QQVRURVJOKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHBhdHRlcm5EZWMocGF0OiBSZWdFeHAgfCBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIHBhdHRlcm46IHR5cGVvZiBwYXQgPT09IFwic3RyaW5nXCIgPyBwYXQgOiBwYXQuc291cmNlLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoRGVjb3JhdGlvbktleXMuREVTQ1JJUFRJT04pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGVzY3JpcHRpb25EZWMoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkFVVEgpLmV4dGVuZCh7IGRlY29yYXRvcjogQXV0aCB9KS5hcHBseSgpO1xuIiwiaW1wb3J0IHsgRm9yYmlkZGVuRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGNsYXNzIENvcnNFcnJvciBleHRlbmRzIEZvcmJpZGRlbkVycm9yIHtcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKG1zZywgQ29yc0Vycm9yLm5hbWUpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IGNsYXNzIFRvTWFueVJlcXVlc3RzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yICkge1xuICAgIHN1cGVyKFRvTWFueVJlcXVlc3RzRXJyb3IubmFtZSwgbXNnICwgNDI5KTtcbiAgfVxufSIsImltcG9ydCB7XG4gIEFyZ3VtZW50c0hvc3QsXG4gIENhdGNoLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIE5vdEFjY2VwdGFibGVFeGNlcHRpb24sXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VkRW52aXJvbm1lbnQgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IFRvTWFueVJlcXVlc3RzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzL3Rocm90dGxpbmdcIjtcblxuQENhdGNoKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNhdGNoKGV4Y2VwdGlvbjogRXJyb3IsIGhvc3Q6IEFyZ3VtZW50c0hvc3QpIHtcbiAgICBjb25zdCBjdHggPSBob3N0LnN3aXRjaFRvSHR0cCgpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gY3R4LmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IGN0eC5nZXRSZXF1ZXN0KCk7XG5cbiAgICBjb25zdCBpc1Byb2R1Y3Rpb24gPSBMb2dnZWRFbnZpcm9ubWVudC5lbnYgPT09IFwicHJvZHVjdGlvblwiO1xuICAgIGxldCBzdGF0dXNDb2RlO1xuXG4gICAgaWYgKFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHxcbiAgICAgIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkRXJyb3JcbiAgICApIHtcbiAgICAgIGV4Y2VwdGlvbiA9IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIHN0YXR1c0NvZGUgPSAoZXhjZXB0aW9uIGFzIE5vdEFjY2VwdGFibGVFeGNlcHRpb24pLmdldFN0YXR1cygpO1xuICAgIH0gZWxzZSBpZiAoIShleGNlcHRpb24gaW5zdGFuY2VvZiBCYXNlRXJyb3IpKSB7XG4gICAgICBpZigoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0Mjkpe1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgVG9NYW55UmVxdWVzdHNFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IEludGVybmFsRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc3BvbnNlLnN0YXR1cygoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlKS5qc29uKHtcbiAgICAgIHN0YXR1czogKGV4Y2VwdGlvbiBhcyBCYXNlRXJyb3IpLmNvZGUgfHwgc3RhdHVzQ29kZSxcbiAgICAgIGVycm9yOiBpc1Byb2R1Y3Rpb24gPyBleGNlcHRpb24ubmFtZSA6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBwYXRoOiByZXF1ZXN0LnVybCxcbiAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVzZUZpbHRlcnMsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZFeGNlcHRpb25GaWx0ZXIgfSBmcm9tIFwiLi9EZWNhZkVycm9yRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vLi4vcmVxdWVzdC9pbmRleFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLkV4Y2VwdGlvbkZpbHRlcltdfSBmaWx0ZXJzIC0gT3B0aW9uYWwgZmlsdGVycyB0byBhcHBseSBnbG9iYWxseS5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxGaWx0ZXJzKC4uLmZpbHRlcnM6IGFueVtdKSB7XG4gICAgdGhpcy5hcHAudXNlR2xvYmFsRmlsdGVycyhcbiAgICAgIC4uLihmaWx0ZXJzLmxlbmd0aCA+IDAgPyBmaWx0ZXJzIDogW25ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpXSlcbiAgICApO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgZ2xvYmFsIGludGVyY2VwdG9ycyBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEludGVyY2VwdG9ycyBhbGxvdyBhZHZhbmNlZCByZXF1ZXN0L3Jlc3BvbnNlIG1hbmlwdWxhdGlvbiBzdWNoIGFzXG4gICAqIHNlcmlhbGl6YXRpb24sIGxvZ2dpbmcsIG9yIHRyYW5zZm9ybWF0aW9uLiBNdWx0aXBsZSBpbnRlcmNlcHRvcnNcbiAgICogY2FuIGJlIGFkZGVkIGZvciBtb2R1bGFyIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uTmVzdEludGVyY2VwdG9yW119IGludGVyY2VwdG9ycyAtIEludGVyY2VwdG9yIGluc3RhbmNlcyB0byByZWdpc3Rlci5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzOiBOZXN0SW50ZXJjZXB0b3JbXSkge1xuICAgIGlmIChpbnRlcmNlcHRvcnMubGVuZ3RoID4gMClcbiAgICAgIHRoaXMuYXBwLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTdGFydHMgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBhbmQgYmluZHMgaXQgdG8gdGhlIGdpdmVuIHBvcnQgYW5kIGhvc3QuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIExpc3RlbnMgb24gdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBvcHRpb25hbGx5IGEgaG9zdC4gT25jZSBzdGFydGVkLFxuICAgKiBsb2dzIHRoZSBhcHBsaWNhdGlvbiBVUkwgZm9yIGVhc3kgYWNjZXNzLiBUaGUgc3RhcnR1cCBwcm9jZXNzIHJlc29sdmVzXG4gICAqIG9uY2UgdGhlIGFwcGxpY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBydW5uaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BvcnQ9MzAwMF0gLSBQb3J0IG51bWJlciB0byBsaXN0ZW4gb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbaG9zdF0gLSBPcHRpb25hbCBob3N0IG9yIElQIGFkZHJlc3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHtib29sZWFufSBbbG9nPXRydWVdIC0gV2hldGhlciB0byBsb2cgdGhlIGFwcGxpY2F0aW9uIFVSTCB1cG9uIHN0YXJ0dXAuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIG9uY2UgdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cyBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc3RhcnQoXG4gICAgcG9ydDogbnVtYmVyID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQpIHx8IDMwMDAsXG4gICAgaG9zdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGxvZzogYm9vbGVhbiA9IHRydWVcbiAgKSB7XG4gICAgdGhpcy5hcHAubGlzdGVuKHBvcnQsIGhvc3QgYXMgYW55KS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5hcHAuZ2V0VXJsKCk7XG4gICAgICAgIHRoaXMubG9nZ2VyLmxvZyhg8J+agCBBcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0OiAke3VybH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5qZWN0YWJsZVNlcnZpY2VLZXksXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSBhcyBDb3JlUmVwb3NpdG9yeSxcbiAgU2VydmljZSBhcyBDb3JlU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZGYWN0b3J5UHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IHN0cmluZztcbiAgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bjtcbn07XG5cbmNvbnN0IHBlbmRpbmdQcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgRGVjYWZGYWN0b3J5UHJvdmlkZXI+KCk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERyYWlucyB0aGUgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIFNlcnZpY2V9L3tAbGluayBSZXBvc2l0b3J5fSB1c2FnZXMuXG4gKiBAc3VtbWFyeSBDb25zdW1lZCBieSB7QGxpbmsgRGVjYWZDb3JlTW9kdWxlLmZvclJvb3R9IHRvIHdpcmUgdGhlIHRva2VucyB0aGF0IHRob3NlIHBhcmFtZXRlclxuICogZGVjb3JhdG9ycyByZWZlcmVuY2UgYmFjayBpbnRvIE5lc3QncyBESSBjb250YWluZXIsIHNpbmNlIGEgcGFyYW1ldGVyIGRlY29yYXRvciBhbG9uZSBjYW5ub3RcbiAqIHN1cHBseSBhIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk6IERlY2FmRmFjdG9yeVByb3ZpZGVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShwZW5kaW5nUHJvdmlkZXJzLnZhbHVlcygpKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcih0b2tlbjogc3RyaW5nLCB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwZW5kaW5nUHJvdmlkZXJzLmhhcyh0b2tlbikpIHJldHVybjtcbiAgcGVuZGluZ1Byb3ZpZGVycy5zZXQodG9rZW4sIHsgcHJvdmlkZTogdG9rZW4sIHVzZUZhY3RvcnkgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTW9kZWxDb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnN0cnVjdG9yPGFueT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgdmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kZWw7XG59XG5cbmZ1bmN0aW9uIG1vZGVsU2VydmljZVRva2VuKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZGVsLm5hbWV9U2VydmljZWA7XG59XG5cbmZ1bmN0aW9uIG1vZGVsUmVwb3NpdG9yeVRva2VuKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZsYXZvdXIgPyBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlAJHtmbGF2b3VyfWAgOiBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlgO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHNlcnZpY2UuXG4gKiBAc3VtbWFyeSBUcmFuc2xhdGVzIGRlY2FmJ3Mgc2VydmljZSByZXNvbHV0aW9uIEFQSXMgaW50byBhIE5lc3QgYEBJbmplY3QoKWAgY2FsbDpcbiAqIC0gYEBTZXJ2aWNlKFNvbWVNb2RlbClgIGluamVjdHMgdGhlIGBNb2RlbFNlcnZpY2U8U29tZU1vZGVsPmAgc2luZ2xldG9uIGZvciB0aGF0IG1vZGVsXG4gKiAgICh2aWEge0BsaW5rIE1vZGVsU2VydmljZS5mb3JNb2RlbH0pLlxuICogLSBgQFNlcnZpY2UoU29tZVNlcnZpY2VDbGFzcylgIG9yIGBAU2VydmljZShcImFsaWFzXCIpYCBpbmplY3RzIHRoZSBtYXRjaGluZyBgQHNlcnZpY2UoKWAtZGVjb3JhdGVkXG4gKiAgIGRlY2FmIHtAbGluayBDb3JlU2VydmljZX0gKHZpYSB7QGxpbmsgQ29yZVNlcnZpY2UuZ2V0fSkuXG4gKiAtIGBAU2VydmljZSgpYCBpbmZlcnMgdGhlIHBhcmFtZXRlcidzIHR5cGUgZnJvbSBlbWl0dGVkIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGFuZCByZXNvbHZlcyBpdCB0aGVcbiAqICAgc2FtZSB3YXksIHByb3ZpZGVkIHRoZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYSBjb25jcmV0ZSBjbGFzcyAoZ2VuZXJpY3MgbGlrZSBgTW9kZWxTZXJ2aWNlPFg+YFxuICogICBhcmUgZXJhc2VkIGF0IHJ1bnRpbWUsIHNvIHRoZSBtb2RlbC1zZXJ2aWNlIGZvcm0gYWx3YXlzIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGFyZ3VtZW50KS5cbiAqIEBwYXJhbSBrZXkgdGhlIG1vZGVsIGNsYXNzLCBzZXJ2aWNlIGNsYXNzLCBvciBhbGlhcyB0byByZXNvbHZlLiBPbWl0IHRvIGluZmVyIGZyb20gdGhlIHBhcmFtZXRlciB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2VydmljZShrZXk/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHJlc29sdmVkOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0ga2V5O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZXM6IGFueVtdID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIHRhcmdldCkgfHwgW107XG4gICAgICByZXNvbHZlZCA9IHBhcmFtVHlwZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBAU2VydmljZSgpIGNvdWxkIG5vdCBkZXRlcm1pbmUgYW4gaW5qZWN0aW9uIHR5cGUgZm9yIHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fSBvZiAkeyh0YXJnZXQgYXMgQ29uc3RydWN0b3I8YW55PikubmFtZX0uIFByb3ZpZGUgYW4gZXhwbGljaXQgYXJndW1lbnQsIGUuZy4gQFNlcnZpY2UoU29tZVNlcnZpY2UpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNNb2RlbCA9IHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIiAmJiBpc01vZGVsQ29uc3RydWN0b3IocmVzb2x2ZWQpO1xuICAgIGNvbnN0IHRva2VuID0gYXNNb2RlbFxuICAgICAgPyBtb2RlbFNlcnZpY2VUb2tlbihyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgICAgOiBpbmplY3RhYmxlU2VydmljZUtleShyZXNvbHZlZCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTtcblxuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IHtcbiAgICAgIGlmIChhc01vZGVsKSByZXR1cm4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZClcbiAgICAgICAgOiBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYge0BsaW5rIENvcmVSZXBvc2l0b3J5fSBmb3IgYG1vZGVsYC5cbiAqIEBzdW1tYXJ5IFVubGlrZSB7QGxpbmsgU2VydmljZX0sIGBtb2RlbGAgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYSBNb2RlbCBjbGFzczogdGhlIHNhbWUgY2xhc3MgcGFzc2VkXG4gKiB0byBgQFNlcnZpY2UobW9kZWwpYCBhbmQgYEBSZXBvc2l0b3J5KG1vZGVsKWAgcmVzb2x2ZXMgdG8gdHdvIGRpZmZlcmVudCBpbmplY3RlZCBvYmplY3RzIChhXG4gKiBgTW9kZWxTZXJ2aWNlPE0+YCB2cyBhIGBSZXBvc2l0b3J5PE0+YCByZXNwZWN0aXZlbHkpLCB2aWEge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgY2xhc3MgdG8gcmVzb2x2ZSBhIHJlcG9zaXRvcnkgZm9yLlxuICogQHBhcmFtIGZsYXZvdXIgb3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLCBmb3J3YXJkZWQgdG8ge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlcG9zaXRvcnkoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IG1vZGVsUmVwb3NpdG9yeVRva2VuKG1vZGVsLCBmbGF2b3VyKTtcbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCwgZmxhdm91cikpO1xuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBUFBfSU5URVJDRVBUT1IsIE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFQ0FGX0FEQVBURVJfSUQsXG4gIERFQ0FGX0hBTkRMRVJTLFxuICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VTZXJ2aWNlLCBTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbiAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5AR2xvYmFsKClcbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZDb3JlTW9kdWxlPENPTkYsIEFEQVBURVIgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnk+PlxuICBpbXBsZW1lbnRzIE9uQXBwbGljYXRpb25TaHV0ZG93blxue1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3BlcnNpc3RlbmNlPzogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgcGVyc2lzdGVuY2UoKTogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlBlcnNpc3RlbmNlIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZkNvcmVNb2R1bGUpO1xuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX01PRFVMRV9PUFRJT05TKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zPENPTkYsIEFEQVBURVI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVmOiBNb2R1bGVSZWZcbiAgKSB7fVxuXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9ucyk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgIGNvbnN0IGRlY2FmUHJvdmlkZXJzID0gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfTU9EVUxFX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCwgdXNlVmFsdWU6IHRoaXMucGVyc2lzdGVuY2U/LmNsaWVudCB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogREVDQUZfSEFORExFUlMsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgIG9wdGlvbnMuaGFuZGxlcnM/Lm1hcCgoSCkgPT4ge1xuICAgICAgICAgICAgICBsb2cuaW5mbyhgUmVnaXN0ZXJlZCByZXF1ZXN0IGhhbmRsZXI6ICR7SC5uYW1lfWApO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IEgoKTtcbiAgICAgICAgICAgIH0pID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycyxcbiAgICAgIF0sXG4gICAgICBleHBvcnRzOiBbXG4gICAgICAgIERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgICBERUNBRl9BREFQVEVSX0lELFxuICAgICAgICBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLm1hcCgocHJvdmlkZXIpID0+IHByb3ZpZGVyLnByb3ZpZGUpLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGJvb3RQZXJzaXN0ZW5jZShcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJvb3RQZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gb3B0aW9ucy5jb25mLm1hcCgoW2NvbnRyLCBjZmcsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCFwb3NzaWJsZSkgcmV0dXJuIFtjb250ciwgY2ZnXTtcbiAgICAgICAgcmV0dXJuIFtjb250ciwgY2ZnLCAuLi5hcmdzXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7XG4gICAgICBhd2FpdCB0aGlzLl9wZXJzaXN0ZW5jZS5ib290KHRyaW1tZWQpO1xuICAgICAgY29uc3QgY2xpZW50cyA9IHRoaXMuX3BlcnNpc3RlbmNlLmNsaWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gb3B0aW9ucy5jb25mW2ldO1xuICAgICAgICBjb25zdCBwb3NzaWJsZVRyYW5zZiA9IGMuc2xpY2UoMiwgYy5sZW5ndGgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtZXIgPSBwb3NzaWJsZVRyYW5zZi5wb3AoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0cmFuc2Zvcm1lciB8fFxuICAgICAgICAgICEodHJhbnNmb3JtZXIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHIgPSBBZGFwdGVyLnRyYW5zZm9ybWVyRm9yKGNsaWVudHNbaV0uZmxhdm91cik7XG4gICAgICAgICAgaWYgKCFjb250cilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gdHJhbnNmb3JtZXIgZm91bmQgZm9yIGZsYXZvdXIgJHtjbGllbnRzW2ldLmZsYXZvdXJ9LiB5b3Ugc2hvdWxkIGVpdGhlciBAcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIG9yIHByb3ZpZGUgYSB0cmFuc2Zvcm1lciBpbiB0aGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSAoY29udHIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgICAgICAgPyBjb250clxuICAgICAgICAgICAgICA6IG5ldyAoY29udHIgYXMgQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4+KSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGJvb3QgdHJhbnNmb3JtZXIgZm9yICR7Y2xpZW50c1tpXS5mbGF2b3VyfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcihjbGllbnRzW2ldLmZsYXZvdXIpKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKFwicGVyc2lzdGVuY2UgbGF5ZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsaXphdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbjogJHtlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgdGhpcy5tb2R1bGVSZWYuZ2V0PGFueT4oREVDQUZfQURBUFRFUl9JRCk7XG4gICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIGFkYXB0ZXJzKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2h1dHRpbmcgZG93biAke2FkYXB0ZXIudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICBhd2FpdCBhZGFwdGVyLnNodXRkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gYXBwbGljYXRpb25gLCBlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgU2VydmljZS5zaHV0ZG93bigpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2VzYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTID0gU3ltYm9sKFxuICBcIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSU1wiXG4pO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3M6IGFueVtdKTogdW5rbm93bltdIHtcbiAgY29uc3QgW21vZGVsQ29uc3RyLCBvcGVyYXRpb24sIGlkLCBwYXlsb2FkXSA9IGFyZ3M7XG5cbiAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWxDb25zdHI/Lm5hbWUgPz8gbW9kZWxDb25zdHI7XG5cbiAgY29uc3Qgc2VyaWFsaXplZFBheWxvYWQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQpXG4gICAgPyBwYXlsb2FkLm1hcCgoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0eXBlb2YgZS5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGUuc2VyaWFsaXplKCk7XG5cbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgUGF5bG9hZCBpdGVtIGZvciAke21vZGVsTmFtZX0gZG9lcyBub3QgaGF2ZSBzZXJpYWxpemUgbWV0aG9kIGFuZCBpcyBhbiAke3R5cGVvZiBlfSwgYXR0ZW1wdGluZyB0byBzdHJpbmdpZnkgZGlyZWN0bHkuIEl0ZW06ICR7ZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGUgPT09IFwic3RyaW5nXCIgPyBlIDogSlNPTi5zdHJpbmdpZnkoZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBwYXlsb2FkIGZvciAke21vZGVsTmFtZX06ICR7ZXJyfWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgOiBwYXlsb2FkICYmIHR5cGVvZiBwYXlsb2FkLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IHBheWxvYWQuc2VyaWFsaXplKClcbiAgICAgIDogdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBwYXlsb2FkXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cbiAgY29uc29sZS5kZWJ1ZyhcbiAgICBgTm9ybWFsaXplZCBldmVudCByZXNwb25zZSBmb3IgbW9kZWwgJHttb2RlbE5hbWV9LCBvcGVyYXRpb24gJHtvcGVyYXRpb259LCBpZCAke2lkfTpgLFxuICAgIHNlcmlhbGl6ZWRQYXlsb2FkXG4gICk7XG5cbiAgcmV0dXJuIFttb2RlbE5hbWUsIG9wZXJhdGlvbiwgaWQsIHNlcmlhbGl6ZWRQYXlsb2FkXTtcbn1cbiIsImltcG9ydCB7IERlY2FmQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBPYnNlcnZlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29udHJvbGxlciwgSW5qZWN0LCBNZXNzYWdlRXZlbnQsIFF1ZXJ5LCBTc2UgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGludGVydmFsLCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVFdmVudFJlc3BvbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cbkBDb250cm9sbGVyKClcbmV4cG9ydCBjbGFzcyBFdmVudHNDb250cm9sbGVyIGV4dGVuZHMgRGVjYWZDb250cm9sbGVyPERlY2FmU2VydmVyQ3R4PiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgQEluamVjdChMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMpIGZsYXZvdXJzOiBzdHJpbmdbXVxuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuICAgIHRoaXMuYWRhcHRlcnMgPSBmbGF2b3Vycy5tYXAoKGZsYXZvdXIpID0+IChBZGFwdGVyIGFzIGFueSkuZ2V0KGZsYXZvdXIpKTsgLy8gY2hhbmdlIHRvIEFkYXB0ZXIuY2FjaGUoXCJcIilcbiAgfVxuXG4gIEBTc2UoKVxuICBsaXN0ZW4oKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgY29uc3QgZXZlbnRzJCA9IG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZlcklkID1cbiAgICAgICAgYEItJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KX1gLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgQ3JlYXRpbmcgU1NFIG9ic2VydmVyOiAke29ic2VydmVySWR9IGZvciBjbGllbnQgJHt0aGlzLmNsaWVudENvbnRleHQudXVpZH1gXG4gICAgICApO1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICBvYnNlcnZlcklkID0gb2JzZXJ2ZXJJZDtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IHJlY2VpdmVkIHJlZnJlc2ggZXZlbnRgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzKTtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBcIm1lc3NhZ2VcIiwgZGF0YSB9KTtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gZXZlbnQgcHVzaGVkIHRvIGNsaWVudGBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIGxvZ2dlci52ZXJib3NlKFxuICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBhY3Jvc3MgJHt0aGlzLmFkYXB0ZXJzLmxlbmd0aH0gYWRhcHRlcihzKWBcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgUmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWdpc3RlciBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoYENsZWFuaW5nIHVwIFNTRSBvYnNlcnZlciAke29ic2VydmVySWR9YCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBjb25zdCBhZGFwdGVyTmFtZSA9IGFkYXB0ZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5rbm93bkFkYXB0ZXJcIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgVW5yZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGZyb20gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBGYWlsZWQgZHVyaW5nIGNsZWFudXAgb2Ygb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTF9NUyA9IDE1MDAwO1xuICAgIGNvbnN0IGhlYXJ0YmVhdCQgPSBpbnRlcnZhbChIRUFSVEJFQVRfSU5URVJWQUxfTVMpLnBpcGUoXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTZW5kaW5nIGhlYXJ0YmVhdFwiKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKFxuICAgICAgICAoKTogTWVzc2FnZUV2ZW50ID0+ICh7XG4gICAgICAgICAgdHlwZTogXCJoZWFydGJlYXRcIixcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHJldHVybiBtZXJnZShldmVudHMkLCBoZWFydGJlYXQkKTtcbiAgfVxuXG4gIEBTc2UoXCIvOm1vZGVsXCIpXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgbGlzdGVuRm9yTW9kZWwoQFF1ZXJ5KFwibW9kZWxcIikgbW9kZWw6IHN0cmluZyk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgY2IgPSBuZXcgKGNsYXNzIGltcGxlbWVudHMgT2JzZXJ2ZXIge1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IGRhdGE6IGFyZ3MgfSBhcyBhbnkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihgRmFpbGVkIHRvIG9ic2VydmUgZXZlbnQ6ICR7ZS5tZXNzYWdlIHx8IGV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBFdmVudHNDb250cm9sbGVyIH0gZnJvbSBcIi4vRXZlbnRzQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgUm91dGVyTW9kdWxlIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmU3RyZWFtTW9kdWxlIHtcbiAgc3RhdGljIGZvckZsYXZvdXJzKFxuICAgIGZsYXZvdXJzOiBzdHJpbmdbXSxcbiAgICBwYXRoOiBzdHJpbmcgPSBcImV2ZW50c1wiXG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgY29udHJvbGxlcnM6IFtFdmVudHNDb250cm9sbGVyXSxcbiAgICAgIGltcG9ydHM6IFtcbiAgICAgICAgUm91dGVyTW9kdWxlLnJlZ2lzdGVyKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXRoOiBwYXRoLnJlcGxhY2UoL15cXC8vLCBcIlwiKSxcbiAgICAgICAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMsXG4gICAgICAgICAgdXNlVmFsdWU6IGZsYXZvdXJzID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBGb3J3YXJkUmVmZXJlbmNlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNhZkNvcmVNb2R1bGUgfSBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0TW9kdWxlRm9yIH0gZnJvbSBcIi4vZGVjYWYtbW9kZWwvaW5kZXhcIjtcbmltcG9ydCB7IERlY2FmU3RyZWFtTW9kdWxlIH0gZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZHVsZSB7XG4gIHN0YXRpYyBhc3luYyBmb3JSb290QXN5bmMoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8RHluYW1pY01vZHVsZT4ge1xuICAgIGNvbnN0IHsgYXV0b0NvbnRyb2xsZXJzLCBhdXRvU2VydmljZXMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmJvb3RQZXJzaXN0ZW5jZShvcHRpb25zKTtcbiAgICBjb25zdCBmbGF2b3VycyA9IGFkYXB0ZXJzLm1hcCgoYWRhcHRlcikgPT4gYWRhcHRlci5mbGF2b3VyKTtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgICBmbGF2b3Vycy5mb3JFYWNoKChmbGF2b3VyKSA9PiB7XG4gICAgICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICAgICAgZ2V0TW9kdWxlRm9yKGZsYXZvdXIpLmZvclJvb3QoZmxhdm91ciwge1xuICAgICAgICAgICAgICBhdXRvU2VydmljZXMsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJFeHBvc3VyZTogb3B0aW9ucy5jb250cm9sbGVyRXhwb3N1cmUsXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXJDb25maWc6IG9wdGlvbnMuY29udHJvbGxlckNvbmZpZyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5vYnNlcnZlck9wdGlvbnM/LmVuYWJsZU9ic2VydmVyRXZlbnRzKSB7XG4gICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgIERlY2FmU3RyZWFtTW9kdWxlLmZvckZsYXZvdXJzKFxuICAgICAgICAgIG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zLm9ic2VydmVyRmxhdm91cnMgfHwgZmxhdm91cnNcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZk1vZHVsZSxcbiAgICAgIGltcG9ydHM6IGltcG9ydHMsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHt9XG4iLCJpbXBvcnQge01vZGVsfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge0ludGVybmFsRXJyb3J9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHtSZXBvc2l0b3J5fSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcG9Gb3JNb2RlbChtb2RlbDogc3RyaW5nKSB7XG5cdGNvbnN0IG0gPSBNb2RlbC5nZXQobW9kZWwpO1xuXHRpZiAoIW0pXG5cdFx0dGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBmaW5kIHJlcG9zaXRvcnkgZm9yICR7bW9kZWx9YClcblx0Y29uc3QgcmVwbyA9IFJlcG9zaXRvcnkuZm9yTW9kZWwobSk7XG5cdHJldHVybiByZXBvO1xufSIsIi8qKlxuICogQG1vZHVsZSBmb3ItbmVzdFxuICogQGRlc2NyaXB0aW9uIFRoaXMgbW9kdWxlIHNlcnZlcyBhcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIHRzLXdvcmtzcGFjZSBsaWJyYXJ5LiBJdCBhZ2dyZWdhdGVzIGFuZCBleHBvcnRzXG4gKiBmdW5jdGlvbmFsaXR5IGZyb20gdmFyaW91cyBzdWJtb2R1bGVzIGFuZCB1dGlsaXRpZXMgd2l0aGluIHRoZSBwcm9qZWN0LlxuICpcbiAqIFRoZSBtb2R1bGUgaW5jbHVkZXM6XG4gKiAxLiBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgdHlwZXMgZnJvbSB0aGUgXCIuL3V0aWxzXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGVzZSBsaWtlbHkgY29udGFpbiBoZWxwZXIgZnVuY3Rpb25zLCBjb21tb24gdHlwZXMsIGFuZCBzaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIHRocm91Z2hvdXQgdGhlIHByb2plY3QuXG4gKiAgICAtIE1heSBpbmNsdWRlIG9wZXJhdGlvbnMgZm9yIGRhdGEgbWFuaXB1bGF0aW9uLCB0eXBlIGNoZWNraW5nLCBvciBvdGhlciBnZW5lcmFsLXB1cnBvc2UgdXRpbGl0aWVzLlxuICpcbiAqIDIuIEEgbmFtZXNwYWNlIGFuZCByZWxhdGVkIHR5cGVzIGZyb20gdGhlIFwiLi9uYW1lc3BhY2VcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoaXMgY291bGQgY29udGFpbiBkb21haW4tc3BlY2lmaWMgY29kZSBvciBhIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LlxuICogICAgLSBNaWdodCBpbmNsdWRlIGludGVyZmFjZXMsIHR5cGVzLCBvciBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IGNvcmUgY29uY2VwdHMgaW4gdGhlIGxpYnJhcnkuXG4gKlxuICogMy4gQSBWRVJTSU9OIGNvbnN0YW50OlxuICogICAgLSBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqICAgIC0gVXNlZnVsIGZvciB2ZXJzaW9uIGNoZWNraW5nIGFuZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLlxuICpcbiAqIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzIGEgY2xlYW4gYW5kIG9yZ2FuaXplZCBleHBvcnQgb2YgdGhlIG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHksIGFsbG93aW5nIGNvbnN1bWVyc1xuICogdG8gZWFzaWx5IGltcG9ydCBhbmQgdXNlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IGFzIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IFwiLi9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRpb25cIjsgLy8gb24gdG9wIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2RlY2FmLW1vZGVsXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9hdXRoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL292ZXJyaWRlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWVzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb250cm9sbGVyc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3JlLW1vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG4vLyBleHBvcnQgKiBmcm9tIFwiLi93ZWJob29rc1wiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgdHMtd29ya3NwYWNlIG1vZHVsZS5cbiAqIFRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgaXMgcmVwbGFjZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLlxuICogQGNvbnN0YW50XG4gKiBAdHlwZSB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCBjb21taXQgaGFzaCBvZiB0aGUgbW9kdWxlIGJ1aWxkLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IGdpdCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBjb21taXQgaGFzaCBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgQ09NTUlUXG4gKi9cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBzZW12ZXIgdmVyc2lvbiBhbmQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLlxuICogVGhlIGJ1aWxkIHJlcGxhY2VzIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgYDx2ZXJzaW9uPi08Y29tbWl0PmAgdmFsdWUgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IEZVTExfVkVSU0lPTlxuICovXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRSMjXCI7XG5cbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24odHJ1ZSk7XG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbk1ldGFkYXRhLmFsbG93UmVyZWdpc3RyYXRpb24oZmFsc2UpO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlNfUFJFRklYIiwiREVDT1JBVE9SUyIsIkFQSV9PUEVSQVRJT04iLCJBUElfUkVTUE9OU0UiLCJBUElfUFJPRFVDRVMiLCJBUElfQ09OU1VNRVMiLCJBUElfVEFHUyIsIkFQSV9DQUxMQkFDS1MiLCJBUElfUEFSQU1FVEVSUyIsIkFQSV9IRUFERVJTIiwiQVBJX01PREVMX1BST1BFUlRJRVMiLCJBUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSIsIkFQSV9TRUNVUklUWSIsIkFQSV9FWENMVURFX0VORFBPSU5UIiwiQVBJX0VYQ0xVREVfQ09OVFJPTExFUiIsIkFQSV9FWFRSQV9NT0RFTFMiLCJBUElfRVhURU5TSU9OIiwiQVBJX1NDSEVNQSIsIkFQSV9ERUZBVUxUX0dFVFRFUiIsIkFQSV9MSU5LIiwiaXNDb25zdHJ1Y3RvciIsInZhbCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsIk1FVEhPRF9NRVRBREFUQSIsImNyZWF0ZU1ldGhvZERlY29yYXRvciIsIm1ldGFrZXkiLCJtZXRhZGF0YSIsIm92ZXJyaWRlRXhpc3RpbmciLCJ0YXJnZXQiLCJrZXkiLCJkZXNjcmlwdG9yIiwicHJldlZhbHVlIiwiUmVmbGVjdCIsImdldE1ldGFkYXRhIiwidmFsdWUiLCJkZWZpbmVNZXRhZGF0YSIsImNyZWF0ZUNsYXNzRGVjb3JhdG9yIiwiY3JlYXRlUHJvcGVydHlEZWNvcmF0b3IiLCJwcm9wZXJ0eUtleSIsInByb3BlcnRpZXMiLCJpbmNsdWRlcyIsImV4aXN0aW5nTWV0YWRhdGEiLCJuZXdNZXRhZGF0YSIsInBpY2tCeSIsIm5lZ2F0ZSIsImlzVW5kZWZpbmVkIiwibWV0YWRhdGFUb1NhdmUiLCJ0eXBlIiwiY29uc3RydWN0b3IiLCJjcmVhdGVNaXhlZERlY29yYXRvciIsIm1ldGFkYXRhcyIsIkFycmF5IiwiaXNBcnJheSIsInByZXZpb3VzTWV0YWRhdGEiLCJPYmplY3QiLCJhc3NpZ24iLCJjcmVhdGVQYXJhbURlY29yYXRvciIsImluaXRpYWwiLCJwYXJhbU9wdGlvbnMiLCJwYXJhbWV0ZXJzIiwicHJvcGVydHlLZXlzIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsInByb3RvdHlwZSIsIm1ldGhvZERlc2NyaXB0b3IiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJpc0FwaU1ldGhvZCIsImhhc01ldGFkYXRhIiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImlucHV0IiwiaXNBcnJheUZsYWciLCJpc0lucHV0QXJyYXkiLCJvYmoiLCJnZXRFbnVtVmFsdWVzIiwiZW51bVR5cGUiLCJudW1lcmljVmFsdWVzIiwidmFsdWVzIiwiZmlsdGVyIiwibWFwIiwidG9TdHJpbmciLCJrZXlzIiwiZ2V0RW51bVR5cGUiLCJoYXNTdHJpbmciLCJpc1N0cmluZyIsImxlbmd0aCIsInJlcXVpcmVkIiwiaXNFbnVtQXJyYXkiLCJvcHRzIiwiZW51bSIsInVuZGVmaW5lZCIsIkFwaVByb3BlcnR5Iiwib3B0aW9ucyIsImNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yIiwiZW51bVZhbHVlcyIsIml0ZW1zIiwiQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiTW9kZWxDb25zdHJ1Y3RvciIsInZlcmIiLCJwYXRoIiwiaHR0cFRvQ3J1ZCIsIkdFVCIsIk9wZXJhdGlvbktleXMiLCJSRUFEIiwiR2V0IiwiUE9TVCIsIkNSRUFURSIsIlBvc3QiLCJQVVQiLCJVUERBVEUiLCJQdXQiLCJQQVRDSCIsIlBhdGNoIiwiREVMRVRFIiwiRGVsZXRlIiwiY3J1ZE9wIiwiSHR0cE1ldGhvZERlY29yYXRvciIsInJlc29sdmVCbG9ja1RhcmdldCIsImNvcmVJc09wZXJhdGlvbkJsb2NrZWQiLCJraW5kIiwiYXBwbHkiLCJBcGlFeGNsdWRlRW5kcG9pbnQiLCJCdWxrQXBpT3BlcmF0aW9uRnJvbU1vZGVsIiwiQnVsa0NydWRPcGVyYXRpb25LZXlzIiwiUkVBRF9BTEwiLCJDUkVBVEVfQUxMIiwiVVBEQVRFX0FMTCIsIkRFTEVURV9BTEwiLCJub3JtYWxpemVkIiwicmVwbGFjZSIsInN0YXRlbWVudFRhcmdldHMiLCJQcmVwYXJlZFN0YXRlbWVudEtleXMiLCJMSVNUX0JZIiwiUEFHRV9CWSIsIkZJTkQiLCJQQUdFIiwiRklORF9PTkVfQlkiLCJGSU5EX0JZIiwiQ09VTlRfT0YiLCJNQVhfT0YiLCJNSU5fT0YiLCJBVkdfT0YiLCJTVU1fT0YiLCJESVNUSU5DVF9PRiIsIkdST1VQX09GIiwic3RhcnRzV2l0aCIsInN0YXRlbWVudFZhbHVlIiwiQXBpUGFyYW1zRnJvbU1vZGVsIiwicHJvcHMiLCJkZWNvcmF0b3JzIiwicCIsIkFwaVBhcmFtRGVjIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiU3RyaW5nIiwiYXBwbHlEZWNvcmF0b3JzIiwiRGVjYWZCb2R5IiwiZGF0YSIsImN0eCIsInJlcXVlc3QiLCJzd2l0Y2hUb0h0dHAiLCJnZXRSZXF1ZXN0IiwiYm9keSIsImNvbnRyb2xsZXIiLCJnZXRDbGFzcyIsIk1vZGVsQ29uc3RyIiwiY2xhc3MiLCJJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIiwiaXRlbSIsIk9yZGVyZWRQYXJhbXMiLCJvcmRlciIsInJlcSIsIm9yaWdpbmFsIiwicGFyYW1zIiwib3JkZXJMaXN0Iiwib3JkZXJlZCIsImsiLCJyYXciLCJ2YWx1ZXNJbk9yZGVyIiwia2V5c0luT3JkZXIiLCJEZWNhZlBhcmFtcyIsIkRlY2FmUXVlcnkiLCJfIiwicXVlcnkiLCJwYXJzZWQiLCJsaW1pdCIsIm4iLCJOdW1iZXIiLCJpc05hTiIsIm9mZnNldCIsImJvb2ttYXJrIiwiREVDQUZfTU9EVUxFX09QVElPTlMiLCJERUNBRl9BREFQVEVSX0lEIiwiREVDQUZfVEFTS19TRVJWSUNFX0lEIiwiREVDQUZfUk9VVEUiLCJERUNBRl9IQU5ETEVSUyIsIlN5bWJvbCIsIkRFQ0FGX0FEQVBURVJfT1BUSU9OUyIsIkRFQ0FGX0VYUE9TRSIsIkRFQ0FGX0NPTlRST0xMRVJfQ09ORklHIiwiREVDQUZfQ09OVEVYVF9LRVkiLCJleHBvc2UiLCJmbGF2b3VycyIsIk1ldGFkYXRhIiwic2V0IiwiY29udHJvbGxlckNvbmZpZyIsImNvbmZpZyIsImNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IiLCJBVVRIX0hBTkRMRVIiLCJBVVRIX01FVEFfS0VZIiwiSVNfUFVCTElDX0tFWSIsIlJFUVVJUkVEX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwiZ2V0T3JVbmRlZmluZWQiLCJvcmdhbml6YXRpb24iLCJjdXJyZW50TG9nIiwiY2hpbGRMb2ciLCJsb2dnZXIiLCJoYW5kbGUiLCJBZGFwdGVyIiwiZmxhdm91cnNUb1RyYW5zZm9ybSIsImZsYXZvdXIiLCJ0cmFuc2Zvcm1lciIsInRyYW5zZm9ybWVyRm9yIiwiZnJvbSIsIk9wdGlvbmFsIiwiUmVmbGVjdG9yIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwic3BsaXQiLCJleHRyYWN0RnJvbUF1dGgiLCJBdXRob3JpemF0aW9uRXJyb3IiLCJyb2xlcyIsIkRlY2FmUm9sZUF1dGhIYW5kbGVyIiwiQXV0aCIsIm1vZGVsIiwicmVzb3VyY2UiLCJkZWNzIiwiQXBpQmVhcmVyQXV0aCIsIlVzZUludGVyY2VwdG9ycyIsInB1c2giLCJTZXRNZXRhZGF0YSIsIlB1YmxpYyIsIlJlcXVpcmVSb2xlcyIsIkFwaVNlY3VyaXR5IiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJjb250ZXh0IiwiZXhlYyIsInJlcyIsIm1ldGhvZCIsInVybCIsImhhbmRsZXIiLCJEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IiLCJyZXNwb25zZSIsImdldFJlc3BvbnNlIiwicGlwZSIsInRhcCIsInRvUmVzcG9uc2UiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwibWV0YSIsIkNvbnRleHQiLCJwZW5kaW5nIiwiaGVhZGVyIiwiSlNPTiIsInN0cmluZ2lmeSIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJkZWNvcmF0b3IiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsInRpbWVzdGFtcCIsIkRhdGUiLCJvcGVyYXRpb24iLCJwYXJzZUlwSGVhZGVyIiwiY2FuZGlkYXRlIiwic2VnbWVudCIsInRyaW0iLCJCb29sZWFuIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsIkFQUF9JTlRFUkNFUFRPUiIsInVzZUNsYXNzIiwiZ2xvYmFsIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiSHR0cFZlcmJUb0RlY29yYXRvciIsIkVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzbGljZSIsImFwaVBhcmFtU3BlYyIsImdldEFwaURlY29yYXRvcnMiLCJtZXRob2ROYW1lIiwiaHR0cFZlcmIiLCJpbmNsdWRlUXVlcnlQYXJhbXMiLCJOZXN0SHR0cFJvdXRlRGVjIiwiYXBpUGF0aFBhcmFtcyIsInN3YWdnZXJRdWVyeVBhcmFtcyIsIkFwaVF1ZXJ5IiwiT3JkZXJEaXJlY3Rpb24iLCJBcGlQYXJhbSIsIkFwaU9wZXJhdGlvbiIsInN1bW1hcnkiLCJBcGlPa1Jlc3BvbnNlIiwiQXBpTm9Db250ZW50UmVzcG9uc2UiLCJRdWVyeSIsImFwcGx5QXBpRGVjb3JhdG9ycyIsInByb3RvIiwiZm9yRWFjaCIsImQiLCJpbmRleCIsInJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZCIsInBlcnNpc3RlbmNlIiwiYXJncyIsIk1vZGVsU2VydmljZSIsInN0YXRlbWVudCIsImNyZWF0ZVJvdXRlSGFuZGxlciIsImFzeW5jIiwicGF0aFBhcmFtcyIsInF1ZXJ5UGFyYW1zIiwiZGlyZWN0aW9uIiwiZXJyb3IiLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImRlZmluZVByb3BlcnR5Iiwid3JpdGFibGUiLCJEZWNhZkNvbnRyb2xsZXIiLCJIdHRwRGVjYWZDb250cm9sbGVyIiwiY2xpZW50Q29udGV4dCIsIl9uYW1lIiwiRGVjYWZNb2RlbENvbnRyb2xsZXIiLCJfcGVyc2lzdGVuY2UiLCJTZXJ2aWNlIiwiZ2V0U2VydmljZSIsIlJlcG9zaXRvcnkiLCJmb3JNb2RlbCIsImNlcnRzIiwib3ZlcnJpZGUiLCJkdG9DYWNoZSIsIk1hcCIsIkR0b0ZvciIsIm9wIiwic3RhY2siLCJTZXQiLCJUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMiLCJjYWNoZSIsImdldER0b0NhY2hlIiwiY2FjaGVkIiwiaXNVcGRhdGVPcCIsIkR5bmFtaWNEVE8iLCJ0b1Bhc2NhbENhc2UiLCJwa1Byb3AiLCJNb2RlbCIsInBrIiwicGtQcm9wc01ldGFkYXRhIiwicGtQcm9wcyIsInBrRGVzaWduVHlwZSIsInBrVHlwZUlzTnVtZXJpYyIsIkJpZ0ludCIsInBrSXNHZW5lcmF0ZWQiLCJnZW5lcmF0ZWQiLCJnZW5lcmF0ZWRCeVNlcXVlbmNlIiwiaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlIiwiYWxsUHJvcHMiLCJyZWxhdGlvbnMiLCJzY2FsYXJQcm9wcyIsInByb3AiLCJoYXMiLCJ2YWxpZGF0aW9uIiwiZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlIiwiaXNSZXF1aXJlZCIsIlZhbGlkYXRpb25LZXlzIiwiUkVRVUlSRUQiLCJ0eXBlSGludCIsImdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZSIsImFwaU9wdGlvbnMiLCJkZXNpZ25UeXBlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsInJlbGF0aW9uIiwicmVsYXRpb25NZXRhIiwiSW50ZXJuYWxFcnJvciIsInJlbGF0aW9uVHlwZSIsInZhbGlkYXRpb25Gb3IiLCJMSVNUIiwiaXNDaXJjdWxhciIsInBrVHlwZU5hbWUiLCJnZXRQa09wZW5BcGlUeXBlIiwiYWRkUmVsYXRpb25Qa1JlZiIsInJlbGF0aW9uRHRvIiwiYWRkIiwiYWRkUmVsYXRpb25VcGRhdGUiLCJhZGRSZWxhdGlvbiIsIkR0b0NsYXNzIiwiZXh0cmFNb2RlbHMiLCJkdG9SZWYiLCJvbmVPZkl0ZW1zIiwiJHJlZiIsIm9uZU9mIiwicGtUeXBlIiwiY3VycmVudCIsIkZ1bmN0aW9uIiwiZ2V0UHJvdG90eXBlT2YiLCJXZWFrTWFwIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsInRhYmxlTmFtZSIsInRvS2ViYWJDYXNlIiwibW9kZWxDbGF6ek5hbWUiLCJmYWN0b3J5UGVyc2lzdGVuY2UiLCJkZWNvcmF0b3JDb25maWciLCJtb2R1bGVPdmVycmlkZSIsIm1lcmdlZENvbmZpZyIsIkZhY3RvcnlDb250cm9sbGVyIiwiTW9kZWxDb250cm9sbGVyRmFjdG9yeSIsImZhY3RvcnlSb3V0ZXMiLCJfX3JvdXRlc19fIiwiZ2V0UEsiLCJhcGlQcm9wZXJ0aWVzIiwicGtQYXRoIiwiZ2V0Um91dGVQYXJhbWV0ZXJzRnJvbU1vZGVsIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwicmVnaXN0cmF0aW9uIiwibWF0Y2hSb3V0ZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlSGFuZGxlciIsImNyZWF0ZUNyZWF0ZURlY29yYXRvcnMiLCJSZXNwb25zZSIsInBhc3N0aHJvdWdoIiwiY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIiLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImNyZWF0ZUJ1bGtSZWFkSGFuZGxlciIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImNyZWF0ZUJ1bGtVcGRhdGVIYW5kbGVyIiwiYnVsa1VwZGF0ZURlY29yYXRvcnMiLCJjcmVhdGVCdWxrRGVsZXRlSGFuZGxlciIsImJ1bGtEZWxldGVEZWNvcmF0b3JzIiwiY3JlYXRlUmVhZEhhbmRsZXIiLCJyZWFkRGVjb3JhdG9ycyIsImNyZWF0ZVVwZGF0ZUhhbmRsZXIiLCJ1cGRhdGVEZWNvcmF0b3JzIiwiY3JlYXRlRGVsZXRlSGFuZGxlciIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJjcmVhdGVTdGF0ZW1lbnRIYW5kbGVyIiwic3RhdGVtZW50RGVjb3JhdG9ycyIsIlBhcmFtIiwic3RhdGVtZW50Um91dGVzIiwic3RhdGVtZW50S2V5Iiwic3RhdGVtZW50TWV0aG9kTmFtZSIsImNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlciIsInN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0UGFyYW1zIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwicm91dGVNZXRhZGF0YSIsIm1hdGNoZWRFbnRyeSIsImZpbmQiLCJhY3R1YWxNZXRob2ROYW1lIiwicGFyYW1TZWdtZW50cyIsImNyZWF0ZUN1c3RvbVJvdXRlSGFuZGxlciIsImZpcnN0U2VnbWVudCIsInNlZ21lbnRzIiwic2VnIiwiaSIsInJlc3AiLCJsb2dDdHgiLCJjcmVhdGVkIiwiY3JlYXRlQWxsIiwicmVhZEFsbCIsImlkcyIsIm5vcm1hbGl6ZWRJZHMiLCJyZWFkIiwidXBkYXRlQWxsIiwidXBkYXRlZCIsImRlbGV0ZUFsbCIsInJvdXRlUGFyYW1zIiwiaWQiLCJWYWxpZGF0aW9uRXJyb3IiLCJyZWFkUmVzdWx0IiwidXBkYXRlIiwicGF5bG9hZCIsInBhcnNlIiwicmVtb3ZlIiwiZGVsIiwiZGVsZXRlIiwiZGV0YWlscyIsIlNUQVRFTUVOVCIsInBhcnNlSW50IiwicGF0aERpcmVjdGlvbiIsInJlc29sdmVkRGlyZWN0aW9uIiwic3RhdGVtZW50U2hvcnRjdXQiLCJsaXN0QnkiLCJwYWdlIiwicGFnaW5hdGVCeSIsIkFTQyIsInJlZiIsImZpbmRPbmVCeSIsInRvT3ZlcnJpZGVzIiwiZmluZEJ5IiwiZmllbGQiLCJjb21wbGV4UXVlcnkiLCJzcHJlYWRBcmdzIiwiZXh0cmFjdFF1ZXJ5QXJncyIsImN1c3RvbVJvdXRlIiwibGFzdCIsInF1ZXJ5T2JqIiwicG9wIiwiaGFzRGlyZWN0aW9uIiwiaGFzTGltaXQiLCJoYXNPZmZzZXQiLCJleHRyYXMiLCJBcGlCb2R5IiwiQXBpQ3JlYXRlZFJlc3BvbnNlIiwic2NoZW1hIiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkFwaU5vdEZvdW5kUmVzcG9uc2UiLCJiYXNlIiwiZ2V0TW9kdWxlRm9yIiwiRGVjYWZNb2RlbE1vZHVsZSIsIkRlY2FmTW9kZWxNb2R1bGVfMSIsImNyZWF0ZU1vZGVsU2VydmljZXMiLCJtb2RlbHMiLCJ1c2VGYWN0b3J5IiwiaXNFeHBvc2VkIiwiZXhwb3N1cmUiLCJ0cmFja2VkTW9kZWxzIiwiY29udHJvbGxlckV4cG9zdXJlIiwibW9kZWxTZXJ2aWNlcyIsImF1dG9TZXJ2aWNlcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkJhc2VFcnJvciIsIkRlY2FmRXhjZXB0aW9uRmlsdGVyIiwiZXhjZXB0aW9uIiwiaG9zdCIsImlzUHJvZHVjdGlvbiIsIkxvZ2dlZEVudmlyb25tZW50IiwiZW52Iiwic3RhdHVzQ29kZSIsIk5vdEZvdW5kRXhjZXB0aW9uIiwiVW5zdXBwb3J0ZWRFcnJvciIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJtZXNzYWdlIiwiZ2V0U3RhdHVzIiwic3RhdHVzIiwiY29kZSIsImpzb24iLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJhdXRoIiwic2NoZW1lIiwiYmVhcmVyRm9ybWF0IiwiaW4iLCJwZXJzaXN0QXV0aG9yaXphdGlvbiIsInRvcGJhckJnQ29sb3IiLCJTd2FnZ2VyQ3VzdG9tVUkiLCJjdXN0b21DU1MiLCJjc3MiLCJ0b3BiYXJJY29uUGF0aCIsImltZyIsImI2NCIsImdldEN1c3RvbU9wdGlvbnMiLCJmYXZpY29uIiwiZmF2aWNvblBhdGgiLCJjdXN0b21TaXRlVGl0bGUiLCJjdXN0b21Dc3MiLCJzd2FnZ2VyT3B0aW9ucyIsImZpbGUiLCJmaWxlUGF0aCIsImFzc2V0c1BhdGgiLCJyZWFkRmlsZVN5bmMiLCJlbmNvZGluZyIsIlN3YWdnZXJCdWlsZGVyIiwiYXBwIiwiY3JlYXRlRG9jdW1lbnQiLCJvcGVuQXBpSnNvblBhdGgiLCJvcGVuQXBpWWFtbFBhdGgiLCJEb2N1bWVudEJ1aWxkZXIiLCJzZXRUaXRsZSIsInNldERlc2NyaXB0aW9uIiwic2V0VmVyc2lvbiIsImFkZEJlYXJlckF1dGgiLCJTd2FnZ2VyTW9kdWxlIiwicmVnaXN0ZXJPcGVuQXBpUm91dGUiLCJjb250ZW50VHlwZSIsImJvZHlGYWN0b3J5IiwiaHR0cEFkYXB0ZXIiLCJnZXRIdHRwQWRhcHRlciIsIl9yZXEiLCJyZXBseSIsInNldHVwU3dhZ2dlciIsImRvY3VtZW50Iiwic3dhZ2dlclVJIiwic2V0dXAiLCJqc29uRG9jdW1lbnRVcmwiLCJ5YW1sRG9jdW1lbnRVcmwiLCJZQU1MIiwiTmVzdEJvb3RzdHJhcGVyIiwiX2xvZ2dlciIsIkxvZ2dlciIsImluaXRpYWxpemUiLCJlbmFibGVMb2dnZXIiLCJjdXN0b21Mb2dnZXIiLCJ1c2VMb2dnZXIiLCJlbmFibGVDb3JzIiwib3JpZ2lucyIsImFsbG93TWV0aG9kcyIsImFsbG93ZWRPcmlnaW5zIiwibyIsInRvTG93ZXJDYXNlIiwiY29yc09wdGlvbnMiLCJvcmlnaW4iLCJjYWxsYmFjayIsImNyZWRlbnRpYWxzIiwibWV0aG9kcyIsInVzZUhlbG1ldCIsImhlbG1ldCIsInJlcXVpcmUiLCJ1c2UiLCJ3YXJuIiwic3dhZ2dlciIsInVzZUdsb2JhbFBpcGVzIiwicGlwZXMiLCJ1c2VHbG9iYWxGaWx0ZXJzIiwiZmlsdGVycyIsInVzZUdsb2JhbEludGVyY2VwdG9ycyIsImludGVyY2VwdG9ycyIsInN0YXJ0IiwicG9ydCIsInByb2Nlc3MiLCJQT1JUIiwibGlzdGVuIiwidGhlbiIsImdldFVybCIsInBlbmRpbmdQcm92aWRlcnMiLCJnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMiLCJyZWdpc3RlclByb3ZpZGVyIiwidG9rZW4iLCJpc01vZGVsQ29uc3RydWN0b3IiLCJtb2RlbFNlcnZpY2VUb2tlbiIsIm1vZGVsUmVwb3NpdG9yeVRva2VuIiwicGFyYW1ldGVySW5kZXgiLCJyZXNvbHZlZCIsInBhcmFtVHlwZXMiLCJhc01vZGVsIiwiaW5qZWN0YWJsZVNlcnZpY2VLZXkiLCJDb3JlU2VydmljZSIsIkNvcmVSZXBvc2l0b3J5IiwiRGVjYWZDb3JlTW9kdWxlIiwiRGVjYWZDb3JlTW9kdWxlXzEiLCJtb2R1bGVSZWYiLCJkZWNhZlByb3ZpZGVycyIsInVzZVZhbHVlIiwiY2xpZW50IiwiSCIsInByb3ZpZGVyIiwiYm9vdFBlcnNpc3RlbmNlIiwidHJpbW1lZCIsImNvbmYiLCJjb250ciIsInBvc3NpYmxlIiwiUGVyc2lzdGVuY2VTZXJ2aWNlIiwiYm9vdCIsImNsaWVudHMiLCJjIiwicG9zc2libGVUcmFuc2YiLCJyZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIiLCJpbml0aWFsaXphdGlvbiIsIm9uQXBwbGljYXRpb25TaHV0ZG93biIsImFkYXB0ZXJzIiwic2h1dGRvd24iLCJHbG9iYWwiLCJNb2R1bGVSZWYiLCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMiLCJub3JtYWxpemVFdmVudFJlc3BvbnNlIiwibW9kZWxDb25zdHIiLCJzZXJpYWxpemVkUGF5bG9hZCIsInNlcmlhbGl6ZSIsImNvbnNvbGUiLCJlcnIiLCJFdmVudHNDb250cm9sbGVyIiwiRXZlbnRzQ29udHJvbGxlcl8xIiwiZXZlbnRzJCIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsIm9ic2VydmVySWQiLCJNYXRoIiwicmFuZG9tIiwidG9VcHBlckNhc2UiLCJjYiIsInJlZnJlc2giLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFPLE1BQU1BLG9CQUFvQjs7QUFDMUIsTUFBTUMsYUFBYTtJQUN4QkMsZUFBZSxHQUFHRjtJQUNsQkcsY0FBYyxHQUFHSDtJQUNqQkksY0FBYyxHQUFHSjtJQUNqQkssY0FBYyxHQUFHTDtJQUNqQk0sVUFBVSxHQUFHTjtJQUNiTyxlQUFlLEdBQUdQO0lBQ2xCUSxnQkFBZ0IsR0FBR1I7SUFDbkJTLGFBQWEsR0FBR1Q7SUFDaEJVLHNCQUFzQixHQUFHVjtJQUN6QlcsNEJBQTRCLEdBQUdYO0lBQy9CWSxjQUFjLEdBQUdaO0lBQ2pCYSxzQkFBc0IsR0FBR2I7SUFDekJjLHdCQUF3QixHQUFHZDtJQUMzQmUsa0JBQWtCLEdBQUdmO0lBQ3JCZ0IsZUFBZSxHQUFHaEI7SUFDbEJpQixZ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
|
|
2756
|
+
export { AUTH_HANDLER, AUTH_META_KEY, ApiOperationFromModel, ApiParamsFromModel, ApiProperty, Auth, AuthInterceptor, BulkApiOperationFromModel, COMMIT, CorsError, DECAF_ADAPTER_ID, DECAF_CONTEXT_KEY, DECAF_CONTROLLER_CONFIG, DECAF_EXPOSE, DECAF_HANDLERS, DECAF_MODULE_OPTIONS, DECAF_ROUTE, DECAF_TASK_SERVICE_ID, DECORATORS, DECORATORS_PREFIX, DecafAuthHandler, DecafAuthModule, DecafBody, DecafController, DecafCoreModule, DecafExceptionFilter, DecafHandlerExecutor, DecafModelController, DecafModule, DecafParams, DecafRequestContext, DecafRequestHandlerInterceptor, DecafResponseInterceptor, DecafRoleAuthHandler, DecafStreamModule, DtoFor, EventsController, FULL_VERSION, FromModelController, IS_PUBLIC_KEY, NestBootstraper, PACKAGE_NAME, Public, REQUIRED_ROLES_KEY, Repository, RequireRoles, SKIP_MODEL_ROLES_KEY, Service, SwaggerBuilder, UseDecafFilter, UseDecafHeaders, VERSION, applyApiDecorators, controllerConfig, createApiPropertyDecorator, createPropertyDecorator, createRouteHandler, defineRouteMethod, expose, getApiDecorators, getEnumType, getEnumValues, getModuleFor, getRegisteredDecafProviders, isUndefined, repoForModel, resolvePersistenceMethod, runMigrations };
|
|
2757
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9vdmVycmlkZXMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9oZWxwZXJzLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9kZWNvcmF0aW9uLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpT3BlcmF0aW9uRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvQXBpUGFyYW1zRnJvbU1vZGVsLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZCb2R5LnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvRGVjYWZQYXJhbXMudHMiLCIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvZXhwb3NlLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL2RlY29yYXRvcnMvY29udHJvbGxlci1jb25maWcudHMiLCIuLi9zcmMvYXV0aC9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0LnRzIiwiLi4vc3JjL2F1dGgvQXV0aEludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2F1dGgvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL3V0aWxzLnRzIiwiLi4vc3JjL2RlY2FmLW1vZGVsL3V0aWxzLnRzIiwiLi4vc3JjL2F1dGgvRGVjYWZBdXRoSGFuZGxlci50cyIsIi4uL3NyYy9hdXRoL0RlY2FmQXV0aE1vZHVsZS50cyIsIi4uL3NyYy9yZXF1ZXN0L0RlY2FmSGFuZGxlckV4ZWN1dG9yLnRzIiwiLi4vc3JjL3JlcXVlc3QvRGVjYWZSZXNwb25zZUludGVyY2VwdG9yLnRzIiwiLi4vc3JjL2NvbnRyb2xsZXJzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9EdG9CdWlsZGVyLnRzIiwiLi4vc3JjL292ZXJyaWRlcy9vdmVycmlkZXMudHMiLCIuLi9zcmMvb3ZlcnJpZGVzL01vZGVsQnVpbGRlckV4dGVuc2lvbnMudHMiLCIuLi9zcmMvZGVjYWYtbW9kZWwvRnJvbU1vZGVsQ29udHJvbGxlci50cyIsIi4uL3NyYy9kZWNhZi1tb2RlbC9EZWNhZk1vZGVsTW9kdWxlLnRzIiwiLi4vc3JjL2RlY29yYXRpb24udHMiLCIuLi9zcmMvZmFjdG9yeS9lcnJvcnMvY29ycy50cyIsIi4uL3NyYy9mYWN0b3J5L2Vycm9ycy90aHJvdHRsaW5nLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9EZWNhZkVycm9yRmlsdGVyLnRzIiwiLi4vc3JjL2ZhY3RvcnkvZXhjZXB0aW9ucy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2ZhY3Rvcnkvb3BlbmFwaS9jb25zdGFudHMudHMiLCIuLi9zcmMvZmFjdG9yeS9vcGVuYXBpL1N3YWdnZXJDdXN0b21VSS50cyIsIi4uL3NyYy9mYWN0b3J5L29wZW5hcGkvU3dhZ2dlckJ1aWxkZXIudHMiLCIuLi9zcmMvZmFjdG9yeS9OZXN0Qm9vdHN0cmFwZXIudHMiLCIuLi9zcmMvaW50ZXJjZXB0b3JzL0RlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvci50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2NvcmUtbW9kdWxlLnRzIiwiLi4vc3JjL2V2ZW50cy1tb2R1bGUvY29uc3RhbnQudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS91dGlscy50cyIsIi4uL3NyYy9ldmVudHMtbW9kdWxlL0V2ZW50c0NvbnRyb2xsZXIudHMiLCIuLi9zcmMvZXZlbnRzLW1vZHVsZS9EZWNhZlN0cmVhbU1vZHVsZS50cyIsIi4uL3NyYy9tb2R1bGUudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IERFQ09SQVRPUlNfUFJFRklYID0gXCJzd2FnZ2VyXCI7XG5leHBvcnQgY29uc3QgREVDT1JBVE9SUyA9IHtcbiAgQVBJX09QRVJBVElPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU9wZXJhdGlvbmAsXG4gIEFQSV9SRVNQT05TRTogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVJlc3BvbnNlYCxcbiAgQVBJX1BST0RVQ0VTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpUHJvZHVjZXNgLFxuICBBUElfQ09OU1VNRVM6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDb25zdW1lc2AsXG4gIEFQSV9UQUdTOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpVXNlVGFnc2AsXG4gIEFQSV9DQUxMQkFDS1M6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlDYWxsYmFja3NgLFxuICBBUElfUEFSQU1FVEVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaVBhcmFtZXRlcnNgLFxuICBBUElfSEVBREVSUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUhlYWRlcnNgLFxuICBBUElfTU9ERUxfUFJPUEVSVElFUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaU1vZGVsUHJvcGVydGllc2AsXG4gIEFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpTW9kZWxQcm9wZXJ0aWVzQXJyYXlgLFxuICBBUElfU0VDVVJJVFk6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTZWN1cml0eWAsXG4gIEFQSV9FWENMVURFX0VORFBPSU5UOiBgJHtERUNPUkFUT1JTX1BSRUZJWH0vYXBpRXhjbHVkZUVuZHBvaW50YCxcbiAgQVBJX0VYQ0xVREVfQ09OVFJPTExFUjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4Y2x1ZGVDb250cm9sbGVyYCxcbiAgQVBJX0VYVFJBX01PREVMUzogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dHJhTW9kZWxzYCxcbiAgQVBJX0VYVEVOU0lPTjogYCR7REVDT1JBVE9SU19QUkVGSVh9L2FwaUV4dGVuc2lvbmAsXG4gIEFQSV9TQ0hFTUE6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlTY2hlbWFgLFxuICBBUElfREVGQVVMVF9HRVRURVI6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlEZWZhdWx0R2V0dGVyYCxcbiAgQVBJX0xJTks6IGAke0RFQ09SQVRPUlNfUFJFRklYfS9hcGlMaW5rYCxcbn07XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc1VuZGVmaW5lZCwgbmVnYXRlLCBwaWNrQnkgfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0NvbnN0cnVjdG9yID0gKHZhbDogYW55KTogYm9vbGVhbiA9PiB2YWwgPT09IFwiY29uc3RydWN0b3JcIjtcbmV4cG9ydCBjb25zdCBNRVRBREFUQV9GQUNUT1JZX05BTUUgPSBcIl9PUEVOQVBJX01FVEFEQVRBX0ZBQ1RPUllcIjtcblxuZXhwb3J0IGNvbnN0IE1FVEhPRF9NRVRBREFUQSA9IFwibWV0aG9kXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXRob2REZWNvcmF0b3I8VCA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQsXG4gIHsgb3ZlcnJpZGVFeGlzdGluZyB9ID0geyBvdmVycmlkZUV4aXN0aW5nOiB0cnVlIH1cbik6IE1ldGhvZERlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yXG4gICkgPT4ge1xuICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICBpZiAocHJldlZhbHVlICYmICFvdmVycmlkZUV4aXN0aW5nKSB7XG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgbWV0YWtleSxcbiAgICAgICAgeyAuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhIH0sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YSwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDbGFzc0RlY29yYXRvcjxUIGV4dGVuZHMgQXJyYXk8YW55PiA9IGFueT4oXG4gIG1ldGFrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFQgPSBbXSBhcyBhbnlcbik6IENsYXNzRGVjb3JhdG9yIHtcbiAgcmV0dXJuICh0YXJnZXQpID0+IHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwgW107XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBbLi4ucHJldlZhbHVlLCAuLi5tZXRhZGF0YV0sIHRhcmdldCk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgICh0YXJnZXQ/LmNvbnN0cnVjdG9yIGFzIGFueSk/LltNRVRBREFUQV9GQUNUT1JZX05BTUUgYXMgYW55XT8uKClbXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgXT8udHlwZSA/PyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIG1ldGFrZXksXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG4gICAgfVxuICB9KSBhcyBQcm9wZXJ0eURlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICAgIHRhcmdldDogb2JqZWN0IHwgRnVuY3Rpb24sXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgY29uc3QgcGFyYW1PcHRpb25zID0ge1xuICAgICAgLi4uaW5pdGlhbCxcbiAgICAgIC4uLnBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSksXG4gICAgfTtcblxuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICBjb25zdCBwYXJhbWV0ZXJzID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLCBkZXNjcmlwdG9yLnZhbHVlKSB8fCBbXTtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgIFsuLi5wYXJhbWV0ZXJzLCBwYXJhbU9wdGlvbnNdLFxuICAgICAgICBkZXNjcmlwdG9yLnZhbHVlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHlLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5S2V5IG9mIHByb3BlcnR5S2V5cykge1xuICAgICAgaWYgKGlzQ29uc3RydWN0b3IocHJvcGVydHlLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtZXRob2REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgdGFyZ2V0LnByb3RvdHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICk7XG5cbiAgICAgIGlmICghbWV0aG9kRGVzY3JpcHRvcikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNBcGlNZXRob2QgPSBSZWZsZWN0Lmhhc01ldGFkYXRhKFxuICAgICAgICBNRVRIT0RfTUVUQURBVEEsXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG5cbiAgICAgIGlmICghaXNBcGlNZXRob2QpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsXG4gICAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgICApIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIG1ldGhvZERlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuKTogW0Z1bmN0aW9uIHwgdW5kZWZpbmVkLCBib29sZWFuXSB7XG4gIGlmICghaW5wdXQpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIHVuZGVmaW5lZCwgaXNBcnJheUZsYWddO1xuICB9XG4gIGlmIChpc0FycmF5RmxhZykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGVcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIHJldHVybiBbdHlwZSBhcyBGdW5jdGlvbiwgaXNJbnB1dEFycmF5XTtcbn1cbiIsImltcG9ydCB7IFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IGlzU3RyaW5nLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUsIE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCIuL2hlbHBlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW51bUFsbG93ZWRUeXBlcyxcbiAgRW51bVNjaGVtYUF0dHJpYnV0ZXMsXG4gIFNjaGVtYU9iamVjdE1ldGFkYXRhLFxuICBTd2FnZ2VyRW51bVR5cGUsXG59IGZyb20gXCIuLi9zd2FnZ2VyLXR5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc1VuZGVmaW5lZCA9IChvYmo6IGFueSk6IG9iaiBpcyB1bmRlZmluZWQgPT5cbiAgdHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVudW1WYWx1ZXMoXG4gIGVudW1UeXBlOiBTd2FnZ2VyRW51bVR5cGUgfCAoKCkgPT4gU3dhZ2dlckVudW1UeXBlKVxuKTogc3RyaW5nW10gfCBudW1iZXJbXSB7XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBnZXRFbnVtVmFsdWVzKGVudW1UeXBlKCkpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZW51bVR5cGUpKSB7XG4gICAgcmV0dXJuIGVudW1UeXBlIGFzIHN0cmluZ1tdO1xuICB9XG4gIGlmICh0eXBlb2YgZW51bVR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgLy8gRW51bXMgd2l0aCBudW1lcmljIHZhbHVlc1xuICAvLyAgIGVudW0gU2l6ZSB7XG4gIC8vICAgICBTTUFMTCA9IDEsXG4gIC8vICAgICBCSUcgPSAyXG4gIC8vICAgfVxuICAvLyBhcmUgdHJhbnNwaWxlZCB0byBpbmNsdWRlIGEgcmV2ZXJzZSBtYXBwaW5nXG4gIC8vICAgY29uc3QgU2l6ZSA9IHtcbiAgLy8gICAgIFwiMVwiOiBcIlNNQUxMXCIsXG4gIC8vICAgICBcIjJcIjogXCJCSUdcIixcbiAgLy8gICAgIFwiU01BTExcIjogMSxcbiAgLy8gICAgIFwiQklHXCI6IDIsXG4gIC8vICAgfVxuICBjb25zdCBudW1lcmljVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKCh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiKVxuICAgIC5tYXAoKHZhbHVlOiBhbnkpID0+IHZhbHVlLnRvU3RyaW5nKCkpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhlbnVtVHlwZSlcbiAgICAuZmlsdGVyKChrZXkpID0+ICFudW1lcmljVmFsdWVzLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCgoa2V5KSA9PiBlbnVtVHlwZVtrZXkgYXMgYW55XSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbnVtVHlwZSh2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIpW10pOiBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB7XG4gIGNvbnN0IGhhc1N0cmluZyA9IHZhbHVlcy5maWx0ZXIoaXNTdHJpbmcpLmxlbmd0aCA+IDA7XG4gIHJldHVybiBoYXNTdHJpbmcgPyBcInN0cmluZ1wiIDogXCJudW1iZXJcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuICgodGFyZ2V0OiBvYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0aWVzID1cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfTU9ERUxfUFJPUEVSVElFU19BUlJBWSwgdGFyZ2V0KSB8fCBbXTtcblxuICAgIGNvbnN0IGtleSA9IGA6JHtwcm9wZXJ0eUtleX1gO1xuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLFxuICAgICAgICBbLi4ucHJvcGVydGllcywgYDoke3Byb3BlcnR5S2V5fWBdLFxuICAgICAgICB0YXJnZXRcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChleGlzdGluZ01ldGFkYXRhKSB7XG4gICAgICBjb25zdCBuZXdNZXRhZGF0YSA9IHBpY2tCeShtZXRhZGF0YSwgbmVnYXRlKGlzVW5kZWZpbmVkKSk7XG4gICAgICBjb25zdCBtZXRhZGF0YVRvU2F2ZSA9IG92ZXJyaWRlRXhpc3RpbmdcbiAgICAgICAgPyB7XG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgfVxuICAgICAgICA6IHtcbiAgICAgICAgICAgIC4uLm5ld01ldGFkYXRhLFxuICAgICAgICAgICAgLi4uZXhpc3RpbmdNZXRhZGF0YSxcbiAgICAgICAgICB9O1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhVG9TYXZlLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbmVzdCBqcyBjb2RlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsIC8vIERlZmF1bHQgdG8gb3B0aW9uYWwgdW5sZXNzIEByZXF1aXJlZCgpIGlzIHVzZWRcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfSkgYXMgUHJvcGVydHlEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCB0eXBlIEFwaVByb3BlcnR5Q29tbW9uT3B0aW9ucyA9IFNjaGVtYU9iamVjdE1ldGFkYXRhICYge1xuICBcIngtZW51bU5hbWVzXCI/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIExhenkgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSB0eXBlIGZvciB3aGljaCB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gICAqIGNhbiBiZSB1c2VkIGFzIGFuIGlkXG4gICAqXG4gICAqIFVzZSB0b2dldGhlciB3aXRoIEBBcGlEZWZhdWx0R2V0dGVyIG9uIHRoZSBnZXR0ZXIgcm91dGUgb2YgdGhlIHR5cGVcbiAgICogdG8gZ2VuZXJhdGUgT3BlbkFQSSBsaW5rIG9iamVjdHNcbiAgICpcbiAgICogQHNlZSBbU3dhZ2dlciBsaW5rIG9iamVjdHNdKGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vbGlua3MvKVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZVxuICBsaW5rPzogKCkgPT4gVHlwZTx1bmtub3duPiB8IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlPcHRpb25zID1cbiAgfCBBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnNcbiAgfCAoQXBpUHJvcGVydHlDb21tb25PcHRpb25zICYge1xuICAgICAgZW51bU5hbWU6IHN0cmluZztcbiAgICAgIGVudW1TY2hlbWE/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHksIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlFeGNsdWRlRW5kcG9pbnQgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIE9wZXJhdGlvbktleXMsXG4gIENydWRPcGVyYXRpb25zLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG5pbXBvcnQgeyBpc09wZXJhdGlvbkJsb2NrZWQgYXMgY29yZUlzT3BlcmF0aW9uQmxvY2tlZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gQ1JVRCBvcGVyYXRpb24gaXMgYmxvY2tlZCBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjb25zdHJ1Y3Rvci5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgb3BlcmF0aW9uLWJsb2NraW5nIGhhbmRsZXIgbWV0YWRhdGEgc3RvcmVkIG9uIHRoZSBwcm92aWRlZCBtb2RlbCBjb25zdHJ1Y3RvciAodW5kZXIgYE9wZXJhdGlvbktleXMuUkVGTEVDVCArIE9wZXJhdGlvbktleXMuQkxPQ0tgKSwgZXhlY3V0ZXMgaXQgKGlmIHByZXNlbnQpIHdpdGggaXRzIHBlcnNpc3RlZCBhcmd1bWVudHMgcGx1cyB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiwgYW5kIHJldHVybnMgd2hldGhlciB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQuIElmIG5vIGhhbmRsZXIgZXhpc3RzLCB0aGUgb3BlcmF0aW9uIGlzIGNvbnNpZGVyZWQgYWxsb3dlZCAocmV0dXJucyBgZmFsc2VgKS5cbiAqIEBwYXJhbSB7TW9kZWxDb25zdHJ1Y3Rvcjxhbnk+fSBNb2RlbENvbnN0cnVjdG9yIC0gVGhlIHRhcmdldCBtb2RlbCBjb25zdHJ1Y3RvciB3aG9zZSBtZXRhZGF0YSBtYXkgaW5jbHVkZSBhIGJsb2NraW5nIGhhbmRsZXIuXG4gKiBAcGFyYW0ge0NydWRPcGVyYXRpb25zfSBvcCAtIFRoZSBDUlVEIG9wZXJhdGlvbiB0byBldmFsdWF0ZSAoZS5nLiwgYE9wZXJhdGlvbktleXMuQ1JFQVRFYCwgYE9wZXJhdGlvbktleXMuUkVBRGAsIGBPcGVyYXRpb25LZXlzLlVQREFURWAsIGBPcGVyYXRpb25LZXlzLkRFTEVURWApLlxuICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBleHBsaWNpdGx5IGJsb2NrZWQgYnkgdGhlIG1vZGVsJ3MgaGFuZGxlcjsgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKiBAZnVuY3Rpb24gaXNPcGVyYXRpb25CbG9ja2VkXG4gKi9cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpT3BlcmF0aW9uRnJvbU1vZGVsKFxuICBNb2RlbENvbnN0cnVjdG9yOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPFxuICAgIEh0dHBWZXJicyxcbiAgICBbQ3J1ZE9wZXJhdGlvbnMsIChwYXRoPzogc3RyaW5nKSA9PiBNZXRob2REZWNvcmF0b3JdXG4gID4gPSB7XG4gICAgR0VUOiBbT3BlcmF0aW9uS2V5cy5SRUFELCBHZXRdLFxuICAgIFBPU1Q6IFtPcGVyYXRpb25LZXlzLkNSRUFURSwgUG9zdF0sXG4gICAgUFVUOiBbT3BlcmF0aW9uS2V5cy5VUERBVEUsIFB1dF0sXG4gICAgUEFUQ0g6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUGF0Y2hdLFxuICAgIERFTEVURTogW09wZXJhdGlvbktleXMuREVMRVRFLCBEZWxldGVdLFxuICB9O1xuXG4gIGNvbnN0IFtjcnVkT3AsIEh0dHBNZXRob2REZWNvcmF0b3JdID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcbiAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgID8gYXBwbHkoQXBpRXhjbHVkZUVuZHBvaW50KCkpXG4gICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVCbG9ja1RhcmdldChcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8QyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHg+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBVbnN1cHBvcnRlZCBIVFRQIHZlcmIgXCIke3ZlcmJ9XCIuIE5vIE5lc3RKUyBkZWNvcmF0b3IgbWFwcGluZyB3YXMgZm91bmQuYFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIiwiaW1wb3J0IHsgUXVlcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgdHlwZSBEZWNvcmF0b3JCdW5kbGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxufSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQge1xuICBEZWNhZkFwaVByb3BlcnR5LFxuICB0eXBlIERlY2FmUGFyYW1Qcm9wcyxcbiAgRGVjYWZQYXJhbXMsXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRGlyZWN0aW9uTGltaXRPZmZzZXQsXG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFJlcG8sXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIdHRwVmVyYlRvRGVjb3JhdG9yIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy91dGlsc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcblxuY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocm91dGVQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gIHJldHVybiByb3V0ZVBhdGhcbiAgICAuc3BsaXQoXCIvXCIpXG4gICAgLmZpbHRlcigocCkgPT4gcC5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAubWFwKChwKSA9PiBwLnNsaWNlKDEpKTtcbn07XG5cbmNvbnN0IGFwaVBhcmFtU3BlYyA9IChuYW1lOiBzdHJpbmcpOiBEZWNhZkFwaVByb3BlcnR5ID0+ICh7XG4gIG5hbWUsXG4gIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gIHJlcXVpcmVkOiB0cnVlLFxuICB0eXBlOiBTdHJpbmcsXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwaURlY29yYXRvcnMoXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgcm91dGVQYXRoOiBzdHJpbmcsXG4gIGh0dHBWZXJiOiBIdHRwVmVyYnMsXG4gIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4pOiBEZWNvcmF0b3JCdW5kbGUge1xuICBjb25zdCBOZXN0SHR0cFJvdXRlRGVjID0gSHR0cFZlcmJUb0RlY29yYXRvcihodHRwVmVyYik7XG4gIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcChhcGlQYXJhbVNwZWMpO1xuXG4gIGNvbnN0IHN3YWdnZXJRdWVyeVBhcmFtcyA9IFtdO1xuICBpZiAoaHR0cFZlcmIgPT09IFwiR0VUXCIgJiYgaW5jbHVkZVF1ZXJ5UGFyYW1zKSB7XG4gICAgc3dhZ2dlclF1ZXJ5UGFyYW1zLnB1c2goXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7XG4gICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmsgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG1ldGhvZDogW1xuICAgICAgTmVzdEh0dHBSb3V0ZURlYyhyb3V0ZVBhdGgpLFxuICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoQXBpUGFyYW0pLFxuICAgICAgLi4uc3dhZ2dlclF1ZXJ5UGFyYW1zLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgYWNjb3JkaW5nIHRvIFwiJHttZXRob2ROYW1lfVwiLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuYCxcbiAgICAgIH0pLFxuICAgIF0sXG4gICAgcGFyYW1zOiBbRGVjYWZQYXJhbXMoYXBpUGF0aFBhcmFtcyksIFF1ZXJ5KCldLCAvLyAsIERlY2FmQm9keSgpXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QXBpRGVjb3JhdG9ycyhcbiAgdGFyZ2V0OiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yLFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JCdW5kbGVcbikge1xuICBjb25zdCBwcm90byA9IHRhcmdldD8ucHJvdG90eXBlID8/IHRhcmdldDtcbiAgZGVjb3JhdG9ycy5tZXRob2QuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICBkZWNvcmF0b3JzLnBhcmFtcz8uZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2Q8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgLi4uYXJnczogYW55W11cbik6IGFueSB7XG4gIGlmIChwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSkge1xuICAgIHJldHVybiB0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSguLi5hcmdzKVxuICAgICAgOiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICBpZiAodHlwZW9mIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpXG4gICAgcmV0dXJuIChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgUGVyc2lzdGVuY2UgbWV0aG9kIFwiJHttZXRob2ROYW1lfVwiIG5vdCBmb3VuZCBvbiAke3BlcnNpc3RlbmNlPy5jb25zdHJ1Y3Rvcj8ubmFtZX1gXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSb3V0ZUhhbmRsZXI8VD4obWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgdGhpczogRGVjYWZNb2RlbENvbnRyb2xsZXI8YW55PixcbiAgICBwYXRoUGFyYW1zOiBEZWNhZlBhcmFtUHJvcHMsXG4gICAgcXVlcnlQYXJhbXM6IERpcmVjdGlvbkxpbWl0T2Zmc2V0XG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGxvZzogTG9nZ2VyID0gdGhpcy5sb2cuZm9yKG1ldGhvZE5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYEludm9raW5nIHBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBnaXZlbiBwYXJhbWV0ZXJzOiAke0pTT04uc3RyaW5naWZ5KHBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcil9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgZGlyZWN0aW9uLCBsaW1pdCwgb2Zmc2V0IH0gPSBxdWVyeVBhcmFtcztcbiAgICAgIHJldHVybiBhd2FpdCByZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QoXG4gICAgICAgIHRoaXMucGVyc2lzdGVuY2UoKSxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgLi4ucGF0aFBhcmFtcy52YWx1ZXNJbk9yZGVyLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIGxpbWl0LFxuICAgICAgICBvZmZzZXRcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUm91dGVNZXRob2QoXG4gIENvbnRyb2xsZXJDbGFzczogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4pOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZSxcbiAgICB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB9XG4gICk7XG5cbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgQ29udHJvbGxlckNsYXNzLnByb3RvdHlwZSB8fCBDb250cm9sbGVyQ2xhc3MsXG4gICAgbWV0aG9kTmFtZVxuICApO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoSGFuZGxlciwgQXV0aERhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuLyoqXG4gKiBTaW1wbGUgYXV0aCBoYW5kbGVyIHRoYXQgcmVhZHMgYSByb2xlIHN0cmluZyBmcm9tIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDxyb2xlPmAgaGVhZGVyLlxuICpcbiAqIE9ubHkgb3ZlcnJpZGVzIHtAbGluayBBdXRoSGFuZGxlci5leHRyYWN0RnJvbUF1dGh9IHRvIHJldHVybiB0aGUgYmVhcmVyIHRva2VuIGFzXG4gKiBib3RoIHRoZSB1c2VyIGlkZW50aWZpZXIgYW5kIHRoZSBzaW5nbGUgcm9sZS4gVGhlIGJhc2UgY2xhc3MgYGJpbmRUb0NvbnRleHRgXG4gKiAoYGN0eC5hY2N1bXVsYXRlKGRhdGEpYCkgaXMgc3VmZmljaWVudCDigJQgdGhlIHRyYW5zZm9ybWVyL2FkYXB0ZXIgaXMgcmVzcG9uc2libGVcbiAqIGZvciBtYXBwaW5nIGNvbnRleHQgZmllbGRzIHRvIGFkYXB0ZXItc3BlY2lmaWMga2V5cyBsaWtlIGBVVUlEYC5cbiAqL1xuZXhwb3J0IGNsYXNzIERlY2FmQXV0aEhhbmRsZXIgZXh0ZW5kcyBBdXRoSGFuZGxlcjxcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgQXV0aERhdGFcbj4ge1xuICBwcm90ZWN0ZWQgcGFyc2VSZXF1ZXN0KHJlcTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24/LnNwbGl0KFwiIFwiKVsxXSBhcyBzdHJpbmc7XG4gICAgcmV0dXJuIHVzZXJSb2xlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGV4dHJhY3RGcm9tQXV0aChjdHg6IEV4ZWN1dGlvbkNvbnRleHQpOiBBdXRoRGF0YSB7XG4gICAgY29uc3QgcmVxID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCB1c2VyUm9sZSA9IHRoaXMucGFyc2VSZXF1ZXN0KHJlcSk7XG4gICAgaWYgKCF1c2VyUm9sZSkgdGhyb3cgbmV3IEF1dGhvcml6YXRpb25FcnJvcihcIlVuYXV0aGVudGljYXRlZFwiKTtcbiAgICByZXR1cm4geyB1c2VyOiB1c2VyUm9sZSwgcm9sZXM6IFt1c2VyUm9sZV0gfTtcbiAgfVxufVxuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgRGVjYWZBdXRoSGFuZGxlcn0ga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAqIFRoZSBcInJvbGVcIiB2YXJpYW50IHByZXZpb3VzbHkgcmV0dXJuZWQgcm9sZXMgZnJvbSBgYXV0aG9yaXplYDsgd2l0aCB0aGUgYmFzZVxuICogY2xhc3Mgbm93IG9yY2hlc3RyYXRpbmcgcm9sZSBjaGVja3MgaW50ZXJuYWxseSwgdGhlIHR3byBjbGFzc2VzIGFyZSBlcXVpdmFsZW50LlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZSb2xlQXV0aEhhbmRsZXIgZXh0ZW5kcyBEZWNhZkF1dGhIYW5kbGVyIHt9XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFR5cGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcblxuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yIH0gZnJvbSBcIi4vQXV0aEludGVyY2VwdG9yXCI7XG5pbXBvcnQgeyBBVVRIX0hBTkRMRVIgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmQXV0aE1vZHVsZU9wdGlvbnMgPSB7XG4gIGdsb2JhbD86IGJvb2xlYW47XG4gIGhhbmRsZXI/OiBUeXBlPEF1dGhIYW5kbGVyPjtcbn07XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoXG4gICAgb3B0aW9uczogRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHt9XG4gICk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IHByb3ZpZGVyczogRHluYW1pY01vZHVsZVtcInByb3ZpZGVyc1wiXSA9IFtcbiAgICAgIEF1dGhJbnRlcmNlcHRvcixcbiAgICBdO1xuXG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgcHJvdmlkZXJzLnB1c2gob3B0aW9ucy5oYW5kbGVyKTtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVVUSF9IQU5ETEVSLFxuICAgICAgICB1c2VDbGFzczogb3B0aW9ucy5oYW5kbGVyLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuZ2xvYmFsKSB7XG4gICAgICAocHJvdmlkZXJzIGFzIGFueVtdKS5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICB1c2VFeGlzdGluZzogQXV0aEludGVyY2VwdG9yLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZBdXRoTW9kdWxlLFxuICAgICAgZ2xvYmFsOiBvcHRpb25zLmdsb2JhbCA/PyBmYWxzZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICAgIGV4cG9ydHM6IFtBdXRoSW50ZXJjZXB0b3IsIEFVVEhfSEFORExFUl0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBTY29wZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcbmltcG9ydCB7IHR5cGUgRGVjYWZSZXF1ZXN0SGFuZGxlciB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfSEFORExFUlMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlcn0gaW5zdGFuY2VzIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LFxuICogcHJvdmlkaW5nIHRoZW0gd2l0aCBhIHNoYXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0Q29udGV4dH0uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBvcmNoZXN0cmF0aW5nIGFuZCBleGVjdXRpbmdcbiAqIGEgc2VxdWVuY2Ugb2YgcmVxdWVzdCBoYW5kbGVycy4gRWFjaCBoYW5kbGVyIHJlY2VpdmVzIHRoZSBzYW1lIHJlcXVlc3Qtc2NvcGVkIGNvbnRleHQsXG4gKiBhbGxvd2luZyBjb29yZGluYXRlZCBwcm9jZXNzaW5nIHN1Y2ggYXMgYXV0aGVudGljYXRpb24sIG1ldGFkYXRhIGV4dHJhY3Rpb24sIGF1ZGl0aW5nLFxuICogYW5kIGN1c3RvbSBwaXBlbGluZSBiZWhhdmlvci4gSGFuZGxlcnMgYXJlIGluamVjdGVkIHZpYSB0aGUge0BsaW5rIERFQ0FGX0hBTkRMRVJTfSB0b2tlbixcbiAqIGVuc3VyaW5nIGV4dGVuc2liaWxpdHkgYW5kIGxvb3NlIGNvdXBsaW5nLlxuICpcbiAqIEBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gRXhhbXBsZSBoYW5kbGVyOlxuICogY2xhc3MgQXV0aEhhbmRsZXIgaW1wbGVtZW50cyBEZWNhZlJlcXVlc3RIYW5kbGVyIHtcbiAqICAgYXN5bmMgaGFuZGxlKGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIHJlcTogUmVxdWVzdCkge1xuICogICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcnNbXCJhdXRob3JpemF0aW9uXCJdO1xuICogICAgIGNvbnN0IHJlc3VsdCA9IE15U2VydmljZS5kb1NvbWV0aGluZyh0b2tlbik7XG4gKiAgICAgY29udGV4dC5zZXQoXCJteS1rZXlcIiwgcmVzdWx0KTtcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEV4ZWN1dG9yIHVzYWdlIGluIGEgcmVxdWVzdDpcbiAqIGF3YWl0IGV4ZWN1dG9yLmV4ZWMocmVxdWVzdCk7XG4gKiAvLyBBbGwgaGFuZGxlcnMgd2lsbCBydW4gaW4gc2VxdWVuY2VcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgICBwYXJ0aWNpcGFudCBFeGVjdXRvclxuICogICAgIHBhcnRpY2lwYW50IEhhbmRsZXJBXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckJcbiAqXG4gKiAgICAgQ2xpZW50LT4+RXhlY3V0b3I6IGV4ZWMocmVxKVxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckE6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckEtLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLT4+SGFuZGxlckI6IGhhbmRsZShjb250ZXh0LCByZXEpXG4gKiAgICAgSGFuZGxlckItLT4+RXhlY3V0b3I6IGNvbXBsZXRlZFxuICogICAgIEV4ZWN1dG9yLS0+PkNsaWVudDogcHJvY2Vzc2luZyBmaW5pc2hlZFxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZIYW5kbGVyRXhlY3V0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX0hBTkRMRVJTKSBwcml2YXRlIHJlYWRvbmx5IGhhbmRsZXJzOiBEZWNhZlJlcXVlc3RIYW5kbGVyW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0XG4gICkge31cblxuICBhc3luYyBleGVjKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkge1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmSGFuZGxlckV4ZWN1dG9yLm5hbWUpLmZvcih0aGlzLmV4ZWMpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5jb250ZXh0LnV1aWR9IHJ1bm5pbmcgJHt0aGlzLmhhbmRsZXJzLmxlbmd0aH0gaGFuZGxlcnMgZm9yIHJlcXVlc3QgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIuaGFuZGxlKHRoaXMuY29udGV4dCwgcmVxLCByZXMpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBDYWxsSGFuZGxlcixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCB0YXAgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciBpbXBsZW1lbnRzIE5lc3RJbnRlcmNlcHRvciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjdHg6IERlY2FmUmVxdWVzdENvbnRleHQpIHt9XG5cbiAgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVzcG9uc2UgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlc3BvbnNlKCk7XG5cbiAgICByZXR1cm4gbmV4dC5oYW5kbGUoKS5waXBlKFxuICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgIHJlc3BvbnNlID0gdGhpcy5jdHgudG9SZXNwb25zZShyZXNwb25zZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IHR5cGUgUmVxdWVzdCB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgYXMgSHR0cERlY2FmQ29udHJvbGxlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQge1xuICBDb250ZXh0LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIHR5cGUgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcblxuaW1wb3J0IHsgRGVjYWZTZXJ2ZXJDdHggfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmQ29udHJvbGxlcjxcbiAgQ09OVEVYVCBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgSHR0cERlY2FmQ29udHJvbGxlcjxSZXF1ZXN0LCBhbnksIERlY2FmUmVxdWVzdENvbnRleHQ+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERlY2FmTW9kZWxDb250cm9sbGVyPFxuICBNIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4sXG4gIEMgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxDPiB7XG4gIHByaXZhdGUgX3BlcnNpc3RlbmNlPzogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJlYWRvbmx5IGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgX25hbWU6IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihjbGllbnRDb250ZXh0LCBfbmFtZSk7XG4gIH1cblxuICBhYnN0cmFjdCBnZXQgY2xhc3MoKTogTW9kZWxDb25zdHJ1Y3RvcjxNPjtcblxuICBwZXJzaXN0ZW5jZShjdHg/OiBDb250ZXh0PGFueT4pOiBSZXBvPE0+IHwgTW9kZWxTZXJ2aWNlPE0+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBTZXJ2aWNlLmdldDxNb2RlbFNlcnZpY2U8TT4+KHRoaXMuY2xhc3MpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBNb2RlbFNlcnZpY2UuZ2V0U2VydmljZShcbiAgICAgICAgICAgIHRoaXMuY2xhc3NcbiAgICAgICAgICApIGFzIE1vZGVsU2VydmljZTxNPjtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IFJlcG9zaXRvcnkuZm9yTW9kZWwodGhpcy5jbGFzcykgYXMgUmVwbzxNPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgY29uc3Qgb3ZlcnJpZGVzID0gdGhpcy5jbGllbnRDb250ZXh0LnRvT3ZlcnJpZGVzKCk7XG5cbiAgICByZXR1cm4gY3R4XG4gICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlIGluc3RhbmNlb2YgUmVwb3NpdG9yeVxuICAgICAgICA/IHRoaXMuX3BlcnNpc3RlbmNlLm92ZXJyaWRlKG92ZXJyaWRlcylcbiAgICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZS5mb3Iob3ZlcnJpZGVzKVxuICAgICAgOiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQnVsa0NydWRPcGVyYXRpb25LZXlzLFxuICBJbnRlcm5hbEVycm9yLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQXBpUHJvcGVydHkgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsLCBWYWxpZGF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgdG9QYXNjYWxDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBERUNPUkFUT1JTIH0gZnJvbSBcIi4uLy4uL292ZXJyaWRlcy9jb25zdGFudHNcIjtcblxuY29uc3QgZHRvQ2FjaGUgPSBuZXcgTWFwPFxuICBPcGVyYXRpb25LZXlzLFxuICBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+XG4+KCk7XG5cbi8qKlxuICogQnVpbGRzIGEgTmVzdC9Td2FnZ2VyIERUTyBjbGFzcyBmb3IgdGhlIGdpdmVuIG1vZGVsIGFuZCBDUlVEIG9wZXJhdGlvbi5cbiAqXG4gKiBSdWxlczpcbiAqICAtIE9ubHkgQ1JFQVRFIGFuZCBVUERBVEUgKGFuZCB0aGVpciBidWxrIHZhcmlhbnRzKSBwcm9kdWNlIGEgRFRPO1xuICogICAgYWxsIG90aGVyIG9wZXJhdGlvbnMgcmV0dXJuIHRoZSBvcmlnaW5hbCBtb2RlbCBjbGFzcyB1bmNoYW5nZWQuXG4gKiAgLSBAZ2VuZXJhdGVkKCkgcHJvcGVydGllcyAoY3JlYXRlZEF0LCB1cGRhdGVkQXQsIGNyZWF0ZWRCeSwgdXBkYXRlZEJ5LFxuICogICAgdXVpZCwgdmVyc2lvbiwgQGNvbXBvc2VkIHBrcywg4oCmKSBhcmUgKipuZXZlcioqIGV4cG9zZWQgaW4gYW55IERUTy5cbiAqICAtIFRoZSBAcGsoKSBwcm9wZXJ0eTpcbiAqICAgICAg4oCiIFVQREFURSDigJMgYWx3YXlzIGluY2x1ZGVkLlxuICogICAgICDigKIgQ1JFQVRFICDigJMgaW5jbHVkZWQgb25seSB3aGVuIHRoZSBwayBpcyBOT1QgYXV0by1nZW5lcmF0ZWRcbiAqICAgICAgICAgICAgICAgICAgKGNoZWNrZWQgdmlhIE1vZGVsLnBrUHJvcHMoKS5nZW5lcmF0ZWQgQU5EIE1vZGVsLmdlbmVyYXRlZCgpKS5cbiAqICAtIFJlbGF0aW9uIHByb3BlcnRpZXMgKEBvbmVUb09uZSwgQG9uZVRvTWFueSwg4oCmKTpcbiAqICAgICAg4oCiIENSRUFURSAg4oCTIG5lc3RlZCBhcyBEdG9Gb3IoQ1JFQVRFLCBSZWxhdGVkTW9kZWwpLiBXaGVuIHRoZSByZWxhdGlvblxuICogICAgICAgICAgICAgICAgICBjcmVhdGVzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIChtb2RlbCBBIOKGkiBtb2RlbCBCIOKGkiBtb2RlbCBBKSxcbiAqICAgICAgICAgICAgICAgICAgdGhlIGJhY2stcmVmZXJlbmNlIHVzZXMgdGhlIHJlbGF0ZWQgbW9kZWwncyBQSyB0eXBlXG4gKiAgICAgICAgICAgICAgICAgIChzdHJpbmcvaW50ZWdlcikgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWsgdGhlIGN5Y2xlLlxuICogICAgICDigKIgVVBEQVRFICDigJMgdW5pb24gb2YgRHRvRm9yKFVQREFURSwgUmVsYXRlZE1vZGVsKSAqKm9yKiogdGhlXG4gKiAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgbW9kZWwncyBwcmltYXJ5LWtleSB0eXBlIChzdHJpbmcgLyBpbnRlZ2VyKSxcbiAqICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGFzIGEgU3dhZ2dlciBvbmVPZi4gQ2lyY3VsYXIgYmFjay1yZWZlcmVuY2VzXG4gKiAgICAgICAgICAgICAgICAgIG9taXQgdGhlIERUTyAkcmVmIGFuZCBvbmx5IGluY2x1ZGUgdGhlIFBLIHR5cGUuXG4gKlxuICogTWV0YWRhdGEucHJvcGVydGllcygpIG5vdyByZXR1cm5zIEFMTCBwcm9wZXJ0aWVzIGFjcm9zcyB0aGUgcHJvdG90eXBlIGNoYWluLFxuICogc28gRFRPIGluaGVyaXRhbmNlIGlzIG5vIGxvbmdlciBuZWVkZWQ7IGV2ZXJ5IERUTyBpcyBhIGZsYXQgY2xhc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEdG9Gb3I8TSBleHRlbmRzIE1vZGVsPihcbiAgb3A6IE9wZXJhdGlvbktleXMsXG4gIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgc3RhY2s6IFNldDxDb25zdHJ1Y3Rvcjxhbnk+PiA9IG5ldyBTZXQoKVxuKTogQ29uc3RydWN0b3I8YW55PiB7XG4gIGlmICghVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzLmluY2x1ZGVzKG9wKSkge1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZ2V0RHRvQ2FjaGUob3ApO1xuICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobW9kZWwpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gIGNvbnN0IGlzVXBkYXRlT3AgPSBbXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgQnVsa0NydWRPcGVyYXRpb25LZXlzLlVQREFURV9BTEwsXG4gIF0uaW5jbHVkZXMob3AgYXMgYW55KTtcblxuICBjbGFzcyBEeW5hbWljRFRPIHt9XG4gIGNhY2hlLnNldChtb2RlbCwgRHluYW1pY0RUTyk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8sIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGAke3RvUGFzY2FsQ2FzZShtb2RlbC5uYW1lKX0ke3RvUGFzY2FsQ2FzZShvcCl9RFRPYCxcbiAgfSk7XG5cbiAgY29uc3QgcGtQcm9wID0gKCgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIE1vZGVsLnBrKG1vZGVsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9KSgpO1xuXG4gIGNvbnN0IHBrUHJvcHNNZXRhZGF0YSA9IHBrUHJvcCA/IE1vZGVsLnBrUHJvcHMobW9kZWwgYXMgYW55KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcGtEZXNpZ25UeXBlID0gcGtQcm9wXG4gICAgPyBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwa1Byb3AgYXMgc3RyaW5nKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa1R5cGVJc051bWVyaWMgPVxuICAgIHBrRGVzaWduVHlwZSA9PT0gTnVtYmVyIHx8IHBrRGVzaWduVHlwZSA9PT0gQmlnSW50O1xuICBjb25zdCBwa0lzR2VuZXJhdGVkID1cbiAgICAhIXBrUHJvcHNNZXRhZGF0YT8uZ2VuZXJhdGVkIHx8XG4gICAgKHBrUHJvcFxuICAgICAgPyBNb2RlbC5nZW5lcmF0ZWRCeVNlcXVlbmNlKG1vZGVsIGFzIGFueSwgcGtQcm9wIGFzIGFueSkgfHxcbiAgICAgICAgaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwa1Byb3AgYXMgc3RyaW5nKSB8fFxuICAgICAgICBwa1R5cGVJc051bWVyaWNcbiAgICAgIDogZmFsc2UpO1xuXG4gIGNvbnN0IGFsbFByb3BzID0gQXJyYXkuZnJvbShuZXcgU2V0KE1ldGFkYXRhLnByb3BlcnRpZXMobW9kZWwpIHx8IFtdKSk7XG4gIGNvbnN0IHJlbGF0aW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigoTW9kZWwucmVsYXRpb25zKG1vZGVsKSBhcyBzdHJpbmdbXSkgfHwgW10pO1xuICBjb25zdCBzY2FsYXJQcm9wczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgYWxsUHJvcHMpIHtcbiAgICBpZiAoIXByb3ApIGNvbnRpbnVlO1xuICAgIGlmIChyZWxhdGlvbnMuaGFzKHByb3ApKSBjb250aW51ZTtcblxuICAgIGlmIChwcm9wID09PSBwa1Byb3AgJiYgIWlzVXBkYXRlT3AgJiYgcGtJc0dlbmVyYXRlZCkgY29udGludWU7XG4gICAgaWYgKHByb3AgIT09IHBrUHJvcCAmJiBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApKVxuICAgICAgY29udGludWU7XG5cbiAgICBzY2FsYXJQcm9wcy5wdXNoKHByb3ApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIHNjYWxhclByb3BzKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCk7XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhdmFsaWRhdGlvbj8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcbiAgICBjb25zdCB0eXBlSGludCA9XG4gICAgICBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHByb3ApID8/XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICAgIHJlcXVpcmVkOiBpc1JlcXVpcmVkLFxuICAgIH07XG4gICAgaWYgKHR5cGVIaW50KSBhcGlPcHRpb25zLnR5cGUgPSB0eXBlSGludDtcblxuICAgIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wKTtcblxuICAgIGNvbnN0IGRlc2lnblR5cGUgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIG1vZGVsLnByb3RvdHlwZSwgcHJvcCkgPz8gdHlwZUhpbnQ7XG4gICAgaWYgKHR5cGVvZiBkZXNpZ25UeXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgICAgIGRlc2lnblR5cGUsXG4gICAgICAgIER5bmFtaWNEVE8ucHJvdG90eXBlLFxuICAgICAgICBwcm9wXG4gICAgICApO1xuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEeW5hbWljRFRPLnByb3RvdHlwZSwgcHJvcCwge1xuICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcmVsYXRpb24gb2YgcmVsYXRpb25zKSB7XG4gICAgY29uc3QgcmVsYXRpb25NZXRhID0gTWV0YWRhdGEucmVsYXRpb25zKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGlmICghcmVsYXRpb25NZXRhKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTWV0YWRhdGEgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIGxldCByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4gfCB1bmRlZmluZWQgPVxuICAgICAgcmVsYXRpb25NZXRhLmNsYXNzIGFzIENvbnN0cnVjdG9yPGFueT47XG4gICAgaWYgKHR5cGVvZiByZWxhdGlvblR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhcmVsYXRpb25UeXBlLm5hbWUpIHtcbiAgICAgIHJlbGF0aW9uVHlwZSA9IChyZWxhdGlvblR5cGUgYXMgYW55KSgpO1xuICAgIH1cbiAgICBpZiAoIXJlbGF0aW9uVHlwZSB8fCB0eXBlb2YgcmVsYXRpb25UeXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUeXBlIGZvciByZWxhdGlvbiAke3JlbGF0aW9ufSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgaWYgKCFNb2RlbC5nZXQocmVsYXRpb25UeXBlLm5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhID0gTWV0YWRhdGEudmFsaWRhdGlvbkZvcihtb2RlbCwgcmVsYXRpb24gYXMgYW55KTtcbiAgICBjb25zdCBpc0FycmF5ID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuTElTVF07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICEhKG1ldGEgYXMgYW55KT8uW1ZhbGlkYXRpb25LZXlzLlJFUVVJUkVEXTtcblxuICAgIC8vIERldGVjdCBjaXJjdWxhciByZWZlcmVuY2U6IGlmIHRoZSByZWxhdGVkIG1vZGVsIGlzIGFscmVhZHkgaW4gdGhlXG4gICAgLy8gcmVjdXJzaW9uIHN0YWNrLCB1c2UgdGhlIFBLIHR5cGUgaW5zdGVhZCBvZiB0aGUgZnVsbCBEVE8gdG8gYnJlYWtcbiAgICAvLyB0aGUgY3ljbGUuIFRoaXMgcHJldmVudHMgQG5lc3Rqcy9zd2FnZ2VyJ3MgU2NoZW1hT2JqZWN0RmFjdG9yeSBmcm9tXG4gICAgLy8gaW5maW5pdGVseSByZWN1cnNpbmcgd2hlbiBleHBsb3JpbmcgdGhlIHNjaGVtYXMuXG4gICAgY29uc3QgaXNDaXJjdWxhciA9IHN0YWNrLmhhcyhyZWxhdGlvblR5cGUpO1xuXG4gICAgaWYgKGlzQ2lyY3VsYXIpIHtcbiAgICAgIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gICAgICBhZGRSZWxhdGlvblBrUmVmKER5bmFtaWNEVE8sIHJlbGF0aW9uLCBwa1R5cGVOYW1lLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlbGF0aW9uRHRvID0gRHRvRm9yKG9wLCByZWxhdGlvblR5cGUsIG5ldyBTZXQoc3RhY2spLmFkZChtb2RlbCkpO1xuXG4gICAgaWYgKGlzVXBkYXRlT3ApIHtcbiAgICAgIGFkZFJlbGF0aW9uVXBkYXRlKFxuICAgICAgICBEeW5hbWljRFRPLFxuICAgICAgICByZWxhdGlvbixcbiAgICAgICAgcmVsYXRpb25UeXBlLFxuICAgICAgICByZWxhdGlvbkR0byxcbiAgICAgICAgaXNBcnJheSxcbiAgICAgICAgaXNSZXF1aXJlZFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUmVsYXRpb24oRHluYW1pY0RUTywgcmVsYXRpb24sIHJlbGF0aW9uRHRvLCBpc0FycmF5LCBpc1JlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRHluYW1pY0RUTztcbn1cblxuZnVuY3Rpb24gYWRkUmVsYXRpb24oXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSB7XG4gICAgdHlwZTogcmVsYXRpb25EdG8sXG4gICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgaXNBcnJheSxcbiAgfTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IHJlbGF0aW9uRHRvLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG4vKipcbiAqIEFkZHMgYSByZWxhdGlvbiBwcm9wZXJ0eSB0aGF0IHVzZXMgdGhlIFBLIHR5cGUgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mXG4gKiBhIGZ1bGwgRFRPIGNsYXNzLiBVc2VkIHRvIGJyZWFrIGNpcmN1bGFyIHJlZmVyZW5jZXMgKGUuZy4gQ3VzdG9tZXIg4oaSIE9yZGVyIOKGkiBDdXN0b21lcikuXG4gKi9cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uUGtSZWYoXG4gIER0b0NsYXNzOiBhbnksXG4gIHJlbGF0aW9uOiBzdHJpbmcsXG4gIHBrVHlwZU5hbWU6IHN0cmluZyxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgaXRlbXM6IHsgdHlwZTogcGtUeXBlTmFtZSB9LCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IHBrVHlwZU5hbWUgPT09IFwiaW50ZWdlclwiID8gTnVtYmVyIDogU3RyaW5nLCByZXF1aXJlZDogaXNSZXF1aXJlZCB9IGFzIGFueSk7XG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiAocGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcpLFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvblVwZGF0ZShcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICByZWxhdGlvbkR0bzogYW55LFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFNb2RlbHMgPVxuICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLCBEdG9DbGFzcykgfHwgW107XG4gIGlmICghZXh0cmFNb2RlbHMuaW5jbHVkZXMocmVsYXRpb25EdG8pKSB7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIERFQ09SQVRPUlMuQVBJX0VYVFJBX01PREVMUyxcbiAgICAgIFsuLi5leHRyYU1vZGVscywgcmVsYXRpb25EdG9dLFxuICAgICAgRHRvQ2xhc3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZHRvUmVmID0gYCMvY29tcG9uZW50cy9zY2hlbWFzLyR7cmVsYXRpb25EdG8ubmFtZX1gO1xuICBjb25zdCBwa1R5cGVOYW1lID0gZ2V0UGtPcGVuQXBpVHlwZShyZWxhdGlvblR5cGUpO1xuICBjb25zdCBvbmVPZkl0ZW1zID0gW3sgJHJlZjogZHRvUmVmIH0sIHsgdHlwZTogcGtUeXBlTmFtZSB9XTtcblxuICBjb25zdCBhcGlPcHRpb25zOiBQYXJhbWV0ZXJzPHR5cGVvZiBBcGlQcm9wZXJ0eT5bMF0gPSBpc0FycmF5XG4gICAgPyAoeyB0eXBlOiBcImFycmF5XCIsIHJlcXVpcmVkOiBpc1JlcXVpcmVkLCBvbmVPZjogb25lT2ZJdGVtcyB9IGFzIGFueSlcbiAgICA6ICh7IHR5cGU6IE9iamVjdCwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KTtcblxuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogT2JqZWN0LFxuICAgIER0b0NsYXNzLnByb3RvdHlwZSxcbiAgICByZWxhdGlvblxuICApO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbiwge1xuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gTW9kZWwucGtQcm9wcyhyZWxhdGlvblR5cGUgYXMgYW55KTtcbiAgICBjb25zdCBwa1R5cGUgPSBwa1Byb3BzTWV0YWRhdGE/LnR5cGU7XG4gICAgaWYgKHBrVHlwZSA9PT0gTnVtYmVyIHx8IHBrVHlwZSA9PT0gQmlnSW50KSByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcInN0cmluZ1wiO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogYm9vbGVhbiB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgaWYgKE1vZGVsLmdlbmVyYXRlZChjdXJyZW50LCBwcm9wIGFzIGFueSkpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBwcm9wOiBzdHJpbmdcbik6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHZhbGlkYXRpb24gPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKGN1cnJlbnQsIHByb3AgYXMgYW55KTtcbiAgICBpZiAodmFsaWRhdGlvbikgcmV0dXJuIHZhbGlkYXRpb24gYXMgYW55O1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LCBwcm9wOiBzdHJpbmcpOiBhbnkge1xuICBsZXQgY3VycmVudDogYW55ID0gbW9kZWw7XG4gIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnQgIT09IE9iamVjdCAmJiBjdXJyZW50ICE9PSBGdW5jdGlvbikge1xuICAgIGNvbnN0IHR5cGUgPSBNZXRhZGF0YS50eXBlKGN1cnJlbnQsIHByb3ApO1xuICAgIGlmICh0eXBlKSByZXR1cm4gdHlwZTtcbiAgICBjdXJyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldER0b0NhY2hlKFxuICBvcDogT3BlcmF0aW9uS2V5c1xuKTogV2Vha01hcDxDb25zdHJ1Y3Rvcjxhbnk+LCBDb25zdHJ1Y3Rvcjxhbnk+PiB7XG4gIGlmICghZHRvQ2FjaGUuaGFzKG9wKSkge1xuICAgIGR0b0NhY2hlLnNldChvcCwgbmV3IFdlYWtNYXAoKSk7XG4gIH1cbiAgcmV0dXJuIGR0b0NhY2hlLmdldChvcCkhO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuaW1wb3J0IHsgQWRhcHRlciwgQ29udGV4dE9mLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbihBZGFwdGVyIGFzIGFueSkudHJhbnNmb3JtZXJGb3IgPSBmdW5jdGlvbiB0b0NvbnRleHRGbGFnczxcbiAgQSBleHRlbmRzIEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pixcbj4oYWRhcHRlcjogQSB8IHN0cmluZyk6IENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxDb250ZXh0T2Y8QT4+PiB7XG4gIGNvbnN0IGFsaWFzID1cbiAgICB0eXBlb2YgYWRhcHRlciA9PT0gXCJzdHJpbmdcIiA/IGFkYXB0ZXIgOiAoYWRhcHRlci5hbGlhcyBhcyBzdHJpbmcpO1xuICByZXR1cm4gTWV0YWRhdGFbXCJpbm5lckdldFwiXShTeW1ib2wuZm9yKFwidHJhbnNmb3JtZXJzXCIpLCBhbGlhcyk7XG59LmJpbmQoQWRhcHRlcik7XG5cbihBZGFwdGVyIGFzIGFueSkuZmxhdm91cnNUb1RyYW5zZm9ybSA9IGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2Zvcm1lcnMoKTpcbiAgfCBzdHJpbmdbXVxuICB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1ldGEgPSBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIikpO1xuICBpZiAoIW1ldGEpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXRhKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKENvbnRleHQgYXMgYW55KS5wcm90b3R5cGUudG9SZXNwb25zZSA9IGZ1bmN0aW9uIHRvUmVzcG9uc2U8XG4gIFJFUyBleHRlbmRzIHsgaGVhZGVyOiBhbnkgfSxcbj4odGhpczogQ29udGV4dCwgcmVzOiBSRVMpOiBSRVMge1xuICBjb25zdCBwZW5kaW5nID0gdGhpcy5wZW5kaW5nKCk7XG4gIGlmIChwZW5kaW5nKSByZXMuaGVhZGVyKFwieC1wZW5kaW5nLXRhc2tcIiwgSlNPTi5zdHJpbmdpZnkocGVuZGluZykpO1xuICByZXR1cm4gcmVzO1xufTtcbiIsImltcG9ydCBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IE1vZGVsQnVpbGRlciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi4vZGVjYWYtbW9kZWwvZGVjb3JhdG9ycy9kZWNvcmF0b3JzXCI7XG5cbmRlY2xhcmUgbW9kdWxlIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCIge1xuICBleHBvcnQgaW50ZXJmYWNlIE1vZGVsQnVpbGRlcjxNPiB7XG4gICAgQXV0aChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gICAgZGVjb3JhdGVDbGFzcyhkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKTogTW9kZWxCdWlsZGVyPE0+O1xuICB9XG59XG5cbmNvbnN0IHByb3RvdHlwZSA9IE1vZGVsQnVpbGRlci5wcm90b3R5cGUgYXMgTW9kZWxCdWlsZGVyPGFueT4gJiB7XG4gIEF1dGg6IChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpID0+IE1vZGVsQnVpbGRlcjxhbnk+O1xufTtcblxuaWYgKCFwcm90b3R5cGUuZGVjb3JhdGVDbGFzcykge1xuICBwcm90b3R5cGUuZGVjb3JhdGVDbGFzcyA9IGZ1bmN0aW9uIChkZWNvcmF0b3I6IENsYXNzRGVjb3JhdG9yKSB7XG4gICAgaWYgKCEodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMpIHtcbiAgICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycyA9IFtdO1xuICAgIH1cbiAgICAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5wcm90b3R5cGUuQXV0aCA9IGZ1bmN0aW9uIChtb2RlbDogc3RyaW5nIHwgQ29uc3RydWN0b3IpIHtcbiAgcmV0dXJuIHRoaXMuZGVjb3JhdGVDbGFzcyhBdXRoKG1vZGVsKSk7XG59O1xuXG5pZiAoIShwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCkge1xuICBjb25zdCBvcmlnaW5hbEJ1aWxkID0gcHJvdG90eXBlLmJ1aWxkO1xuICBwcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG9yaWdpbmFsQnVpbGQuY2FsbCh0aGlzKTtcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzO1xuICAgIGlmIChkZWNvcmF0b3JzPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgICAgY29uc3QgZGVjb3JhdGVkID0gZGVjb3JhdG9yKHJlc3VsdCBhcyBhbnkpIGFzIHR5cGVvZiByZXN1bHQgfCB2b2lkO1xuICAgICAgICBpZiAoZGVjb3JhdGVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gZGVjb3JhdGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIChwcm90b3R5cGUgYXMgYW55KS5fX2hhc0NsYXNzRGVjb3JhdG9yU3VwcG9ydCA9IHRydWU7XG59XG4iLCJpbXBvcnQgeyBDb250cm9sbGVyLCBQYXJhbSwgUXVlcnksIFJlc3BvbnNlLCBTZXRNZXRhZGF0YSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpTm90Rm91bmRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG4gIEFwaVRhZ3MsXG4gIEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSxcbiAgZ2V0U2NoZW1hUGF0aCxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUGVyc2lzdGVuY2VLZXlzLFxuICBQcmVwYXJlZFN0YXRlbWVudEtleXMsXG4gIHR5cGUgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IExvZ2dpbmcsIHRvS2ViYWJDYXNlIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIERCS2V5cyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsLFxuICBBcGlQYXJhbXNGcm9tTW9kZWwsXG4gIHR5cGUgRGVjYWZBcGlQcm9wZXJ0eSxcbiAgRGVjYWZCb2R5LFxuICBEZWNhZlBhcmFtcyxcbiAgRGVjYWZRdWVyeSxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cFZlcmJUb0RlY29yYXRvciB9IGZyb20gXCIuL2RlY29yYXRvcnMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgREVDQUZfUk9VVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBTS0lQX01PREVMX1JPTEVTX0tFWSB9IGZyb20gXCIuLi9hdXRoL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aCwgUHVibGljLCBSZXF1aXJlUm9sZXMgfSBmcm9tIFwiLi4vYXV0aC9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyQ29uc3RydWN0b3IgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZNb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IER0b0ZvciB9IGZyb20gXCIuLi9mYWN0b3J5L29wZW5hcGkvRHRvQnVpbGRlclwiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQge1xuICBNb2RlbENvbnRyb2xsZXJGYWN0b3J5LFxuICB0eXBlIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcsXG4gIHR5cGUgQXV0aENvbmZpZyxcbiAgdHlwZSBTZXJ2ZXJSb3V0ZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIEZyb21Nb2RlbENvbnRyb2xsZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLm5hbWUpO1xuXG4gIHN0YXRpYyBnZXRQZXJzaXN0ZW5jZTxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8VD5cbiAgKTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBTZXJ2aWNlLmdldDxNb2RlbFNlcnZpY2U8VD4+KE1vZGVsQ2xhenopO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBNb2RlbFNlcnZpY2UuZ2V0U2VydmljZShNb2RlbENsYXp6KSBhcyBNb2RlbFNlcnZpY2U8VD47XG4gICAgICB9IGNhdGNoIChlMjogdW5rbm93bikge1xuICAgICAgICByZXR1cm4gUmVwb3NpdG9yeS5mb3JNb2RlbChNb2RlbENsYXp6KSBhcyBSZXBvPFQ+O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVRdWVyeVJvdXRlc0Zyb21SZXBvc2l0b3J5PFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgcGVyc2lzdGVuY2U6IFJlcG88VD4gfCBNb2RlbFNlcnZpY2U8VD4sXG4gICAgcHJlZml4OiBzdHJpbmcgPSBQZXJzaXN0ZW5jZUtleXMuUVVFUllcbiAgKTogQ29udHJvbGxlckNvbnN0cnVjdG9yPFQ+IHtcbiAgICBjb25zdCByZXBvOiBSZXBvPFQ+ID1cbiAgICAgIHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlID8gcGVyc2lzdGVuY2UucmVwbyA6IHBlcnNpc3RlbmNlO1xuICAgIGNvbnN0IE1vZGVsQ29uc3RyOiBDb25zdHJ1Y3RvciA9IHJlcG8uY2xhc3M7XG4gICAgY29uc3QgcXVlcnlNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCB7IGZpZWxkcz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH0+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcmVwby5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KFBlcnNpc3RlbmNlS2V5cy5RVUVSWSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjb25zdCByb3V0ZU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICBwZXJzaXN0ZW5jZS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNsYXNzIFF1ZXJ5Q29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LCBuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoY2xpZW50Q29udGV4dCwgbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgcGFyYW1zXSBvZiBPYmplY3QuZW50cmllcyhyb3V0ZU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCByb3V0ZVBhdGggPSBbcGFyYW1zLnBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIildXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQ6IHN0cmluZykgPT4gc2VnbWVudCAmJiBzZWdtZW50LnRyaW0oKSlcbiAgICAgICAgLmpvaW4oXCIvXCIpO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKFxuICAgICAgICBtZXRob2ROYW1lXG4gICAgICApIGFzIGFueTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIGhhbmRsZXJcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHBhcmFtcy5odHRwTWV0aG9kIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgcGFyYW1zLmh0dHBNZXRob2RcbiAgICAgICk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmFwcGx5RGVjb3JhdG9ycyhcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc11cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChcbiAgICAgICAgUXVlcnlDb250cm9sbGVyLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyXG4gICAgICApO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykocm91dGVQYXRoIHx8IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICBRdWVyeUNvbnRyb2xsZXIsXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIFtodHRwRGVjb3JhdG9yLCAuLi5kZWNvcmF0b3JzXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUXVlcnlDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZTxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8VD4sXG4gICAgbW9kdWxlQ29uZmlnT3ZlcnJpZGVzPzogUmVjb3JkPHN0cmluZywgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4sXG4gICAgZ2xvYmFsRGVmYXVsdHM/OiBQYXJ0aWFsPE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+XG4gICk6IENvbnRyb2xsZXJDb25zdHJ1Y3RvcjxUPiB7XG4gICAgY29uc3QgbG9nID0gRnJvbU1vZGVsQ29udHJvbGxlci5sb2cuZm9yKEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBNb2RlbC50YWJsZU5hbWUoTW9kZWxDb25zdHIpO1xuICAgIGNvbnN0IHJvdXRlUGF0aCA9IHRvS2ViYWJDYXNlKHRhYmxlTmFtZSk7XG4gICAgY29uc3QgbW9kZWxDbGF6ek5hbWUgPSBNb2RlbENvbnN0ci5uYW1lO1xuICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRQZXJzaXN0ZW5jZShNb2RlbENvbnN0cik7XG5cbiAgICAvLyBXaGVuIHBlcnNpc3RlbmNlIGlzIGEgTW9kZWxTZXJ2aWNlLCB0aGUgQHF1ZXJ5L0Byb3V0ZSBtZXRhZGF0YSBsaXZlcyBvblxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIHJlcG9zaXRvcnkgY2xhc3MgKGN1c3RvbSByZXBvKSwgbm90IG9uIE1vZGVsU2VydmljZSBpdHNlbGYuXG4gICAgLy8gUGFzcyB0aGUgcmVwbyB0byB0aGUgZmFjdG9yeSBzbyBhZGRDb21wbGV4UXVlcmllcygpIGNhbiBkaXNjb3ZlciB0aGVtLlxuICAgIGNvbnN0IGZhY3RvcnlQZXJzaXN0ZW5jZSA9XG4gICAgICBwZXJzaXN0ZW5jZSBpbnN0YW5jZW9mIE1vZGVsU2VydmljZSA/IHBlcnNpc3RlbmNlLnJlcG8gOiBwZXJzaXN0ZW5jZTtcblxuICAgIGNvbnN0IGRlY29yYXRvckNvbmZpZyA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX0NPTlRST0xMRVJfQ09ORklHKVxuICAgICkgYXMgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBtb2R1bGVPdmVycmlkZSA9IG1vZHVsZUNvbmZpZ092ZXJyaWRlcz8uW01vZGVsQ29uc3RyLm5hbWVdO1xuICAgIGNvbnN0IG1lcmdlZENvbmZpZzogTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyA9IHtcbiAgICAgIC4uLihnbG9iYWxEZWZhdWx0cyB8fCB7fSksXG4gICAgICAuLi4oZGVjb3JhdG9yQ29uZmlnIHx8IHt9KSxcbiAgICAgIC4uLihtb2R1bGVPdmVycmlkZSB8fCB7fSksXG4gICAgfTtcblxuICAgIGNvbnN0IEZhY3RvcnlDb250cm9sbGVyID0gTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGU8VD4oXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIGZhY3RvcnlQZXJzaXN0ZW5jZSxcbiAgICAgIG1lcmdlZENvbmZpZ1xuICAgICk7XG4gICAgY29uc3QgZmFjdG9yeVJvdXRlcyA9IChGYWN0b3J5Q29udHJvbGxlciBhcyBhbnkpLl9fcm91dGVzX18gYXNcbiAgICAgIHwgU2VydmVyUm91dGVbXVxuICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB7IGdldFBLLCBhcGlQcm9wZXJ0aWVzLCBwYXRoOiBwa1BhdGggfSA9XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudClcbiAgICAgICAgICByZXR1cm4gYVBhcmFtQ291bnQgLSBiUGFyYW1Db3VudDtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KTtcbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IEZyb21Nb2RlbENvbnRyb2xsZXIubWF0Y2hSb3V0ZShcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBmYWN0b3J5UGVyc2lzdGVuY2VcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWdpc3RyYXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH0gPVxuICAgICAgICAgIHJlZ2lzdHJhdGlvbjtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoXG4gICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXJcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZGVzY3JpcHRvcikge1xuICAgICAgICAgIGNvbnN0IGh0dHBEZWNvcmF0b3IgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKHJvdXRlLm1ldGhvZCBhcyBIdHRwVmVyYnMpKFxuICAgICAgICAgICAgcm91dGUucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKSB8fCB1bmRlZmluZWRcbiAgICAgICAgICApO1xuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFxuICAgICAgICAgICAgRHluYW1pY01vZGVsQ29udHJvbGxlcixcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc10sXG4gICAgICAgICAgICBwYXJhbURlY29yYXRvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgYXMgYW55O1xuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdO1xuICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoTW9kZWxDbGF6eikgYXMga2V5b2YgTW9kZWw8YW55PjtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ2xhenosXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLkNPTVBPU0VELCBwaylcbiAgICApO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5cyA9IGNvbXBvc2VkPy5hcmdzID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9XG4gICAgICBBcnJheS5pc0FycmF5KGNvbXBvc2VkS2V5cykgJiYgY29tcG9zZWRLZXlzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmNvbXBvc2VkS2V5c10pKVxuICAgICAgICA6IEFycmF5LmZyb20obmV3IFNldChbcGtdKSk7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenopID8/IFwiXCI7XG4gICAgY29uc3QgcGF0aCA9IGA6JHt1bmlxdWVLZXlzLmpvaW4oXCIvOlwiKX1gO1xuICAgIGNvbnN0IGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSA9IHVuaXF1ZUtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgZGVzY3JpcHRpb246IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenosIGtleSksXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT5cbiAgICAgICAgY29tcG9zZWQ/LnNlcGFyYXRvciA/IHBhcmFtcy5qb2luKGNvbXBvc2VkLnNlcGFyYXRvcikgOiBwYXJhbXMuam9pbihcIlwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmaW5lTWV0aG9kKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiAoLi4uYXJnczogYW55W10pID0+IGFueVxuICApOiBQcm9wZXJ0eURlc2NyaXB0b3IgfCB1bmRlZmluZWQge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgIHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LFxuICAgICAgbWV0aG9kTmFtZSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IGhhbmRsZXIsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdXG4gICkge1xuICAgIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBtZXRob2ROYW1lKTtcbiAgICBtZXRob2REZWNvcmF0b3JzLmZvckVhY2goKGQpID0+IGQocHJvdG8sIG1ldGhvZE5hbWUsIGRlc2NyaXB0b3IpKTtcbiAgICBwYXJhbURlY29yYXRvcnMuZm9yRWFjaCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+XG4gICAgICBkZWNvcmF0b3IocHJvdG8sIG1ldGhvZE5hbWUsIGluZGV4KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBtYXRjaFJvdXRlKFxuICAgIHJvdXRlOiBTZXJ2ZXJSb3V0ZSxcbiAgICBwa1BhdGg6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBlcnNpc3RlbmNlPzogYW55XG4gICk6IHtcbiAgICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPjtcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT47XG4gIH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgbWV0aG9kLCBwYXRoIH0gPSByb3V0ZTtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBPU1RcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNyZWF0ZUhhbmRsZXIoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDcmVhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImNyZWF0ZUFsbFwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJHRVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJyZWFkQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrUmVhZERlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtVcGRhdGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcyksXG4gICAgICAgIFt7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiZGVsZXRlQWxsXCIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtEZWxldGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcyksXG4gICAgICAgIFt7IGRlY29yYXRvcjogUXVlcnkoXCJpZHNcIikgYXMgYW55LCBpbmRleDogMCB9LCB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWFkSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJlYWREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgW3sgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhhcGlQcm9wZXJ0aWVzKSBhcyBhbnksIGluZGV4OiAwIH1dXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInVwZGF0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVVwZGF0ZUhhbmRsZXIoZ2V0UEssIE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGFwaVByb3BlcnRpZXMsIHBrUGF0aCksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoYXBpUHJvcGVydGllcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiREVMRVRFXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZURlbGV0ZUhhbmRsZXIoZ2V0UEssIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSwgYXBpUHJvcGVydGllcywgcGtQYXRoKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlBhcmFtcyhhcGlQcm9wZXJ0aWVzKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbXBvc2VkIFBLIGZhbGxiYWNrIHJvdXRlcyAoZmlsdGVyRW1wdHkpIOKAlCBwYXRoIGRpZmZlcnMgZnJvbSBwa1BhdGhcbiAgICBjb25zdCBmYWxsYmFja1NlZ21lbnRzID0gbm9ybWFsaXplZFBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBpc0FsbFBhcmFtcyA9IGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJiBmYWxsYmFja1NlZ21lbnRzLmV2ZXJ5KChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBpZiAoaXNBbGxQYXJhbXMgJiYgbm9ybWFsaXplZFBhdGggIT09IHBrUGF0aCkge1xuICAgICAgY29uc3QgZmFsbGJhY2tBcGlQcm9wcyA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXJgLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgfSkpO1xuICAgICAgY29uc3Qgc3VmZml4ID0gZmFsbGJhY2tTZWdtZW50cy5tYXAoKHMpID0+IHMuc2xpY2UoMSkpLmpvaW4oXCJBbmRcIik7XG4gICAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgcmVhZEJ5JHtzdWZmaXh9YCxcbiAgICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlYWRIYW5kbGVyKGdldFBLLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbeyBkZWNvcmF0b3I6IERlY2FmUGFyYW1zKGZhbGxiYWNrQXBpUHJvcHMpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRob2QgPT09IFwiUFVUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGB1cGRhdGVCeSR7c3VmZml4fWAsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVVcGRhdGVIYW5kbGVyKGdldFBLLCBNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoZmFsbGJhY2tBcGlQcm9wcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDIgfSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgZGVsZXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlRGVsZXRlSGFuZGxlcihnZXRQSywgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuZGVsZXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIGZhbGxiYWNrQXBpUHJvcHMsIG5vcm1hbGl6ZWRQYXRoKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZQYXJhbXMoZmFsbGJhY2tBcGlQcm9wcykgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVTdGF0ZW1lbnRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlU3RhdGVtZW50U2hvcnRjdXRIYW5kbGVyKHN0YXRlbWVudEtleSwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUsIG5vcm1hbGl6ZWRQYXRoLCBzdGF0ZW1lbnRLZXkpLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXnF1ZXJ5XFwvLywgXCJcIikuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKHF1ZXJ5TWV0aG9kKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMocXVlcnlNZXRob2QsIG5vcm1hbGl6ZWRQYXRoLCBcIkdFVFwiLCB0cnVlKSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jb21wbGV4UXVlcnlQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBjdXN0b20gQHJvdXRlKCkgcGF0aHMgKGUuZy4gXCJtZXRhZGF0YS9mb3ItcHJvZHVjdC86cHJvZHVjdENvZGVcIilcbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIiwgXCJmaW5kQnlcIiwgXCJmaW5kQnlQYWdpbmF0ZVwiLCBcImZpbmRPbmVCeVwiLCBcInBhZ2luYXRlQnlcIixcbiAgICAgIFwiZmluZFwiLCBcInBhZ2VcIiwgXCJjb3VudE9mXCIsIFwibWF4T2ZcIiwgXCJtaW5PZlwiLCBcImF2Z09mXCIsIFwic3VtT2ZcIixcbiAgICAgIFwiZGlzdGluY3RPZlwiLCBcImdyb3VwT2ZcIiwgXCJzdGF0ZW1lbnRcIiwgXCJidWxrXCIsIFwicXVlcnlcIixcbiAgICBdKTtcbiAgICBpZiAoXG4gICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikgJiZcbiAgICAgICFrbm93blByZWZpeGVzLmhhcyhwYXRoU2VnbWVudHNbMF0pXG4gICAgKSB7XG4gICAgICAvLyBMb29rIHVwIHRoZSBhY3R1YWwgbWV0aG9kIG5hbWUgZnJvbSBAcm91dGUgbWV0YWRhdGEgYnkgbWF0Y2hpbmcgdGhlIHBhdGguXG4gICAgICAvLyBUaGUgQHJvdXRlIGRlY29yYXRvciBzdG9yZXMgeyBwYXRoLCBodHRwTWV0aG9kLCBoYW5kbGVyIH0ga2V5ZWQgYnkgbWV0aG9kIG5hbWVcbiAgICAgIC8vIG9uIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yLlxuICAgICAgY29uc3Qgcm91dGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9XG4gICAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgICAocGVyc2lzdGVuY2UgYXMgYW55KT8uY29uc3RydWN0b3IsXG4gICAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgICApID8/IHt9O1xuICAgICAgY29uc3QgbWF0Y2hlZEVudHJ5ID0gT2JqZWN0LmVudHJpZXMocm91dGVNZXRhZGF0YSkuZmluZChcbiAgICAgICAgKFssIGluZm9dKSA9PlxuICAgICAgICAgIGluZm8gJiZcbiAgICAgICAgICB0eXBlb2YgaW5mbyA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgIGluZm8ucGF0aD8ucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIikgPT09IG5vcm1hbGl6ZWRQYXRoXG4gICAgICApO1xuICAgICAgY29uc3QgYWN0dWFsTWV0aG9kTmFtZSA9IG1hdGNoZWRFbnRyeT8uWzBdIHx8IHBhdGhTZWdtZW50c1swXTtcblxuICAgICAgY29uc3QgcGFyYW1TZWdtZW50cyA9IHBhdGhTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IHBhcmFtU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtuYW1lfSBwYXJhbWV0ZXIgZm9yIHRoZSBxdWVyeWAsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9KSk7XG5cbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgYWN0dWFsTWV0aG9kTmFtZSxcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIoYWN0dWFsTWV0aG9kTmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSByZWNvcmRzIHVzaW5nIFwiJHthY3R1YWxNZXRob2ROYW1lfVwiLmAgfSksXG4gICAgICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiIH0pLFxuICAgICAgICBdLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmNvbXBsZXhRdWVyeVBhcmFtcyhub3JtYWxpemVkUGF0aClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICBtZXRob2ROYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gICAgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPixcbiAgICBwYXJhbURlY29yYXRvcnM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT5cbiAgKSB7XG4gICAgcmV0dXJuIHsgbWV0aG9kTmFtZSwgaGFuZGxlciwgZGVjb3JhdG9ycywgcGFyYW1EZWNvcmF0b3JzIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRNZXRob2ROYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlyc3RTZWdtZW50ID0gcGF0aC5zcGxpdChcIi9cIilbMF07XG4gICAgcmV0dXJuIGZpcnN0U2VnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb21wbGV4UXVlcnlQYXJhbXMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBjb25zdCBwYXJhbXM6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4gPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcsIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogUGFyYW0obmFtZSkgYXMgYW55LCBpbmRleDogaSB9KTtcbiAgICB9KTtcbiAgICBpZiAocGF0aC5zdGFydHNXaXRoKFwicXVlcnkvXCIpKSB7XG4gICAgICBwYXJhbXMucHVzaCh7IGRlY29yYXRvcjogRGVjYWZRdWVyeSgpIGFzIGFueSwgaW5kZXg6IHNlZ21lbnRzLmxlbmd0aCB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNyZWF0ZUhhbmRsZXIoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjcmVhdGUoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBkYXRhOiBhbnksXG4gICAgICByZXNwPzogYW55XG4gICAgKTogUHJvbWlzZTxNb2RlbDxhbnk+PiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkNSRUFURSwgdHJ1ZSlcbiAgICAgICkuZm9yKGNyZWF0ZSk7XG4gICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBsZXQgY3JlYXRlZDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmNyZWF0ZShkYXRhLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa0NyZWF0ZUhhbmRsZXIoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjcmVhdGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBkYXRhOiBhbnlbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IoY3JlYXRlQWxsKTtcbiAgICAgIGxvZy52ZXJib3NlKGBjcmVhdGluZyBuZXcgJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgIGxldCBjcmVhdGVkOiBhbnlbXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNyZWF0ZWQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuY3JlYXRlQWxsKFxuICAgICAgICAgIGRhdGEubWFwKChkKSA9PiBuZXcgTW9kZWxDb25zdHIoZCkpLFxuICAgICAgICAgIGN0eFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgY3JlYXRlZCBuZXcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAkeyhjcmVhdGVkIGFzIGFueSlbdGhpcy5wa119YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1JlYWRIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZEFsbChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIGlkczogc3RyaW5nW11cbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5SRUFEX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlYWRBbGwpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkcyA9IEFycmF5LmlzQXJyYXkoaWRzKSA/IGlkcyA6IFtpZHNdO1xuICAgICAgbGV0IHJlYWQ6IE1vZGVsW107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHtub3JtYWxpemVkSWRzfSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLnJlYWRBbGwobm9ybWFsaXplZElkcyBhcyBhbnksIGN0eCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHJlYWQgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGByZWFkICR7cmVhZC5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICByZXR1cm4gcmVhZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlQnVsa1VwZGF0ZUhhbmRsZXIobW9kZWxDbGF6ek5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiB1cGRhdGVBbGwoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICBib2R5OiBhbnlbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgdHJ1ZSlcbiAgICAgICkuZm9yKHVwZGF0ZUFsbCk7XG4gICAgICBsZXQgdXBkYXRlZDogYW55W107XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHtib2R5Lmxlbmd0aH0gJHttb2RlbENsYXp6TmFtZX1gKTtcbiAgICAgICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS51cGRhdGVBbGwoYm9keSwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUJ1bGtEZWxldGVIYW5kbGVyKG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWxsKFxuICAgICAgdGhpczogYW55LFxuICAgICAgaWRzOiBzdHJpbmdbXSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsW10+IHtcbiAgICAgIGNvbnN0IHsgY3R4LCBsb2cgfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cy5ERUxFVEVfQUxMLCB0cnVlKVxuICAgICAgKS5mb3IoZGVsZXRlQWxsKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZHMgPSBBcnJheS5pc0FycmF5KGlkcykgPyBpZHMgOiBbaWRzXTtcbiAgICAgIGxldCByZWFkOiBNb2RlbFtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nLmRlYnVnKGBkZWxldGluZyAke25vcm1hbGl6ZWRJZHMubGVuZ3RofSAke21vZGVsQ2xhenpOYW1lfWApO1xuICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmRlbGV0ZUFsbChub3JtYWxpemVkSWRzLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKGBkZWxldGVkICR7cmVhZC5sZW5ndGh9ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICBpZiAocmVzcCkgY3R4LnRvUmVzcG9uc2UocmVzcCk7XG4gICAgICByZXR1cm4gcmVhZDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlUmVhZEhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVhZChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIHJvdXRlUGFyYW1zOiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLlJFQUQsIHRydWUpXG4gICAgICApLmZvcihyZWFkKTtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UEsoLi4ucm91dGVQYXJhbXMudmFsdWVzSW5PcmRlcik7XG4gICAgICBpZiAodHlwZW9mIGlkID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBObyAke3RoaXMucGt9IHByb3ZpZGVkYCk7XG4gICAgICBsZXQgcmVhZFJlc3VsdDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYHJlYWRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGt9ICR7aWR9YCk7XG4gICAgICAgIHJlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkucmVhZChpZCwgY3R4KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCwgZSBhcyBFcnJvcik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhgcmVhZCAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7KHJlYWRSZXN1bHQgYXMgYW55KVt0aGlzLnBrXX1gKTtcbiAgICAgIHJldHVybiByZWFkUmVzdWx0O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVVcGRhdGVIYW5kbGVyKFxuICAgIGdldFBLOiAoLi4ucDogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT4gc3RyaW5nLFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gdXBkYXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIGJvZHk6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgeyBjdHgsIGxvZyB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgT3BlcmF0aW9uS2V5cy5VUERBVEUsIHRydWUpXG4gICAgICApLmZvcih1cGRhdGUpO1xuICAgICAgY29uc3QgaWQgPSBnZXRQSyguLi5yb3V0ZVBhcmFtcy52YWx1ZXNJbk9yZGVyKTtcbiAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYE5vICR7dGhpcy5wa30gcHJvdmlkZWRgKTtcbiAgICAgIGxldCB1cGRhdGVkOiBhbnk7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuaW5mbyhgdXBkYXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGt9ICR7aWR9YCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGJvZHkpKTtcbiAgICAgICAgdXBkYXRlZCA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UoY3R4KS51cGRhdGUoXG4gICAgICAgICAgbmV3IE1vZGVsQ29uc3RyKHsgLi4ucGF5bG9hZCwgW3RoaXMucGtdOiBpZCB9KSxcbiAgICAgICAgICBjdHhcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZURlbGV0ZUhhbmRsZXIoXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgcm91dGVQYXJhbXM6IGFueSxcbiAgICAgIHJlc3A/OiBhbnlcbiAgICApOiBQcm9taXNlPE1vZGVsPiB7XG4gICAgICBjb25zdCB7IGN0eCwgbG9nIH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBPcGVyYXRpb25LZXlzLkRFTEVURSwgdHJ1ZSlcbiAgICAgICkuZm9yKHJlbW92ZSk7XG4gICAgICBjb25zdCBpZCA9IGdldFBLKC4uLnJvdXRlUGFyYW1zLnZhbHVlc0luT3JkZXIpO1xuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgTm8gJHt0aGlzLnBrfSBwcm92aWRlZGApO1xuICAgICAgbGV0IGRlbDogTW9kZWw7XG4gICAgICB0cnkge1xuICAgICAgICBsb2cuZGVidWcoYGRlbGV0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHt0aGlzLnBrfSAke2lkfWApO1xuICAgICAgICBkZWwgPSBhd2FpdCB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuZGVsZXRlKGlkLCBjdHgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBkZWxldGUgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWAsIGUgYXMgRXJyb3IpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke2lkfWApO1xuICAgICAgaWYgKHJlc3ApIGN0eC50b1Jlc3BvbnNlKHJlc3ApO1xuICAgICAgcmV0dXJuIGRlbDtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlYXRlU3RhdGVtZW50SGFuZGxlcihtb2RlbENsYXp6TmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHN0YXRlbWVudChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgIGFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICBkZXRhaWxzOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICBhd2FpdCB0aGlzLmxvZ0N0eChbXSwgUGVyc2lzdGVuY2VLZXlzLlNUQVRFTUVOVCwgdHJ1ZSlcbiAgICAgICkuZm9yKHN0YXRlbWVudCk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgb2Zmc2V0LCBsaW1pdCwgYm9va21hcmsgfSA9IGRldGFpbHM7XG4gICAgICBhcmdzID0gYXJncy5tYXAoXG4gICAgICAgIChhKSA9PiAodHlwZW9mIGEgPT09IFwic3RyaW5nXCIgPyBwYXJzZUludChhIGFzIHN0cmluZykgOiBhKSB8fCBhXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgcGF0aERpcmVjdGlvbiA9IGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvbHZlZERpcmVjdGlvbiA9IChkaXJlY3Rpb24gPz8gcGF0aERpcmVjdGlvbikgYXNcbiAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAocmVzb2x2ZWREaXJlY3Rpb24gJiYgYXJncy5sZW5ndGggPiAxKSBhcmdzWzFdID0gcmVzb2x2ZWREaXJlY3Rpb247XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORDpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9CWTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWTpcbiAgICAgICAgICBhcmdzLnB1c2goZGlyZWN0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0U6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6XG4gICAgICAgICAgYXJncyA9IFtcbiAgICAgICAgICAgIGFyZ3NbMF0sXG4gICAgICAgICAgICByZXNvbHZlZERpcmVjdGlvbiBhcyBhbnksXG4gICAgICAgICAgICB7IGxpbWl0LCBvZmZzZXQsIGJvb2ttYXJrIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORF9PTkVfQlk6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLk1JTl9PRjpcbiAgICAgICAgY2FzZSBQcmVwYXJlZFN0YXRlbWVudEtleXMuQVZHX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0Y6XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GOlxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5HUk9VUF9PRjpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eCkuc3RhdGVtZW50KG5hbWUsIC4uLmFyZ3MsIGN0eCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZVN0YXRlbWVudFNob3J0Y3V0SGFuZGxlcihcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZyxcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICkge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBzdGF0ZW1lbnRTaG9ydGN1dChcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IHsgY3R4IH0gPSAoXG4gICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBzdGF0ZW1lbnRLZXksIHRydWUpXG4gICAgICApLmZvcihzdGF0ZW1lbnRTaG9ydGN1dCk7XG5cbiAgICAgIHN3aXRjaCAoc3RhdGVtZW50S2V5KSB7XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5saXN0QnkoXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAoZGV0YWlscyBhcyBhbnkpPy5kaXJlY3Rpb24gYXMgT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0VfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCBwYWdlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5wYWdpbmF0ZUJ5KFxuICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uIGFzIE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsaW1pdDogKGRldGFpbHMgYXMgYW55KT8ubGltaXQsXG4gICAgICAgICAgICAgIG9mZnNldDogKGRldGFpbHMgYXMgYW55KT8ub2Zmc2V0LFxuICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICBjdHhcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQ6IHtcbiAgICAgICAgICBjb25zdCBbdmFsdWUsIGRldGFpbHNdID0gYXJncztcbiAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgKGRldGFpbHMgYXMgYW55KT8uZGlyZWN0aW9uID8/IE9yZGVyRGlyZWN0aW9uLkFTQztcbiAgICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLmZpbmQgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5maW5kKHZhbHVlLCBkaXJlY3Rpb24sIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuRklORCwgdmFsdWUsIGRpcmVjdGlvbiwgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFOiB7XG4gICAgICAgICAgY29uc3QgW3ZhbHVlLCBkZXRhaWxzXSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3QgcmVmID0ge1xuICAgICAgICAgICAgb2Zmc2V0OiAoZGV0YWlscyBhcyBhbnkpPy5vZmZzZXQgPz8gMSxcbiAgICAgICAgICAgIGxpbWl0OiAoZGV0YWlscyBhcyBhbnkpPy5saW1pdCA/PyAxMCxcbiAgICAgICAgICAgIGJvb2ttYXJrOiAoZGV0YWlscyBhcyBhbnkpPy5ib29rbWFyayxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHBlcnNpc3RlbmNlID0gdGhpcy5wZXJzaXN0ZW5jZShjdHgpO1xuICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IChkZXRhaWxzIGFzIGFueSk/LmRpcmVjdGlvbiA/PyBPcmRlckRpcmVjdGlvbi5BU0M7XG4gICAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5wYWdlID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucGFnZSh2YWx1ZSwgZGlyZWN0aW9uLCByZWYsIGN0eCk7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRSwgdmFsdWUsIGRpcmVjdGlvbiwgcmVmLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZOiB7XG4gICAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gYXJncztcbiAgICAgICAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZShjdHgpLmZpbmRPbmVCeShrZXksIHZhbHVlLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlk6IHtcbiAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBhcmdzO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlKGN0eClcbiAgICAgICAgICAgIC5mb3IoY3R4LnRvT3ZlcnJpZGVzKCkpXG4gICAgICAgICAgICAuZmluZEJ5KGtleSwgdmFsdWUsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YgfHxcbiAgICAgICAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GIHx8XG4gICAgICAgICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRiB8fFxuICAgICAgICAgICAgc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuR1JPVVBfT0ZcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IFtmaWVsZF0gPSBhcmdzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UoY3R4KS5zdGF0ZW1lbnQoc3RhdGVtZW50S2V5LCBmaWVsZCwgY3R4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHN0YXRlbWVudDogJHtzdGF0ZW1lbnRLZXl9YCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGNvbXBsZXhRdWVyeShcbiAgICAgIHRoaXM6IGFueSxcbiAgICAgIC4uLmFyZ3M6IGFueVtdXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IGxvZzogYW55ID0gdGhpcy5sb2c/LmZvcj8uKGNvbXBsZXhRdWVyeSk7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZGVidWcoYEludm9raW5nIGN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cImApO1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gKFxuICAgICAgICAgIGF3YWl0IHRoaXMubG9nQ3R4KFtdLCBtZXRob2ROYW1lLCB0cnVlKVxuICAgICAgICApLmZvcihjb21wbGV4UXVlcnkpO1xuICAgICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgICAgY29uc3Qgc3ByZWFkQXJncyA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZXh0cmFjdFF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdKC4uLnNwcmVhZEFyZ3MsIGN0eCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGlmIChsb2cpIGxvZy5lcnJvcihgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGAsIGUpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIobWV0aG9kTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGN1c3RvbVJvdXRlKFxuICAgICAgdGhpczogYW55LFxuICAgICAgLi4uYXJnczogYW55W11cbiAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgY29uc3QgbG9nOiBhbnkgPSB0aGlzLmxvZz8uZm9yPy4oY3VzdG9tUm91dGUpO1xuICAgICAgY29uc3QgeyBjdHggfSA9IChcbiAgICAgICAgYXdhaXQgdGhpcy5sb2dDdHgoW10sIG1ldGhvZE5hbWUsIHRydWUpXG4gICAgICApLmZvcihjdXN0b21Sb3V0ZSk7XG4gICAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IHRoaXMucGVyc2lzdGVuY2UoY3R4KTtcbiAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLmV4dHJhY3RRdWVyeUFyZ3MoYXJncyk7XG5cbiAgICAgIC8vIFRyeSB0aGUgcGVyc2lzdGVuY2UgZGlyZWN0bHkgKHdvcmtzIHdoZW4gaXQncyBhIGN1c3RvbSBSZXBvc2l0b3J5KVxuICAgICAgaWYgKHR5cGVvZiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZVttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgfVxuICAgICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIG1ldGhvZCBsaXZlcyBvbiB0aGUgdW5kZXJseWluZyByZXBvXG4gICAgICBpZiAocGVyc2lzdGVuY2U/LnJlcG8gJiYgdHlwZW9mIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgfVxuICAgICAgLy8gRmFsbCBiYWNrIHRvIHN0YXRlbWVudCBnYXRld2F5XG4gICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5zdGF0ZW1lbnQobWV0aG9kTmFtZSwgLi4uc3ByZWFkQXJncywgY3R4KTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9IG9yIGl0cyByZXBvYFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKFxuICAgICAgbGFzdCAmJlxuICAgICAgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KGxhc3QpXG4gICAgKSB7XG4gICAgICBjb25zdCBxdWVyeU9iaiA9IGFyZ3MucG9wKCk7XG4gICAgICBjb25zdCBoYXNEaXJlY3Rpb24gPSBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0xpbWl0ID0gcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc09mZnNldCA9IHF1ZXJ5T2JqLm9mZnNldCAhPT0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCFoYXNEaXJlY3Rpb24gJiYgIWhhc0xpbWl0ICYmICFoYXNPZmZzZXQpIHJldHVybiBhcmdzO1xuICAgICAgY29uc3QgZXh0cmFzOiBhbnlbXSA9IFtdO1xuICAgICAgaWYgKGhhc0RpcmVjdGlvbikgZXh0cmFzLnB1c2gocXVlcnlPYmouZGlyZWN0aW9uKTtcbiAgICAgIGVsc2UgaWYgKGhhc0xpbWl0IHx8IGhhc09mZnNldCkgZXh0cmFzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgIGlmIChoYXNMaW1pdCkgZXh0cmFzLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgICAgaWYgKGhhc09mZnNldCkgZXh0cmFzLnB1c2gocXVlcnlPYmoub2Zmc2V0KTtcbiAgICAgIHJldHVybiBbLi4uYXJncywgLi4uZXh0cmFzXTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZ3M7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oeyBuYW1lOiBcIm1ldGhvZFwiLCBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIiB9KSxcbiAgICAgIEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJhcmdzXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImNvbmNhdGVuYXRlZCBsaXN0IG9mIGFyZ3VtZW50cyB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhbiBhY2NlcHRcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImRpcmVjdGlvblwiLFxuICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IHRydWUsIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIiB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGxpc3RlZCBmb3VuZC5gIH0pLFxuICAgICAgQXBpTm90Rm91bmRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTm8gJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIG1hdGNoZXMgdGhlIHByb3ZpZGVkIGlkZW50aWZpZXIuYCxcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnRLZXk6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICBjb25zdCBiYXNlOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+ID0gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwYXRoKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBSZXRyaWV2ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHsgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAgfSksXG4gICAgXTtcblxuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKChzZWcpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBzZWcucmVwbGFjZShcIjpcIiwgXCJcIik7XG4gICAgICBiYXNlLnB1c2goQXBpUGFyYW0oeyBuYW1lLCBkZXNjcmlwdGlvbjogYFRoZSAke25hbWV9IHBhcmFtZXRlcmAgfSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwibGlzdEJ5L1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnaW5hdGVCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImZpbmQvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKVxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlclwiLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcInBhZ2UvXCIpKSB7XG4gICAgICBiYXNlLnB1c2goXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJsaW1pdFwiLCByZXF1aXJlZDogZmFsc2UsIGRlc2NyaXB0aW9uOiBcInBhZ2Ugc2l6ZVwiIH0pLFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwib2Zmc2V0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwicGFnZSBudW1iZXJcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImJvb2ttYXJrXCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwiYm9va21hcmsgZm9yIGN1cnNvciBwYWdpbmF0aW9uXCIgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCwgdHlwZTogTnVtYmVyIH0pKTtcbiAgICB9XG4gICAgaWYgKHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GKSB7XG4gICAgICBiYXNlLnB1c2goQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgRGlzdGluY3QgdmFsdWVzIGZvciAke21vZGVsQ2xhenpOYW1lfS5gLCB0eXBlOiBbU3RyaW5nXSB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRRdWVyeURlY29yYXRvcnMoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlUGF0aDogc3RyaW5nLFxuICAgIGh0dHBWZXJiOiBzdHJpbmcsXG4gICAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2VcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgY29uc3QgZXh0cmFjdFBhdGhQYXJhbXMgPSAocDogc3RyaW5nKTogc3RyaW5nW10gPT5cbiAgICAgIHAuc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSkubWFwKChzKSA9PiBzLnNsaWNlKDEpKTtcblxuICAgIGNvbnN0IGFwaVBhdGhQYXJhbXMgPSBleHRyYWN0UGF0aFBhcmFtcyhyb3V0ZVBhdGgpLm1hcCgobmFtZSkgPT4gKHtcbiAgICAgIG5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB0eXBlOiBTdHJpbmcsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yczogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiA9IFtcbiAgICAgIC4uLmFwaVBhdGhQYXJhbXMubWFwKChwKSA9PiBBcGlQYXJhbShwKSksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlJlc3VsdCBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLlwiIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImxpbWl0XCIsIHJlcXVpcmVkOiBmYWxzZSwgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIgfSksXG4gICAgICAgIEFwaVF1ZXJ5KHsgbmFtZTogXCJvZmZzZXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJvZmZzZXQgb3IgYm9va21hcmtcIiB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgTW9kdWxlLCBQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBGcm9tTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4vRnJvbU1vZGVsQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxlRm9yKGZsYXZvdXI6IHN0cmluZykge1xuICBATW9kdWxlKHt9KVxuICBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZNb2RlbE1vZHVsZS5uYW1lKS5mb3IoZmxhdm91cik7XG5cbiAgICBzdGF0aWMgY3JlYXRlTW9kZWxTZXJ2aWNlczxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICAgICAgbW9kZWxzOiBNb2RlbENvbnN0cnVjdG9yPFQ+W11cbiAgICApOiBQcm92aWRlcltdIHtcbiAgICAgIHJldHVybiBtb2RlbHMubWFwKChtb2RlbCkgPT4gKHtcbiAgICAgICAgcHJvdmlkZTogYCR7bW9kZWwubmFtZX1TZXJ2aWNlYCxcbiAgICAgICAgdXNlRmFjdG9yeTogKCkgPT4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzRXhwb3NlZChcbiAgICAgIG1vZGVsOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgICBleHBvc3VyZT86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCBzdHJpbmdbXT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gZXhwb3N1cmU/Llttb2RlbC5uYW1lXTtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgdHlwZW9mIG92ZXJyaWRlICE9PSBcInVuZGVmaW5lZFwiXG4gICAgICAgICAgPyBvdmVycmlkZVxuICAgICAgICAgIDogTWV0YWRhdGEuZ2V0KG1vZGVsLCBNZXRhZGF0YS5rZXkoREVDQUZfRVhQT1NFKSk7XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmluY2x1ZGVzKGZsYXZvdXIpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN0YXRpYyBmb3JSb290KFxuICAgICAgZmxhdm91cjogc3RyaW5nLFxuICAgICAgb3B0aW9uczogUGFydGlhbDxEZWNhZk1vZHVsZU9wdGlvbnM+ID0ge31cbiAgICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgICAgY29uc3QgdHJhY2tlZE1vZGVscyA9IEFkYXB0ZXIubW9kZWxzKGZsYXZvdXIpLmZpbHRlcigobW9kZWwpID0+XG4gICAgICAgIHRoaXMuaXNFeHBvc2VkKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSlcbiAgICAgICk7XG5cbiAgICAgIGxldCBtb2RlbFNlcnZpY2VzOiBQcm92aWRlcltdID0gW107XG4gICAgICBpZiAob3B0aW9ucy5hdXRvU2VydmljZXMpIHtcbiAgICAgICAgbG9nLmluZm8oXCJBdXRvLXNlcnZpY2VzIGVuYWJsZWQuIEluaXRpYWxpemluZyBzZXJ2aWNlIGdlbmVyYXRpb24uXCIpO1xuICAgICAgICBtb2RlbFNlcnZpY2VzID0gdGhpcy5jcmVhdGVNb2RlbFNlcnZpY2VzKHRyYWNrZWRNb2RlbHMpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgQXV0by1zZXJ2aWNlcyBjb21wbGV0ZWQuICR7bW9kZWxTZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2VzIGluaXRpYWxpemVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2xvYmFsRGVmYXVsdHM6IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4gPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLmFnZ3JlZ2F0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgZ2xvYmFsRGVmYXVsdHMuYWxsb3dHcm91cGluZ1F1ZXJpZXMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udHJvbGxlcnMgPSB0cmFja2VkTW9kZWxzLm1hcCgobW9kZWwpID0+XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsIGdsb2JhbERlZmF1bHRzKVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgICAgY29udHJvbGxlcnMsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgIC4uLm1vZGVsU2VydmljZXMsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBPYmplY3QuYXNzaWduKERlY2FmTW9kZWxNb2R1bGUsIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGBEZWNhZk1vZHVsZSR7Zmxhdm91cn1gLFxuICB9KTtcbiAgcmV0dXJuIERlY2FmTW9kZWxNb2R1bGU7XG59XG4iLCJpbXBvcnQge1xuICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsXG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZz86IEluamVjdGFibGVDb25maWdcbiAgICApIHtcbiAgICAgIGNmZyA9XG4gICAgICAgIGNmZyB8fFxuICAgICAgICAodHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LFxuICAgICAgICAgICAgICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZSh7XG4gICAgICAgIHNjb3BlOiBjZmcuc2luZ2xldG9uID8gU2NvcGUuREVGQVVMVCA6IFNjb3BlLlJFUVVFU1QsXG4gICAgICAgIGR1cmFibGU6IGNmZy5zaW5nbGV0b24gPyB1bmRlZmluZWQgOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdChcbiAgICAgIGNhdGVnb3J5OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNmZzogSW5qZWN0T3B0aW9uc1xuICAgICkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyTmVzdEluamVjdChcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgICBkZXNjcmlwdG9yPzogYW55XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIEluamVjdChjYXRlZ29yeSB8fCAodGFyZ2V0IGFzIENvbnN0cnVjdG9yKSkoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKVxuICAuZXh0ZW5kKFxuICAgIEFwaVByb3BlcnR5KHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gIClcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heGltdW06IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5pbXVtOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluTGVuZ3RoRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5MZW5ndGg6IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHR5cGVEZWMoXG4gICAgICB0eXBlOlxuICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW11cbiAgICAgICAgfCBDb25zdHJ1Y3RvclxuICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3RvcilcbiAgICApIHtcbiAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICB0eXBlID0gQXJyYXkuaXNBcnJheSh0eXBlKSA/IHR5cGVbMF0gOiB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHlwZS5uYW1lKVxuICAgICAgICAgIHR5cGUgPSAodHlwZSBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbiAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIGFueSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIH0pKHRhcmdldCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbGlzdERlYyhcbi8vICAgICAgIGNsYXp6OlxuLy8gICAgICAgICB8IENvbnN0cnVjdG9yXG4vLyAgICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuLy8gICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW10sXG4vLyAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4vLyAgICAgICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiXG4vLyAgICAgKSB7XG4vLyAgICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbi8vICAgICAgICAgY2xhenogPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4vLyAgICAgICAgIGlmICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZSlcbi8vICAgICAgICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbi8vICAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgdHlwZTogW2NsYXp6IGFzIGFueV0gfSkodGFyZ2V0LCBwcm9wKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vLyAvL1xuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuREFURSlcbiAgLmV4dGVuZCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGF0ZURlYyhmb3JtYXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZS10aW1lXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgLy8gZXhhbXBsZTogcGFyc2VEYXRlKGZvcm1hdCwgbmV3IERhdGUoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuRU5VTSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvcHRpb25EZWMob3B0aW9uczogc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICBjb25zdCBvcHRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBPYmplY3QudmFsdWVzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZW51bTogb3B0cyxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbkRlYyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkZXNjcmlwdGlvbkRlYyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQVVUSCkuZXh0ZW5kKHsgZGVjb3JhdG9yOiBBdXRoIH0pLmFwcGx5KCk7XG4iLCJpbXBvcnQgeyBGb3JiaWRkZW5FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgQ29yc0Vycm9yIGV4dGVuZHMgRm9yYmlkZGVuRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBDb3JzRXJyb3IubmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgVG9NYW55UmVxdWVzdHNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgKSB7XG4gICAgc3VwZXIoVG9NYW55UmVxdWVzdHNFcnJvci5uYW1lLCBtc2cgLCA0MjkpO1xuICB9XG59IiwiaW1wb3J0IHtcbiAgQXJndW1lbnRzSG9zdCxcbiAgQ2F0Y2gsXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvdGhyb3R0bGluZ1wiO1xuXG5AQ2F0Y2goKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY2F0Y2goZXhjZXB0aW9uOiBFcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgIGNvbnN0IGN0eCA9IGhvc3Quc3dpdGNoVG9IdHRwKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgbGV0IHN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvclxuICAgICkge1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgc3RhdHVzQ29kZSA9IChleGNlcHRpb24gYXMgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7XG4gICAgfSBlbHNlIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEJhc2VFcnJvcikpIHtcbiAgICAgIGlmKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSl7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUb01hbnlSZXF1ZXN0c0Vycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgSW50ZXJuYWxFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc3RhdHVzKChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgc3RhdHVzOiAoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVXNlRmlsdGVycywgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL0RlY2FmRXJyb3JGaWx0ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L2luZGV4XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VjdXJpdHlTY2hlbWVPYmplY3QgfSBmcm9tIFwiLi4vLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xuICBhdXRoPzogU2VjdXJpdHlTY2hlbWVPYmplY3Q7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIGV4dHJhTW9kZWxzPzogQ29uc3RydWN0b3JbXTtcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1dBR0dFUl9VSV9DT05TVEFOVFM6IFN3YWdnZXJPcHRpb25zID0ge1xuICB0aXRsZTogXCJTd2FnZ2VyIHwgT3BlbkFQSSBTcGVjaWZpY2F0aW9uIChPQVMpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkaXplZCBmb3JtYXQgZm9yIGRlc2NyaWJpbmcgUkVTVGZ1bCBBUElzXCIsXG4gIHZlcnNpb246IFwiMC4wLjFcIixcbiAgcGF0aDogXCJkb2NzXCIsXG4gIGZhdmljb25GaWxlUGF0aDogXCJcIixcbiAgdG9wYmFySWNvbkZpbGVQYXRoOiBcIlwiLFxuICBhdXRoOiB7XG4gICAgdHlwZTogXCJodHRwXCIsXG4gICAgc2NoZW1lOiBcImJlYXJlclwiLFxuICAgIGJlYXJlckZvcm1hdDogXCJKV1RcIixcbiAgICBuYW1lOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbnRlciBKV1QgdG9rZW5cIixcbiAgICBpbjogXCJoZWFkZXJcIixcbiAgfSxcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gIHRvcGJhckJnQ29sb3I6IFwiIzAwMDAwMFwiLFxufTtcbiIsImltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyVUlPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQ3VzdG9tVUkge1xuICByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zO1xuICAvLyBwcml2YXRlIHJlYWRvbmx5IGFzc2V0c1BhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgLy8gICBfX2Rpcm5hbWUsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIndvcmtkb2NzXCIsXG4gIC8vICAgXCJhc3NldHNcIlxuICAvLyApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGN1c3RvbUNTUygpIHtcbiAgICBsZXQgY3NzID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKSB7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpO1xuICAgICAgY3NzICs9IGAudG9wYmFyLXdyYXBwZXIgeyBjb250ZW50OiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke2ltZ30nKTsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IGF1dG87IH1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY3NzICtcbiAgICAgIGBcbiAgICAgICAgLnRvcGJhci13cmFwcGVyIHN2ZyB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuICAgICAgICAuc3dhZ2dlci11aSAudG9wYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvciB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy50b3BiYXJCZ0NvbG9yfTsgfVxuICAgICAgYFxuICAgICk7XG4gIH1cblxuICBnZXRDdXN0b21PcHRpb25zKCkge1xuICAgIGNvbnN0IGZhdmljb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhdmljb25QYXRoKSB7XG4gICAgICBmYXZpY29uW1wiY3VzdG9tZmF2SWNvblwiXSA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgLi4uZmF2aWNvbixcbiAgICAgIGN1c3RvbUNzczogdGhpcy5jdXN0b21DU1MoKSxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB7XG4gICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBiNjQoZmlsZTogc3RyaW5nLCBpbWc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy5hc3NldHNQYXRoIHx8IFwiXCIsIGZpbGUpO1xuICAgIGNvbnN0IGI2NCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogXCJiYXNlNjRcIiB9KTtcbiAgICByZXR1cm4gaW1nID8gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiNjQgOiBiNjQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElOZXN0QXBwbGljYXRpb24gfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERvY3VtZW50QnVpbGRlciwgU3dhZ2dlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IFN3YWdnZXJDdXN0b21VSSB9IGZyb20gXCIuL1N3YWdnZXJDdXN0b21VSVwiO1xuaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMsIFN3YWdnZXJPcHRpb25zIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogSU5lc3RBcHBsaWNhdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJPcHRpb25zXG4gICkge31cblxuICBwcml2YXRlIGNyZWF0ZURvY3VtZW50KCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnBhdGhcbiAgICAgID8gdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uICtcbiAgICAgICAgXCJcIiArXG4gICAgICAgIGA8YnI+PGJyPjxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9XCI+T3BlbkFQSSBKU09OIFNwZWM8L2E+IHwgYCArXG4gICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofVwiPk9wZW5BUEkgWUFNTCBTcGVjPC9hPmBcbiAgICAgIDogdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3QgY29uZmlnID0gbmV3IERvY3VtZW50QnVpbGRlcigpXG4gICAgICAuc2V0VGl0bGUodGhpcy5vcHRpb25zLnRpdGxlKVxuICAgICAgLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnNldFZlcnNpb24odGhpcy5vcHRpb25zLnZlcnNpb24gfHwgXCIwLjAuMVwiKVxuICAgICAgLmFkZEJlYXJlckF1dGgodGhpcy5vcHRpb25zLmF1dGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMuYXV0aClcbiAgICAgIC5idWlsZCgpO1xuXG4gICAgcmV0dXJuIFN3YWdnZXJNb2R1bGUuY3JlYXRlRG9jdW1lbnQodGhpcy5hcHAsIGNvbmZpZywge1xuICAgICAgZXh0cmFNb2RlbHM6IHRoaXMub3B0aW9ucy5leHRyYU1vZGVscyB8fCBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB8IFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgYm9keUZhY3Rvcnk6ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBodHRwQWRhcHRlciA9IHRoaXMuYXBwLmdldEh0dHBBZGFwdGVyKCkgYXMgYW55O1xuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgaHR0cEFkYXB0ZXIuZ2V0KHBhdGgsIChfcmVxOiBhbnksIHJlczogYW55KSA9PiB7XG4gICAgICBodHRwQWRhcHRlci5yZXBseShyZXMsIGJvZHlGYWN0b3J5KCksIDIwMCwge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwU3dhZ2dlcigpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlRG9jdW1lbnQoKTtcbiAgICBjb25zdCBzd2FnZ2VyVUkgPSBuZXcgU3dhZ2dlckN1c3RvbVVJKHtcbiAgICAgIHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogdGhpcy5vcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uUGF0aDogdGhpcy5vcHRpb25zLmZhdmljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckljb25QYXRoOiB0aGlzLm9wdGlvbnMudG9wYmFySWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogdGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgfSk7XG4gICAgU3dhZ2dlck1vZHVsZS5zZXR1cChcbiAgICAgIHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIGRvY3VtZW50LFxuICAgICAge1xuICAgICAgICAuLi5zd2FnZ2VyVUkuZ2V0Q3VzdG9tT3B0aW9ucygpLFxuICAgICAgICBqc29uRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB5YW1sRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgKCkgPT4gZG9jdW1lbnRcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgICAgKCkgPT4gWUFNTC5zdHJpbmdpZnkoZG9jdW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgZ2V0VmVyc2lvbigpIHtcbiAgLy8gICAvLyBjb25zdCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgLy8gICAvLyBjb25zdCB7dmVyc2lvbn0gPSByZXF1aXJlKHBhY2thZ2VKc29uKTtcbiAgLy8gICByZXR1cm4gXCJ2ZXJzaW9uXCI7XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7XG4gIElOZXN0QXBwbGljYXRpb24sXG4gIExvZ2dlcixcbiAgTmVzdEludGVyY2VwdG9yLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmbHVlbnQsIHN0YXRpYyBib290c3RyYXAgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgY29uZmlndXJpbmcgYSBOZXN0SlMgYXBwbGljYXRpb24uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTmVzdEJvb3RzdHJhcGVyYCBjbGFzcyBwcm92aWRlcyBhIGNoYWluYWJsZSBBUEkgZm9yIGNvbmZpZ3VyaW5nXG4gKiBhIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gSXQgaW5jbHVkZXMgYnVpbHQtaW4gbWV0aG9kcyBmb3IgZW5hYmxpbmdcbiAqIENPUlMsIEhlbG1ldCBzZWN1cml0eSwgU3dhZ2dlciBkb2N1bWVudGF0aW9uLCBnbG9iYWwgcGlwZXMsIGZpbHRlcnMsXG4gKiBpbnRlcmNlcHRvcnMsIGFuZCBzdGFydGluZyB0aGUgc2VydmVyLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvbW90ZXMgY29uc2lzdGVuY3kgYW5kIHJlZHVjZXMgcmVwZXRpdGl2ZSBzZXR1cCBjb2RlXG4gKiBhY3Jvc3MgbXVsdGlwbGUgTmVzdEpTIHByb2plY3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmVzdEZhY3RvcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tIFwiLi9hcHAubW9kdWxlXCI7XG4gKiBpbXBvcnQgeyBNeUxvZ2dlciB9IGZyb20gXCIuL015TG9nZ2VyXCI7XG4gKiBpbXBvcnQgeyBOZXN0Qm9vdHN0cmFwZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1uZXN0XCI7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICogICBjb25zdCBhcHAgPSBhd2FpdCBOZXN0RmFjdG9yeS5jcmVhdGUoQXBwTW9kdWxlKTtcbiAqXG4gKiAgIGF3YWl0IE5lc3RCb290c3RyYXBlclxuICogICAgIC5pbml0aWFsaXplKGFwcClcbiAqICAgICAuZW5hYmxlTG9nZ2VyKG5ldyBNeUxvZ2dlcigpKVxuICogICAgIC5lbmFibGVDb3JzKFtcImh0dHA6Ly9sb2NhbGhvc3Q6NDIwMFwiXSlcbiAqICAgICAudXNlSGVsbWV0KClcbiAqICAgICAuc2V0dXBTd2FnZ2VyKHtcbiAqICAgICAgIHRpdGxlOiBcIk9wZW5BUEkgYnkgVHJhZGVNYXJr4oSiXCIsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogXCJUcmFkZU1hcmvihKIgQVBJIGRvY3VtZW50YXRpb25cIixcbiAqICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAqICAgICAgIHBhdGg6IFwiYXBpXCIsXG4gKiAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAqICAgICAgIHRvcGJhckJnQ29sb3I6IFwiIzJDM0U1MFwiLFxuICogICAgICAgdG9wYmFySWNvblBhdGg6IFwiL2Fzc2V0cy9sb2dvLnN2Z1wiLFxuICogICAgICAgZmF2aWNvblBhdGg6IFwiL2Fzc2V0cy9mYXZpY29uLmljb1wiXG4gKiAgICAgfSlcbiAqICAgICAudXNlR2xvYmFsRmlsdGVycygpXG4gKiAgICAgLnVzZUdsb2JhbFBpcGVzKC4uLilcbiAqICAgICAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLilcbiAqICAgICAuc3RhcnQoMzAwMCk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKCk7XG4gKiBgYGBcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTmVzdEJvb3RzdHJhcGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYXBwOiBJTmVzdEFwcGxpY2F0aW9uO1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dlciBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IG9uZSBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbnN1cmVzIHRoYXQgYSB2YWxpZCBgTG9nZ2VyYCBpbnN0YW5jZSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAqIGZvciBsb2dnaW5nIGJvb3RzdHJhcC1yZWxhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBhY3RpdmUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGxvZ2dlcigpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB7XG4gICAgICAvLyBmYWxsYmFja1xuICAgICAgdGhpcy5fbG9nZ2VyID0gbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluaXRpYWxpemVzIHRoZSBib290c3RyYXBwZXIgd2l0aCBhIGdpdmVuIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQmluZHMgdGhlIHByb3ZpZGVkIE5lc3RKUyBhcHAgaW5zdGFuY2UgdG8gdGhlIGJvb3RzdHJhcHBlciwgZW5hYmxpbmdcbiAgICogY2hhaW5lZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7SU5lc3RBcHBsaWNhdGlvbn0gYXBwIC0gVGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlTG9nZ2VyKGN1c3RvbUxvZ2dlcj86IExvZ2dlcikge1xuICAgIHRoaXMuX2xvZ2dlciA9IGN1c3RvbUxvZ2dlciB8fCBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB0aGlzLmFwcC51c2VMb2dnZXIodGhpcy5fbG9nZ2VyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUykgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQWxsb3dzIGRlZmluaW5nIGVpdGhlciBhIHdpbGRjYXJkIG9yaWdpbiAoYFwiKlwiYCkgb3IgYSBsaXN0IG9mIGFsbG93ZWQgb3JpZ2lucy5cbiAgICogQXV0b21hdGljYWxseSBhY2NlcHRzIGxvY2FsIGRldmVsb3BtZW50IHJlcXVlc3RzIGFuZCB0aG9zZSB3aXRob3V0IG9yaWdpbiBoZWFkZXJzLlxuICAgKiBUaHJvd3MgYSBgQ29yc0Vycm9yYCBmb3IgdW5hdXRob3JpemVkIG9yaWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7JyonIHwgc3RyaW5nW119IFtvcmlnaW5zPVtdXSAtIExpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zIG9yIGBcIipcImAgdG8gYWxsb3cgYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxsb3dNZXRob2RzPVsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddXSAtIEFsbG93ZWQgSFRUUCBtZXRob2RzLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUNvcnMoXG4gICAgb3JpZ2luczogXCIqXCIgfCBzdHJpbmdbXSA9IFtdLFxuICAgIGFsbG93TWV0aG9kczogc3RyaW5nW10gPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdXG4gICkge1xuICAgIGNvbnN0IGFsbG93ZWRPcmlnaW5zID1cbiAgICAgIG9yaWdpbnMgPT09IFwiKlwiID8gXCIqXCIgOiBvcmlnaW5zLm1hcCgobykgPT4gby50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBjb25zdCBjb3JzT3B0aW9uczogQ29yc09wdGlvbnMgPSB7XG4gICAgICBvcmlnaW46IChvcmlnaW4sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIEFsbG93IHJlcXVlc3Qgd2l0aG91dCBvcmlnaW4uLi5cbiAgICAgICAgaWYgKCFvcmlnaW4pIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnMgPT09IFwiKlwiIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbnMpICYmXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2lucy5pbmNsdWRlcyhvcmlnaW4udG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG5ldyBDb3JzRXJyb3IoYE9yaWdpbiAke29yaWdpbn0gbm90IGFsbG93ZWRgKSk7XG4gICAgICB9LFxuICAgICAgY3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBtZXRob2RzOiBhbGxvd01ldGhvZHMuam9pbihcIixcIiksXG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmVuYWJsZUNvcnMoY29yc09wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBcHBsaWVzIHRoZSBIZWxtZXQgbWlkZGxld2FyZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIER5bmFtaWNhbGx5IGxvYWRzIHRoZSBgaGVsbWV0YCBwYWNrYWdlIGlmIGF2YWlsYWJsZSBhbmQgcmVnaXN0ZXJzIGl0XG4gICAqIGFzIG1pZGRsZXdhcmUgdG8gaW1wcm92ZSBIVFRQIGhlYWRlciBzZWN1cml0eS4gSWYgbm90IGluc3RhbGxlZCwgbG9ncyBhIHdhcm5pbmdcbiAgICogYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gd2l0aG91dCB0aHJvd2luZyBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXNzZWQgdG8gSGVsbWV0LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBzZXR1cFN3YWdnZXIob3B0aW9uczogU3dhZ2dlclNldHVwT3B0aW9ucykge1xuICAgIGNvbnN0IHN3YWdnZXIgPSBuZXcgU3dhZ2dlckJ1aWxkZXIodGhpcy5hcHAsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICBwYXRoOiBvcHRpb25zLnBhdGggfHwgXCJhcGlcIixcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiBvcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiBvcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uRmlsZVBhdGg6IG9wdGlvbnMuZmF2aWNvblBhdGgsXG4gICAgICB0b3BiYXJJY29uRmlsZVBhdGg6IG9wdGlvbnMudG9wYmFySWNvblBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiBvcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgICBvcGVuQXBpSnNvblBhdGg6IG9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgb3BlbkFwaVlhbWxQYXRoOiBvcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICB9KTtcbiAgICBzd2FnZ2VyLnNldHVwU3dhZ2dlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIHZhbGlkYXRpb24gcGlwZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuYWJsZXMgcmVxdWVzdCBwYXlsb2FkIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIGdsb2JhbGx5IGFjcm9zc1xuICAgKiB0aGUgZW50aXJlIE5lc3RKUyBhcHBsaWNhdGlvbi4gTXVsdGlwbGUgcGlwZXMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXJcbiAgICogZm9yIG1vZHVsYXIgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QaXBlVHJhbnNmb3JtW119IHBpcGVzIC0gUGlwZSBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIgZ2xvYmFsbHkuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uRXhjZXB0aW9uRmlsdGVyW119IGZpbHRlcnMgLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IGdsb2JhbGx5LlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEZpbHRlcnMoLi4uZmlsdGVyczogYW55W10pIHtcbiAgICB0aGlzLmFwcC51c2VHbG9iYWxGaWx0ZXJzKFxuICAgICAgLi4uKGZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnMgOiBbbmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCldKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBnbG9iYWwgaW50ZXJjZXB0b3JzIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSW50ZXJjZXB0b3JzIGFsbG93IGFkdmFuY2VkIHJlcXVlc3QvcmVzcG9uc2UgbWFuaXB1bGF0aW9uIHN1Y2ggYXNcbiAgICogc2VyaWFsaXphdGlvbiwgbG9nZ2luZywgb3IgdHJhbnNmb3JtYXRpb24uIE11bHRpcGxlIGludGVyY2VwdG9yc1xuICAgKiBjYW4gYmUgYWRkZWQgZm9yIG1vZHVsYXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5OZXN0SW50ZXJjZXB0b3JbXX0gaW50ZXJjZXB0b3JzIC0gSW50ZXJjZXB0b3IgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnM6IE5lc3RJbnRlcmNlcHRvcltdKSB7XG4gICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPiAwKVxuICAgICAgdGhpcy5hcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN0YXJ0cyB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uIGFuZCBiaW5kcyBpdCB0byB0aGUgZ2l2ZW4gcG9ydCBhbmQgaG9zdC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogTGlzdGVucyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kIG9wdGlvbmFsbHkgYSBob3N0LiBPbmNlIHN0YXJ0ZWQsXG4gICAqIGxvZ3MgdGhlIGFwcGxpY2F0aW9uIFVSTCBmb3IgZWFzeSBhY2Nlc3MuIFRoZSBzdGFydHVwIHByb2Nlc3MgcmVzb2x2ZXNcbiAgICogb25jZSB0aGUgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9ydD0zMDAwXSAtIFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtob3N0XSAtIE9wdGlvbmFsIGhvc3Qgb3IgSVAgYWRkcmVzcyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9dHJ1ZV0gLSBXaGV0aGVyIHRvIGxvZyB0aGUgYXBwbGljYXRpb24gVVJMIHVwb24gc3RhcnR1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgb25jZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydChcbiAgICBwb3J0OiBudW1iZXIgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCxcbiAgICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgbG9nOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmFwcC5saXN0ZW4ocG9ydCwgaG9zdCBhcyBhbnkpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmFwcC5nZXRVcmwoKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGDwn5qAIEFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgYXQ6ICR7dXJsfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDYWxsSGFuZGxlcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBEZWZhdWx0QWRhcHRlckZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckZsYWdzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnRlcmNlcHRvciByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIGFsbCByZWdpc3RlcmVkIERlY2FmIHJlcXVlc3QgaGFuZGxlcnNcbiAqIGJlZm9yZSB0aGUgY29udHJvbGxlciBtZXRob2QgaXMgaW52b2tlZC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3J9IGludGVncmF0ZXMgdGhlIERlY2FmIHJlcXVlc3QtaGFuZGxpbmcgcGlwZWxpbmVcbiAqIGludG8gTmVzdEpTJyBpbnRlcmNlcHRvciBtZWNoYW5pc20uIEJlZm9yZSBwYXNzaW5nIGV4ZWN1dGlvbiB0byB0aGUgbmV4dCBoYW5kbGVyIGluIHRoZVxuICogTmVzdEpTIGNoYWluLCBpdCBkZWxlZ2F0ZXMgcmVxdWVzdCBwcm9jZXNzaW5nIHRvIHRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9LCB3aGljaFxuICogc2VxdWVudGlhbGx5IHJ1bnMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcy4gVGhpcyBhbGxvd3NcbiAqIGJlaGF2aW9ycyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBsb2dnaW5nLCB0ZW5hbnQgcmVzb2x1dGlvbiwgb3IgbWV0YWRhdGEgZW5yaWNobWVudFxuICogdG8gb2NjdXIgcHJpb3IgdG8gY29udHJvbGxlciBleGVjdXRpb24uXG4gKlxuICogQGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQXBwbHkgZ2xvYmFsbHk6XG4gKiBhcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKG5ldyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IoZXhlY3V0b3IpKTtcbiAqXG4gKiAvLyBPciBpbiBhIG1vZHVsZTpcbiAqIEBNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gKiAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEludGVyY2VwdG9yXG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBDb250cm9sbGVyXG4gKlxuICogICAgIENsaWVudC0+PkludGVyY2VwdG9yOiBIVFRQIFJlcXVlc3RcbiAqICAgICBJbnRlcmNlcHRvci0+PkV4ZWN1dG9yOiBleGVjKHJlcXVlc3QpXG4gKiAgICAgRXhlY3V0b3ItLT4+SW50ZXJjZXB0b3I6IGhhbmRsZXJzIGNvbXBsZXRlZFxuICogICAgIEludGVyY2VwdG9yLT4+Q29udHJvbGxlcjogbmV4dC5oYW5kbGUoKVxuICogICAgIENvbnRyb2xsZXItLT4+Q2xpZW50OiBSZXNwb25zZVxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRvcjogRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb250ZXh0dWFsaXplKHJlcTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICAgIGNvbnN0IGZsYWdzOiBEZWNhZlNlcnZlckZsYWdzID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBpcCA9IGV4dHJhY3RJcChyZXEpO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHsgaXAgfSk7XG5cbiAgICB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgRGVmYXVsdEFkYXB0ZXJGbGFncyxcbiAgICAgICAge1xuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgb3BlcmF0aW9uOiBgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YCxcbiAgICAgICAgfSxcbiAgICAgICAgZmxhZ3NcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKSB7XG4gICAgY29uc3QgcmVxID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVzID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcikuZm9yKHRoaXMuaW50ZXJjZXB0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRleHR1YWxpemUocmVxKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gY29udGV4dHVhbGl6ZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZXhlY3V0b3IuZXhlYyhyZXEsIHJlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGV4ZWN1dG9ycyBmaW5pc2hlZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJcChyZXE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgZnVuY3Rpb24gcGFyc2VJcEhlYWRlcih2YWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilbMF07XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtZm9yd2FyZGVkLWZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtcmVhbC1pcFwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtRm9yd2FyZGVkLUZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtUmVhbC1JUFwiXSkgPz9cbiAgICByZXEuaXBcbiAgKTtcbn1cbiIsImltcG9ydCB7IEluamVjdCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIGluamVjdGFibGVTZXJ2aWNlS2V5LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG9zaXRvcnkgYXMgQ29yZVJlcG9zaXRvcnksXG4gIFNlcnZpY2UgYXMgQ29yZVNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmRmFjdG9yeVByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBzdHJpbmc7XG4gIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd247XG59O1xuXG5jb25zdCBwZW5kaW5nUHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIERlY2FmRmFjdG9yeVByb3ZpZGVyPigpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEcmFpbnMgdGhlIHByb3ZpZGVycyByZWdpc3RlcmVkIGJ5IHtAbGluayBTZXJ2aWNlfS97QGxpbmsgUmVwb3NpdG9yeX0gdXNhZ2VzLlxuICogQHN1bW1hcnkgQ29uc3VtZWQgYnkge0BsaW5rIERlY2FmQ29yZU1vZHVsZS5mb3JSb290fSB0byB3aXJlIHRoZSB0b2tlbnMgdGhhdCB0aG9zZSBwYXJhbWV0ZXJcbiAqIGRlY29yYXRvcnMgcmVmZXJlbmNlIGJhY2sgaW50byBOZXN0J3MgREkgY29udGFpbmVyLCBzaW5jZSBhIHBhcmFtZXRlciBkZWNvcmF0b3IgYWxvbmUgY2Fubm90XG4gKiBzdXBwbHkgYSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpOiBEZWNhZkZhY3RvcnlQcm92aWRlcltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20ocGVuZGluZ1Byb3ZpZGVycy52YWx1ZXMoKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW46IHN0cmluZywgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICBpZiAocGVuZGluZ1Byb3ZpZGVycy5oYXModG9rZW4pKSByZXR1cm47XG4gIHBlbmRpbmdQcm92aWRlcnMuc2V0KHRva2VuLCB7IHByb3ZpZGU6IHRva2VuLCB1c2VGYWN0b3J5IH0pO1xufVxuXG5mdW5jdGlvbiBpc01vZGVsQ29uc3RydWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIE1vZGVsO1xufVxuXG5mdW5jdGlvbiBtb2RlbFNlcnZpY2VUb2tlbihtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHJldHVybiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgO1xufVxuXG5mdW5jdGlvbiBtb2RlbFJlcG9zaXRvcnlUb2tlbihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBmbGF2b3VyID8gYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5QCR7Zmxhdm91cn1gIDogYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5YDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiBzZXJ2aWNlLlxuICogQHN1bW1hcnkgVHJhbnNsYXRlcyBkZWNhZidzIHNlcnZpY2UgcmVzb2x1dGlvbiBBUElzIGludG8gYSBOZXN0IGBASW5qZWN0KClgIGNhbGw6XG4gKiAtIGBAU2VydmljZShTb21lTW9kZWwpYCBpbmplY3RzIHRoZSBgTW9kZWxTZXJ2aWNlPFNvbWVNb2RlbD5gIHNpbmdsZXRvbiBmb3IgdGhhdCBtb2RlbFxuICogICAodmlhIHtAbGluayBNb2RlbFNlcnZpY2UuZm9yTW9kZWx9KS5cbiAqIC0gYEBTZXJ2aWNlKFNvbWVTZXJ2aWNlQ2xhc3MpYCBvciBgQFNlcnZpY2UoXCJhbGlhc1wiKWAgaW5qZWN0cyB0aGUgbWF0Y2hpbmcgYEBzZXJ2aWNlKClgLWRlY29yYXRlZFxuICogICBkZWNhZiB7QGxpbmsgQ29yZVNlcnZpY2V9ICh2aWEge0BsaW5rIENvcmVTZXJ2aWNlLmdldH0pLlxuICogLSBgQFNlcnZpY2UoKWAgaW5mZXJzIHRoZSBwYXJhbWV0ZXIncyB0eXBlIGZyb20gZW1pdHRlZCBjb25zdHJ1Y3RvciBtZXRhZGF0YSBhbmQgcmVzb2x2ZXMgaXQgdGhlXG4gKiAgIHNhbWUgd2F5LCBwcm92aWRlZCB0aGUgcGFyYW1ldGVyIGlzIHR5cGVkIGFzIGEgY29uY3JldGUgY2xhc3MgKGdlbmVyaWNzIGxpa2UgYE1vZGVsU2VydmljZTxYPmBcbiAqICAgYXJlIGVyYXNlZCBhdCBydW50aW1lLCBzbyB0aGUgbW9kZWwtc2VydmljZSBmb3JtIGFsd2F5cyByZXF1aXJlcyBhbiBleHBsaWNpdCBhcmd1bWVudCkuXG4gKiBAcGFyYW0ga2V5IHRoZSBtb2RlbCBjbGFzcywgc2VydmljZSBjbGFzcywgb3IgYWxpYXMgdG8gcmVzb2x2ZS4gT21pdCB0byBpbmZlciBmcm9tIHRoZSBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlcnZpY2Uoa2V5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCByZXNvbHZlZDogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IGtleTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBwYXJhbVR5cGVzOiBhbnlbXSA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgcmVzb2x2ZWQgPSBwYXJhbVR5cGVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQFNlcnZpY2UoKSBjb3VsZCBub3QgZGV0ZXJtaW5lIGFuIGluamVjdGlvbiB0eXBlIGZvciBwYXJhbWV0ZXIgJHtwYXJhbWV0ZXJJbmRleH0gb2YgJHsodGFyZ2V0IGFzIENvbnN0cnVjdG9yPGFueT4pLm5hbWV9LiBQcm92aWRlIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCBlLmcuIEBTZXJ2aWNlKFNvbWVTZXJ2aWNlKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFzTW9kZWwgPSB0eXBlb2YgcmVzb2x2ZWQgIT09IFwic3RyaW5nXCIgJiYgaXNNb2RlbENvbnN0cnVjdG9yKHJlc29sdmVkKTtcbiAgICBjb25zdCB0b2tlbiA9IGFzTW9kZWxcbiAgICAgID8gbW9kZWxTZXJ2aWNlVG9rZW4ocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55PilcbiAgICAgIDogaW5qZWN0YWJsZVNlcnZpY2VLZXkocmVzb2x2ZWQgYXMgc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik7XG5cbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiB7XG4gICAgICBpZiAoYXNNb2RlbCkgcmV0dXJuIE1vZGVsU2VydmljZS5mb3JNb2RlbChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQpXG4gICAgICAgIDogQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHtAbGluayBDb3JlUmVwb3NpdG9yeX0gZm9yIGBtb2RlbGAuXG4gKiBAc3VtbWFyeSBVbmxpa2Uge0BsaW5rIFNlcnZpY2V9LCBgbW9kZWxgIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGEgTW9kZWwgY2xhc3M6IHRoZSBzYW1lIGNsYXNzIHBhc3NlZFxuICogdG8gYEBTZXJ2aWNlKG1vZGVsKWAgYW5kIGBAUmVwb3NpdG9yeShtb2RlbClgIHJlc29sdmVzIHRvIHR3byBkaWZmZXJlbnQgaW5qZWN0ZWQgb2JqZWN0cyAoYVxuICogYE1vZGVsU2VydmljZTxNPmAgdnMgYSBgUmVwb3NpdG9yeTxNPmAgcmVzcGVjdGl2ZWx5KSwgdmlhIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsIGNsYXNzIHRvIHJlc29sdmUgYSByZXBvc2l0b3J5IGZvci5cbiAqIEBwYXJhbSBmbGF2b3VyIG9wdGlvbmFsIGFkYXB0ZXIgZmxhdm91ci9hbGlhcywgZm9yd2FyZGVkIHRvIHtAbGluayBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXBvc2l0b3J5KFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSBtb2RlbFJlcG9zaXRvcnlUb2tlbihtb2RlbCwgZmxhdm91cik7XG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4gQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWwobW9kZWwsIGZsYXZvdXIpKTtcbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG4iLCJpbXBvcnQge1xuICBEeW5hbWljTW9kdWxlLFxuICBHbG9iYWwsXG4gIEluamVjdCxcbiAgTW9kdWxlLFxuICBPbkFwcGxpY2F0aW9uU2h1dGRvd24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SLCBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgdHlwZSB7IERlY2FmTW9kdWxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBERUNBRl9BREFQVEVSX0lELFxuICBERUNBRl9IQU5ETEVSUyxcbiAgREVDQUZfTU9EVUxFX09QVElPTlMsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxufSBmcm9tIFwiLi9pbnRlcmNlcHRvcnNcIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlU2VydmljZSwgU2VydmljZSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQge1xuICBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG4gIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbn0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxDT05GLCBBREFQVEVSIGV4dGVuZHMgQWRhcHRlcjxDT05GLCBhbnksIGFueSwgYW55Pj5cbiAgaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByaXZhdGUgc3RhdGljIF9wZXJzaXN0ZW5jZT86IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+O1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IHBlcnNpc3RlbmNlKCk6IFBlcnNpc3RlbmNlU2VydmljZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJQZXJzaXN0ZW5jZSBzZXJ2aWNlIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVuY2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBsb2coKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikgdGhpcy5fbG9nZ2VyID0gTG9nZ2luZy5mb3IoRGVjYWZDb3JlTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChERUNBRl9NT0RVTEVfT1BUSU9OUylcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uczxDT05GLCBBREFQVEVSPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vZHVsZVJlZjogTW9kdWxlUmVmXG4gICkge31cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5mb3JSb290KTtcbiAgICBjb25zdCBkZWNhZlByb3ZpZGVycyA9IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpO1xuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmQ29yZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucyB9LFxuICAgICAgICB7IHByb3ZpZGU6IERFQ0FGX0FEQVBURVJfSUQsIHVzZVZhbHVlOiB0aGlzLnBlcnNpc3RlbmNlPy5jbGllbnQgfSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICAgIHVzZUZhY3Rvcnk6ICgpID0+XG4gICAgICAgICAgICBvcHRpb25zLmhhbmRsZXJzPy5tYXAoKEgpID0+IHtcbiAgICAgICAgICAgICAgbG9nLmluZm8oYFJlZ2lzdGVyZWQgcmVxdWVzdCBoYW5kbGVyOiAke0gubmFtZX1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIKCk7XG4gICAgICAgICAgICB9KSA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgICAgdXNlQ2xhc3M6IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbiAgICAgICAgfSxcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMsXG4gICAgICBdLFxuICAgICAgZXhwb3J0czogW1xuICAgICAgICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbiAgICAgICAgREVDQUZfQURBUFRFUl9JRCxcbiAgICAgICAgREVDQUZfSEFORExFUlMsXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycy5tYXAoKHByb3ZpZGVyKSA9PiBwcm92aWRlci5wcm92aWRlKSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBib290UGVyc2lzdGVuY2UoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ib290UGVyc2lzdGVuY2UpO1xuXG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSkge1xuICAgICAgY29uc3QgdHJpbW1lZCA9IG9wdGlvbnMuY29uZi5tYXAoKFtjb250ciwgY2ZnLCAuLi5hcmdzXSkgPT4ge1xuICAgICAgICBjb25zdCBwb3NzaWJsZSA9IGFyZ3MucG9wKCk7XG4gICAgICAgIGlmICghcG9zc2libGUpIHJldHVybiBbY29udHIsIGNmZ107XG4gICAgICAgIHJldHVybiBbY29udHIsIGNmZywgLi4uYXJnc107XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gbmV3IFBlcnNpc3RlbmNlU2VydmljZSgpO1xuICAgICAgYXdhaXQgdGhpcy5fcGVyc2lzdGVuY2UuYm9vdCh0cmltbWVkKTtcbiAgICAgIGNvbnN0IGNsaWVudHMgPSB0aGlzLl9wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYyA9IG9wdGlvbnMuY29uZltpXTtcbiAgICAgICAgY29uc3QgcG9zc2libGVUcmFuc2YgPSBjLnNsaWNlKDIsIGMubGVuZ3RoKTtcbiAgICAgICAgbGV0IHRyYW5zZm9ybWVyID0gcG9zc2libGVUcmFuc2YucG9wKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdHJhbnNmb3JtZXIgfHxcbiAgICAgICAgICAhKHRyYW5zZm9ybWVyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGNvbnRyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihjbGllbnRzW2ldLmZsYXZvdXIpO1xuICAgICAgICAgIGlmICghY29udHIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHRyYW5zZm9ybWVyIGZvdW5kIGZvciBmbGF2b3VyICR7Y2xpZW50c1tpXS5mbGF2b3VyfS4geW91IHNob3VsZCBlaXRoZXIgQHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciBvciBwcm92aWRlIGEgdHJhbnNmb3JtZXIgaW4gdGhlIGNvbmZpZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRyYW5zZm9ybWVyID0gKGNvbnRyIGFzIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+KS5mcm9tXG4gICAgICAgICAgICAgID8gY29udHJcbiAgICAgICAgICAgICAgOiBuZXcgKGNvbnRyIGFzIENvbnN0cnVjdG9yPFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcjxhbnk+PikoKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBib290IHRyYW5zZm9ybWVyIGZvciAke2NsaWVudHNbaV0uZmxhdm91cn06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIoY2xpZW50c1tpXS5mbGF2b3VyKSh0cmFuc2Zvcm1lcik7XG4gICAgICB9XG4gICAgICBsb2cuaW5mbyhcInBlcnNpc3RlbmNlIGxheWVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IVwiKTtcblxuICAgICAgaWYgKG9wdGlvbnMuaW5pdGlhbGl6YXRpb24pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXRpYWxpemF0aW9uKCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYXBwbGljYXRpb246ICR7ZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLmNsaWVudDtcbiAgfVxuXG4gIGFzeW5jIG9uQXBwbGljYXRpb25TaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSBEZWNhZkNvcmVNb2R1bGUubG9nLmZvcih0aGlzLm9uQXBwbGljYXRpb25TaHV0ZG93bik7XG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIHRoaXMubW9kdWxlUmVmLmdldDxhbnk+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiBhZGFwdGVycylcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChhZGFwdGVyKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFNodXR0aW5nIGRvd24gJHthZGFwdGVyLnRvU3RyaW5nKCl9YCk7XG4gICAgICAgICAgYXdhaXQgYWRhcHRlci5zaHV0ZG93bigpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFNlcnZpY2Uuc2h1dGRvd24oKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlc2AsIGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyA9IFN5bWJvbChcbiAgXCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlNcIlxuKTtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJnZXRPclVuZGVmaW5lZCIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIkVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzcGxpdCIsInNsaWNlIiwiYXBpUGFyYW1TcGVjIiwiZ2V0QXBpRGVjb3JhdG9ycyIsIm1ldGhvZE5hbWUiLCJodHRwVmVyYiIsImluY2x1ZGVRdWVyeVBhcmFtcyIsIk5lc3RIdHRwUm91dGVEZWMiLCJhcGlQYXRoUGFyYW1zIiwic3dhZ2dlclF1ZXJ5UGFyYW1zIiwiQXBpUXVlcnkiLCJPcmRlckRpcmVjdGlvbiIsIm1ldGhvZCIsIkFwaVBhcmFtIiwiQXBpT3BlcmF0aW9uIiwic3VtbWFyeSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb0NvbnRlbnRSZXNwb25zZSIsIlF1ZXJ5IiwiYXBwbHlBcGlEZWNvcmF0b3JzIiwicHJvdG8iLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kIiwicGVyc2lzdGVuY2UiLCJhcmdzIiwiTW9kZWxTZXJ2aWNlIiwic3RhdGVtZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyIiwiYXN5bmMiLCJwYXRoUGFyYW1zIiwicXVlcnlQYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlyZWN0aW9uIiwiZXJyb3IiLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJBUFBfSU5URVJDRVBUT1IiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yXzEiLCJoYW5kbGVycyIsImNvbnRleHQiLCJleGVjIiwicmVzIiwidXJsIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJ0b1Jlc3BvbnNlIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsIkludGVybmFsRXJyb3IiLCJyZWxhdGlvblR5cGUiLCJtZXRhIiwidmFsaWRhdGlvbkZvciIsIkxJU1QiLCJpc0NpcmN1bGFyIiwicGtUeXBlTmFtZSIsImdldFBrT3BlbkFwaVR5cGUiLCJhZGRSZWxhdGlvblBrUmVmIiwicmVsYXRpb25EdG8iLCJhZGQiLCJhZGRSZWxhdGlvblVwZGF0ZSIsImFkZFJlbGF0aW9uIiwiRHRvQ2xhc3MiLCJleHRyYU1vZGVscyIsImR0b1JlZiIsIm9uZU9mSXRlbXMiLCIkcmVmIiwib25lT2YiLCJwa1R5cGUiLCJjdXJyZW50IiwiRnVuY3Rpb24iLCJnZXRQcm90b3R5cGVPZiIsIldlYWtNYXAiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwiQ29udGV4dCIsInBlbmRpbmciLCJoZWFkZXIiLCJNb2RlbEJ1aWxkZXIiLCJkZWNvcmF0ZUNsYXNzIiwiX2NsYXNzRGVjb3JhdG9ycyIsIl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0Iiwib3JpZ2luYWxCdWlsZCIsImJ1aWxkIiwicmVzdWx0IiwiY2FsbCIsImRlY29yYXRlZCIsIkZyb21Nb2RlbENvbnRyb2xsZXIiLCJnZXRQZXJzaXN0ZW5jZSIsIk1vZGVsQ2xhenoiLCJlMiIsImNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnkiLCJwcmVmaXgiLCJQZXJzaXN0ZW5jZUtleXMiLCJRVUVSWSIsInJlcG8iLCJxdWVyeU1ldGhvZHMiLCJyb3V0ZU1ldGhvZHMiLCJRdWVyeUNvbnRyb2xsZXIiLCJlbnRyaWVzIiwic2VnbWVudCIsInRyaW0iLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsImdsb2JhbERlZmF1bHRzIiwidGFibGVOYW1lIiwidG9LZWJhYkNhc2UiLCJtb2RlbENsYXp6TmFtZSIsImZhY3RvcnlQZXJzaXN0ZW5jZSIsImRlY29yYXRvckNvbmZpZyIsIm1vZHVsZU92ZXJyaWRlIiwibWVyZ2VkQ29uZmlnIiwiRmFjdG9yeUNvbnRyb2xsZXIiLCJNb2RlbENvbnRyb2xsZXJGYWN0b3J5IiwiZmFjdG9yeVJvdXRlcyIsIl9fcm91dGVzX18iLCJnZXRQSyIsImFwaVByb3BlcnRpZXMiLCJwa1BhdGgiLCJnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwiLCJhdXRoQ29uZmlnIiwiYXV0aCIsImFwcGx5Q2xhc3NBdXRoIiwicHVibGljIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiQm9vbGVhbiIsImJTZWdtZW50cyIsImFQYXJhbUNvdW50IiwicyIsImJQYXJhbUNvdW50IiwiYUxpdGVyYWxDb3VudCIsImJMaXRlcmFsQ291bnQiLCJyb3V0ZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJwYXJhbURlY29yYXRvcnMiLCJjb21wb3NlZCIsIkRCS2V5cyIsIkNPTVBPU0VEIiwiY29tcG9zZWRLZXlzIiwidW5pcXVlS2V5cyIsInNlcGFyYXRvciIsIm1ldGhvZERlY29yYXRvcnMiLCJub3JtYWxpemVkUGF0aCIsImNyZWF0ZVJlZ2lzdHJhdGlvbiIsImNyZWF0ZUNyZWF0ZUhhbmRsZXIiLCJjcmVhdGVDcmVhdGVEZWNvcmF0b3JzIiwiUmVzcG9uc2UiLCJwYXNzdGhyb3VnaCIsImNyZWF0ZUJ1bGtDcmVhdGVIYW5kbGVyIiwiYnVsa0NyZWF0ZURlY29yYXRvcnMiLCJjcmVhdGVCdWxrUmVhZEhhbmRsZXIiLCJidWxrUmVhZERlY29yYXRvcnMiLCJjcmVhdGVCdWxrVXBkYXRlSGFuZGxlciIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiY3JlYXRlQnVsa0RlbGV0ZUhhbmRsZXIiLCJidWxrRGVsZXRlRGVjb3JhdG9ycyIsImNyZWF0ZVJlYWRIYW5kbGVyIiwicmVhZERlY29yYXRvcnMiLCJjcmVhdGVVcGRhdGVIYW5kbGVyIiwidXBkYXRlRGVjb3JhdG9ycyIsImNyZWF0ZURlbGV0ZUhhbmRsZXIiLCJkZWxldGVEZWNvcmF0b3JzIiwiZmFsbGJhY2tTZWdtZW50cyIsImlzQWxsUGFyYW1zIiwiZXZlcnkiLCJmYWxsYmFja0FwaVByb3BzIiwic3VmZml4IiwiY3JlYXRlU3RhdGVtZW50SGFuZGxlciIsInN0YXRlbWVudERlY29yYXRvcnMiLCJQYXJhbSIsInN0YXRlbWVudFJvdXRlcyIsInN0YXRlbWVudEtleSIsInN0YXRlbWVudE1ldGhvZE5hbWUiLCJjcmVhdGVTdGF0ZW1lbnRTaG9ydGN1dEhhbmRsZXIiLCJzdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMiLCJzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyIsInF1ZXJ5TWV0aG9kIiwiY29tcGxleFF1ZXJ5UGFyYW1zIiwicGF0aFNlZ21lbnRzIiwia25vd25QcmVmaXhlcyIsInJvdXRlTWV0YWRhdGEiLCJtYXRjaGVkRW50cnkiLCJmaW5kIiwiYWN0dWFsTWV0aG9kTmFtZSIsInBhcmFtU2VnbWVudHMiLCJjcmVhdGVDdXN0b21Sb3V0ZUhhbmRsZXIiLCJmaXJzdFNlZ21lbnQiLCJzZWdtZW50cyIsInNlZyIsImkiLCJyZXNwIiwibG9nQ3R4IiwiY3JlYXRlZCIsImNyZWF0ZUFsbCIsInJlYWRBbGwiLCJpZHMiLCJub3JtYWxpemVkSWRzIiwicmVhZCIsInVwZGF0ZUFsbCIsInVwZGF0ZWQiLCJkZWxldGVBbGwiLCJyb3V0ZVBhcmFtcyIsImlkIiwiVmFsaWRhdGlvbkVycm9yIiwicmVhZFJlc3VsdCIsInVwZGF0ZSIsInBheWxvYWQiLCJwYXJzZSIsInJlbW92ZSIsImRlbCIsImRlbGV0ZSIsImRldGFpbHMiLCJTVEFURU1FTlQiLCJwYXJzZUludCIsInBhdGhEaXJlY3Rpb24iLCJyZXNvbHZlZERpcmVjdGlvbiIsInN0YXRlbWVudFNob3J0Y3V0IiwibGlzdEJ5IiwicGFnZSIsInBhZ2luYXRlQnkiLCJBU0MiLCJyZWYiLCJmaW5kT25lQnkiLCJmaW5kQnkiLCJmaWVsZCIsImNvbXBsZXhRdWVyeSIsInNwcmVhZEFyZ3MiLCJleHRyYWN0UXVlcnlBcmdzIiwiY3VzdG9tUm91dGUiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsIkFwaUJvZHkiLCJBcGlDcmVhdGVkUmVzcG9uc2UiLCJzY2hlbWEiLCJnZXRTY2hlbWFQYXRoIiwiQXBpQmFkUmVxdWVzdFJlc3BvbnNlIiwiQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlIiwiQXBpTm90Rm91bmRSZXNwb25zZSIsImJhc2UiLCJnZXRNb2R1bGVGb3IiLCJEZWNhZk1vZGVsTW9kdWxlIiwiRGVjYWZNb2RlbE1vZHVsZV8xIiwiY3JlYXRlTW9kZWxTZXJ2aWNlcyIsIm1vZGVscyIsInVzZUZhY3RvcnkiLCJpc0V4cG9zZWQiLCJleHBvc3VyZSIsInRyYWNrZWRNb2RlbHMiLCJjb250cm9sbGVyRXhwb3N1cmUiLCJtb2RlbFNlcnZpY2VzIiwiYXV0b1NlcnZpY2VzIiwiYWdncmVnYXRpb25zIiwiYWxsb3dHcm91cGluZ1F1ZXJpZXMiLCJjb250cm9sbGVycyIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJTkpFQ1RBQkxFIiwiZXh0ZW5kIiwibmVzdEluamVjdGFibGUiLCJjYXRlZ29yeSIsImNmZyIsIkRlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyIsInNpbmdsZXRvbiIsIkRFRkFVTFQiLCJkdXJhYmxlIiwiSU5KRUNUIiwibmVzdEluamVjdCIsImlubmVyTmVzdEluamVjdCIsIk1BWCIsIm1heERlYyIsIm1heCIsIm1heGltdW0iLCJNSU4iLCJtaW5EZWMiLCJtaW4iLCJtaW5pbXVtIiwiTUFYX0xFTkdUSCIsIm1heExlbmd0aERlYyIsIm1heExlbmd0aCIsIk1JTl9MRU5HVEgiLCJtaW5MZW5ndGhEZWMiLCJtaW5MZW5ndGgiLCJUWVBFIiwidHlwZURlYyIsIkRBVEUiLCJkYXRlRGVjIiwiZm9ybWF0IiwiRU5VTSIsIm9wdGlvbkRlYyIsIlBBVFRFUk4iLCJwYXR0ZXJuRGVjIiwicGF0IiwicGF0dGVybiIsInNvdXJjZSIsIkNPTFVNTiIsImNvbHVtbkRlYyIsIkRlY29yYXRpb25LZXlzIiwiREVTQ1JJUFRJT04iLCJkZXNjcmlwdGlvbkRlYyIsIkFVVEgiLCJDb3JzRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIm1zZyIsIlRvTWFueVJlcXVlc3RzRXJyb3IiLCJCYXNlRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIlVuc3VwcG9ydGVkRXJyb3IiLCJOb3RBY2NlcHRhYmxlRXhjZXB0aW9uIiwibWVzc2FnZSIsImdldFN0YXR1cyIsInN0YXR1cyIsImNvZGUiLCJqc29uIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiQ2F0Y2giLCJVc2VEZWNhZkZpbHRlciIsIlVzZUZpbHRlcnMiLCJVc2VEZWNhZkhlYWRlcnMiLCJTV0FHR0VSX1VJX0NPTlNUQU5UUyIsInRpdGxlIiwidmVyc2lvbiIsImZhdmljb25GaWxlUGF0aCIsInRvcGJhckljb25GaWxlUGF0aCIsInNjaGVtZSIsImJlYXJlckZvcm1hdCIsImluIiwicGVyc2lzdEF1dGhvcml6YXRpb24iLCJ0b3BiYXJCZ0NvbG9yIiwiU3dhZ2dlckN1c3RvbVVJIiwiY3VzdG9tQ1NTIiwiY3NzIiwidG9wYmFySWNvblBhdGgiLCJpbWciLCJiNjQiLCJnZXRDdXN0b21PcHRpb25zIiwiZmF2aWNvbiIsImZhdmljb25QYXRoIiwiY3VzdG9tU2l0ZVRpdGxlIiwiY3VzdG9tQ3NzIiwic3dhZ2dlck9wdGlvbnMiLCJmaWxlIiwiZmlsZVBhdGgiLCJhc3NldHNQYXRoIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJTd2FnZ2VyQnVpbGRlciIsImFwcCIsImNyZWF0ZURvY3VtZW50Iiwib3BlbkFwaUpzb25QYXRoIiwib3BlbkFwaVlhbWxQYXRoIiwiRG9jdW1lbnRCdWlsZGVyIiwic2V0VGl0bGUiLCJzZXREZXNjcmlwdGlvbiIsInNldFZlcnNpb24iLCJhZGRCZWFyZXJBdXRoIiwiU3dhZ2dlck1vZHVsZSIsInJlZ2lzdGVyT3BlbkFwaVJvdXRlIiwiY29udGVudFR5cGUiLCJib2R5RmFjdG9yeSIsImh0dHBBZGFwdGVyIiwiZ2V0SHR0cEFkYXB0ZXIiLCJfcmVxIiwicmVwbHkiLCJzZXR1cFN3YWdnZXIiLCJkb2N1bWVudCIsInN3YWdnZXJVSSIsInNldHVwIiwianNvbkRvY3VtZW50VXJsIiwieWFtbERvY3VtZW50VXJsIiwiWUFNTCIsIk5lc3RCb290c3RyYXBlciIsIl9sb2dnZXIiLCJMb2dnZXIiLCJpbml0aWFsaXplIiwiZW5hYmxlTG9nZ2VyIiwiY3VzdG9tTG9nZ2VyIiwidXNlTG9nZ2VyIiwiZW5hYmxlQ29ycyIsIm9yaWdpbnMiLCJhbGxvd01ldGhvZHMiLCJhbGxvd2VkT3JpZ2lucyIsIm8iLCJ0b0xvd2VyQ2FzZSIsImNvcnNPcHRpb25zIiwib3JpZ2luIiwiY2FsbGJhY2siLCJjcmVkZW50aWFscyIsIm1ldGhvZHMiLCJ1c2VIZWxtZXQiLCJoZWxtZXQiLCJyZXF1aXJlIiwidXNlIiwid2FybiIsInN3YWdnZXIiLCJ1c2VHbG9iYWxQaXBlcyIsInBpcGVzIiwidXNlR2xvYmFsRmlsdGVycyIsImZpbHRlcnMiLCJ1c2VHbG9iYWxJbnRlcmNlcHRvcnMiLCJpbnRlcmNlcHRvcnMiLCJzdGFydCIsInBvcnQiLCJwcm9jZXNzIiwiUE9SVCIsImxpc3RlbiIsInRoZW4iLCJnZXRVcmwiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IiLCJEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3JfMSIsImV4ZWN1dG9yIiwiY29udGV4dHVhbGl6ZSIsImZsYWdzIiwiaXAiLCJleHRyYWN0SXAiLCJEZWZhdWx0QWRhcHRlckZsYWdzIiwib3BlcmF0aW9uIiwicGFyc2VJcEhlYWRlciIsImNhbmRpZGF0ZSIsInBlbmRpbmdQcm92aWRlcnMiLCJnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMiLCJyZWdpc3RlclByb3ZpZGVyIiwidG9rZW4iLCJpc01vZGVsQ29uc3RydWN0b3IiLCJtb2RlbFNlcnZpY2VUb2tlbiIsIm1vZGVsUmVwb3NpdG9yeVRva2VuIiwicGFyYW1ldGVySW5kZXgiLCJyZXNvbHZlZCIsInBhcmFtVHlwZXMiLCJhc01vZGVsIiwiaW5qZWN0YWJsZVNlcnZpY2VLZXkiLCJDb3JlU2VydmljZSIsIkNvcmVSZXBvc2l0b3J5IiwiRGVjYWZDb3JlTW9kdWxlIiwiRGVjYWZDb3JlTW9kdWxlXzEiLCJtb2R1bGVSZWYiLCJkZWNhZlByb3ZpZGVycyIsInVzZVZhbHVlIiwiY2xpZW50IiwiSCIsInByb3ZpZGVyIiwiYm9vdFBlcnNpc3RlbmNlIiwidHJpbW1lZCIsImNvbmYiLCJjb250ciIsInBvc3NpYmxlIiwiUGVyc2lzdGVuY2VTZXJ2aWNlIiwiYm9vdCIsImNsaWVudHMiLCJjIiwicG9zc2libGVUcmFuc2YiLCJyZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIiLCJpbml0aWFsaXphdGlvbiIsIm9uQXBwbGljYXRpb25TaHV0ZG93biIsImFkYXB0ZXJzIiwic2h1dGRvd24iLCJHbG9iYWwiLCJNb2R1bGVSZWYiLCJMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMiLCJub3JtYWxpemVFdmVudFJlc3BvbnNlIiwibW9kZWxDb25zdHIiLCJzZXJpYWxpemVkUGF5bG9hZCIsInNlcmlhbGl6ZSIsImNvbnNvbGUiLCJlcnIiLCJFdmVudHNDb250cm9sbGVyIiwiRXZlbnRzQ29udHJvbGxlcl8xIiwiZXZlbnRzJCIsIk9ic2VydmFibGUiLCJvYnNlcnZlciIsIm9ic2VydmVySWQiLCJNYXRoIiwicmFuZG9tIiwidG9VcHBlckNhc2UiLCJjYiIsInJlZnJlc2giLCJQcm9taXNlIiwicmVzb2x2ZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFPLE1BQU1BLG9CQUFvQjs7QUFDMUIsTUFBTUMsYUFBYTtJQUN4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
|