@decaf-ts/for-nest 0.11.2-refactor.5 → 0.11.2-refactor.7
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 +49 -8
- package/dist/for-nest.js +53 -11
- package/lib/cjs/factory/NestBootstraper.cjs +11 -3
- package/lib/cjs/factory/exceptions/DecafErrorFilter.cjs +106 -7
- package/lib/cjs/factory/exceptions/decorators.cjs +5 -2
- package/lib/cjs/index.cjs +3 -3
- package/lib/esm/factory/NestBootstraper.js +10 -2
- package/lib/esm/factory/exceptions/DecafErrorFilter.js +106 -8
- package/lib/esm/factory/exceptions/decorators.js +4 -1
- package/lib/esm/index.js +3 -3
- package/lib/types/factory/NestBootstraper.d.cts +5 -0
- package/lib/types/factory/NestBootstraper.d.mts +5 -0
- package/lib/types/factory/exceptions/DecafErrorFilter.d.cts +33 -1
- package/lib/types/factory/exceptions/DecafErrorFilter.d.mts +33 -1
- package/lib/types/index.d.cts +3 -3
- package/lib/types/index.d.mts +3 -3
- package/package.json +1 -1
package/dist/for-nest.js
CHANGED
|
@@ -2,7 +2,7 @@ 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, Query, Module, Controller, Param, Response, NotFoundException, NotAcceptableException, Catch, UseFilters, Logger, Global, Sse } from "@nestjs/common";
|
|
5
|
+
import { Delete, Patch, Put, Post, Get, applyDecorators, createParamDecorator as createParamDecorator$1, InternalServerErrorException, Injectable, Scope, Inject, Optional, UseInterceptors, SetMetadata, Query, Module, Controller, Param, Response, UnauthorizedException, ForbiddenException, BadRequestException, ConflictException, UnprocessableEntityException, NotFoundException, NotAcceptableException, HttpException, Catch, UseFilters, Logger, Global, Sse } from "@nestjs/common";
|
|
6
6
|
|
|
7
7
|
import { Model, ValidationKeys, ModelBuilder } from "@decaf-ts/decorator-validation";
|
|
8
8
|
|
|
@@ -12,11 +12,11 @@ import { pickBy, negate, isUndefined as isUndefined$1, isArray, isString } from
|
|
|
12
12
|
|
|
13
13
|
import { ApiExcludeEndpoint, ApiParam, ApiBearerAuth, ApiSecurity, ApiQuery, ApiOperation, ApiOkResponse, ApiNoContentResponse, ApiTags, ApiExtraModels, ApiBody, ApiCreatedResponse, getSchemaPath, ApiBadRequestResponse, ApiUnprocessableEntityResponse, ApiNotFoundResponse, DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
|
|
14
14
|
|
|
15
|
-
import { OperationKeys, BulkCrudOperationKeys, BaseError, InternalError, DBKeys } from "@decaf-ts/db-decorators";
|
|
15
|
+
import { OperationKeys, BulkCrudOperationKeys, BaseError, InternalError, DBKeys, BadRequestError, ConflictError, ValidationError } from "@decaf-ts/db-decorators";
|
|
16
16
|
|
|
17
17
|
import { __decorate, __param, __metadata } from "tslib";
|
|
18
18
|
|
|
19
|
-
import { REQUEST, Reflector, APP_INTERCEPTOR, ModuleRef, RouterModule } from "@nestjs/core";
|
|
19
|
+
import { REQUEST, Reflector, APP_INTERCEPTOR, ContextIdFactory, ModuleRef, RouterModule } from "@nestjs/core";
|
|
20
20
|
|
|
21
21
|
import { Logging, toPascalCase, toKebabCase, LoggedEnvironment } from "@decaf-ts/logging";
|
|
22
22
|
|
|
@@ -1903,8 +1903,13 @@ class ToManyRequestsError extends BaseError {
|
|
|
1903
1903
|
}
|
|
1904
1904
|
}
|
|
1905
1905
|
|
|
1906
|
+
const HTTP_EXCEPTION_TO_DECAF_ERROR = new Map([ [ UnauthorizedException, msg => new AuthorizationError(msg) ], [ ForbiddenException, msg => new ForbiddenError(msg) ], [ BadRequestException, msg => new BadRequestError(msg) ], [ ConflictException, msg => new ConflictError(msg) ], [ UnprocessableEntityException, msg => new ValidationError(msg) ] ]);
|
|
1907
|
+
|
|
1906
1908
|
let DecafExceptionFilter = class DecafExceptionFilter {
|
|
1907
|
-
|
|
1909
|
+
constructor(moduleRef) {
|
|
1910
|
+
this.moduleRef = moduleRef;
|
|
1911
|
+
}
|
|
1912
|
+
async catch(exception, host) {
|
|
1908
1913
|
const ctx = host.switchToHttp();
|
|
1909
1914
|
const response = ctx.getResponse();
|
|
1910
1915
|
const request = ctx.getRequest();
|
|
@@ -1914,12 +1919,18 @@ let DecafExceptionFilter = class DecafExceptionFilter {
|
|
|
1914
1919
|
exception = new NotAcceptableException(exception.message);
|
|
1915
1920
|
statusCode = exception.getStatus();
|
|
1916
1921
|
} else if (!(exception instanceof BaseError)) {
|
|
1917
|
-
|
|
1922
|
+
const toDecafError = this.decafErrorFor(exception);
|
|
1923
|
+
if (toDecafError) {
|
|
1924
|
+
exception = toDecafError(exception.message);
|
|
1925
|
+
} else if (exception.status === 429) {
|
|
1918
1926
|
exception = new ToManyRequestsError(exception.message);
|
|
1927
|
+
} else if (exception instanceof HttpException) {
|
|
1928
|
+
statusCode = exception.getStatus();
|
|
1919
1929
|
} else {
|
|
1920
1930
|
exception = new InternalError(exception.message);
|
|
1921
1931
|
}
|
|
1922
1932
|
}
|
|
1933
|
+
await this.logError(request, exception);
|
|
1923
1934
|
response.status(exception.code || statusCode).json({
|
|
1924
1935
|
status: exception.code || statusCode,
|
|
1925
1936
|
error: isProduction ? exception.name : exception.message,
|
|
@@ -1928,9 +1939,38 @@ let DecafExceptionFilter = class DecafExceptionFilter {
|
|
|
1928
1939
|
method: request.method
|
|
1929
1940
|
});
|
|
1930
1941
|
}
|
|
1942
|
+
decafErrorFor(exception) {
|
|
1943
|
+
for (const [type, factory] of HTTP_EXCEPTION_TO_DECAF_ERROR) {
|
|
1944
|
+
if (exception instanceof type) return factory;
|
|
1945
|
+
}
|
|
1946
|
+
return undefined;
|
|
1947
|
+
}
|
|
1948
|
+
async logError(request, exception) {
|
|
1949
|
+
const message = `Unhandled error on ${request?.method} ${request?.url}`;
|
|
1950
|
+
try {
|
|
1951
|
+
const log = await this.resolveLogger(request);
|
|
1952
|
+
log.error(message, exception);
|
|
1953
|
+
} catch {
|
|
1954
|
+
try {
|
|
1955
|
+
Logging.get().error(message, exception);
|
|
1956
|
+
} catch {}
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
async resolveLogger(request) {
|
|
1960
|
+
if (this.moduleRef) {
|
|
1961
|
+
try {
|
|
1962
|
+
const contextId = ContextIdFactory.getByRequest(request);
|
|
1963
|
+
const requestContext = await this.moduleRef.resolve(DecafRequestContext, contextId, {
|
|
1964
|
+
strict: false
|
|
1965
|
+
});
|
|
1966
|
+
if (requestContext?.logger) return requestContext.logger;
|
|
1967
|
+
} catch {}
|
|
1968
|
+
}
|
|
1969
|
+
return Logging.get();
|
|
1970
|
+
}
|
|
1931
1971
|
};
|
|
1932
1972
|
|
|
1933
|
-
DecafExceptionFilter = __decorate([ Catch() ], DecafExceptionFilter);
|
|
1973
|
+
DecafExceptionFilter = __decorate([ Catch(), Injectable(), __param(0, Optional()), __metadata("design:paramtypes", [ ModuleRef ]) ], DecafExceptionFilter);
|
|
1934
1974
|
|
|
1935
1975
|
function UseDecafFilter() {
|
|
1936
1976
|
return UseFilters(new DecafExceptionFilter);
|
|
@@ -2103,7 +2143,9 @@ class NestBootstraper {
|
|
|
2103
2143
|
return this;
|
|
2104
2144
|
}
|
|
2105
2145
|
static useGlobalFilters(...filters) {
|
|
2106
|
-
this.app.useGlobalFilters(...filters.length > 0 ? filters : [ new DecafExceptionFilter
|
|
2146
|
+
this.app.useGlobalFilters(...filters.length > 0 ? filters : [ new DecafExceptionFilter(this.app.get(ModuleRef, {
|
|
2147
|
+
strict: false
|
|
2148
|
+
})) ]);
|
|
2107
2149
|
return this;
|
|
2108
2150
|
}
|
|
2109
2151
|
static useGlobalInterceptors(...interceptors) {
|
|
@@ -2505,11 +2547,11 @@ function repoForModel(model) {
|
|
|
2505
2547
|
return repo;
|
|
2506
2548
|
}
|
|
2507
2549
|
|
|
2508
|
-
const VERSION = "0.11.2-refactor.
|
|
2550
|
+
const VERSION = "0.11.2-refactor.7";
|
|
2509
2551
|
|
|
2510
|
-
const COMMIT = "
|
|
2552
|
+
const COMMIT = "42895ce";
|
|
2511
2553
|
|
|
2512
|
-
const FULL_VERSION = "0.11.2-refactor.
|
|
2554
|
+
const FULL_VERSION = "0.11.2-refactor.7-42895ce";
|
|
2513
2555
|
|
|
2514
2556
|
const PACKAGE_NAME = "@decaf-ts/for-nest";
|
|
2515
2557
|
|
|
@@ -2520,4 +2562,4 @@ Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
|
2520
2562
|
Metadata.allowReregistration(false);
|
|
2521
2563
|
|
|
2522
2564
|
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 };
|
|
2523
|
-
//# 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/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaUV4Y2x1ZGVFbmRwb2ludCB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgQ3J1ZE9wZXJhdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlbGV0ZSwgR2V0LCBQYXRjaCwgUG9zdCwgUHV0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5cbmltcG9ydCB7IGlzT3BlcmF0aW9uQmxvY2tlZCBhcyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQcmVwYXJlZFN0YXRlbWVudEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgYSBnaXZlbiBDUlVEIG9wZXJhdGlvbiBpcyBibG9ja2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNvbnN0cnVjdG9yLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBvcGVyYXRpb24tYmxvY2tpbmcgaGFuZGxlciBtZXRhZGF0YSBzdG9yZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9yICh1bmRlciBgT3BlcmF0aW9uS2V5cy5SRUZMRUNUICsgT3BlcmF0aW9uS2V5cy5CTE9DS2ApLCBleGVjdXRlcyBpdCAoaWYgcHJlc2VudCkgd2l0aCBpdHMgcGVyc2lzdGVkIGFyZ3VtZW50cyBwbHVzIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZC4gSWYgbm8gaGFuZGxlciBleGlzdHMsIHRoZSBvcGVyYXRpb24gaXMgY29uc2lkZXJlZCBhbGxvd2VkIChyZXR1cm5zIGBmYWxzZWApLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgdGFyZ2V0IG1vZGVsIGNvbnN0cnVjdG9yIHdob3NlIG1ldGFkYXRhIG1heSBpbmNsdWRlIGEgYmxvY2tpbmcgaGFuZGxlci5cbiAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IG9wIC0gVGhlIENSVUQgb3BlcmF0aW9uIHRvIGV2YWx1YXRlIChlLmcuLCBgT3BlcmF0aW9uS2V5cy5DUkVBVEVgLCBgT3BlcmF0aW9uS2V5cy5SRUFEYCwgYE9wZXJhdGlvbktleXMuVVBEQVRFYCwgYE9wZXJhdGlvbktleXMuREVMRVRFYCkuXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGV4cGxpY2l0bHkgYmxvY2tlZCBieSB0aGUgbW9kZWwncyBoYW5kbGVyOyBvdGhlcndpc2UgYGZhbHNlYC5cbiAqIEBmdW5jdGlvbiBpc09wZXJhdGlvbkJsb2NrZWRcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZGl0aW9uYWxseSBhcHBsaWVzIGFuIEhUVFAgbWV0aG9kIGRlY29yYXRvciBmb3IgYSBnaXZlbiBtb2RlbCBhbmQgdmVyYiwgaGlkaW5nIHRoZSBlbmRwb2ludCBpbiBTd2FnZ2VyIChhbmQgbm90IHJlZ2lzdGVyaW5nIHRoZSByb3V0ZSkgd2hlbiB0aGUgbW9kZWwgYmxvY2tzIHRoYXQgQ1JVRCBvcGVyYXRpb24uXG4gKiBAc3VtbWFyeSBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBgQ3J1ZE9wZXJhdGlvbnNgIGtleSBhbmQgTmVzdCBIVFRQIGRlY29yYXRvciAoYEBHZXRgLCBgQFBvc3RgLCBldGMuKS4gSXQgY2hlY2tzIGBpc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKWAgYW5kLCBpZiBibG9ja2VkLCBhcHBsaWVzIG9ubHkgYEBBcGlFeGNsdWRlRW5kcG9pbnQoKWAgKFN3YWdnZXItaGlkZGVuLCBubyBOZXN0IHJvdXRlKS4gSWYgcGVybWl0dGVkLCBpdCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBIVFRQIGRlY29yYXRvciB3aXRoIHRoZSBvcHRpb25hbCBgcGF0aGAuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIHJlc29sdmUgb3BlcmF0aW9uLWJsb2NraW5nIHJ1bGVzLlxuICogQHBhcmFtIHtIdHRwVmVyYnN9IHZlcmIgLSBUaGUgSFRUUCB2ZXJiIHRvIG1hcCAoZS5nLiwgYFwiR0VUXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcm91dGUgcGF0aCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29ycmVzcG9uZGluZyBOZXN0IEhUVFAgbWV0aG9kIGRlY29yYXRvci5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgZWl0aGVyIGV4Y2x1ZGVzIHRoZSBlbmRwb2ludCBmcm9tIFN3YWdnZXIgKGFuZCByb3V0ZSByZWdpc3RyYXRpb24pIG9yIGFwcGxpZXMgdGhlIGNvcnJlY3QgSFRUUCBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtDcnVkT3BlcmF0aW9ucywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtPcGVyYXRpb25LZXlzLlJFQUQsIEdldF0sXG4gICAgUE9TVDogW09wZXJhdGlvbktleXMuQ1JFQVRFLCBQb3N0XSxcbiAgICBQVVQ6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUHV0XSxcbiAgICBQQVRDSDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbT3BlcmF0aW9uS2V5cy5ERUxFVEUsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlQmxvY2tUYXJnZXQodmVyYiwgcGF0aCk7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgdGFyZ2V0LmtpbmQgYXMgYW55LCB0YXJnZXQudmFsdWUpXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKVxuICAgIDogY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTpcbiAgfCB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmZ1bmN0aW9uIHRvRGVjYWZFcnJvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmNsaWVudENvbnRleHQudG9PdmVycmlkZXMoKTtcblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUob3ZlcnJpZGVzKVxuICAgICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlLmZvcihvdmVycmlkZXMpXG4gICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkdG9DYWNoZSA9IG5ldyBNYXA8XG4gIE9wZXJhdGlvbktleXMsXG4gIFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj5cbj4oKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBOZXN0L1N3YWdnZXIgRFRPIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIENSVUQgb3BlcmF0aW9uLlxuICpcbiAqIFJ1bGVzOlxuICogIC0gT25seSBDUkVBVEUgYW5kIFVQREFURSAoYW5kIHRoZWlyIGJ1bGsgdmFyaWFudHMpIHByb2R1Y2UgYSBEVE87XG4gKiAgICBhbGwgb3RoZXIgb3BlcmF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIG1vZGVsIGNsYXNzIHVuY2hhbmdlZC5cbiAqICAtIEBnZW5lcmF0ZWQoKSBwcm9wZXJ0aWVzIChjcmVhdGVkQXQsIHVwZGF0ZWRBdCwgY3JlYXRlZEJ5LCB1cGRhdGVkQnksXG4gKiAgICB1dWlkLCB2ZXJzaW9uLCBAY29tcG9zZWQgcGtzLCDigKYpIGFyZSAqKm5ldmVyKiogZXhwb3NlZCBpbiBhbnkgRFRPLlxuICogIC0gVGhlIEBwaygpIHByb3BlcnR5OlxuICogICAgICDigKIgVVBEQVRFIOKAkyBhbHdheXMgaW5jbHVkZWQuXG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBpbmNsdWRlZCBvbmx5IHdoZW4gdGhlIHBrIGlzIE5PVCBhdXRvLWdlbmVyYXRlZFxuICogICAgICAgICAgICAgICAgICAoY2hlY2tlZCB2aWEgTW9kZWwucGtQcm9wcygpLmdlbmVyYXRlZCBBTkQgTW9kZWwuZ2VuZXJhdGVkKCkpLlxuICogIC0gUmVsYXRpb24gcHJvcGVydGllcyAoQG9uZVRvT25lLCBAb25lVG9NYW55LCDigKYpOlxuICogICAgICDigKIgQ1JFQVRFICDigJMgbmVzdGVkIGFzIER0b0ZvcihDUkVBVEUsIFJlbGF0ZWRNb2RlbCkuIFdoZW4gdGhlIHJlbGF0aW9uXG4gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgKG1vZGVsIEEg4oaSIG1vZGVsIEIg4oaSIG1vZGVsIEEpLFxuICogICAgICAgICAgICAgICAgICB0aGUgYmFjay1yZWZlcmVuY2UgdXNlcyB0aGUgcmVsYXRlZCBtb2RlbCdzIFBLIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVhayB0aGUgY3ljbGUuXG4gKiAgICAgIOKAoiBVUERBVEUgIOKAkyB1bmlvbiBvZiBEdG9Gb3IoVVBEQVRFLCBSZWxhdGVkTW9kZWwpICoqb3IqKiB0aGVcbiAqICAgICAgICAgICAgICAgICAgcmVsYXRlZCBtb2RlbCdzIHByaW1hcnkta2V5IHR5cGUgKHN0cmluZyAvIGludGVnZXIpLFxuICogICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBTd2FnZ2VyIG9uZU9mLiBDaXJjdWxhciBiYWNrLXJlZmVyZW5jZXNcbiAqICAgICAgICAgICAgICAgICAgb21pdCB0aGUgRFRPICRyZWYgYW5kIG9ubHkgaW5jbHVkZSB0aGUgUEsgdHlwZS5cbiAqXG4gKiBNZXRhZGF0YS5wcm9wZXJ0aWVzKCkgbm93IHJldHVybnMgQUxMIHByb3BlcnRpZXMgYWNyb3NzIHRoZSBwcm90b3R5cGUgY2hhaW4sXG4gKiBzbyBEVE8gaW5oZXJpdGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZXZlcnkgRFRPIGlzIGEgZmxhdCBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIER0b0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBzdGFjazogU2V0PENvbnN0cnVjdG9yPGFueT4+ID0gbmV3IFNldCgpXG4pOiBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgaWYgKCFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMuaW5jbHVkZXMob3ApKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXREdG9DYWNoZShvcCk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtb2RlbCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgaXNVcGRhdGVPcCA9IFtcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgXS5pbmNsdWRlcyhvcCBhcyBhbnkpO1xuXG4gIGNsYXNzIER5bmFtaWNEVE8ge31cbiAgY2FjaGUuc2V0KG1vZGVsLCBEeW5hbWljRFRPKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTywgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYCR7dG9QYXNjYWxDYXNlKG1vZGVsLm5hbWUpfSR7dG9QYXNjYWxDYXNlKG9wKX1EVE9gLFxuICB9KTtcblxuICBjb25zdCBwa1Byb3AgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTW9kZWwucGsobW9kZWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gcGtQcm9wID8gTW9kZWwucGtQcm9wcyhtb2RlbCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa0Rlc2lnblR5cGUgPSBwa1Byb3BcbiAgICA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHBrUHJvcCBhcyBzdHJpbmcpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrVHlwZUlzTnVtZXJpYyA9XG4gICAgcGtEZXNpZ25UeXBlID09PSBOdW1iZXIgfHwgcGtEZXNpZ25UeXBlID09PSBCaWdJbnQ7XG4gIGNvbnN0IHBrSXNHZW5lcmF0ZWQgPVxuICAgICEhcGtQcm9wc01ldGFkYXRhPy5nZW5lcmF0ZWQgfHxcbiAgICAocGtQcm9wXG4gICAgICA/IE1vZGVsLmdlbmVyYXRlZEJ5U2VxdWVuY2UobW9kZWwgYXMgYW55LCBwa1Byb3AgYXMgYW55KSB8fFxuICAgICAgICBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHBrUHJvcCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHBrVHlwZUlzTnVtZXJpY1xuICAgICAgOiBmYWxzZSk7XG5cbiAgY29uc3QgYWxsUHJvcHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoTWV0YWRhdGEucHJvcGVydGllcyhtb2RlbCkgfHwgW10pKTtcbiAgY29uc3QgcmVsYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KChNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gIGNvbnN0IHNjYWxhclByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBhbGxQcm9wcykge1xuICAgIGlmICghcHJvcCkgY29udGludWU7XG4gICAgaWYgKHJlbGF0aW9ucy5oYXMocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByb3AgPT09IHBrUHJvcCAmJiAhaXNVcGRhdGVPcCAmJiBwa0lzR2VuZXJhdGVkKSBjb250aW51ZTtcbiAgICBpZiAocHJvcCAhPT0gcGtQcm9wICYmIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHNjYWxhclByb3BzLnB1c2gocHJvcCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGFyUHJvcHMpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISF2YWxpZGF0aW9uPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuICAgIGNvbnN0IHR5cGVIaW50ID1cbiAgICAgIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkgPz9cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgfTtcbiAgICBpZiAodHlwZUhpbnQpIGFwaU9wdGlvbnMudHlwZSA9IHR5cGVIaW50O1xuXG4gICAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKSA/PyB0eXBlSGludDtcbiAgICBpZiAodHlwZW9mIGRlc2lnblR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgZGVzaWduVHlwZSxcbiAgICAgICAgRHluYW1pY0RUTy5wcm90b3R5cGUsXG4gICAgICAgIHByb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSBNZXRhZGF0YS5yZWxhdGlvbnMobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgaWYgKCFyZWxhdGlvbk1ldGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNZXRhZGF0YSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9XG4gICAgICByZWxhdGlvbk1ldGEuY2xhc3MgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICBpZiAodHlwZW9mIHJlbGF0aW9uVHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICFyZWxhdGlvblR5cGUubmFtZSkge1xuICAgICAgcmVsYXRpb25UeXBlID0gKHJlbGF0aW9uVHlwZSBhcyBhbnkpKCk7XG4gICAgfVxuICAgIGlmICghcmVsYXRpb25UeXBlIHx8IHR5cGVvZiByZWxhdGlvblR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFR5cGUgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoIU1vZGVsLmdldChyZWxhdGlvblR5cGUubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGNvbnN0IGlzQXJyYXkgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5MSVNUXTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuXG4gICAgLy8gRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZTogaWYgdGhlIHJlbGF0ZWQgbW9kZWwgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAvLyByZWN1cnNpb24gc3RhY2ssIHVzZSB0aGUgUEsgdHlwZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVha1xuICAgIC8vIHRoZSBjeWNsZS4gVGhpcyBwcmV2ZW50cyBAbmVzdGpzL3N3YWdnZXIncyBTY2hlbWFPYmplY3RGYWN0b3J5IGZyb21cbiAgICAvLyBpbmZpbml0ZWx5IHJlY3Vyc2luZyB3aGVuIGV4cGxvcmluZyB0aGUgc2NoZW1hcy5cbiAgICBjb25zdCBpc0NpcmN1bGFyID0gc3RhY2suaGFzKHJlbGF0aW9uVHlwZSk7XG5cbiAgICBpZiAoaXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgICAgIGFkZFJlbGF0aW9uUGtSZWYoRHluYW1pY0RUTywgcmVsYXRpb24sIHBrVHlwZU5hbWUsIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25EdG8gPSBEdG9Gb3Iob3AsIHJlbGF0aW9uVHlwZSwgbmV3IFNldChzdGFjaykuYWRkKG1vZGVsKSk7XG5cbiAgICBpZiAoaXNVcGRhdGVPcCkge1xuICAgICAgYWRkUmVsYXRpb25VcGRhdGUoXG4gICAgICAgIER5bmFtaWNEVE8sXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICByZWxhdGlvblR5cGUsXG4gICAgICAgIHJlbGF0aW9uRHRvLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBpc1JlcXVpcmVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRSZWxhdGlvbihEeW5hbWljRFRPLCByZWxhdGlvbiwgcmVsYXRpb25EdG8sIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEeW5hbWljRFRPO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvbihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICB0eXBlOiByZWxhdGlvbkR0byxcbiAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICBpc0FycmF5LFxuICB9O1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogcmVsYXRpb25EdG8sXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHJlbGF0aW9uIHByb3BlcnR5IHRoYXQgdXNlcyB0aGUgUEsgdHlwZSAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2ZcbiAqIGEgZnVsbCBEVE8gY2xhc3MuIFVzZWQgdG8gYnJlYWsgY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBDdXN0b21lciDihpIgT3JkZXIg4oaSIEN1c3RvbWVyKS5cbiAqL1xuZnVuY3Rpb24gYWRkUmVsYXRpb25Qa1JlZihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcGtUeXBlTmFtZTogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBwa1R5cGVOYW1lIH0sIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogcGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcsIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IChwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZyksXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uVXBkYXRlKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4sXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBleHRyYU1vZGVscyA9XG4gICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsIER0b0NsYXNzKSB8fCBbXTtcbiAgaWYgKCFleHRyYU1vZGVscy5pbmNsdWRlcyhyZWxhdGlvbkR0bykpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLFxuICAgICAgWy4uLmV4dHJhTW9kZWxzLCByZWxhdGlvbkR0b10sXG4gICAgICBEdG9DbGFzc1xuICAgICk7XG4gIH1cblxuICBjb25zdCBkdG9SZWYgPSBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHtyZWxhdGlvbkR0by5uYW1lfWA7XG4gIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gIGNvbnN0IG9uZU9mSXRlbXMgPSBbeyAkcmVmOiBkdG9SZWYgfSwgeyB0eXBlOiBwa1R5cGVOYW1lIH1dO1xuXG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpO1xuXG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiBPYmplY3QsXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBNb2RlbC5wa1Byb3BzKHJlbGF0aW9uVHlwZSBhcyBhbnkpO1xuICAgIGNvbnN0IHBrVHlwZSA9IHBrUHJvcHNNZXRhZGF0YT8udHlwZTtcbiAgICBpZiAocGtUeXBlID09PSBOdW1iZXIgfHwgcGtUeXBlID09PSBCaWdJbnQpIHJldHVybiBcImludGVnZXJcIjtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBpZiAoTW9kZWwuZ2VuZXJhdGVkKGN1cnJlbnQsIHByb3AgYXMgYW55KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IoY3VycmVudCwgcHJvcCBhcyBhbnkpO1xuICAgIGlmICh2YWxpZGF0aW9uKSByZXR1cm4gdmFsaWRhdGlvbiBhcyBhbnk7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZyk6IGFueSB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoY3VycmVudCwgcHJvcCk7XG4gICAgaWYgKHR5cGUpIHJldHVybiB0eXBlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RHRvQ2FjaGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzXG4pOiBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+IHtcbiAgaWYgKCFkdG9DYWNoZS5oYXMob3ApKSB7XG4gICAgZHRvQ2FjaGUuc2V0KG9wLCBuZXcgV2Vha01hcCgpKTtcbiAgfVxuICByZXR1cm4gZHRvQ2FjaGUuZ2V0KG9wKSE7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnRyb2xsZXIsXG4gIFBhcmFtLFxuICBRdWVyeSxcbiAgUmVzcG9uc2UsXG4gIFNldE1ldGFkYXRhLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFwaUJhZFJlcXVlc3RSZXNwb25zZSxcbiAgQXBpQm9keSxcbiAgQXBpQ3JlYXRlZFJlc3BvbnNlLFxuICBBcGlFeHRyYU1vZGVscyxcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICB0eXBlIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwsXG4gIEFwaVBhcmFtc0Zyb21Nb2RlbCxcbiAgdHlwZSBEZWNhZkFwaVByb3BlcnR5LFxuICBEZWNhZkJvZHksXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyB0b0RlY2FmRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmdcbiAgKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgOiBmYWxsYmFja01lc3NhZ2VcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldFBlcnNpc3RlbmNlPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxUPj4oTW9kZWxDbGF6eik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKE1vZGVsQ2xhenopIGFzIE1vZGVsU2VydmljZTxUPjtcbiAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKE1vZGVsQ2xhenopIGFzIFJlcG88VD47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgICBwcmVmaXg6IHN0cmluZyA9IFBlcnNpc3RlbmNlS2V5cy5RVUVSWVxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IHJlcG86IFJlcG88VD4gPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG4gICAgY29uc3QgcXVlcnlNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCB7IGZpZWxkcz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH0+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcmVwby5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KFBlcnNpc3RlbmNlS2V5cy5RVUVSWSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjb25zdCByb3V0ZU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICBwZXJzaXN0ZW5jZS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNsYXNzIFF1ZXJ5Q29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBwYXJhbXNdIG9mIE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwYXJhbXMucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudDogc3RyaW5nKSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBoYW5kbGVyKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IocGFyYW1zLmh0dHBNZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgcm91dGVQYXRoIHx8IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBwYXJhbXMuaHR0cE1ldGhvZFxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIGhhbmRsZXIpO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykoXG4gICAgICAgIHJvdXRlUGF0aCB8fCB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qge1xuICAgICAgZ2V0UEssXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgcGF0aDogcGtQYXRoLFxuICAgIH0gPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudCkgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPVxuICAgICAgICAgIHJvdXRlLmltcGxlbWVudGF0aW9uPy5uYW1lIHx8IHJvdXRlLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1ldGhvZE5hbWU6IHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICBwYXJhbURlY29yYXRvcnMsXG4gICAgICAgIH0gPSByZWdpc3RyYXRpb247XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlclxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3Iocm91dGUubWV0aG9kIGFzIEh0dHBWZXJicykoXG4gICAgICAgICAgICByb3V0ZS5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc10sXG4gICAgICAgICAgICBwYXJhbURlY29yYXRvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgYXMgYW55O1xuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdO1xuICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoTW9kZWxDbGF6eikgYXMga2V5b2YgTW9kZWw8YW55PjtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ2xhenosXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLkNPTVBPU0VELCBwaylcbiAgICApO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5cyA9IGNvbXBvc2VkPy5hcmdzID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9XG4gICAgICBBcnJheS5pc0FycmF5KGNvbXBvc2VkS2V5cykgJiYgY29tcG9zZWRLZXlzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmNvbXBvc2VkS2V5c10pKVxuICAgICAgICA6IEFycmF5LmZyb20obmV3IFNldChbcGtdKSk7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenopID8/IFwiXCI7XG4gICAgY29uc3QgcGF0aCA9IGA6JHt1bmlxdWVLZXlzLmpvaW4oXCIvOlwiKX1gO1xuICAgIGNvbnN0IGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSA9IHVuaXF1ZUtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgZGVzY3JpcHRpb246IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenosIGtleSksXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT5cbiAgICAgICAgY29tcG9zZWQ/LnNlcGFyYXRvciA/IHBhcmFtcy5qb2luKGNvbXBvc2VkLnNlcGFyYXRvcikgOiBwYXJhbXMuam9pbihcIlwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcm91dGVQYXJhbURlY29yYXRvcnMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGxldCBwYXJhbUluZGV4ID0gMDtcbiAgICByZXR1cm4gcGF0aFxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZsYXRNYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIipcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWZpbmVNZXRob2QoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgIH0+ID0gW11cbiAgKSB7XG4gICAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG1ldGhvZE5hbWUpO1xuICAgIG1ldGhvZERlY29yYXRvcnMuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICAgIHBhcmFtRGVjb3JhdG9ycy5mb3JFYWNoKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT5cbiAgICAgIGRlY29yYXRvcihwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoUm91dGUoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlOiBTZXJ2ZXJSb3V0ZSxcbiAgICBwa1BhdGg6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6XG4gICAgfCB7XG4gICAgICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAgICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgICAgIGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yO1xuICAgICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbiBhcyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZEFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtSZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXNcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBwa1BhdGhcbiAgICAgICAgKSxcbiAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZWQgUEsgZmFsbGJhY2sgcm91dGVzIChmaWx0ZXJFbXB0eSkg4oCUIHBhdGggZGlmZmVycyBmcm9tIHBrUGF0aFxuICAgIGNvbnN0IGZhbGxiYWNrU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGlzQWxsUGFyYW1zID1cbiAgICAgIGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGByZWFkQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgICBmYWxsYmFja0FwaVByb3BzLFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICAgIGRlY29yYXRvcixcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgZGVsZXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJmaW5kT25lQnlcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgIHN0YXRlbWVudEtleVxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXnF1ZXJ5XFwvLywgXCJcIikuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIixcbiAgICAgIFwiZmluZEJ5XCIsXG4gICAgICBcImZpbmRCeVBhZ2luYXRlXCIsXG4gICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIixcbiAgICAgIFwicGFnZVwiLFxuICAgICAgXCJjb3VudE9mXCIsXG4gICAgICBcIm1heE9mXCIsXG4gICAgICBcIm1pbk9mXCIsXG4gICAgICBcImF2Z09mXCIsXG4gICAgICBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIixcbiAgICAgIFwiZ3JvdXBPZlwiLFxuICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgIFwiYnVsa1wiLFxuICAgICAgXCJxdWVyeVwiLFxuICAgIF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJzdGF0ZW1lbnQvXCIpICYmXG4gICAgICAha25vd25QcmVmaXhlcy5oYXMocGF0aFNlZ21lbnRzWzBdKVxuICAgICkge1xuICAgICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IHBhdGhTZWdtZW50c1xuICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBbXG4gICAgICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSkpLmZvcihcbiAgICAgICAgICBjb21wbGV4UXVlcnlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLm5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBlcnNpc3RlbmNlPy5yZXBvICYmXG4gICAgICAgICAgdHlwZW9mIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5xdWVyeSAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucXVlcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5xdWVyeShtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3QgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFtub3JtYWxpemVkLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdCB8fCB0eXBlb2YgbGFzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeU9iaiA9IGxhc3QgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBoYXNRdWVyeUZpZWxkcyA9XG4gICAgICBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWhhc1F1ZXJ5RmllbGRzKSB7XG4gICAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICBpZiAocXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgIGlmIChxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgIGlmIChxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5ib29rbWFyayk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcIm1ldGhvZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcImFyZ3NcIixcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gbGlzdGVkIGZvdW5kLmAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGJhc2U6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBhdGgpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJib29rbWFya1wiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJib29rbWFyayBmb3IgY3Vyc29yIHBhZ2luYXRpb25cIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBEaXN0aW5jdCB2YWx1ZXMgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICAgICAgdHlwZTogW1N0cmluZ10sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwXG4gICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFByb3ZpZGVyIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBNb2RlbFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZyb21Nb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi9Gcm9tTW9kZWxDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERFQ0FGX0VYUE9TRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVGb3IoZmxhdm91cjogc3RyaW5nKSB7XG4gIEBNb2R1bGUoe30pXG4gIGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICAgIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlLm5hbWUpLmZvcihmbGF2b3VyKTtcblxuICAgIHN0YXRpYyBjcmVhdGVNb2RlbFNlcnZpY2VzPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgICBtb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8VD5bXVxuICAgICk6IFByb3ZpZGVyW10ge1xuICAgICAgcmV0dXJuIG1vZGVscy5tYXAoKG1vZGVsKSA9PiAoe1xuICAgICAgICBwcm92aWRlOiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFeHBvc2VkKFxuICAgICAgbW9kZWw6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgIGV4cG9zdXJlPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZ1tdPlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHBvc3VyZT8uW21vZGVsLm5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IG92ZXJyaWRlXG4gICAgICAgICAgOiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShERUNBRl9FWFBPU0UpKTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmxhdm91cik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgICBvcHRpb25zOiBQYXJ0aWFsPERlY2FmTW9kdWxlT3B0aW9ucz4gPSB7fVxuICAgICk6IER5bmFtaWNNb2R1bGUge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgICBjb25zdCB0cmFja2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHMoZmxhdm91cikuZmlsdGVyKChtb2RlbCkgPT5cbiAgICAgICAgdGhpcy5pc0V4cG9zZWQobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlKVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udHJvbGxlcnMgYWx3YXlzIHJlbHkgb24gYSBiYWNraW5nIE1vZGVsU2VydmljZSwgZXZlbiB3aGVuIE5lc3QgcHJvdmlkZXJzXG4gICAgICAvLyBhcmUgbm90IGF1dG8tcmVnaXN0ZXJlZC4gV2FybSB0aGUgc2luZ2xldG9uIHJlZ2lzdHJ5IGhlcmUgc28gc2h1dGRvd24gY2FuXG4gICAgICAvLyBzZWUgdGhlIGxpdmUgc2VydmljZXMgY3JlYXRlZCBmb3IgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVycy5cbiAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdHJhY2tlZE1vZGVscykgTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSk7XG5cbiAgICAgIGxldCBtb2RlbFNlcnZpY2VzOiBQcm92aWRlcltdID0gW107XG4gICAgICBpZiAob3B0aW9ucy5hdXRvU2VydmljZXMpIHtcbiAgICAgICAgbG9nLmluZm8oXCJBdXRvLXNlcnZpY2VzIGVuYWJsZWQuIEluaXRpYWxpemluZyBzZXJ2aWNlIGdlbmVyYXRpb24uXCIpO1xuICAgICAgICBtb2RlbFNlcnZpY2VzID0gdGhpcy5jcmVhdGVNb2RlbFNlcnZpY2VzKHRyYWNrZWRNb2RlbHMpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgQXV0by1zZXJ2aWNlcyBjb21wbGV0ZWQuICR7bW9kZWxTZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2VzIGluaXRpYWxpemVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2xvYmFsRGVmYXVsdHM6IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4gPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLmFnZ3JlZ2F0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgZ2xvYmFsRGVmYXVsdHMuYWxsb3dHcm91cGluZ1F1ZXJpZXMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udHJvbGxlcnMgPSB0cmFja2VkTW9kZWxzLm1hcCgobW9kZWwpID0+XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsIGdsb2JhbERlZmF1bHRzKVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgICAgY29udHJvbGxlcnMsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgIC4uLm1vZGVsU2VydmljZXMsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBPYmplY3QuYXNzaWduKERlY2FmTW9kZWxNb2R1bGUsIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGBEZWNhZk1vZHVsZSR7Zmxhdm91cn1gLFxuICB9KTtcbiAgcmV0dXJuIERlY2FmTW9kZWxNb2R1bGU7XG59XG4iLCJpbXBvcnQge1xuICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsXG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZz86IEluamVjdGFibGVDb25maWdcbiAgICApIHtcbiAgICAgIGNmZyA9XG4gICAgICAgIGNmZyB8fFxuICAgICAgICAodHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LFxuICAgICAgICAgICAgICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZSh7XG4gICAgICAgIHNjb3BlOiBjZmcuc2luZ2xldG9uID8gU2NvcGUuREVGQVVMVCA6IFNjb3BlLlJFUVVFU1QsXG4gICAgICAgIGR1cmFibGU6IGNmZy5zaW5nbGV0b24gPyB1bmRlZmluZWQgOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdChcbiAgICAgIGNhdGVnb3J5OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNmZzogSW5qZWN0T3B0aW9uc1xuICAgICkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyTmVzdEluamVjdChcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgICBkZXNjcmlwdG9yPzogYW55XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIEluamVjdChjYXRlZ29yeSB8fCAodGFyZ2V0IGFzIENvbnN0cnVjdG9yKSkoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKVxuICAuZXh0ZW5kKFxuICAgIEFwaVByb3BlcnR5KHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gIClcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heGltdW06IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5pbXVtOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluTGVuZ3RoRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5MZW5ndGg6IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHR5cGVEZWMoXG4gICAgICB0eXBlOlxuICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW11cbiAgICAgICAgfCBDb25zdHJ1Y3RvclxuICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3RvcilcbiAgICApIHtcbiAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICB0eXBlID0gQXJyYXkuaXNBcnJheSh0eXBlKSA/IHR5cGVbMF0gOiB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHlwZS5uYW1lKVxuICAgICAgICAgIHR5cGUgPSAodHlwZSBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbiAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIGFueSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIH0pKHRhcmdldCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbGlzdERlYyhcbi8vICAgICAgIGNsYXp6OlxuLy8gICAgICAgICB8IENvbnN0cnVjdG9yXG4vLyAgICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuLy8gICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW10sXG4vLyAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4vLyAgICAgICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiXG4vLyAgICAgKSB7XG4vLyAgICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbi8vICAgICAgICAgY2xhenogPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4vLyAgICAgICAgIGlmICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZSlcbi8vICAgICAgICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbi8vICAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgdHlwZTogW2NsYXp6IGFzIGFueV0gfSkodGFyZ2V0LCBwcm9wKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vLyAvL1xuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuREFURSlcbiAgLmV4dGVuZCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGF0ZURlYyhmb3JtYXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZS10aW1lXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgLy8gZXhhbXBsZTogcGFyc2VEYXRlKGZvcm1hdCwgbmV3IERhdGUoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuRU5VTSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvcHRpb25EZWMob3B0aW9uczogc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICBjb25zdCBvcHRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBPYmplY3QudmFsdWVzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZW51bTogb3B0cyxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbkRlYyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkZXNjcmlwdGlvbkRlYyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQVVUSCkuZXh0ZW5kKHsgZGVjb3JhdG9yOiBBdXRoIH0pLmFwcGx5KCk7XG4iLCJpbXBvcnQgeyBGb3JiaWRkZW5FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgQ29yc0Vycm9yIGV4dGVuZHMgRm9yYmlkZGVuRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBDb3JzRXJyb3IubmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgVG9NYW55UmVxdWVzdHNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgKSB7XG4gICAgc3VwZXIoVG9NYW55UmVxdWVzdHNFcnJvci5uYW1lLCBtc2cgLCA0MjkpO1xuICB9XG59IiwiaW1wb3J0IHtcbiAgQXJndW1lbnRzSG9zdCxcbiAgQ2F0Y2gsXG4gIEV4Y2VwdGlvbkZpbHRlcixcbiAgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvdGhyb3R0bGluZ1wiO1xuXG5AQ2F0Y2goKVxuZXhwb3J0IGNsYXNzIERlY2FmRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgRXhjZXB0aW9uRmlsdGVyIHtcbiAgY2F0Y2goZXhjZXB0aW9uOiBFcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgIGNvbnN0IGN0eCA9IGhvc3Quc3dpdGNoVG9IdHRwKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgbGV0IHN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvclxuICAgICkge1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgc3RhdHVzQ29kZSA9IChleGNlcHRpb24gYXMgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7XG4gICAgfSBlbHNlIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEJhc2VFcnJvcikpIHtcbiAgICAgIGlmKChleGNlcHRpb24gYXMgYW55KS5zdGF0dXMgPT09IDQyOSl7XG4gICAgICAgIGV4Y2VwdGlvbiA9IG5ldyBUb01hbnlSZXF1ZXN0c0Vycm9yKGV4Y2VwdGlvbi5tZXNzYWdlKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgSW50ZXJuYWxFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzcG9uc2Uuc3RhdHVzKChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgc3RhdHVzOiAoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVXNlRmlsdGVycywgVXNlSW50ZXJjZXB0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL0RlY2FmRXJyb3JGaWx0ZXJcIjtcbmltcG9ydCB7IERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L2luZGV4XCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBVc2VEZWNhZkZpbHRlcigpIHtcbiAgcmV0dXJuIFVzZUZpbHRlcnMobmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZIZWFkZXJzKCkge1xuICByZXR1cm4gVXNlSW50ZXJjZXB0b3JzKERlY2FmUmVzcG9uc2VJbnRlcmNlcHRvcik7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgU2VjdXJpdHlTY2hlbWVPYmplY3QgfSBmcm9tIFwiLi4vLi4vc3dhZ2dlci10eXBlc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJPcHRpb25zIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJJY29uRmlsZVBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgcGF0aDogc3RyaW5nO1xuICBhdXRoPzogU2VjdXJpdHlTY2hlbWVPYmplY3Q7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG4gIGV4dHJhTW9kZWxzPzogQ29uc3RydWN0b3JbXTtcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgU1dBR0dFUl9VSV9DT05TVEFOVFM6IFN3YWdnZXJPcHRpb25zID0ge1xuICB0aXRsZTogXCJTd2FnZ2VyIHwgT3BlbkFQSSBTcGVjaWZpY2F0aW9uIChPQVMpXCIsXG4gIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkaXplZCBmb3JtYXQgZm9yIGRlc2NyaWJpbmcgUkVTVGZ1bCBBUElzXCIsXG4gIHZlcnNpb246IFwiMC4wLjFcIixcbiAgcGF0aDogXCJkb2NzXCIsXG4gIGZhdmljb25GaWxlUGF0aDogXCJcIixcbiAgdG9wYmFySWNvbkZpbGVQYXRoOiBcIlwiLFxuICBhdXRoOiB7XG4gICAgdHlwZTogXCJodHRwXCIsXG4gICAgc2NoZW1lOiBcImJlYXJlclwiLFxuICAgIGJlYXJlckZvcm1hdDogXCJKV1RcIixcbiAgICBuYW1lOiBcIkF1dGhvcml6YXRpb25cIixcbiAgICBkZXNjcmlwdGlvbjogXCJFbnRlciBKV1QgdG9rZW5cIixcbiAgICBpbjogXCJoZWFkZXJcIixcbiAgfSxcbiAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gIHRvcGJhckJnQ29sb3I6IFwiIzAwMDAwMFwiLFxufTtcbiIsImltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyVUlPcHRpb25zIHtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICBmYXZpY29uUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckJnQ29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTd2FnZ2VyQ3VzdG9tVUkge1xuICByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zO1xuICAvLyBwcml2YXRlIHJlYWRvbmx5IGFzc2V0c1BhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgLy8gICBfX2Rpcm5hbWUsXG4gIC8vICAgXCIuLlwiLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIndvcmtkb2NzXCIsXG4gIC8vICAgXCJhc3NldHNcIlxuICAvLyApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFN3YWdnZXJVSU9wdGlvbnMpIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGN1c3RvbUNTUygpIHtcbiAgICBsZXQgY3NzID0gXCJcIjtcbiAgICBpZiAodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKSB7XG4gICAgICBjb25zdCBpbWcgPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMudG9wYmFySWNvblBhdGgpO1xuICAgICAgY3NzICs9IGAudG9wYmFyLXdyYXBwZXIgeyBjb250ZW50OiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwke2ltZ30nKTsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IGF1dG87IH1cXG5gO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY3NzICtcbiAgICAgIGBcbiAgICAgICAgLnRvcGJhci13cmFwcGVyIHN2ZyB7IHZpc2liaWxpdHk6IGhpZGRlbjsgfVxuICAgICAgICAuc3dhZ2dlci11aSAudG9wYmFyIHsgYmFja2dyb3VuZC1jb2xvcjogJHt0aGlzLm9wdGlvbnMudG9wYmFyQmdDb2xvciB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy50b3BiYXJCZ0NvbG9yfTsgfVxuICAgICAgYFxuICAgICk7XG4gIH1cblxuICBnZXRDdXN0b21PcHRpb25zKCkge1xuICAgIGNvbnN0IGZhdmljb246IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZhdmljb25QYXRoKSB7XG4gICAgICBmYXZpY29uW1wiY3VzdG9tZmF2SWNvblwiXSA9IHRoaXMuYjY0KHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGN1c3RvbVNpdGVUaXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgLi4uZmF2aWNvbixcbiAgICAgIGN1c3RvbUNzczogdGhpcy5jdXN0b21DU1MoKSxcbiAgICAgIHN3YWdnZXJPcHRpb25zOiB7XG4gICAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBiNjQoZmlsZTogc3RyaW5nLCBpbWc6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHRoaXMub3B0aW9ucy5hc3NldHNQYXRoIHx8IFwiXCIsIGZpbGUpO1xuICAgIGNvbnN0IGI2NCA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgeyBlbmNvZGluZzogXCJiYXNlNjRcIiB9KTtcbiAgICByZXR1cm4gaW1nID8gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsXCIgKyBiNjQgOiBiNjQ7XG4gIH1cbn1cbiIsImltcG9ydCB7IElOZXN0QXBwbGljYXRpb24gfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERvY3VtZW50QnVpbGRlciwgU3dhZ2dlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IFN3YWdnZXJDdXN0b21VSSB9IGZyb20gXCIuL1N3YWdnZXJDdXN0b21VSVwiO1xuaW1wb3J0IHsgU1dBR0dFUl9VSV9DT05TVEFOVFMsIFN3YWdnZXJPcHRpb25zIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgWUFNTCBmcm9tIFwieWFtbFwiO1xuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcDogSU5lc3RBcHBsaWNhdGlvbixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFN3YWdnZXJPcHRpb25zXG4gICkge31cblxuICBwcml2YXRlIGNyZWF0ZURvY3VtZW50KCkge1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdGhpcy5vcHRpb25zLnBhdGhcbiAgICAgID8gdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uICtcbiAgICAgICAgXCJcIiArXG4gICAgICAgIGA8YnI+PGJyPjxhIGhyZWY9XCIke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9XCI+T3BlbkFQSSBKU09OIFNwZWM8L2E+IHwgYCArXG4gICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofVwiPk9wZW5BUEkgWUFNTCBTcGVjPC9hPmBcbiAgICAgIDogdGhpcy5vcHRpb25zLmRlc2NyaXB0aW9uO1xuXG4gICAgY29uc3QgY29uZmlnID0gbmV3IERvY3VtZW50QnVpbGRlcigpXG4gICAgICAuc2V0VGl0bGUodGhpcy5vcHRpb25zLnRpdGxlKVxuICAgICAgLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKVxuICAgICAgLnNldFZlcnNpb24odGhpcy5vcHRpb25zLnZlcnNpb24gfHwgXCIwLjAuMVwiKVxuICAgICAgLmFkZEJlYXJlckF1dGgodGhpcy5vcHRpb25zLmF1dGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMuYXV0aClcbiAgICAgIC5idWlsZCgpO1xuXG4gICAgcmV0dXJuIFN3YWdnZXJNb2R1bGUuY3JlYXRlRG9jdW1lbnQodGhpcy5hcHAsIGNvbmZpZywge1xuICAgICAgZXh0cmFNb2RlbHM6IHRoaXMub3B0aW9ucy5leHRyYU1vZGVscyB8fCBbXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgcGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL2pzb25cIiB8IFwiYXBwbGljYXRpb24veC15YW1sXCIsXG4gICAgYm9keUZhY3Rvcnk6ICgpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKCFwYXRoKSByZXR1cm47XG5cbiAgICBjb25zdCBodHRwQWRhcHRlciA9IHRoaXMuYXBwLmdldEh0dHBBZGFwdGVyKCkgYXMgYW55O1xuICAgIHBhdGggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWA7XG4gICAgaHR0cEFkYXB0ZXIuZ2V0KHBhdGgsIChfcmVxOiBhbnksIHJlczogYW55KSA9PiB7XG4gICAgICBodHRwQWRhcHRlci5yZXBseShyZXMsIGJvZHlGYWN0b3J5KCksIDIwMCwge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBjb250ZW50VHlwZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldHVwU3dhZ2dlcigpIHtcbiAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuY3JlYXRlRG9jdW1lbnQoKTtcbiAgICBjb25zdCBzd2FnZ2VyVUkgPSBuZXcgU3dhZ2dlckN1c3RvbVVJKHtcbiAgICAgIHRpdGxlOiB0aGlzLm9wdGlvbnMudGl0bGUsXG4gICAgICBwYXRoOiB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRoaXMub3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogdGhpcy5vcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uUGF0aDogdGhpcy5vcHRpb25zLmZhdmljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckljb25QYXRoOiB0aGlzLm9wdGlvbnMudG9wYmFySWNvbkZpbGVQYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogdGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgfSk7XG4gICAgU3dhZ2dlck1vZHVsZS5zZXR1cChcbiAgICAgIHRoaXMub3B0aW9ucy5wYXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLnBhdGgsXG4gICAgICB0aGlzLmFwcCxcbiAgICAgIGRvY3VtZW50LFxuICAgICAge1xuICAgICAgICAuLi5zd2FnZ2VyVUkuZ2V0Q3VzdG9tT3B0aW9ucygpLFxuICAgICAgICBqc29uRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB5YW1sRG9jdW1lbnRVcmw6IHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGhcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGh9YFxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgICAgdGhpcy5vcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgKCkgPT4gZG9jdW1lbnRcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgICAgKCkgPT4gWUFNTC5zdHJpbmdpZnkoZG9jdW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIC8vIHByaXZhdGUgZ2V0VmVyc2lvbigpIHtcbiAgLy8gICAvLyBjb25zdCBwYWNrYWdlSnNvbiA9IHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcInBhY2thZ2UuanNvblwiKTtcbiAgLy8gICAvLyBjb25zdCB7dmVyc2lvbn0gPSByZXF1aXJlKHBhY2thZ2VKc29uKTtcbiAgLy8gICByZXR1cm4gXCJ2ZXJzaW9uXCI7XG4gIC8vIH1cbn1cbiIsImltcG9ydCB7XG4gIElOZXN0QXBwbGljYXRpb24sXG4gIExvZ2dlcixcbiAgTmVzdEludGVyY2VwdG9yLFxuICBQaXBlVHJhbnNmb3JtLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vZXhjZXB0aW9uc1wiO1xuaW1wb3J0IHsgU3dhZ2dlckJ1aWxkZXIgfSBmcm9tIFwiLi9vcGVuYXBpXCI7XG5pbXBvcnQgeyBDb3JzT3B0aW9ucyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL2V4dGVybmFsL2NvcnMtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IENvcnNFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogRGVmaW5lcyBhbGwgY3VzdG9taXphYmxlIHBhcmFtZXRlcnMgZm9yIFN3YWdnZXIgc2V0dXAuXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBkZXZlbG9wZXJzIHRvIGN1c3RvbWl6ZSBob3cgU3dhZ2dlciBVSSBpcyBjb25maWd1cmVkXG4gKiB3aXRoaW4gdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi4gSXQgaW5jbHVkZXMgcGFyYW1ldGVycyBmb3IgdGl0bGVzLCBwYXRocyxcbiAqIGNvbG9yIHNjaGVtZXMsIGFuZCBhc3NldCBwYXRocyB0byB0YWlsb3IgdGhlIEFQSSBkb2N1bWVudGF0aW9uIGV4cGVyaWVuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gVGl0bGUgZGlzcGxheWVkIGluIFN3YWdnZXIgVUkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb24gLSBEZXNjcmlwdGlvbiBzaG93biBiZWxvdyB0aGUgdGl0bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIEFQSSB2ZXJzaW9uIGRpc3BsYXllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF0gLSBPcHRpb25hbCBwYXRoIHdoZXJlIFN3YWdnZXIgd2lsbCBiZSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwZXJzaXN0QXV0aG9yaXphdGlvbl0gLSBXaGV0aGVyIGF1dGhvcml6YXRpb24gdG9rZW5zIHBlcnNpc3QgYWNyb3NzIHJlbG9hZHMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Fzc2V0c1BhdGhdIC0gUGF0aCB0byBjdXN0b20gYXNzZXRzIGZvciBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJCZ0NvbG9yXSAtIEN1c3RvbSBiYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgU3dhZ2dlciB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFt0b3BiYXJJY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGljb24gZGlzcGxheWVkIGluIHRoZSB0b3AgYmFyLlxuICogQHBhcmFtIHtzdHJpbmd9IFtmYXZpY29uUGF0aF0gLSBQYXRoIHRvIGEgY3VzdG9tIGZhdmljb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclNldHVwT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcGVyc2lzdEF1dGhvcml6YXRpb24/OiBib29sZWFuO1xuICBhc3NldHNQYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICB0b3BiYXJJY29uUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQYXRoIHRvIGV4cG9zZSB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIEpTT04gZm9ybWF0LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkuanNvblxuICAgKi9cbiAgb3BlbkFwaUpzb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBZQU1MIGZvcm1hdC5cbiAgICogUmVxdWlyZXMgJ3lhbWwnIHBhY2thZ2UgYXMgcGVlciBkZXBlbmRlbmN5LlxuICAgKiBFeGFtcGxlOiAvYXBpL29wZW5hcGkueWFtbFxuICAgKi9cbiAgb3BlbkFwaVlhbWxQYXRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBmbHVlbnQsIHN0YXRpYyBib290c3RyYXAgY2xhc3MgZm9yIGluaXRpYWxpemluZyBhbmQgY29uZmlndXJpbmcgYSBOZXN0SlMgYXBwbGljYXRpb24uXG4gKlxuICogQHN1bW1hcnlcbiAqIFRoZSBgTmVzdEJvb3RzdHJhcGVyYCBjbGFzcyBwcm92aWRlcyBhIGNoYWluYWJsZSBBUEkgZm9yIGNvbmZpZ3VyaW5nXG4gKiBhIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZS4gSXQgaW5jbHVkZXMgYnVpbHQtaW4gbWV0aG9kcyBmb3IgZW5hYmxpbmdcbiAqIENPUlMsIEhlbG1ldCBzZWN1cml0eSwgU3dhZ2dlciBkb2N1bWVudGF0aW9uLCBnbG9iYWwgcGlwZXMsIGZpbHRlcnMsXG4gKiBpbnRlcmNlcHRvcnMsIGFuZCBzdGFydGluZyB0aGUgc2VydmVyLlxuICpcbiAqIFRoaXMgY2xhc3MgcHJvbW90ZXMgY29uc2lzdGVuY3kgYW5kIHJlZHVjZXMgcmVwZXRpdGl2ZSBzZXR1cCBjb2RlXG4gKiBhY3Jvc3MgbXVsdGlwbGUgTmVzdEpTIHByb2plY3RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgTmVzdEZhY3RvcnkgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG4gKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tIFwiLi9hcHAubW9kdWxlXCI7XG4gKiBpbXBvcnQgeyBNeUxvZ2dlciB9IGZyb20gXCIuL015TG9nZ2VyXCI7XG4gKiBpbXBvcnQgeyBOZXN0Qm9vdHN0cmFwZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1uZXN0XCI7XG4gKlxuICogYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICogICBjb25zdCBhcHAgPSBhd2FpdCBOZXN0RmFjdG9yeS5jcmVhdGUoQXBwTW9kdWxlKTtcbiAqXG4gKiAgIGF3YWl0IE5lc3RCb290c3RyYXBlclxuICogICAgIC5pbml0aWFsaXplKGFwcClcbiAqICAgICAuZW5hYmxlTG9nZ2VyKG5ldyBNeUxvZ2dlcigpKVxuICogICAgIC5lbmFibGVDb3JzKFtcImh0dHA6Ly9sb2NhbGhvc3Q6NDIwMFwiXSlcbiAqICAgICAudXNlSGVsbWV0KClcbiAqICAgICAuc2V0dXBTd2FnZ2VyKHtcbiAqICAgICAgIHRpdGxlOiBcIk9wZW5BUEkgYnkgVHJhZGVNYXJr4oSiXCIsXG4gKiAgICAgICBkZXNjcmlwdGlvbjogXCJUcmFkZU1hcmvihKIgQVBJIGRvY3VtZW50YXRpb25cIixcbiAqICAgICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAqICAgICAgIHBhdGg6IFwiYXBpXCIsXG4gKiAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdHJ1ZSxcbiAqICAgICAgIHRvcGJhckJnQ29sb3I6IFwiIzJDM0U1MFwiLFxuICogICAgICAgdG9wYmFySWNvblBhdGg6IFwiL2Fzc2V0cy9sb2dvLnN2Z1wiLFxuICogICAgICAgZmF2aWNvblBhdGg6IFwiL2Fzc2V0cy9mYXZpY29uLmljb1wiXG4gKiAgICAgfSlcbiAqICAgICAudXNlR2xvYmFsRmlsdGVycygpXG4gKiAgICAgLnVzZUdsb2JhbFBpcGVzKC4uLilcbiAqICAgICAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLilcbiAqICAgICAuc3RhcnQoMzAwMCk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKCk7XG4gKiBgYGBcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTmVzdEJvb3RzdHJhcGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYXBwOiBJTmVzdEFwcGxpY2F0aW9uO1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvZ2dlciBpbnN0YW5jZSwgY3JlYXRpbmcgYSBkZWZhdWx0IG9uZSBpZiBub3Qgc2V0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbnN1cmVzIHRoYXQgYSB2YWxpZCBgTG9nZ2VyYCBpbnN0YW5jZSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gICAqIGZvciBsb2dnaW5nIGJvb3RzdHJhcC1yZWxhdGVkIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtMb2dnZXJ9IFRoZSBhY3RpdmUgbG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0IGxvZ2dlcigpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB7XG4gICAgICAvLyBmYWxsYmFja1xuICAgICAgdGhpcy5fbG9nZ2VyID0gbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEluaXRpYWxpemVzIHRoZSBib290c3RyYXBwZXIgd2l0aCBhIGdpdmVuIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQmluZHMgdGhlIHByb3ZpZGVkIE5lc3RKUyBhcHAgaW5zdGFuY2UgdG8gdGhlIGJvb3RzdHJhcHBlciwgZW5hYmxpbmdcbiAgICogY2hhaW5lZCBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7SU5lc3RBcHBsaWNhdGlvbn0gYXBwIC0gVGhlIE5lc3RKUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byBpbml0aWFsaXplLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uIG1ldGhvZHMuXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShhcHA6IElOZXN0QXBwbGljYXRpb24pIHtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBvciByZXBsYWNlcyB0aGUgZ2xvYmFsIGxvZ2dlciBmb3IgdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgYSBjdXN0b20gbG9nZ2VyIGlzIHByb3ZpZGVkLCBpdCByZXBsYWNlcyB0aGUgZGVmYXVsdCBsb2dnZXIuIE90aGVyd2lzZSxcbiAgICogYSBuZXcgbG9nZ2VyIG5hbWVkIGBcIk5lc3RCb290c3RyYXBcImAgaXMgdXNlZC4gVGhpcyBsb2dnZXIgaXMgYWxzbyByZWdpc3RlcmVkXG4gICAqIHdpdGggdGhlIE5lc3RKUyBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtMb2dnZXJ9IFtjdXN0b21Mb2dnZXJdIC0gT3B0aW9uYWwgY3VzdG9tIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcuXG4gICAqL1xuICBzdGF0aWMgZW5hYmxlTG9nZ2VyKGN1c3RvbUxvZ2dlcj86IExvZ2dlcikge1xuICAgIHRoaXMuX2xvZ2dlciA9IGN1c3RvbUxvZ2dlciB8fCBuZXcgTG9nZ2VyKFwiTmVzdEJvb3RzdHJhcFwiKTtcbiAgICB0aGlzLmFwcC51c2VMb2dnZXIodGhpcy5fbG9nZ2VyKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRW5hYmxlcyBDcm9zcy1PcmlnaW4gUmVzb3VyY2UgU2hhcmluZyAoQ09SUykgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogQWxsb3dzIGRlZmluaW5nIGVpdGhlciBhIHdpbGRjYXJkIG9yaWdpbiAoYFwiKlwiYCkgb3IgYSBsaXN0IG9mIGFsbG93ZWQgb3JpZ2lucy5cbiAgICogQXV0b21hdGljYWxseSBhY2NlcHRzIGxvY2FsIGRldmVsb3BtZW50IHJlcXVlc3RzIGFuZCB0aG9zZSB3aXRob3V0IG9yaWdpbiBoZWFkZXJzLlxuICAgKiBUaHJvd3MgYSBgQ29yc0Vycm9yYCBmb3IgdW5hdXRob3JpemVkIG9yaWdpbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7JyonIHwgc3RyaW5nW119IFtvcmlnaW5zPVtdXSAtIExpc3Qgb2YgYWxsb3dlZCBvcmlnaW5zIG9yIGBcIipcImAgdG8gYWxsb3cgYWxsLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxsb3dNZXRob2RzPVsnR0VUJywgJ1BPU1QnLCAnUFVUJywgJ0RFTEVURSddXSAtIEFsbG93ZWQgSFRUUCBtZXRob2RzLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUNvcnMoXG4gICAgb3JpZ2luczogXCIqXCIgfCBzdHJpbmdbXSA9IFtdLFxuICAgIGFsbG93TWV0aG9kczogc3RyaW5nW10gPSBbXCJHRVRcIiwgXCJQT1NUXCIsIFwiUFVUXCIsIFwiREVMRVRFXCJdXG4gICkge1xuICAgIGNvbnN0IGFsbG93ZWRPcmlnaW5zID1cbiAgICAgIG9yaWdpbnMgPT09IFwiKlwiID8gXCIqXCIgOiBvcmlnaW5zLm1hcCgobykgPT4gby50cmltKCkudG9Mb3dlckNhc2UoKSk7XG5cbiAgICBjb25zdCBjb3JzT3B0aW9uczogQ29yc09wdGlvbnMgPSB7XG4gICAgICBvcmlnaW46IChvcmlnaW4sIGNhbGxiYWNrKSA9PiB7XG4gICAgICAgIC8vIEFsbG93IHJlcXVlc3Qgd2l0aG91dCBvcmlnaW4uLi5cbiAgICAgICAgaWYgKCFvcmlnaW4pIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWxsb3dlZE9yaWdpbnMgPT09IFwiKlwiIHx8XG4gICAgICAgICAgKEFycmF5LmlzQXJyYXkoYWxsb3dlZE9yaWdpbnMpICYmXG4gICAgICAgICAgICBhbGxvd2VkT3JpZ2lucy5pbmNsdWRlcyhvcmlnaW4udG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrKG5ldyBDb3JzRXJyb3IoYE9yaWdpbiAke29yaWdpbn0gbm90IGFsbG93ZWRgKSk7XG4gICAgICB9LFxuICAgICAgY3JlZGVudGlhbHM6IHRydWUsXG4gICAgICBtZXRob2RzOiBhbGxvd01ldGhvZHMuam9pbihcIixcIiksXG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmVuYWJsZUNvcnMoY29yc09wdGlvbnMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBcHBsaWVzIHRoZSBIZWxtZXQgbWlkZGxld2FyZSBmb3IgZW5oYW5jZWQgc2VjdXJpdHkuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIER5bmFtaWNhbGx5IGxvYWRzIHRoZSBgaGVsbWV0YCBwYWNrYWdlIGlmIGF2YWlsYWJsZSBhbmQgcmVnaXN0ZXJzIGl0XG4gICAqIGFzIG1pZGRsZXdhcmUgdG8gaW1wcm92ZSBIVFRQIGhlYWRlciBzZWN1cml0eS4gSWYgbm90IGluc3RhbGxlZCwgbG9ncyBhIHdhcm5pbmdcbiAgICogYW5kIGNvbnRpbnVlcyBleGVjdXRpb24gd2l0aG91dCB0aHJvd2luZyBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW29wdGlvbnNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBwYXNzZWQgdG8gSGVsbWV0LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUhlbG1ldChvcHRpb25zPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRyeSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgICAgY29uc3QgaGVsbWV0ID0gcmVxdWlyZShcImhlbG1ldFwiKTsgLy8gRHluYW1pYyBpbXBvcnQgdG8gYXZvaWQgaGFyZCBkZXBlbmRlbmN5XG4gICAgICB0aGlzLmFwcC51c2UoaGVsbWV0KG9wdGlvbnMpKTtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZyhcIkhlbG1ldCBtaWRkbGV3YXJlIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LlwiKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJIZWxtZXQgbm90IGluc3RhbGxlZC4gU2tpcHBpbmcgbWlkZGxld2FyZS5cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENvbmZpZ3VyZXMgYW5kIGluaXRpYWxpemVzIFN3YWdnZXIgVUkgZm9yIEFQSSBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBVc2VzIHRoZSBgU3dhZ2dlckJ1aWxkZXJgIHV0aWxpdHkgdG8gY29uZmlndXJlIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqIHdpdGggZGV0YWlsZWQgY3VzdG9taXphdGlvbiBmb3IgdGl0bGUsIHZlcnNpb24sIHBhdGhzLCBhbmQgY29sb3JzLlxuICAgKiBTd2FnZ2VyIGlzIGF1dG9tYXRpY2FsbHkgZXhwb3NlZCBhdCB0aGUgY29uZmlndXJlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0ge1N3YWdnZXJTZXR1cE9wdGlvbnN9IG9wdGlvbnMgLSBTd2FnZ2VyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBzZXR1cFN3YWdnZXIob3B0aW9uczogU3dhZ2dlclNldHVwT3B0aW9ucykge1xuICAgIGNvbnN0IHN3YWdnZXIgPSBuZXcgU3dhZ2dlckJ1aWxkZXIodGhpcy5hcHAsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICBwYXRoOiBvcHRpb25zLnBhdGggfHwgXCJhcGlcIixcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiBvcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uID8/IHRydWUsXG4gICAgICBhc3NldHNQYXRoOiBvcHRpb25zLmFzc2V0c1BhdGgsXG4gICAgICBmYXZpY29uRmlsZVBhdGg6IG9wdGlvbnMuZmF2aWNvblBhdGgsXG4gICAgICB0b3BiYXJJY29uRmlsZVBhdGg6IG9wdGlvbnMudG9wYmFySWNvblBhdGgsXG4gICAgICB0b3BiYXJCZ0NvbG9yOiBvcHRpb25zLnRvcGJhckJnQ29sb3IsXG4gICAgICBvcGVuQXBpSnNvblBhdGg6IG9wdGlvbnMub3BlbkFwaUpzb25QYXRoLFxuICAgICAgb3BlbkFwaVlhbWxQYXRoOiBvcHRpb25zLm9wZW5BcGlZYW1sUGF0aCxcbiAgICB9KTtcbiAgICBzd2FnZ2VyLnNldHVwU3dhZ2dlcigpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIHZhbGlkYXRpb24gcGlwZXMuXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEVuYWJsZXMgcmVxdWVzdCBwYXlsb2FkIHZhbGlkYXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIGdsb2JhbGx5IGFjcm9zc1xuICAgKiB0aGUgZW50aXJlIE5lc3RKUyBhcHBsaWNhdGlvbi4gTXVsdGlwbGUgcGlwZXMgY2FuIGJlIGNoYWluZWQgdG9nZXRoZXJcbiAgICogZm9yIG1vZHVsYXIgaW5wdXQgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5QaXBlVHJhbnNmb3JtW119IHBpcGVzIC0gUGlwZSBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIgZ2xvYmFsbHkuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzOiBQaXBlVHJhbnNmb3JtW10pIHtcbiAgICBpZiAocGlwZXMubGVuZ3RoID4gMCkgdGhpcy5hcHAudXNlR2xvYmFsUGlwZXMoLi4ucGlwZXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZWdpc3RlcnMgb25lIG9yIG1vcmUgZ2xvYmFsIGV4Y2VwdGlvbiBmaWx0ZXJzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJZiBubyBmaWx0ZXJzIGFyZSBwcm92aWRlZCwgaXQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBkZWZhdWx0XG4gICAqIHNldCBvZiBzdGFuZGFyZCBleGNlcHRpb24gZmlsdGVycyBmb3IgY29tbW9uIGVycm9yIHR5cGVzIGxpa2VcbiAgICogYEh0dHBFeGNlcHRpb25gLCBgVmFsaWRhdGlvbkV4Y2VwdGlvbmAsIGBDb25mbGljdEV4Y2VwdGlvbmAsIGFuZCBvdGhlcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uRXhjZXB0aW9uRmlsdGVyW119IGZpbHRlcnMgLSBPcHRpb25hbCBmaWx0ZXJzIHRvIGFwcGx5IGdsb2JhbGx5LlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEZpbHRlcnMoLi4uZmlsdGVyczogYW55W10pIHtcbiAgICB0aGlzLmFwcC51c2VHbG9iYWxGaWx0ZXJzKFxuICAgICAgLi4uKGZpbHRlcnMubGVuZ3RoID4gMCA/IGZpbHRlcnMgOiBbbmV3IERlY2FmRXhjZXB0aW9uRmlsdGVyKCldKVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlZ2lzdGVycyBnbG9iYWwgaW50ZXJjZXB0b3JzIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSW50ZXJjZXB0b3JzIGFsbG93IGFkdmFuY2VkIHJlcXVlc3QvcmVzcG9uc2UgbWFuaXB1bGF0aW9uIHN1Y2ggYXNcbiAgICogc2VyaWFsaXphdGlvbiwgbG9nZ2luZywgb3IgdHJhbnNmb3JtYXRpb24uIE11bHRpcGxlIGludGVyY2VwdG9yc1xuICAgKiBjYW4gYmUgYWRkZWQgZm9yIG1vZHVsYXIgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5OZXN0SW50ZXJjZXB0b3JbXX0gaW50ZXJjZXB0b3JzIC0gSW50ZXJjZXB0b3IgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyLlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHVzZUdsb2JhbEludGVyY2VwdG9ycyguLi5pbnRlcmNlcHRvcnM6IE5lc3RJbnRlcmNlcHRvcltdKSB7XG4gICAgaWYgKGludGVyY2VwdG9ycy5sZW5ndGggPiAwKVxuICAgICAgdGhpcy5hcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9ycyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFN0YXJ0cyB0aGUgTmVzdEpTIGFwcGxpY2F0aW9uIGFuZCBiaW5kcyBpdCB0byB0aGUgZ2l2ZW4gcG9ydCBhbmQgaG9zdC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogTGlzdGVucyBvbiB0aGUgc3BlY2lmaWVkIHBvcnQgYW5kIG9wdGlvbmFsbHkgYSBob3N0LiBPbmNlIHN0YXJ0ZWQsXG4gICAqIGxvZ3MgdGhlIGFwcGxpY2F0aW9uIFVSTCBmb3IgZWFzeSBhY2Nlc3MuIFRoZSBzdGFydHVwIHByb2Nlc3MgcmVzb2x2ZXNcbiAgICogb25jZSB0aGUgYXBwbGljYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IHJ1bm5pbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9ydD0zMDAwXSAtIFBvcnQgbnVtYmVyIHRvIGxpc3RlbiBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtob3N0XSAtIE9wdGlvbmFsIGhvc3Qgb3IgSVAgYWRkcmVzcyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2c9dHJ1ZV0gLSBXaGV0aGVyIHRvIGxvZyB0aGUgYXBwbGljYXRpb24gVVJMIHVwb24gc3RhcnR1cC5cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgb25jZSB0aGUgYXBwbGljYXRpb24gc3RhcnRzIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBzdGFydChcbiAgICBwb3J0OiBudW1iZXIgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCxcbiAgICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgbG9nOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmFwcC5saXN0ZW4ocG9ydCwgaG9zdCBhcyBhbnkpLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLmFwcC5nZXRVcmwoKTtcbiAgICAgICAgdGhpcy5sb2dnZXIubG9nKGDwn5qAIEFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgYXQ6ICR7dXJsfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDYWxsSGFuZGxlcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgSW5qZWN0YWJsZSxcbiAgTmVzdEludGVyY2VwdG9yLFxuICBTY29wZSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBEZWZhdWx0QWRhcHRlckZsYWdzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckZsYWdzIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IFwiLi4vb3ZlcnJpZGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbnRlcmNlcHRvciByZXNwb25zaWJsZSBmb3IgZXhlY3V0aW5nIGFsbCByZWdpc3RlcmVkIERlY2FmIHJlcXVlc3QgaGFuZGxlcnNcbiAqIGJlZm9yZSB0aGUgY29udHJvbGxlciBtZXRob2QgaXMgaW52b2tlZC5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3J9IGludGVncmF0ZXMgdGhlIERlY2FmIHJlcXVlc3QtaGFuZGxpbmcgcGlwZWxpbmVcbiAqIGludG8gTmVzdEpTJyBpbnRlcmNlcHRvciBtZWNoYW5pc20uIEJlZm9yZSBwYXNzaW5nIGV4ZWN1dGlvbiB0byB0aGUgbmV4dCBoYW5kbGVyIGluIHRoZVxuICogTmVzdEpTIGNoYWluLCBpdCBkZWxlZ2F0ZXMgcmVxdWVzdCBwcm9jZXNzaW5nIHRvIHRoZSB7QGxpbmsgRGVjYWZIYW5kbGVyRXhlY3V0b3J9LCB3aGljaFxuICogc2VxdWVudGlhbGx5IHJ1bnMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJ9IGluc3RhbmNlcy4gVGhpcyBhbGxvd3NcbiAqIGJlaGF2aW9ycyBzdWNoIGFzIGF1dGhlbnRpY2F0aW9uLCBsb2dnaW5nLCB0ZW5hbnQgcmVzb2x1dGlvbiwgb3IgbWV0YWRhdGEgZW5yaWNobWVudFxuICogdG8gb2NjdXIgcHJpb3IgdG8gY29udHJvbGxlciBleGVjdXRpb24uXG4gKlxuICogQGNsYXNzIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQXBwbHkgZ2xvYmFsbHk6XG4gKiBhcHAudXNlR2xvYmFsSW50ZXJjZXB0b3JzKG5ldyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IoZXhlY3V0b3IpKTtcbiAqXG4gKiAvLyBPciBpbiBhIG1vZHVsZTpcbiAqIEBNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAqICAgICB7XG4gKiAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gKiAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcE1vZHVsZSB7fVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEludGVyY2VwdG9yXG4gKiAgICAgcGFydGljaXBhbnQgRXhlY3V0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBDb250cm9sbGVyXG4gKlxuICogICAgIENsaWVudC0+PkludGVyY2VwdG9yOiBIVFRQIFJlcXVlc3RcbiAqICAgICBJbnRlcmNlcHRvci0+PkV4ZWN1dG9yOiBleGVjKHJlcXVlc3QpXG4gKiAgICAgRXhlY3V0b3ItLT4+SW50ZXJjZXB0b3I6IGhhbmRsZXJzIGNvbXBsZXRlZFxuICogICAgIEludGVyY2VwdG9yLT4+Q29udHJvbGxlcjogbmV4dC5oYW5kbGUoKVxuICogICAgIENvbnRyb2xsZXItLT4+Q2xpZW50OiBSZXNwb25zZVxuICovXG5ASW5qZWN0YWJsZSh7IHNjb3BlOiBTY29wZS5SRVFVRVNUIH0pXG5leHBvcnQgY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBleGVjdXRvcjogRGVjYWZIYW5kbGVyRXhlY3V0b3JcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb250ZXh0dWFsaXplKHJlcTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICAgIGNvbnN0IGZsYWdzOiBEZWNhZlNlcnZlckZsYWdzID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIG92ZXJyaWRlczoge30sXG4gICAgfSBhcyBhbnk7XG5cbiAgICBjb25zdCBpcCA9IGV4dHJhY3RJcChyZXEpO1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHsgaXAgfSk7XG5cbiAgICB0aGlzLnJlcXVlc3RDb250ZXh0LmFjY3VtdWxhdGUoXG4gICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICB7fSxcbiAgICAgICAgRGVmYXVsdEFkYXB0ZXJGbGFncyxcbiAgICAgICAge1xuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICAgICAgb3BlcmF0aW9uOiBgJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YCxcbiAgICAgICAgfSxcbiAgICAgICAgZmxhZ3NcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW50ZXJjZXB0KGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG5leHQ6IENhbGxIYW5kbGVyKSB7XG4gICAgY29uc3QgcmVxID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcmVzID0gY29udGV4dC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXNwb25zZSgpO1xuICAgIGNvbnN0IGxvZyA9IExvZ2dpbmcuZm9yKERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcikuZm9yKHRoaXMuaW50ZXJjZXB0KTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmNvbnRleHR1YWxpemUocmVxKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gY29udGV4dHVhbGl6ZWQgLSByZXF1ZXN0OiAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcblxuICAgIGF3YWl0IHRoaXMuZXhlY3V0b3IuZXhlYyhyZXEsIHJlcyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLnJlcXVlc3RDb250ZXh0LnV1aWR9IGV4ZWN1dG9ycyBmaW5pc2hlZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RJcChyZXE6IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycztcbiAgZnVuY3Rpb24gcGFyc2VJcEhlYWRlcih2YWx1ZT86IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWVbMF0gOiB2YWx1ZTtcbiAgICByZXR1cm4gY2FuZGlkYXRlXG4gICAgICAuc3BsaXQoXCIsXCIpXG4gICAgICAubWFwKChzZWdtZW50KSA9PiBzZWdtZW50LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbilbMF07XG4gIH1cbiAgcmV0dXJuIChcbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtZm9yd2FyZGVkLWZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIngtcmVhbC1pcFwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtRm9yd2FyZGVkLUZvclwiXSkgPz9cbiAgICBwYXJzZUlwSGVhZGVyKGhlYWRlcnM/LltcIlgtUmVhbC1JUFwiXSkgPz9cbiAgICByZXEuaXBcbiAgKTtcbn1cbiIsImltcG9ydCB7IEluamVjdCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7XG4gIGluamVjdGFibGVTZXJ2aWNlS2V5LFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG9zaXRvcnkgYXMgQ29yZVJlcG9zaXRvcnksXG4gIFNlcnZpY2UgYXMgQ29yZVNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCB0eXBlIERlY2FmRmFjdG9yeVByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBzdHJpbmc7XG4gIHVzZUZhY3Rvcnk6ICgpID0+IHVua25vd247XG59O1xuXG5jb25zdCBwZW5kaW5nUHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIERlY2FmRmFjdG9yeVByb3ZpZGVyPigpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEcmFpbnMgdGhlIHByb3ZpZGVycyByZWdpc3RlcmVkIGJ5IHtAbGluayBTZXJ2aWNlfS97QGxpbmsgUmVwb3NpdG9yeX0gdXNhZ2VzLlxuICogQHN1bW1hcnkgQ29uc3VtZWQgYnkge0BsaW5rIERlY2FmQ29yZU1vZHVsZS5mb3JSb290fSB0byB3aXJlIHRoZSB0b2tlbnMgdGhhdCB0aG9zZSBwYXJhbWV0ZXJcbiAqIGRlY29yYXRvcnMgcmVmZXJlbmNlIGJhY2sgaW50byBOZXN0J3MgREkgY29udGFpbmVyLCBzaW5jZSBhIHBhcmFtZXRlciBkZWNvcmF0b3IgYWxvbmUgY2Fubm90XG4gKiBzdXBwbHkgYSBwcm92aWRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycygpOiBEZWNhZkZhY3RvcnlQcm92aWRlcltdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20ocGVuZGluZ1Byb3ZpZGVycy52YWx1ZXMoKSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW46IHN0cmluZywgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICBpZiAocGVuZGluZ1Byb3ZpZGVycy5oYXModG9rZW4pKSByZXR1cm47XG4gIHBlbmRpbmdQcm92aWRlcnMuc2V0KHRva2VuLCB7IHByb3ZpZGU6IHRva2VuLCB1c2VGYWN0b3J5IH0pO1xufVxuXG5mdW5jdGlvbiBpc01vZGVsQ29uc3RydWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlLnByb3RvdHlwZSBpbnN0YW5jZW9mIE1vZGVsO1xufVxuXG5mdW5jdGlvbiBtb2RlbFNlcnZpY2VUb2tlbihtb2RlbDogQ29uc3RydWN0b3I8YW55Pik6IHN0cmluZyB7XG4gIHJldHVybiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgO1xufVxuXG5mdW5jdGlvbiBtb2RlbFJlcG9zaXRvcnlUb2tlbihcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHJldHVybiBmbGF2b3VyID8gYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5QCR7Zmxhdm91cn1gIDogYCR7bW9kZWwubmFtZX1SZXBvc2l0b3J5YDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiBzZXJ2aWNlLlxuICogQHN1bW1hcnkgVHJhbnNsYXRlcyBkZWNhZidzIHNlcnZpY2UgcmVzb2x1dGlvbiBBUElzIGludG8gYSBOZXN0IGBASW5qZWN0KClgIGNhbGw6XG4gKiAtIGBAU2VydmljZShTb21lTW9kZWwpYCBpbmplY3RzIHRoZSBgTW9kZWxTZXJ2aWNlPFNvbWVNb2RlbD5gIHNpbmdsZXRvbiBmb3IgdGhhdCBtb2RlbFxuICogICAodmlhIHtAbGluayBNb2RlbFNlcnZpY2UuZm9yTW9kZWx9KS5cbiAqIC0gYEBTZXJ2aWNlKFNvbWVTZXJ2aWNlQ2xhc3MpYCBvciBgQFNlcnZpY2UoXCJhbGlhc1wiKWAgaW5qZWN0cyB0aGUgbWF0Y2hpbmcgYEBzZXJ2aWNlKClgLWRlY29yYXRlZFxuICogICBkZWNhZiB7QGxpbmsgQ29yZVNlcnZpY2V9ICh2aWEge0BsaW5rIENvcmVTZXJ2aWNlLmdldH0pLlxuICogLSBgQFNlcnZpY2UoKWAgaW5mZXJzIHRoZSBwYXJhbWV0ZXIncyB0eXBlIGZyb20gZW1pdHRlZCBjb25zdHJ1Y3RvciBtZXRhZGF0YSBhbmQgcmVzb2x2ZXMgaXQgdGhlXG4gKiAgIHNhbWUgd2F5LCBwcm92aWRlZCB0aGUgcGFyYW1ldGVyIGlzIHR5cGVkIGFzIGEgY29uY3JldGUgY2xhc3MgKGdlbmVyaWNzIGxpa2UgYE1vZGVsU2VydmljZTxYPmBcbiAqICAgYXJlIGVyYXNlZCBhdCBydW50aW1lLCBzbyB0aGUgbW9kZWwtc2VydmljZSBmb3JtIGFsd2F5cyByZXF1aXJlcyBhbiBleHBsaWNpdCBhcmd1bWVudCkuXG4gKiBAcGFyYW0ga2V5IHRoZSBtb2RlbCBjbGFzcywgc2VydmljZSBjbGFzcywgb3IgYWxpYXMgdG8gcmVzb2x2ZS4gT21pdCB0byBpbmZlciBmcm9tIHRoZSBwYXJhbWV0ZXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlcnZpY2Uoa2V5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGxldCByZXNvbHZlZDogc3RyaW5nIHwgQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9IGtleTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBwYXJhbVR5cGVzOiBhbnlbXSA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCB0YXJnZXQpIHx8IFtdO1xuICAgICAgcmVzb2x2ZWQgPSBwYXJhbVR5cGVzW3BhcmFtZXRlckluZGV4XTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBAU2VydmljZSgpIGNvdWxkIG5vdCBkZXRlcm1pbmUgYW4gaW5qZWN0aW9uIHR5cGUgZm9yIHBhcmFtZXRlciAke3BhcmFtZXRlckluZGV4fSBvZiAkeyh0YXJnZXQgYXMgQ29uc3RydWN0b3I8YW55PikubmFtZX0uIFByb3ZpZGUgYW4gZXhwbGljaXQgYXJndW1lbnQsIGUuZy4gQFNlcnZpY2UoU29tZVNlcnZpY2UpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXNNb2RlbCA9IHR5cGVvZiByZXNvbHZlZCAhPT0gXCJzdHJpbmdcIiAmJiBpc01vZGVsQ29uc3RydWN0b3IocmVzb2x2ZWQpO1xuICAgIGNvbnN0IHRva2VuID0gYXNNb2RlbFxuICAgICAgPyBtb2RlbFNlcnZpY2VUb2tlbihyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KVxuICAgICAgOiBpbmplY3RhYmxlU2VydmljZUtleShyZXNvbHZlZCBhcyBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTtcblxuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IHtcbiAgICAgIGlmIChhc01vZGVsKSByZXR1cm4gTW9kZWxTZXJ2aWNlLmZvck1vZGVsKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pO1xuICAgICAgcmV0dXJuIHR5cGVvZiByZXNvbHZlZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZClcbiAgICAgICAgOiBDb3JlU2VydmljZS5nZXQocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gSW5qZWN0KHRva2VuKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBwYXJhbWV0ZXJJbmRleCk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0cnVjdG9yIHBhcmFtZXRlciBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVjYWYge0BsaW5rIENvcmVSZXBvc2l0b3J5fSBmb3IgYG1vZGVsYC5cbiAqIEBzdW1tYXJ5IFVubGlrZSB7QGxpbmsgU2VydmljZX0sIGBtb2RlbGAgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYSBNb2RlbCBjbGFzczogdGhlIHNhbWUgY2xhc3MgcGFzc2VkXG4gKiB0byBgQFNlcnZpY2UobW9kZWwpYCBhbmQgYEBSZXBvc2l0b3J5KG1vZGVsKWAgcmVzb2x2ZXMgdG8gdHdvIGRpZmZlcmVudCBpbmplY3RlZCBvYmplY3RzIChhXG4gKiBgTW9kZWxTZXJ2aWNlPE0+YCB2cyBhIGBSZXBvc2l0b3J5PE0+YCByZXNwZWN0aXZlbHkpLCB2aWEge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqIEBwYXJhbSBtb2RlbCB0aGUgbW9kZWwgY2xhc3MgdG8gcmVzb2x2ZSBhIHJlcG9zaXRvcnkgZm9yLlxuICogQHBhcmFtIGZsYXZvdXIgb3B0aW9uYWwgYWRhcHRlciBmbGF2b3VyL2FsaWFzLCBmb3J3YXJkZWQgdG8ge0BsaW5rIENvcmVSZXBvc2l0b3J5LmZvck1vZGVsfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFJlcG9zaXRvcnkoXG4gIG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+LFxuICBmbGF2b3VyPzogc3RyaW5nXG4pOiBQYXJhbWV0ZXJEZWNvcmF0b3Ige1xuICByZXR1cm4gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1ldGVySW5kZXg6IG51bWJlclxuICApOiB2b2lkID0+IHtcbiAgICBjb25zdCB0b2tlbiA9IG1vZGVsUmVwb3NpdG9yeVRva2VuKG1vZGVsLCBmbGF2b3VyKTtcbiAgICByZWdpc3RlclByb3ZpZGVyKHRva2VuLCAoKSA9PiBDb3JlUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCwgZmxhdm91cikpO1xuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBUFBfSU5URVJDRVBUT1IsIE1vZHVsZVJlZiB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFQ0FGX0FEQVBURVJfSUQsXG4gIERFQ0FGX0hBTkRMRVJTLFxuICBERUNBRl9NT0RVTEVfT1BUSU9OUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG59IGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuaW1wb3J0IHsgRGVjYWZIYW5kbGVyRXhlY3V0b3IsIERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VTZXJ2aWNlLCBTZXJ2aWNlIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7XG4gIFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcixcbiAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1odHRwL3NlcnZlclwiO1xuXG5AR2xvYmFsKClcbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZDb3JlTW9kdWxlPENPTkYsIEFEQVBURVIgZXh0ZW5kcyBBZGFwdGVyPENPTkYsIGFueSwgYW55LCBhbnk+PlxuICBpbXBsZW1lbnRzIE9uQXBwbGljYXRpb25TaHV0ZG93blxue1xuICBwcml2YXRlIHN0YXRpYyBfbG9nZ2VyOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX3BlcnNpc3RlbmNlPzogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj47XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgcGVyc2lzdGVuY2UoKTogUGVyc2lzdGVuY2VTZXJ2aWNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55Pj4ge1xuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlBlcnNpc3RlbmNlIHNlcnZpY2Ugbm90IGluaXRpYWxpemVkXCIpO1xuICAgIHJldHVybiB0aGlzLl9wZXJzaXN0ZW5jZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZkNvcmVNb2R1bGUpO1xuICAgIHJldHVybiB0aGlzLl9sb2dnZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERFQ0FGX01PRFVMRV9PUFRJT05TKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zPENPTkYsIEFEQVBURVI+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlUmVmOiBNb2R1bGVSZWZcbiAgKSB7fVxuXG4gIHN0YXRpYyBmb3JSb290KG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9ucyk6IER5bmFtaWNNb2R1bGUge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmZvclJvb3QpO1xuICAgIGNvbnN0IGRlY2FmUHJvdmlkZXJzID0gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfTU9EVUxFX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH0sXG4gICAgICAgIHsgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCwgdXNlVmFsdWU6IHRoaXMucGVyc2lzdGVuY2U/LmNsaWVudCB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogREVDQUZfSEFORExFUlMsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKCkgPT5cbiAgICAgICAgICAgIG9wdGlvbnMuaGFuZGxlcnM/Lm1hcCgoSCkgPT4ge1xuICAgICAgICAgICAgICBsb2cuaW5mbyhgUmVnaXN0ZXJlZCByZXF1ZXN0IGhhbmRsZXI6ICR7SC5uYW1lfWApO1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IEgoKTtcbiAgICAgICAgICAgIH0pID8/IFtdLFxuICAgICAgICB9LFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAgICAgICAgICB1c2VDbGFzczogRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yLFxuICAgICAgICB9LFxuICAgICAgICAuLi5kZWNhZlByb3ZpZGVycyxcbiAgICAgIF0sXG4gICAgICBleHBvcnRzOiBbXG4gICAgICAgIERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgICBERUNBRl9BREFQVEVSX0lELFxuICAgICAgICBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgRGVjYWZIYW5kbGVyRXhlY3V0b3IsXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLm1hcCgocHJvdmlkZXIpID0+IHByb3ZpZGVyLnByb3ZpZGUpLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGJvb3RQZXJzaXN0ZW5jZShcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXT4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJvb3RQZXJzaXN0ZW5jZSk7XG5cbiAgICBpZiAoIXRoaXMuX3BlcnNpc3RlbmNlKSB7XG4gICAgICBjb25zdCB0cmltbWVkID0gb3B0aW9ucy5jb25mLm1hcCgoW2NvbnRyLCBjZmcsIC4uLmFyZ3NdKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlID0gYXJncy5wb3AoKTtcbiAgICAgICAgaWYgKCFwb3NzaWJsZSkgcmV0dXJuIFtjb250ciwgY2ZnXTtcbiAgICAgICAgcmV0dXJuIFtjb250ciwgY2ZnLCAuLi5hcmdzXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fcGVyc2lzdGVuY2UgPSBuZXcgUGVyc2lzdGVuY2VTZXJ2aWNlKCk7XG4gICAgICBhd2FpdCB0aGlzLl9wZXJzaXN0ZW5jZS5ib290KHRyaW1tZWQpO1xuICAgICAgY29uc3QgY2xpZW50cyA9IHRoaXMuX3BlcnNpc3RlbmNlLmNsaWVudDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2xpZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjID0gb3B0aW9ucy5jb25mW2ldO1xuICAgICAgICBjb25zdCBwb3NzaWJsZVRyYW5zZiA9IGMuc2xpY2UoMiwgYy5sZW5ndGgpO1xuICAgICAgICBsZXQgdHJhbnNmb3JtZXIgPSBwb3NzaWJsZVRyYW5zZi5wb3AoKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0cmFuc2Zvcm1lciB8fFxuICAgICAgICAgICEodHJhbnNmb3JtZXIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgY29udHIgPSBBZGFwdGVyLnRyYW5zZm9ybWVyRm9yKGNsaWVudHNbaV0uZmxhdm91cik7XG4gICAgICAgICAgaWYgKCFjb250cilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgTm8gdHJhbnNmb3JtZXIgZm91bmQgZm9yIGZsYXZvdXIgJHtjbGllbnRzW2ldLmZsYXZvdXJ9LiB5b3Ugc2hvdWxkIGVpdGhlciBAcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIG9yIHByb3ZpZGUgYSB0cmFuc2Zvcm1lciBpbiB0aGUgY29uZmlnYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSAoY29udHIgYXMgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4pLmZyb21cbiAgICAgICAgICAgICAgPyBjb250clxuICAgICAgICAgICAgICA6IG5ldyAoY29udHIgYXMgQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPGFueT4+KSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGJvb3QgdHJhbnNmb3JtZXIgZm9yICR7Y2xpZW50c1tpXS5mbGF2b3VyfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lcihjbGllbnRzW2ldLmZsYXZvdXIpKHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICAgIGxvZy5pbmZvKFwicGVyc2lzdGVuY2UgbGF5ZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuXG4gICAgICBpZiAob3B0aW9ucy5pbml0aWFsaXphdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbjogJHtlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGVyc2lzdGVuY2UuY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W10gPVxuICAgICAgdGhpcy5tb2R1bGVSZWYuZ2V0PGFueT4oREVDQUZfQURBUFRFUl9JRCk7XG4gICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIGFkYXB0ZXJzKVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGFkYXB0ZXIpIHtcbiAgICAgICAgICBsb2cuaW5mbyhgU2h1dHRpbmcgZG93biAke2FkYXB0ZXIudG9TdHJpbmcoKX1gKTtcbiAgICAgICAgICBhd2FpdCBhZGFwdGVyLnNodXRkb3duKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gYXBwbGljYXRpb25gLCBlIGFzIEVycm9yKTtcbiAgICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgU2VydmljZS5zaHV0ZG93bigpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2VzYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgY29uc3QgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTID0gU3ltYm9sKFxuICBcIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSU1wiXG4pO1xuIiwiZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJnczogYW55W10pOiB1bmtub3duW10ge1xuICBjb25zdCBbbW9kZWxDb25zdHIsIG9wZXJhdGlvbiwgaWQsIHBheWxvYWRdID0gYXJncztcblxuICBjb25zdCBtb2RlbE5hbWUgPSBtb2RlbENvbnN0cj8ubmFtZSA/PyBtb2RlbENvbnN0cjtcblxuICBjb25zdCBzZXJpYWxpemVkUGF5bG9hZCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZClcbiAgICA/IHBheWxvYWQubWFwKChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBlLnNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZS5zZXJpYWxpemUoKTtcblxuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBQYXlsb2FkIGl0ZW0gZm9yICR7bW9kZWxOYW1lfSBkb2VzIG5vdCBoYXZlIHNlcmlhbGl6ZSBtZXRob2QgYW5kIGlzIGFuICR7dHlwZW9mIGV9LCBhdHRlbXB0aW5nIHRvIHN0cmluZ2lmeSBkaXJlY3RseS4gSXRlbTogJHtlfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZSA9PT0gXCJzdHJpbmdcIiA/IGUgOiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gc2VyaWFsaXplIHBheWxvYWQgZm9yICR7bW9kZWxOYW1lfTogJHtlcnJ9YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICA6IHBheWxvYWQgJiYgdHlwZW9mIHBheWxvYWQuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gcGF5bG9hZC5zZXJpYWxpemUoKVxuICAgICAgOiB0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IHBheWxvYWRcbiAgICAgICAgOiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcblxuICBjb25zb2xlLmRlYnVnKFxuICAgIGBOb3JtYWxpemVkIGV2ZW50IHJlc3BvbnNlIGZvciBtb2RlbCAke21vZGVsTmFtZX0sIG9wZXJhdGlvbiAke29wZXJhdGlvbn0sIGlkICR7aWR9OmAsXG4gICAgc2VyaWFsaXplZFBheWxvYWRcbiAgKTtcblxuICByZXR1cm4gW21vZGVsTmFtZSwgb3BlcmF0aW9uLCBpZCwgc2VyaWFsaXplZFBheWxvYWRdO1xufVxuIiwiaW1wb3J0IHsgRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIE9ic2VydmVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sbGVyLCBJbmplY3QsIE1lc3NhZ2VFdmVudCwgUXVlcnksIFNzZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgaW50ZXJ2YWwsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuQENvbnRyb2xsZXIoKVxuZXhwb3J0IGNsYXNzIEV2ZW50c0NvbnRyb2xsZXIgZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8RGVjYWZTZXJ2ZXJDdHg+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhZGFwdGVyczogQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+W107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBASW5qZWN0KExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUykgZmxhdm91cnM6IHN0cmluZ1tdXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQsIEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG4gICAgdGhpcy5hZGFwdGVycyA9IGZsYXZvdXJzLm1hcCgoZmxhdm91cikgPT4gKEFkYXB0ZXIgYXMgYW55KS5nZXQoZmxhdm91cikpOyAvLyBjaGFuZ2UgdG8gQWRhcHRlci5jYWNoZShcIlwiKVxuICB9XG5cbiAgQFNzZSgpXG4gIGxpc3RlbigpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICBjb25zdCBldmVudHMkID0gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IG9ic2VydmVySWQgPVxuICAgICAgICBgQi0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDgpfWAudG9VcHBlckNhc2UoKTtcblxuICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgIGBDcmVhdGluZyBTU0Ugb2JzZXJ2ZXI6ICR7b2JzZXJ2ZXJJZH0gZm9yIGNsaWVudCAke3RoaXMuY2xpZW50Q29udGV4dC51dWlkfWBcbiAgICAgICk7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIG9ic2VydmVySWQgPSBvYnNlcnZlcklkO1xuICAgICAgICByZWZyZXNoKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFNTRSBvYnNlcnZlciAke3RoaXMub2JzZXJ2ZXJJZH0gcmVjZWl2ZWQgcmVmcmVzaCBldmVudGBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVFdmVudFJlc3BvbnNlKGFyZ3MpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh7IHR5cGU6IFwibWVzc2FnZVwiLCBkYXRhIH0pO1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSBldmVudCBwdXNoZWQgdG8gY2xpZW50YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgbG9nZ2VyLnZlcmJvc2UoXG4gICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGFjcm9zcyAke3RoaXMuYWRhcHRlcnMubGVuZ3RofSBhZGFwdGVyKHMpYFxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWdpc3RlcmluZyBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlZ2lzdGVyIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgQ2xlYW5pbmcgdXAgU1NFIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH1gKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgIGNvbnN0IGFkYXB0ZXJOYW1lID0gYWRhcHRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbmtub3duQWRhcHRlclwiO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBVbnJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gZnJvbSBhZGFwdGVyICR7YWRhcHRlck5hbWV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFkYXB0ZXIudW5PYnNlcnZlKGNiKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYEZhaWxlZCBkdXJpbmcgY2xlYW51cCBvZiBvYnNlcnZlciAke29ic2VydmVySWR9IGluIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX06ICR7ZT8ubWVzc2FnZSB8fCBlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgSEVBUlRCRUFUX0lOVEVSVkFMX01TID0gMTUwMDA7XG4gICAgY29uc3QgaGVhcnRiZWF0JCA9IGludGVydmFsKEhFQVJUQkVBVF9JTlRFUlZBTF9NUykucGlwZShcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNlbmRpbmcgaGVhcnRiZWF0XCIpO1xuICAgICAgfSksXG4gICAgICBtYXAoXG4gICAgICAgICgpOiBNZXNzYWdlRXZlbnQgPT4gKHtcbiAgICAgICAgICB0eXBlOiBcImhlYXJ0YmVhdFwiLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgcmV0dXJuIG1lcmdlKGV2ZW50cyQsIGhlYXJ0YmVhdCQpO1xuICB9XG5cbiAgQFNzZShcIi86bW9kZWxcIilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBsaXN0ZW5Gb3JNb2RlbChAUXVlcnkoXCJtb2RlbFwiKSBtb2RlbDogc3RyaW5nKTogT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+IHtcbiAgICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihFdmVudHNDb250cm9sbGVyLm5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4oKG9ic2VydmVyKSA9PiB7XG4gICAgICBjb25zdCBjYiA9IG5ldyAoY2xhc3MgaW1wbGVtZW50cyBPYnNlcnZlciB7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgZGF0YTogYXJncyB9IGFzIGFueSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgYWRhcHRlci5vYnNlcnZlKGNiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGBGYWlsZWQgdG8gb2JzZXJ2ZSBldmVudDogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgdGhpcy5hZGFwdGVycykge1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEV2ZW50c0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9FdmVudHNDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgfSBmcm9tIFwiLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi9yZXF1ZXN0XCI7XG5cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZTdHJlYW1Nb2R1bGUge1xuICBzdGF0aWMgZm9yRmxhdm91cnMoXG4gICAgZmxhdm91cnM6IHN0cmluZ1tdLFxuICAgIHBhdGg6IHN0cmluZyA9IFwiZXZlbnRzXCJcbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZTdHJlYW1Nb2R1bGUsXG4gICAgICBjb250cm9sbGVyczogW0V2ZW50c0NvbnRyb2xsZXJdLFxuICAgICAgaW1wb3J0czogW1xuICAgICAgICBSb3V0ZXJNb2R1bGUucmVnaXN0ZXIoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpLFxuICAgICAgICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgIF0sXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyxcbiAgICAgICAgICB1c2VWYWx1ZTogZmxhdm91cnMgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBnZXRNb2R1bGVGb3IgfSBmcm9tIFwiLi9kZWNhZi1tb2RlbC9pbmRleFwiO1xuaW1wb3J0IHsgRGVjYWZTdHJlYW1Nb2R1bGUgfSBmcm9tIFwiLi9ldmVudHMtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMsIGF1dG9TZXJ2aWNlcyB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICBhd2FpdCBEZWNhZkNvcmVNb2R1bGUuYm9vdFBlcnNpc3RlbmNlKG9wdGlvbnMpO1xuICAgIGNvbnN0IGZsYXZvdXJzID0gYWRhcHRlcnMubWFwKChhZGFwdGVyKSA9PiBhZGFwdGVyLmZsYXZvdXIpO1xuXG4gICAgY29uc3QgaW1wb3J0czpcbiAgICAgIHwgKFxuICAgICAgICAgIHwgRHluYW1pY01vZHVsZVxuICAgICAgICAgIHwgVHlwZTxhbnk+XG4gICAgICAgICAgfCBQcm9taXNlPER5bmFtaWNNb2R1bGU+XG4gICAgICAgICAgfCBGb3J3YXJkUmVmZXJlbmNlPGFueT5cbiAgICAgICAgKVtdXG4gICAgICB8IHVuZGVmaW5lZCA9IFtEZWNhZkNvcmVNb2R1bGUuZm9yUm9vdChvcHRpb25zKV07XG5cbiAgICBpZiAoYXV0b0NvbnRyb2xsZXJzKSB7XG4gICAgICAgIGZsYXZvdXJzLmZvckVhY2goKGZsYXZvdXIpID0+IHtcbiAgICAgICAgICBpbXBvcnRzLnB1c2goXG4gICAgICAgICAgICBnZXRNb2R1bGVGb3IoZmxhdm91cikuZm9yUm9vdChmbGF2b3VyLCB7XG4gICAgICAgICAgICAgIGF1dG9TZXJ2aWNlcyxcbiAgICAgICAgICAgICAgY29udHJvbGxlckV4cG9zdXJlOiBvcHRpb25zLmNvbnRyb2xsZXJFeHBvc3VyZSxcbiAgICAgICAgICAgICAgY29udHJvbGxlckNvbmZpZzogb3B0aW9ucy5jb250cm9sbGVyQ29uZmlnLFxuICAgICAgICAgICAgICBhZ2dyZWdhdGlvbnM6IG9wdGlvbnMuYWdncmVnYXRpb25zLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgIGlmIChvcHRpb25zLm9ic2VydmVyT3B0aW9ucz8uZW5hYmxlT2JzZXJ2ZXJFdmVudHMpIHtcbiAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgRGVjYWZTdHJlYW1Nb2R1bGUuZm9yRmxhdm91cnMoXG4gICAgICAgICAgb3B0aW9ucy5vYnNlcnZlck9wdGlvbnMub2JzZXJ2ZXJGbGF2b3VycyB8fCBmbGF2b3Vyc1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtb2R1bGU6IERlY2FmTW9kdWxlLFxuICAgICAgaW1wb3J0czogaW1wb3J0cyxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5NaWdyYXRpb25zKCk6IFByb21pc2U8dm9pZD4ge31cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdGlvblwiOyAvLyBvbiB0b3Agb24gcHVycG9zZVxuZXhwb3J0ICogZnJvbSBcIi4vZGVjYWYtbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2F1dGhcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyY2VwdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3ZlcnJpZGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZXF1ZXN0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnRyb2xsZXJzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcbi8vIGV4cG9ydCAqIGZyb20gXCIuL3dlYmhvb2tzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSB0cy13b3Jrc3BhY2UgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuXG4gKiBAY29uc3RhbnRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IGNvbW1pdCBoYXNoIG9mIHRoZSBtb2R1bGUgYnVpbGQuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgZ2l0IGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS4gVGhlIGJ1aWxkIHJlcGxhY2VzXG4gKiB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGNvbW1pdCBoYXNoIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBDT01NSVRcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBmdWxsIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIHNlbXZlciB2ZXJzaW9uIGFuZCBjb21taXQgaGFzaCBmb3IgdGhlIHBhY2thZ2UuXG4gKiBUaGUgYnVpbGQgcmVwbGFjZXMgdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCBgPHZlcnNpb24+LTxjb21taXQ+YCB2YWx1ZSBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgRlVMTF9WRVJTSU9OXG4gKi9cbmV4cG9ydCBjb25zdCBGVUxMX1ZFUlNJT04gPSBcIiMjRlVMTF9WRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFIyNcIjtcblxuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbih0cnVlKTtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuTWV0YWRhdGEuYWxsb3dSZXJlZ2lzdHJhdGlvbihmYWxzZSk7XG4iXSwibmFtZXMiOlsiREVDT1JBVE9SU19QUkVGSVgiLCJERUNPUkFUT1JTIiwiQVBJX09QRVJBVElPTiIsIkFQSV9SRVNQT05TRSIsIkFQSV9QUk9EVUNFUyIsIkFQSV9DT05TVU1FUyIsIkFQSV9UQUdTIiwiQVBJX0NBTExCQUNLUyIsIkFQSV9QQVJBTUVURVJTIiwiQVBJX0hFQURFUlMiLCJBUElfTU9ERUxfUFJPUEVSVElFUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZIiwiQVBJX1NFQ1VSSVRZIiwiQVBJX0VYQ0xVREVfRU5EUE9JTlQiLCJBUElfRVhDTFVERV9DT05UUk9MTEVSIiwiQVBJX0VYVFJBX01PREVMUyIsIkFQSV9FWFRFTlNJT04iLCJBUElfU0NIRU1BIiwiQVBJX0RFRkFVTFRfR0VUVEVSIiwiQVBJX0xJTksiLCJpc0NvbnN0cnVjdG9yIiwidmFsIiwiTUVUQURBVEFfRkFDVE9SWV9OQU1FIiwiTUVUSE9EX01FVEFEQVRBIiwiY3JlYXRlTWV0aG9kRGVjb3JhdG9yIiwibWV0YWtleSIsIm1ldGFkYXRhIiwib3ZlcnJpZGVFeGlzdGluZyIsInRhcmdldCIsImtleSIsImRlc2NyaXB0b3IiLCJwcmV2VmFsdWUiLCJSZWZsZWN0IiwiZ2V0TWV0YWRhdGEiLCJ2YWx1ZSIsImRlZmluZU1ldGFkYXRhIiwiY3JlYXRlQ2xhc3NEZWNvcmF0b3IiLCJjcmVhdGVQcm9wZXJ0eURlY29yYXRvciIsInByb3BlcnR5S2V5IiwicHJvcGVydGllcyIsImluY2x1ZGVzIiwiZXhpc3RpbmdNZXRhZGF0YSIsIm5ld01ldGFkYXRhIiwicGlja0J5IiwibmVnYXRlIiwiaXNVbmRlZmluZWQiLCJtZXRhZGF0YVRvU2F2ZSIsInR5cGUiLCJjb25zdHJ1Y3RvciIsImNyZWF0ZU1peGVkRGVjb3JhdG9yIiwibWV0YWRhdGFzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJldmlvdXNNZXRhZGF0YSIsIk9iamVjdCIsImFzc2lnbiIsImNyZWF0ZVBhcmFtRGVjb3JhdG9yIiwiaW5pdGlhbCIsInBhcmFtT3B0aW9ucyIsInBhcmFtZXRlcnMiLCJwcm9wZXJ0eUtleXMiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwicHJvdG90eXBlIiwibWV0aG9kRGVzY3JpcHRvciIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImlzQXBpTWV0aG9kIiwiaGFzTWV0YWRhdGEiLCJnZXRUeXBlSXNBcnJheVR1cGxlIiwiaW5wdXQiLCJpc0FycmF5RmxhZyIsImlzSW5wdXRBcnJheSIsIm9iaiIsImdldEVudW1WYWx1ZXMiLCJlbnVtVHlwZSIsIm51bWVyaWNWYWx1ZXMiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJtYXAiLCJ0b1N0cmluZyIsImtleXMiLCJnZXRFbnVtVHlwZSIsImhhc1N0cmluZyIsImlzU3RyaW5nIiwibGVuZ3RoIiwicmVxdWlyZWQiLCJpc0VudW1BcnJheSIsIm9wdHMiLCJlbnVtIiwidW5kZWZpbmVkIiwiQXBpUHJvcGVydHkiLCJvcHRpb25zIiwiY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3IiLCJlbnVtVmFsdWVzIiwiaXRlbXMiLCJBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJNb2RlbENvbnN0cnVjdG9yIiwidmVyYiIsInBhdGgiLCJodHRwVG9DcnVkIiwiR0VUIiwiT3BlcmF0aW9uS2V5cyIsIlJFQUQiLCJHZXQiLCJQT1NUIiwiQ1JFQVRFIiwiUG9zdCIsIlBVVCIsIlVQREFURSIsIlB1dCIsIlBBVENIIiwiUGF0Y2giLCJERUxFVEUiLCJEZWxldGUiLCJjcnVkT3AiLCJIdHRwTWV0aG9kRGVjb3JhdG9yIiwicmVzb2x2ZUJsb2NrVGFyZ2V0IiwiY29yZUlzT3BlcmF0aW9uQmxvY2tlZCIsImtpbmQiLCJhcHBseSIsIkFwaUV4Y2x1ZGVFbmRwb2ludCIsIkJ1bGtBcGlPcGVyYXRpb25Gcm9tTW9kZWwiLCJCdWxrQ3J1ZE9wZXJhdGlvbktleXMiLCJSRUFEX0FMTCIsIkNSRUFURV9BTEwiLCJVUERBVEVfQUxMIiwiREVMRVRFX0FMTCIsIm5vcm1hbGl6ZWQiLCJyZXBsYWNlIiwic3RhdGVtZW50VGFyZ2V0cyIsIlByZXBhcmVkU3RhdGVtZW50S2V5cyIsIkxJU1RfQlkiLCJQQUdFX0JZIiwiRklORCIsIlBBR0UiLCJGSU5EX09ORV9CWSIsIkZJTkRfQlkiLCJDT1VOVF9PRiIsIk1BWF9PRiIsIk1JTl9PRiIsIkFWR19PRiIsIlNVTV9PRiIsIkRJU1RJTkNUX09GIiwiR1JPVVBfT0YiLCJzdGFydHNXaXRoIiwic3RhdGVtZW50VmFsdWUiLCJBcGlQYXJhbXNGcm9tTW9kZWwiLCJwcm9wcyIsImRlY29yYXRvcnMiLCJwIiwiQXBpUGFyYW1EZWMiLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJTdHJpbmciLCJhcHBseURlY29yYXRvcnMiLCJEZWNhZkJvZHkiLCJkYXRhIiwiY3R4IiwicmVxdWVzdCIsInN3aXRjaFRvSHR0cCIsImdldFJlcXVlc3QiLCJib2R5IiwiY29udHJvbGxlciIsImdldENsYXNzIiwiTW9kZWxDb25zdHIiLCJjbGFzcyIsIkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24iLCJpdGVtIiwiT3JkZXJlZFBhcmFtcyIsIm9yZGVyIiwicmVxIiwib3JpZ2luYWwiLCJwYXJhbXMiLCJvcmRlckxpc3QiLCJvcmRlcmVkIiwiayIsInJhdyIsInZhbHVlc0luT3JkZXIiLCJrZXlzSW5PcmRlciIsIkRlY2FmUGFyYW1zIiwiRGVjYWZRdWVyeSIsIl8iLCJxdWVyeSIsInBhcnNlZCIsImxpbWl0IiwibiIsIk51bWJlciIsImlzTmFOIiwib2Zmc2V0IiwiYm9va21hcmsiLCJERUNBRl9NT0RVTEVfT1BUSU9OUyIsIkRFQ0FGX0FEQVBURVJfSUQiLCJERUNBRl9UQVNLX1NFUlZJQ0VfSUQiLCJERUNBRl9ST1VURSIsIkRFQ0FGX0hBTkRMRVJTIiwiU3ltYm9sIiwiREVDQUZfRVhQT1NFIiwiREVDQUZfQ09OVFJPTExFUl9DT05GSUciLCJERUNBRl9DT05URVhUX0tFWSIsImV4cG9zZSIsImZsYXZvdXJzIiwiTWV0YWRhdGEiLCJzZXQiLCJjb250cm9sbGVyQ29uZmlnIiwiY29uZmlnIiwiY29udHJvbGxlckNvbmZpZ0RlY29yYXRvciIsIkFVVEhfSEFORExFUiIsIkFVVEhfTUVUQV9LRVkiLCJJU19QVUJMSUNfS0VZIiwiUkVRVUlSRURfUk9MRVNfS0VZIiwiU0tJUF9NT0RFTF9ST0xFU19LRVkiLCJEZWNhZlJlcXVlc3RDb250ZXh0IiwiUmVxdWVzdENvbnRleHQiLCJzdXBlciIsImhlYWRlcnNPZiIsImhlYWRlcnMiLCJ0aGlzIiwidXVpZCIsIlVVSUQiLCJpbnN0YW5jZSIsImdlbmVyYXRlIiwiZ2V0T3JVbmRlZmluZWQiLCJwdXQiLCJyZWNvcmQiLCJvdmVycmlkZXMiLCJnZXQiLCJlIiwiYWNjdW11bGF0ZSIsIl9fZGVjb3JhdGUiLCJJbmplY3RhYmxlIiwic2NvcGUiLCJTY29wZSIsIlJFUVVFU1QiLCJfX3BhcmFtIiwiSW5qZWN0IiwiQXV0aEludGVyY2VwdG9yIiwicmVmbGVjdG9yIiwicmVxdWVzdENvbnRleHQiLCJhdXRoSGFuZGxlciIsImludGVyY2VwdCIsIm5leHQiLCJsb2ciLCJMb2dnaW5nIiwiZm9yIiwiaXNQdWJsaWMiLCJnZXRBbGxBbmRPdmVycmlkZSIsImdldEhhbmRsZXIiLCJtb2RlbE5hbWUiLCJyZXF1aXJlZFJvbGVzIiwic2tpcE1vZGVsUm9sZXMiLCJlZmZlY3RpdmVNb2RlbCIsInZlcmJvc2UiLCJkZWJ1ZyIsImF1dGhvcml6ZSIsImFwcGx5VHJhbnNmb3JtZXJzIiwidXNlciIsIm9yZ2FuaXphdGlvbiIsImN1cnJlbnRMb2ciLCJjaGlsZExvZyIsImxvZ2dlciIsImhhbmRsZSIsIkFkYXB0ZXIiLCJmbGF2b3Vyc1RvVHJhbnNmb3JtIiwiZmxhdm91ciIsInRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJGb3IiLCJmcm9tIiwiT3B0aW9uYWwiLCJSZWZsZWN0b3IiLCJBdXRoIiwibW9kZWwiLCJyZXNvdXJjZSIsImRlY3MiLCJBcGlCZWFyZXJBdXRoIiwiVXNlSW50ZXJjZXB0b3JzIiwicHVzaCIsIlNldE1ldGFkYXRhIiwiUHVibGljIiwiUmVxdWlyZVJvbGVzIiwicm9sZXMiLCJBcGlTZWN1cml0eSIsIkh0dHBWZXJiVG9EZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJVbnN1cHBvcnRlZEVycm9yIiwiZXh0cmFjdFBhdGhQYXJhbXMiLCJyb3V0ZVBhdGgiLCJzcGxpdCIsInNsaWNlIiwiYXBpUGFyYW1TcGVjIiwidG9EZWNhZkVycm9yIiwiZXJyb3IiLCJmYWxsYmFja01lc3NhZ2UiLCJCYXNlRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiRXJyb3IiLCJtZXNzYWdlIiwiZ2V0QXBpRGVjb3JhdG9ycyIsIm1ldGhvZE5hbWUiLCJodHRwVmVyYiIsImluY2x1ZGVRdWVyeVBhcmFtcyIsIk5lc3RIdHRwUm91dGVEZWMiLCJhcGlQYXRoUGFyYW1zIiwic3dhZ2dlclF1ZXJ5UGFyYW1zIiwiQXBpUXVlcnkiLCJPcmRlckRpcmVjdGlvbiIsIm1ldGhvZCIsIkFwaVBhcmFtIiwiQXBpT3BlcmF0aW9uIiwic3VtbWFyeSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb0NvbnRlbnRSZXNwb25zZSIsIlF1ZXJ5IiwiYXBwbHlBcGlEZWNvcmF0b3JzIiwicHJvdG8iLCJmb3JFYWNoIiwiZCIsImluZGV4IiwicmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kIiwicGVyc2lzdGVuY2UiLCJhcmdzIiwiTW9kZWxTZXJ2aWNlIiwic3RhdGVtZW50IiwiY3JlYXRlUm91dGVIYW5kbGVyIiwiYXN5bmMiLCJwYXRoUGFyYW1zIiwicXVlcnlQYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZGlyZWN0aW9uIiwiZGVmaW5lUm91dGVNZXRob2QiLCJDb250cm9sbGVyQ2xhc3MiLCJoYW5kbGVyIiwiZGVmaW5lUHJvcGVydHkiLCJ3cml0YWJsZSIsIkRlY2FmQXV0aEhhbmRsZXIiLCJBdXRoSGFuZGxlciIsInBhcnNlUmVxdWVzdCIsInVzZXJSb2xlIiwiYXV0aG9yaXphdGlvbiIsImV4dHJhY3RGcm9tQXV0aCIsIkF1dGhvcml6YXRpb25FcnJvciIsIkRlY2FmUm9sZUF1dGhIYW5kbGVyIiwiRGVjYWZBdXRoTW9kdWxlIiwiRGVjYWZBdXRoTW9kdWxlXzEiLCJmb3JSb290IiwicHJvdmlkZXJzIiwicHJvdmlkZSIsInVzZUNsYXNzIiwiZ2xvYmFsIiwiQVBQX0lOVEVSQ0VQVE9SIiwidXNlRXhpc3RpbmciLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kdWxlIiwiRGVjYWZIYW5kbGVyRXhlY3V0b3IiLCJEZWNhZkhhbmRsZXJFeGVjdXRvcl8xIiwiaGFuZGxlcnMiLCJjb250ZXh0IiwiZXhlYyIsInJlcyIsInVybCIsIkRlY2FmUmVzcG9uc2VJbnRlcmNlcHRvciIsInJlc3BvbnNlIiwiZ2V0UmVzcG9uc2UiLCJwaXBlIiwidGFwIiwidG9SZXNwb25zZSIsIkRlY2FmQ29udHJvbGxlciIsIkh0dHBEZWNhZkNvbnRyb2xsZXIiLCJjbGllbnRDb250ZXh0IiwiX25hbWUiLCJEZWNhZk1vZGVsQ29udHJvbGxlciIsIl9wZXJzaXN0ZW5jZSIsIlNlcnZpY2UiLCJnZXRTZXJ2aWNlIiwiUmVwb3NpdG9yeSIsImZvck1vZGVsIiwidG9PdmVycmlkZXMiLCJvdmVycmlkZSIsImR0b0NhY2hlIiwiTWFwIiwiRHRvRm9yIiwib3AiLCJzdGFjayIsIlNldCIsIlRyYW5zYWN0aW9uT3BlcmF0aW9uS2V5cyIsImNhY2hlIiwiZ2V0RHRvQ2FjaGUiLCJjYWNoZWQiLCJpc1VwZGF0ZU9wIiwiRHluYW1pY0RUTyIsInRvUGFzY2FsQ2FzZSIsInBrUHJvcCIsIk1vZGVsIiwicGsiLCJwa1Byb3BzTWV0YWRhdGEiLCJwa1Byb3BzIiwicGtEZXNpZ25UeXBlIiwicGtUeXBlSXNOdW1lcmljIiwiQmlnSW50IiwicGtJc0dlbmVyYXRlZCIsImdlbmVyYXRlZCIsImdlbmVyYXRlZEJ5U2VxdWVuY2UiLCJpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UiLCJhbGxQcm9wcyIsInJlbGF0aW9ucyIsInNjYWxhclByb3BzIiwicHJvcCIsImhhcyIsInZhbGlkYXRpb24iLCJnZXRWYWxpZGF0aW9uQWNyb3NzSW5oZXJpdGFuY2UiLCJpc1JlcXVpcmVkIiwiVmFsaWRhdGlvbktleXMiLCJSRVFVSVJFRCIsInR5cGVIaW50IiwiZ2V0VHlwZUFjcm9zc0luaGVyaXRhbmNlIiwiYXBpT3B0aW9ucyIsImRlc2lnblR5cGUiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwicmVsYXRpb24iLCJyZWxhdGlvbk1ldGEiLCJyZWxhdGlvblR5cGUiLCJtZXRhIiwidmFsaWRhdGlvbkZvciIsIkxJU1QiLCJpc0NpcmN1bGFyIiwicGtUeXBlTmFtZSIsImdldFBrT3BlbkFwaVR5cGUiLCJhZGRSZWxhdGlvblBrUmVmIiwicmVsYXRpb25EdG8iLCJhZGQiLCJhZGRSZWxhdGlvblVwZGF0ZSIsImFkZFJlbGF0aW9uIiwiRHRvQ2xhc3MiLCJleHRyYU1vZGVscyIsImR0b1JlZiIsIm9uZU9mSXRlbXMiLCIkcmVmIiwib25lT2YiLCJwa1R5cGUiLCJjdXJyZW50IiwiRnVuY3Rpb24iLCJnZXRQcm90b3R5cGVPZiIsIldlYWtNYXAiLCJ0b0NvbnRleHRGbGFncyIsImFkYXB0ZXIiLCJhbGlhcyIsImJpbmQiLCJyZXF1ZXN0VHJhbnNmb3JtZXJzIiwiQ29udGV4dCIsInBlbmRpbmciLCJoZWFkZXIiLCJNb2RlbEJ1aWxkZXIiLCJkZWNvcmF0ZUNsYXNzIiwiX2NsYXNzRGVjb3JhdG9ycyIsIl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0Iiwib3JpZ2luYWxCdWlsZCIsImJ1aWxkIiwicmVzdWx0IiwiY2FsbCIsImRlY29yYXRlZCIsIkZyb21Nb2RlbENvbnRyb2xsZXIiLCJnZXRQZXJzaXN0ZW5jZSIsIk1vZGVsQ2xhenoiLCJlMiIsImNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnkiLCJwcmVmaXgiLCJQZXJzaXN0ZW5jZUtleXMiLCJRVUVSWSIsInJlcG8iLCJxdWVyeU1ldGhvZHMiLCJyb3V0ZU1ldGhvZHMiLCJRdWVyeUNvbnRyb2xsZXIiLCJlbnRyaWVzIiwic2VnbWVudCIsInRyaW0iLCJqb2luIiwiY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlciIsImRlZmluZU1ldGhvZCIsImh0dHBEZWNvcmF0b3IiLCJodHRwTWV0aG9kIiwiZ2V0UXVlcnlEZWNvcmF0b3JzIiwib2JqVmFsdWVzIiwiZmllbGRzIiwiZiIsImNyZWF0ZSIsIm1vZHVsZUNvbmZpZ092ZXJyaWRlcyIsImdsb2JhbERlZmF1bHRzIiwidGFibGVOYW1lIiwidG9LZWJhYkNhc2UiLCJtb2RlbENsYXp6TmFtZSIsImZhY3RvcnlQZXJzaXN0ZW5jZSIsImRlY29yYXRvckNvbmZpZyIsIm1vZHVsZU92ZXJyaWRlIiwibWVyZ2VkQ29uZmlnIiwiRmFjdG9yeUNvbnRyb2xsZXIiLCJNb2RlbENvbnRyb2xsZXJGYWN0b3J5IiwiZmFjdG9yeVJvdXRlcyIsIl9fcm91dGVzX18iLCJnZXRQSyIsImFwaVByb3BlcnRpZXMiLCJwa1BhdGgiLCJnZXRSb3V0ZVBhcmFtZXRlcnNGcm9tTW9kZWwiLCJhdXRoQ29uZmlnIiwiYXV0aCIsImFwcGx5Q2xhc3NBdXRoIiwicHVibGljIiwiRHluYW1pY01vZGVsQ29udHJvbGxlciIsIkR5bmFtaWNNb2RlbENvbnRyb2xsZXJfMSIsImluZm8iLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwic29ydGVkUm91dGVzIiwic29ydCIsImEiLCJiIiwiYVNlZ21lbnRzIiwiQm9vbGVhbiIsImJTZWdtZW50cyIsImFQYXJhbUNvdW50IiwicyIsImJQYXJhbUNvdW50IiwiYUxpdGVyYWxDb3VudCIsImJMaXRlcmFsQ291bnQiLCJyb3V0ZSIsImltcGxlbWVudGF0aW9uIiwidG9Mb3dlckNhc2UiLCJyZWdpc3RyYXRpb24iLCJtYXRjaFJvdXRlIiwicmVnaXN0ZXJlZE1ldGhvZE5hbWUiLCJwYXJhbURlY29yYXRvcnMiLCJjb21wb3NlZCIsIkRCS2V5cyIsIkNPTVBPU0VEIiwiY29tcG9zZWRLZXlzIiwidW5pcXVlS2V5cyIsInNlcGFyYXRvciIsInJvdXRlUGFyYW1EZWNvcmF0b3JzIiwicGFyYW1JbmRleCIsImZsYXRNYXAiLCJQYXJhbSIsIm1ldGhvZERlY29yYXRvcnMiLCJub3JtYWxpemVkUGF0aCIsImNyZWF0ZVJlZ2lzdHJhdGlvbiIsImNyZWF0ZUNyZWF0ZURlY29yYXRvcnMiLCJSZXNwb25zZSIsInBhc3N0aHJvdWdoIiwiYnVsa0NyZWF0ZURlY29yYXRvcnMiLCJidWxrUmVhZERlY29yYXRvcnMiLCJidWxrVXBkYXRlRGVjb3JhdG9ycyIsImJ1bGtEZWxldGVEZWNvcmF0b3JzIiwicmVhZERlY29yYXRvcnMiLCJyb3V0ZVBhcmFtcyIsInVwZGF0ZURlY29yYXRvcnMiLCJkZWxldGVEZWNvcmF0b3JzIiwiZmFsbGJhY2tTZWdtZW50cyIsImlzQWxsUGFyYW1zIiwiZXZlcnkiLCJmYWxsYmFja0FwaVByb3BzIiwic3VmZml4Iiwic3RhdGVtZW50RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyIsInN0YXRlbWVudFNob3J0Y3V0UGFyYW1zIiwic3RhdGVtZW50Um91dGVzIiwic3RhdGVtZW50S2V5Iiwic3RhdGVtZW50TWV0aG9kTmFtZSIsInF1ZXJ5TWV0aG9kIiwiY29tcGxleFF1ZXJ5UGFyYW1zIiwicGF0aFNlZ21lbnRzIiwia25vd25QcmVmaXhlcyIsImZpcnN0U2VnbWVudCIsInNlZ21lbnRzIiwic2VnIiwiaSIsImNvbXBsZXhRdWVyeSIsImxvZ0N0eCIsInNwcmVhZEFyZ3MiLCJub3JtYWxpemVRdWVyeUFyZ3MiLCJleHRyYWN0UXVlcnlBcmdzIiwibGFzdCIsInF1ZXJ5T2JqIiwicG9wIiwiaGFzRGlyZWN0aW9uIiwiaGFzTGltaXQiLCJoYXNPZmZzZXQiLCJleHRyYXMiLCJoYXNRdWVyeUZpZWxkcyIsIkFwaUJvZHkiLCJBcGlDcmVhdGVkUmVzcG9uc2UiLCJzY2hlbWEiLCJnZXRTY2hlbWFQYXRoIiwiQXBpQmFkUmVxdWVzdFJlc3BvbnNlIiwiQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlIiwiQXBpTm90Rm91bmRSZXNwb25zZSIsImJhc2UiLCJnZXRNb2R1bGVGb3IiLCJEZWNhZk1vZGVsTW9kdWxlIiwiRGVjYWZNb2RlbE1vZHVsZV8xIiwiY3JlYXRlTW9kZWxTZXJ2aWNlcyIsIm1vZGVscyIsInVzZUZhY3RvcnkiLCJpc0V4cG9zZWQiLCJleHBvc3VyZSIsInRyYWNrZWRNb2RlbHMiLCJjb250cm9sbGVyRXhwb3N1cmUiLCJtb2RlbFNlcnZpY2VzIiwiYXV0b1NlcnZpY2VzIiwiYWdncmVnYXRpb25zIiwiYWxsb3dHcm91cGluZ1F1ZXJpZXMiLCJjb250cm9sbGVycyIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJTkpFQ1RBQkxFIiwiZXh0ZW5kIiwibmVzdEluamVjdGFibGUiLCJjYXRlZ29yeSIsImNmZyIsIkRlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyIsInNpbmdsZXRvbiIsIkRFRkFVTFQiLCJkdXJhYmxlIiwiSU5KRUNUIiwibmVzdEluamVjdCIsImlubmVyTmVzdEluamVjdCIsIk1BWCIsIm1heERlYyIsIm1heCIsIm1heGltdW0iLCJNSU4iLCJtaW5EZWMiLCJtaW4iLCJtaW5pbXVtIiwiTUFYX0xFTkdUSCIsIm1heExlbmd0aERlYyIsIm1heExlbmd0aCIsIk1JTl9MRU5HVEgiLCJtaW5MZW5ndGhEZWMiLCJtaW5MZW5ndGgiLCJUWVBFIiwidHlwZURlYyIsIkRBVEUiLCJkYXRlRGVjIiwiZm9ybWF0IiwiRU5VTSIsIm9wdGlvbkRlYyIsIlBBVFRFUk4iLCJwYXR0ZXJuRGVjIiwicGF0IiwicGF0dGVybiIsInNvdXJjZSIsIkNPTFVNTiIsImNvbHVtbkRlYyIsIkRlY29yYXRpb25LZXlzIiwiREVTQ1JJUFRJT04iLCJkZXNjcmlwdGlvbkRlYyIsIkFVVEgiLCJDb3JzRXJyb3IiLCJGb3JiaWRkZW5FcnJvciIsIm1zZyIsIlRvTWFueVJlcXVlc3RzRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJnZXRTdGF0dXMiLCJzdGF0dXMiLCJjb2RlIiwianNvbiIsInRpbWVzdGFtcCIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkNhdGNoIiwiVXNlRGVjYWZGaWx0ZXIiLCJVc2VGaWx0ZXJzIiwiVXNlRGVjYWZIZWFkZXJzIiwiU1dBR0dFUl9VSV9DT05TVEFOVFMiLCJ0aXRsZSIsInZlcnNpb24iLCJmYXZpY29uRmlsZVBhdGgiLCJ0b3BiYXJJY29uRmlsZVBhdGgiLCJzY2hlbWUiLCJiZWFyZXJGb3JtYXQiLCJpbiIsInBlcnNpc3RBdXRob3JpemF0aW9uIiwidG9wYmFyQmdDb2xvciIsIlN3YWdnZXJDdXN0b21VSSIsImN1c3RvbUNTUyIsImNzcyIsInRvcGJhckljb25QYXRoIiwiaW1nIiwiYjY0IiwiZ2V0Q3VzdG9tT3B0aW9ucyIsImZhdmljb24iLCJmYXZpY29uUGF0aCIsImN1c3RvbVNpdGVUaXRsZSIsImN1c3RvbUNzcyIsInN3YWdnZXJPcHRpb25zIiwiZmlsZSIsImZpbGVQYXRoIiwiYXNzZXRzUGF0aCIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiU3dhZ2dlckJ1aWxkZXIiLCJhcHAiLCJjcmVhdGVEb2N1bWVudCIsIm9wZW5BcGlKc29uUGF0aCIsIm9wZW5BcGlZYW1sUGF0aCIsIkRvY3VtZW50QnVpbGRlciIsInNldFRpdGxlIiwic2V0RGVzY3JpcHRpb24iLCJzZXRWZXJzaW9uIiwiYWRkQmVhcmVyQXV0aCIsIlN3YWdnZXJNb2R1bGUiLCJyZWdpc3Rlck9wZW5BcGlSb3V0ZSIsImNvbnRlbnRUeXBlIiwiYm9keUZhY3RvcnkiLCJodHRwQWRhcHRlciIsImdldEh0dHBBZGFwdGVyIiwiX3JlcSIsInJlcGx5Iiwic2V0dXBTd2FnZ2VyIiwiZG9jdW1lbnQiLCJzd2FnZ2VyVUkiLCJzZXR1cCIsImpzb25Eb2N1bWVudFVybCIsInlhbWxEb2N1bWVudFVybCIsIllBTUwiLCJOZXN0Qm9vdHN0cmFwZXIiLCJfbG9nZ2VyIiwiTG9nZ2VyIiwiaW5pdGlhbGl6ZSIsImVuYWJsZUxvZ2dlciIsImN1c3RvbUxvZ2dlciIsInVzZUxvZ2dlciIsImVuYWJsZUNvcnMiLCJvcmlnaW5zIiwiYWxsb3dNZXRob2RzIiwiYWxsb3dlZE9yaWdpbnMiLCJvIiwiY29yc09wdGlvbnMiLCJvcmlnaW4iLCJjYWxsYmFjayIsImNyZWRlbnRpYWxzIiwibWV0aG9kcyIsInVzZUhlbG1ldCIsImhlbG1ldCIsInJlcXVpcmUiLCJ1c2UiLCJ3YXJuIiwic3dhZ2dlciIsInVzZUdsb2JhbFBpcGVzIiwicGlwZXMiLCJ1c2VHbG9iYWxGaWx0ZXJzIiwiZmlsdGVycyIsInVzZUdsb2JhbEludGVyY2VwdG9ycyIsImludGVyY2VwdG9ycyIsInN0YXJ0IiwicG9ydCIsInByb2Nlc3MiLCJQT1JUIiwibGlzdGVuIiwidGhlbiIsImdldFVybCIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvciIsIkRlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcl8xIiwiZXhlY3V0b3IiLCJjb250ZXh0dWFsaXplIiwiZmxhZ3MiLCJpcCIsImV4dHJhY3RJcCIsIkRlZmF1bHRBZGFwdGVyRmxhZ3MiLCJvcGVyYXRpb24iLCJwYXJzZUlwSGVhZGVyIiwiY2FuZGlkYXRlIiwicGVuZGluZ1Byb3ZpZGVycyIsImdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyIsInJlZ2lzdGVyUHJvdmlkZXIiLCJ0b2tlbiIsImlzTW9kZWxDb25zdHJ1Y3RvciIsIm1vZGVsU2VydmljZVRva2VuIiwibW9kZWxSZXBvc2l0b3J5VG9rZW4iLCJwYXJhbWV0ZXJJbmRleCIsInJlc29sdmVkIiwicGFyYW1UeXBlcyIsImFzTW9kZWwiLCJpbmplY3RhYmxlU2VydmljZUtleSIsIkNvcmVTZXJ2aWNlIiwiQ29yZVJlcG9zaXRvcnkiLCJEZWNhZkNvcmVNb2R1bGUiLCJEZWNhZkNvcmVNb2R1bGVfMSIsIm1vZHVsZVJlZiIsImRlY2FmUHJvdmlkZXJzIiwidXNlVmFsdWUiLCJjbGllbnQiLCJIIiwicHJvdmlkZXIiLCJib290UGVyc2lzdGVuY2UiLCJ0cmltbWVkIiwiY29uZiIsImNvbnRyIiwicG9zc2libGUiLCJQZXJzaXN0ZW5jZVNlcnZpY2UiLCJib290IiwiY2xpZW50cyIsImMiLCJwb3NzaWJsZVRyYW5zZiIsInJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciIsImluaXRpYWxpemF0aW9uIiwib25BcHBsaWNhdGlvblNodXRkb3duIiwiYWRhcHRlcnMiLCJzaHV0ZG93biIsIkdsb2JhbCIsIk1vZHVsZVJlZiIsIkxJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyIsIm5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UiLCJtb2RlbENvbnN0ciIsImlkIiwicGF5bG9hZCIsInNlcmlhbGl6ZWRQYXlsb2FkIiwic2VyaWFsaXplIiwiY29uc29sZSIsImVyciIsIkV2ZW50c0NvbnRyb2xsZXIiLCJFdmVudHNDb250cm9sbGVyXzEiLCJldmVudHMkIiwiT2JzZXJ2YWJsZSIsIm9ic2VydmVyIiwib2JzZXJ2ZXJJZCIsIk1hdGgiLCJyYW5kb20iLCJ0b1VwcGVyQ2FzZSIsImNiIiwicmVmcmVzaCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYWRhcHRlck5hbWUiLCJvYnNlcnZlIiwidW5PYnNlcnZlIiwiSEVBUlRCRUFUX0lOVEVSVkFMX01TIiwiaGVhcnRiZWF0JCIsImludGVydmFsIiwidHMiLCJtZXJnZSIsImxpc3RlbkZvck1vZGVsIiwiU3NlIiwiRGVjYWZTdHJlYW1Nb2R1bGUiLCJEZWNhZlN0cmVhbU1vZHVsZV8xIiwiZm9yRmxhdm91cnMiLCJpbXBvcnRzIiwiUm91dGVyTW9kdWxlIiwicmVnaXN0ZXIiLCJEZWNhZk1vZHVsZSIsIkRlY2FmTW9kdWxlXzEiLCJmb3JSb290QXN5bmMiLCJhdXRvQ29udHJvbGxlcnMiLCJvYnNlcnZlck9wdGlvbnMiLCJlbmFibGVPYnNlcnZlckV2ZW50cyIsIm9ic2VydmVyRmxhdm91cnMiLCJydW5NaWdyYXRpb25zIiwicmVwb0Zvck1vZGVsIiwibSIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiLCJhbGxvd1JlcmVnaXN0cmF0aW9uIiwicmVnaXN0ZXJMaWJyYXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQU8sTUFBTUEsb0JBQW9COztBQUMxQixNQUFNQyxhQUFhO0lBQ3hCQyxlQUFlLEdBQUdGO0lBQ2xCRyxjQUFjLEdBQUdIO0lBQ2pCSSxjQUFjLEdBQUdKO0lBQ2pCSyxjQUFjLEdBQUdMO0lBQ2pCTSxVQUFVLEdBQUdOO0lBQ2JPLGVBQWUsR0FBR1A7SUFDbEJRLGdCQUFnQixHQUFHUjtJQUNuQlMsYUFBYSxHQUFHVDtJQUNoQlUsc0JBQXNCLEdBQUdWO0lBQ3pCVyw0QkFBNEIsR0FBR1g7SUFDL0JZLGNBQWMsR0FBR1o7SUFDakJhLHNCQUFzQixHQUFHYjtJQUN6QmMsd0JBQXdCLEdBQUdkO0lBQzNCZSxrQkFBa0IsR0FBR2Y7SUFDckJnQixlQUFlLEdBQUdoQjtJQUNsQmlCLFlBQVksR0FBR2pCO0lBQ2ZrQixvQkFBb0IsR0FBR2xCO0lBQ3ZCbUIsVUFBVSxHQUFHbkI7OztBQ2hCUixNQUFNb0IsZ0JBQWlCQyxPQUFzQkEsUUFBUTs7QUFDckQsTUFBTUMsd0JBQXdCOztBQUU5QixNQUFNQyxrQkFBa0I7O0FBRXpCLFNBQVVDLHNCQUNkQyxTQUNBQyxXQUNBQyxrQkFBRUEsb0JBQXFCO0lBQUVBLGtCQUFrQjs7SUFFM0MsT0FBTyxDQUNMQyxRQUNBQyxLQUNBQztRQUVBLFdBQVdKLGFBQWEsVUFBVTtZQUNoQyxNQUFNSyxZQUFZQyxRQUFRQyxZQUFZUixTQUFTSyxXQUFXSTtZQUMxRCxJQUFJSCxjQUFjSixrQkFBa0I7Z0JBQ2xDLE9BQU9HO0FBQ1Q7WUFDQUUsUUFBUUcsZUFDTlYsU0FDQTttQkFBS007bUJBQWNMO2VBQ25CSSxXQUFXSTtZQUViLE9BQU9KO0FBQ1Q7UUFDQUUsUUFBUUcsZUFBZVYsU0FBU0MsVUFBVUksV0FBV0k7UUFDckQsT0FBT0o7O0FBRVg7O1NBRWdCTSxxQkFDZFgsU0FDQUMsV0FBYztJQUVkLE9BQVFFO1FBQ04sTUFBTUcsWUFBWUMsUUFBUUMsWUFBWVIsU0FBU0csV0FBVztRQUMxREksUUFBUUcsZUFBZVYsU0FBUyxLQUFJTSxjQUFjTCxZQUFXRTtRQUM3RCxPQUFPQTs7QUFFWDs7QUFFTSxTQUFVUywwQkFDZFosU0FDQUMsVUFDQUMsbUJBQW1CO0lBRW5CLE9BQUEsQ0FBU0MsUUFBZ0JVO1FBQ3ZCLE1BQU1DLGFBQ0pQLFFBQVFDLFlBQVloQyxXQUFXVSw0QkFBNEJpQixXQUFXO1FBRXhFLE1BQU1DLE1BQU0sSUFBSVM7UUFDaEIsS0FBS0MsV0FBV0MsU0FBU1gsTUFBTTtZQUM3QkcsUUFBUUcsZUFDTmxDLFdBQVdVLDRCQUNYLEtBQUk0QixZQUFZLElBQUlELGlCQUNwQlY7QUFFSjtRQUNBLE1BQU1hLG1CQUFtQlQsUUFBUUMsWUFBWVIsU0FBU0csUUFBUVU7UUFDOUQsSUFBSUcsa0JBQWtCO1lBQ3BCLE1BQU1DLGNBQWNDLE9BQU9qQixVQUFVa0IsT0FBT0M7WUFDNUMsTUFBTUMsaUJBQWlCbkIsbUJBQ25CO21CQUNLYzttQkFDQUM7Z0JBRUw7bUJBQ0tBO21CQUNBRDs7WUFHVFQsUUFBUUcsZUFBZVYsU0FBU3FCLGdCQUFnQmxCLFFBQVFVO0FBQzFELGVBQU87WUFDTCxNQUFNUyxPQUNIbkIsUUFBUW9CLGNBQXNCMUIsMkJBQzdCZ0IsY0FDQ1MsUUFBUWYsUUFBUUMsWUFBWSxlQUFlTCxRQUFRVTtZQUV4RE4sUUFBUUcsZUFDTlYsU0FDQTtnQkFDRXNCO21CQUNHSixPQUFPakIsVUFBVWtCLE9BQU9DO2VBRTdCakIsUUFDQVU7QUFFSjtBQUNEO0FBQ0g7O0FBRU0sU0FBVVcscUJBQ2R4QixTQUNBQztJQUVBLE9BQU8sQ0FDTEUsUUFDQUMsS0FDQUM7UUFFQSxJQUFJQSxZQUFZO1lBQ2QsSUFBSW9CO1lBQ0osSUFBSUMsTUFBTUMsUUFBUTFCLFdBQVc7Z0JBQzNCLE1BQU0yQixtQkFDSnJCLFFBQVFDLFlBQVlSLFNBQVNLLFdBQVdJLFVBQVU7Z0JBQ3BEZ0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2QyxtQkFBTztnQkFDTCxNQUFNMkIsbUJBQ0pyQixRQUFRQyxZQUFZUixTQUFTSyxXQUFXSSxVQUFVLENBQUE7Z0JBQ3BEZ0IsWUFBWTt1QkFBS0c7dUJBQXFCM0I7O0FBQ3hDO1lBQ0FNLFFBQVFHLGVBQWVWLFNBQVN5QixXQUFXcEIsV0FBV0k7WUFDdEQsT0FBT0o7QUFDVDtRQUVBLElBQUlvQjtRQUNKLElBQUlDLE1BQU1DLFFBQVExQixXQUFXO1lBQzNCLE1BQU0yQixtQkFBbUJyQixRQUFRQyxZQUFZUixTQUFTRyxXQUFXO1lBQ2pFc0IsWUFBWSxLQUFJRyxxQkFBcUIzQjtBQUN2QyxlQUFPO1lBQ0wsTUFBTTJCLG1CQUFtQnJCLFFBQVFDLFlBQVlSLFNBQVNHLFdBQVcsQ0FBQTtZQUNqRXNCLFlBQVlJLE9BQU9DLE9BQU9ELE9BQU9DLE9BQU8sSUFBSUYsbUJBQW1CM0I7QUFDakU7UUFDQU0sUUFBUUcsZUFBZVYsU0FBU3lCLFdBQVd0QjtRQUMzQyxPQUFPQTs7QUFFWDs7QUFFTSxTQUFVNEIscUJBQ2Q5QixVQUNBK0I7SUFFQSxPQUFPLENBRUw3QixRQUNBQyxLQUNBQztRQUVBLE1BQU00QixlQUFlO2VBQ2hCRDtlQUNBZCxPQUFPakIsVUFBVWtCLE9BQU9DOztRQUc3QixJQUFJZixZQUFZO1lBQ2QsTUFBTTZCLGFBQ0ozQixRQUFRQyxZQUFZaEMsV0FBV08sZ0JBQWdCc0IsV0FBV0ksVUFBVTtZQUN0RUYsUUFBUUcsZUFDTmxDLFdBQVdPLGdCQUNYLEtBQUltRCxZQUFZRCxnQkFDaEI1QixXQUFXSTtZQUViLE9BQU9KO0FBQ1Q7UUFFQSxXQUFXRixXQUFXLFVBQVU7WUFDOUIsT0FBT0E7QUFDVDtRQUVBLE1BQU1nQyxlQUFlTixPQUFPTyxvQkFBb0JqQyxPQUFPa0M7UUFFdkQsS0FBSyxNQUFNeEIsZUFBZXNCLGNBQWM7WUFDdEMsSUFBSXhDLGNBQWNrQixjQUFjO2dCQUM5QjtBQUNGO1lBRUEsTUFBTXlCLG1CQUFtQlQsT0FBT1UseUJBQzlCcEMsT0FBT2tDLFdBQ1B4QjtZQUdGLEtBQUt5QixrQkFBa0I7Z0JBQ3JCO0FBQ0Y7WUFFQSxNQUFNRSxjQUFjakMsUUFBUWtDLFlBQzFCM0MsaUJBQ0F3QyxpQkFBaUI3QjtZQUduQixLQUFLK0IsYUFBYTtnQkFDaEI7QUFDRjtZQUVBLE1BQU1OLGFBQ0ozQixRQUFRQyxZQUNOaEMsV0FBV08sZ0JBQ1h1RCxpQkFBaUI3QixVQUNkO1lBQ1BGLFFBQVFHLGVBQ05sQyxXQUFXTyxnQkFDWCxLQUFJbUQsWUFBWUQsZ0JBQ2hCSyxpQkFBaUI3QjtBQUVyQjs7QUFFSjs7U0FFZ0JpQyxvQkFFZEMsT0FDQUM7SUFHQSxLQUFLRCxPQUFPO1FBQ1YsT0FBTyxFQUFDQSxPQUFvQkM7QUFDOUI7SUFDQSxJQUFJQSxhQUFhO1FBRWYsT0FBTyxFQUFDRCxPQUFtQkM7QUFDN0I7SUFDQSxNQUFNQyxlQUFlbEIsUUFBUWdCO0lBQzdCLE1BQU1yQixPQUFPdUIsZUFBZUYsTUFBTSxLQUFLQTtJQUV2QyxPQUFPLEVBQUNyQixNQUFrQnVCO0FBQzVCOztBQ2hOTyxNQUFNekIsY0FBZTBCLGNBQ25CQSxRQUFROztBQUVYLFNBQVVDLGNBQ2RDO0lBRUEsV0FBV0EsYUFBYSxZQUFZO1FBQ2xDLE9BQU9ELGNBQWNDO0FBQ3ZCO0lBRUEsSUFBSXRCLE1BQU1DLFFBQVFxQixXQUFXO1FBQzNCLE9BQU9BO0FBQ1Q7SUFDQSxXQUFXQSxhQUFhLFVBQVU7UUFDaEMsT0FBTztBQUNUO0lBYUEsTUFBTUMsZ0JBQWdCcEIsT0FBT3FCLE9BQU9GLFVBQ2pDRyxPQUFRMUMsZ0JBQWlCQSxVQUFVLFVBQ25DMkMsSUFBSzNDLFNBQWVBLE1BQU00QztJQUU3QixPQUFPeEIsT0FBT3lCLEtBQUtOLFVBQ2hCRyxPQUFRL0MsUUFBUzZDLGNBQWNsQyxTQUFTWCxNQUN4Q2dELElBQUtoRCxPQUFRNEMsU0FBUzVDO0FBQzNCOztBQUVNLFNBQVVtRCxZQUFZTDtJQUMxQixNQUFNTSxZQUFZTixPQUFPQyxPQUFPTSxVQUFVQyxTQUFTO0lBQ25ELE9BQU9GLFlBQVksV0FBVztBQUNoQzs7QUFFTSxTQUFVNUMsd0JBQ2RaLFNBQ0FDLFVBQ0FDLG1CQUFtQjtJQUVuQixPQUFBLENBQVNDLFFBQWdCVTtRQUN2QixNQUFNQyxhQUNKUCxRQUFRQyxZQUFZaEMsV0FBV1UsNEJBQTRCaUIsV0FBVztRQUV4RSxNQUFNQyxNQUFNLElBQUlTO1FBQ2hCLEtBQUtDLFdBQVdDLFNBQVNYLE1BQU07WUFDN0JHLFFBQVFHLGVBQ05sQyxXQUFXVSw0QkFDWCxLQUFJNEIsWUFBWSxJQUFJRCxpQkFDcEJWO0FBRUo7UUFDQSxNQUFNYSxtQkFBbUJULFFBQVFDLFlBQVlSLFNBQVNHLFFBQVFVO1FBQzlELElBQUlHLGtCQUFrQjtZQUNwQixNQUFNQyxjQUFjQyxPQUFPakIsVUFBVWtCLE9BQU9DO1lBQzVDLE1BQU1DLGlCQUFpQm5CLG1CQUNuQjttQkFDS2M7bUJBQ0FDO2dCQUVMO21CQUNLQTttQkFDQUQ7O1lBR1RULFFBQVFHLGVBQWVWLFNBQVNxQixnQkFBZ0JsQixRQUFRVTtBQUMxRCxlQUFPO1lBQ0wsTUFBTVMsT0FFSm5CLFFBQVFvQixjQUFjMUIsMkJBQTJCZ0IsY0FBY1MsUUFDL0RmLFFBQVFDLFlBQVksZUFBZUwsUUFBUVU7WUFFN0NOLFFBQVFHLGVBQ05WLFNBQ0E7Z0JBQ0VzQjtnQkFDQXFDLFVBQVU7bUJBQ1B6QyxPQUFPakIsVUFBVWtCLE9BQU9DO2VBRTdCakIsUUFDQVU7QUFFSjtBQUNEO0FBQ0g7O0FBd0JBLE1BQU0rQyxjQUNKQyxRQU1JQSxLQUFLbEMsV0FBVyxVQUFVa0MsUUFBUUEsS0FBS0MsU0FBU0M7O0FBS2hELFNBQVVDLFlBQ2RDLFVBQThCO0lBRTlCLE9BQU9DLDJCQUEyQkQ7QUFDcEM7O0FBRU0sU0FBVUMsMkJBQ2RELFVBQThCLElBQzlCL0QsbUJBQW1CO0lBRW5CLE9BQU9vQixNQUFNSyxXQUFXZSxvQkFDdEJ1QixRQUFRM0MsTUFDUjJDLFFBQVF0QztJQUVWc0MsVUFBVTtXQUNMQTtRQUNIM0M7UUFDQUs7O0lBR0YsSUFBSWlDLFlBQVlLLFVBQVU7UUFDeEJBLFFBQVEzQyxPQUFPO1FBRWYsTUFBTTZDLGFBQWFwQixjQUFja0IsUUFBUUg7UUFDekNHLFFBQVFHLFFBQVE7WUFDZDlDLE1BQU1pQyxZQUFZWTtZQUNsQkwsTUFBTUs7O2VBR0RGLFFBQVFIO0FBQ2pCLFdBQU8sSUFBSSxVQUFVRyxXQUFXQSxRQUFRSCxTQUFTQyxXQUFXO1FBQzFELE1BQU1JLGFBQWFwQixjQUFja0IsUUFBUUg7UUFFekNHLFFBQVFILE9BQU9LO1FBQ2ZGLFFBQVEzQyxPQUFPaUMsWUFBWVk7QUFDN0I7SUFFQSxJQUFJekMsTUFBTUMsUUFBUXNDLFFBQVEzQyxPQUFPO1FBQy9CMkMsUUFBUTNDLE9BQU87UUFDZjJDLFFBQVFHLFFBQVE7WUFDZDlDLE1BQU07WUFDTjhDLE9BQU87Z0JBQ0w5QyxNQUFNMkMsUUFBUTNDLEtBQUs7OztBQUd6QjtJQUVBLE9BQU9WLHdCQUNMcEMsV0FBV1Msc0JBQ1hnRixTQUNBL0Q7QUFFSjs7U0NoS2dCbUUsc0JBQ2RDLGtCQUNBQyxNQUNBQztJQUVBLE1BQU1DLGFBR0Y7UUFDRkMsS0FBSyxFQUFDQyxjQUFjQyxNQUFNQztRQUMxQkMsTUFBTSxFQUFDSCxjQUFjSSxRQUFRQztRQUM3QkMsS0FBSyxFQUFDTixjQUFjTyxRQUFRQztRQUM1QkMsT0FBTyxFQUFDVCxjQUFjTyxRQUFRRztRQUM5QkMsUUFBUSxFQUFDWCxjQUFjVyxRQUFRQzs7SUFHakMsT0FBT0MsUUFBUUMsdUJBQXVCaEIsV0FBV0Y7SUFDakQsTUFBTXBFLFNBQVN1RixtQkFBbUJuQixNQUFNQztJQUN4QyxPQUFPckUsU0FDSHdGLG1CQUF1QnJCLGtCQUFrQm5FLE9BQU95RixNQUFhekYsT0FBT00sU0FDbEVvRixNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakIsU0FDNUJtQixtQkFBdUJyQixrQkFBa0JrQixVQUN2Q0ssTUFBTUMsd0JBQ05ELE1BQU1KLG9CQUFvQmpCO0FBQ2xDOztTQVNnQnVCLDBCQUNkekIsa0JBQ0FDLE1BQ0FDO0lBRUEsTUFBTUMsYUFHRjtRQUNGQyxLQUFLLEVBQUNzQixzQkFBc0JDLFVBQVVwQjtRQUN0Q0MsTUFBTSxFQUFDa0Isc0JBQXNCRSxZQUFZbEI7UUFDekNDLEtBQUssRUFBQ2Usc0JBQXNCRyxZQUFZaEI7UUFDeENDLE9BQU8sRUFBQ1ksc0JBQXNCRyxZQUFZZDtRQUMxQ0MsUUFBUSxFQUFDVSxzQkFBc0JJLFlBQVliOztJQUc3QyxPQUFPQyxRQUFRQyx1QkFBdUJoQixXQUFXRjtJQUNqRCxNQUFNcEUsU0FBU3FFLE9BQU9rQixtQkFBbUJuQixNQUFNQyxRQUFRVDtJQUN2RCxPQUFPNUQsU0FDSHdGLG1CQUF1QnJCLGtCQUFrQm5FLE9BQU95RixNQUFhekYsT0FBT00sU0FDbEVvRixNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakIsU0FDNUJtQixtQkFBdUJyQixrQkFBa0IsUUFBZWtCLFVBQ3RESyxNQUFNQyx3QkFDTkQsTUFBTUosb0JBQW9CakI7QUFDbEM7O0FBQ0EsU0FBU2tCLG1CQUNQbkIsTUFDQUM7SUFJQSxLQUFLQSxNQUFNLE9BQU9UO0lBRWxCLE1BQU1zQyxhQUFhN0IsS0FBSzhCLFFBQVEsY0FBYztJQUM5QyxNQUFNQyxtQkFBMkM7UUFDL0MsZUFBZUMsc0JBQXNCQztRQUNyQyx5QkFBeUJELHNCQUFzQkU7UUFDL0MsZUFBZUYsc0JBQXNCRztRQUNyQyxlQUFlSCxzQkFBc0JJO1FBQ3JDLHlCQUF5Qkosc0JBQXNCSztRQUMvQyxzQkFBc0JMLHNCQUFzQk07UUFDNUMsMkJBQTJCO1FBQzNCLGtCQUFrQk4sc0JBQXNCTztRQUN4QyxnQkFBZ0JQLHNCQUFzQlE7UUFDdEMsZ0JBQWdCUixzQkFBc0JTO1FBQ3RDLGdCQUFnQlQsc0JBQXNCVTtRQUN0QyxnQkFBZ0JWLHNCQUFzQlc7UUFDdEMscUJBQXFCWCxzQkFBc0JZO1FBQzNDLGtCQUFrQlosc0JBQXNCYTs7SUFHMUMsSUFBSWhCLFdBQVdpQixXQUFXLFdBQVc7UUFDbkMsT0FBTztZQUFFMUIsTUFBTTtZQUFTbkYsT0FBTzRGLFdBQVdDLFFBQVEsWUFBWTs7QUFDaEU7SUFFQSxNQUFNaUIsaUJBQWlCaEIsaUJBQWlCRjtJQUN4QyxJQUFJa0IsZ0JBQWdCO1FBQ2xCLE9BQU87WUFBRTNCLE1BQU07WUFBYW5GLE9BQU84Rzs7QUFDckM7SUFFQSxJQUFJaEQsU0FBUyxTQUFTOEIsZUFBZSxJQUFJO1FBQ3ZDLE9BQU87WUFBRVQsTUFBTTtZQUFRbkYsT0FBT2tFLGNBQWNDOztBQUM5QztJQUVBLE9BQU9iO0FBQ1Q7O0FDbkhNLFNBQVV5RCxtQkFDZEMsUUFBNEI7SUFFNUIsTUFBTUMsYUFBYUQsTUFBTXJFLElBQUt1RSxLQUM1QkMsU0FBWTtRQUNWQyxNQUFNRixFQUFFRTtRQUNSQyxhQUFhSCxFQUFFRyxlQUFlLG1CQUFtQkgsRUFBRUU7UUFDbkRsRSxVQUFVZ0UsRUFBRWhFLFlBQVk7UUFFeEJyQyxNQUFNcUcsRUFBRXJHLFFBQVF5Rzs7SUFHcEIsT0FBT0MsbUJBQW1CTjtBQUM1Qjs7QUNsQk8sTUFBTU8sWUFBWWxHLHVCQUN2QixDQUFDbUcsTUFBZUM7SUFDZCxNQUFNQyxVQUFVRCxJQUFJRSxlQUFlQztJQUNuQyxNQUFNQyxPQUFPSCxRQUFRRztJQUdyQixNQUFNQyxhQUFhTCxJQUFJTTtJQUV2QixNQUFNQyxjQUFlRixXQUFtQkc7SUFFeEMsS0FBS0QsYUFBYTtRQUNoQixNQUFNLElBQUlFLDZCQUNSLDRDQUE0Q0osV0FBV1g7QUFFM0Q7SUFFQSxLQUFLVSxNQUFNLE9BQU9BO0lBRWxCLElBQUk3RyxNQUFNQyxRQUFRNEcsT0FBTztRQUN2QixPQUFPQSxLQUFLbkYsSUFBS3lGLFFBQVMsSUFBSUgsWUFBWUc7QUFDNUM7SUFFQSxPQUFPLElBQUlILFlBQVlIOzs7QUNsQjNCLE1BQU1PLGdCQUFnQi9HLHVCQUNwQixDQUFDZ0gsT0FBNkJaO0lBQzVCLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO0lBQy9CLE1BQU1XLFdBQVlELEtBQUtFLFVBQVU7SUFDakMsTUFBTUMsWUFBWUosU0FBU2xILE9BQU95QixLQUFLMkY7SUFDdkMsTUFBTUcsVUFBVUQsVUFBVS9GLElBQUtpRyxLQUFNSixTQUFTSTtJQUM5QyxPQUFPO1FBQUVDLEtBQUtMO1FBQVVNLGVBQWVIO1FBQVNJLGFBQWFMOzs7O0FBVTNELFNBQVVNLFlBQ2RoQyxRQUE0QjtJQUU1QixNQUFNc0IsUUFBUXRCLE1BQU1yRSxJQUFLdUUsS0FBTUEsRUFBRUU7SUFDakMsT0FBT2lCLGNBQWNDO0FBQ3ZCOztBQUVPLE1BQU1XLGFBQWEzSCx1QkFDeEIsQ0FBQzRILEdBQVl4QjtJQUNYLE1BQU1hLE1BQU1iLElBQUlFLGVBQWVDO0lBQy9CLE1BQU1zQixRQUFRWixJQUFJWSxTQUFTLENBQUE7SUFFM0IsTUFBTUMsU0FBYztXQUFLRDs7SUFHekIsSUFBSUMsT0FBT0MsVUFBVS9GLFdBQVc7UUFDOUIsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9DO1FBQ3hCLEtBQUtFLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9DLFFBQVFDO0FBQ3ZDO0lBRUEsSUFBSUYsT0FBT0ssV0FBV25HLFdBQVc7UUFDL0IsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9LO1FBQ3hCLEtBQUtGLE9BQU9DLE1BQU1GLElBQUlGLE9BQU9LLFNBQVNIO0FBQ3hDO0lBR0EsSUFBSUYsT0FBT00sYUFBYXBHLFdBQVc7UUFDakMsTUFBTWdHLElBQUlDLE9BQU9ILE9BQU9NO1FBQ3hCTixPQUFPTSxXQUFXSCxPQUFPQyxNQUFNRixLQUFLRixPQUFPTSxXQUFXSjtBQUN4RDtJQUVBLE9BQU9GOzs7QUMxREosTUFBTU8sdUJBQXVCOztBQUM3QixNQUFNQyxtQkFBbUI7O0FBQ3pCLE1BQU1DLHdCQUF3Qjs7QUFFOUIsTUFBTUMsY0FBYzs7TUFDZEMsaUJBQWlCQyxPQUFPOztBQUM5QixNQUFNQyxlQUFlOztBQUNyQixNQUFNQywwQkFBMEI7O01BRTFCQyxvQkFBb0JILE9BQU87O0FDUmxDLFNBQVVJLFVBQVVDO0lBQ3hCLE9BQU8sU0FBU0QsT0FBTzFLO1FBQ3JCNEssU0FBU0MsSUFDUDdLLFFBQ0F1SyxjQUNDSSxTQUFTcEgsU0FBU29ILFdBQVc7UUFFaEMsT0FBTzNLO0FBQ1Q7QUFDRjs7QUNRTSxTQUFVOEssaUJBQWlCQztJQUMvQixPQUFPLFNBQVNDLDBCQUEwQmhMO1FBQ3hDNEssU0FBU0MsSUFBSTdLLFFBQVF3Syx5QkFBeUJPO1FBQzlDLE9BQU8vSztBQUNUO0FBQ0Y7O01DMUJhaUwsZUFBZVgsT0FBTzs7QUFDNUIsTUFBTVksZ0JBQWdCOztBQUN0QixNQUFNQyxnQkFBZ0I7O0FBQ3RCLE1BQU1DLHFCQUFxQjs7QUFDM0IsTUFBTUMsdUJBQXVCOztBQ0s3QixJQUFNQyxzQkFBTixNQUFNQSw0QkFHSEM7SUFJUixXQUFBbkssQ0FBNkJ5SDtRQUMzQjJDLE1BQ0U7WUFDRUMsV0FBWXhELFdBQXNCQSxTQUFpQnlELFdBQVc5SDtXQUVoRWlGO1FBTDBDOEMsS0FBQTlDLE1BQUFBO1FBSDlDOEMsS0FBQUMsT0FBT0MsS0FBS0MsU0FBU0M7UUFVbkJKLEtBQUsxRCxVQUFVWTtBQUNqQjtJQUVBLFdBQUk2QztRQUNGLE9BQU9DLEtBQUtLLGVBQWU7QUFDN0I7SUFFQSxHQUFBQyxDQUFJQztRQUNGLElBQUlDO1FBQ0o7WUFDRUEsWUFBWVIsS0FBS1MsSUFBSTtBQUN2QixVQUFFLE9BQU9DO1lBQ1BGLFlBQVksQ0FBQTtBQUNkO1FBRUFSLEtBQUtXLFdBQVc7WUFDZEgsV0FBV3pLLE9BQU9DLE9BQU93SyxXQUFXRDs7QUFFeEM7OztBQWhDV1osc0JBQW1CaUIsV0FBQSxFQUQvQkMsV0FBVztJQUFFQyxPQUFPQyxNQUFNQztJQVFaQyxRQUFBLEdBQUFDLE9BQU9GLDBEQVBUckI7O0FDbUJOLElBQU13QixrQkFBTixNQUFNQTtJQUNYLFdBQUExTCxDQUNtQjJMLFdBQ0VDLGdCQUNnQ0M7UUFGbEN0QixLQUFBb0IsWUFBQUE7UUFDRXBCLEtBQUFxQixpQkFBQUE7UUFDZ0NyQixLQUFBc0IsY0FBQUE7QUFDbEQ7SUFFSCxlQUFNQyxDQUNKbEYsS0FDQW1GO1FBRUEsTUFBTUMsTUFBTUMsUUFBUUMsSUFBSTNCLE1BQWEyQixJQUFJM0IsS0FBS3VCO1FBRTlDLE1BQU1LLFdBQVc1QixLQUFLb0IsVUFBVVMsa0JBQTJCckMsZUFBZSxFQUN4RW5ELElBQUl5RixjQUNKekYsSUFBSU07UUFHTixNQUFNb0YsWUFDSi9CLEtBQUtvQixVQUFVWCxJQUNibEIsZUFDQWxELElBQUl5RixpQkFFTjlCLEtBQUtvQixVQUFVWCxJQUEwQmxCLGVBQWVsRCxJQUFJTTtRQUU5RCxNQUFNcUYsZ0JBQWdCaEMsS0FBS29CLFVBQVVTLGtCQUNuQ3BDLG9CQUNBLEVBQUNwRCxJQUFJeUYsY0FBY3pGLElBQUlNO1FBR3pCLE1BQU1zRixpQkFBaUJqQyxLQUFLb0IsVUFBVVMsa0JBQ3BDbkMsc0JBQ0EsRUFBQ3JELElBQUl5RixjQUFjekYsSUFBSU07UUFHekIsTUFBTXVGLGlCQUFpQkQsaUJBQWlCaEssWUFBWThKO1FBRXBETixJQUFJVSxRQUFRLHNCQUFzQkosWUFBWSxRQUFRQSxjQUFjO1FBRXBFLElBQUlILFVBQVU7WUFDWkgsSUFBSVcsTUFBTTtBQUNaLGVBQU8sSUFBSXBDLEtBQUtzQixhQUFhO2tCQUNyQnRCLEtBQUtzQixZQUFZZSxVQUNyQmhHLEtBQ0E2RixnQkFDQUYsZUFDQWhDLEtBQUtxQjtBQUVULGVBQU87WUFDTEksSUFBSVcsTUFBTTtBQUNaO2NBS01wQyxLQUFLc0M7UUFFWCxNQUFNQyxPQUFPdkMsS0FBS3FCLGVBQWVoQixlQUFlO1FBQ2hELE1BQU1tQyxlQUFleEMsS0FBS3FCLGVBQWVoQixlQUN2QztRQUVGLElBQUlrQyxRQUFRQyxjQUFjO1lBQ3hCLE1BQU1DLGFBQWF6QyxLQUFLcUIsZUFBZVosSUFBSTtZQUMzQyxNQUFNaUMsV0FBV0QsV0FBV2QsSUFBSTtnQkFBRVk7Z0JBQU1DOztZQUN4Q3hDLEtBQUtxQixlQUFlVixXQUFXO2dCQUFFZ0MsUUFBUUQ7O0FBQzNDO1FBRUEsT0FBT2xCLEtBQUtvQjtBQUNkO0lBRVUsdUJBQU1OO1FBQ2QsTUFBTXRELFdBQVc2RCxRQUFRQztRQUN6QixLQUFLOUQsVUFBVTtRQUVmLEtBQUssTUFBTStELFdBQVcvRCxVQUFVO1lBQzlCLE1BQU1nRSxjQUFjSCxRQUFRSSxlQUMxQkY7WUFFRixLQUFLQyxhQUFhO1lBQ2xCLE1BQU03QyxXQUFZNkMsWUFBb0JFLE9BQ2xDRixjQUNBLElBQUtBO1lBQ1QsTUFBTUUsYUFBYS9DLFNBQVMrQyxLQUFLbEQsS0FBS3FCO1lBQ3RDLElBQUk2QixNQUFNbEQsS0FBS3FCLGVBQWVWLFdBQVd1QztBQUMzQztBQUNGOzs7QUFyRlcvQixrQkFBZVAsV0FBQSxFQUQzQkMsV0FBVztJQUFFQyxPQUFPQyxNQUFNQztJQUt0QkMsUUFBQSxHQUFBa0MsYUFBWWxDLFFBQUEsR0FBQUMsT0FBTzVCLGtEQUZROEQsV0FDT3pELHFCQUFtQjVKLGFBSDdDb0w7O0FDckJQLFNBQVVrQyxLQUFLQztJQUNuQixNQUFNQyxXQUFXRCxlQUNOQSxVQUFVLFdBQ2ZBLFFBQ0FBLE1BQU12SCxPQUNSOUQ7SUFDSixNQUFNdUwsT0FBTyxFQUFDQyxpQkFBaUJDLGdCQUFnQnZDO0lBQy9DLElBQUlvQyxVQUFVQyxLQUFLRyxLQUFLQyxZQUFZckUsZUFBZWdFO0lBQ25ELE9BQU9ySCxtQkFBbUJzSDtBQUM1Qjs7U0FFZ0JLO0lBQ2QsT0FBTzNILGdCQUFnQjBILFlBQVlwRSxlQUFlO0FBQ3BEOztBQUVNLFNBQVVzRSxnQkFBZ0JDO0lBQzlCLE9BQU83SCxnQkFDTDhILFlBQVksV0FDWkosWUFBWW5FLG9CQUFvQnNFLFFBQ2hDTCxnQkFBZ0J2QztBQUVwQjs7QUNmTSxTQUFVOEMsb0JBQ2R4TDtJQUVBLE1BQU1FLGFBQW9FO1FBQ3hFQyxLQUFLRztRQUNMQyxNQUFNRTtRQUNOQyxLQUFLRTtRQUNMQyxPQUFPQztRQUNQQyxRQUFRQzs7SUFHVixNQUFNeUssWUFBWXZMLFdBQVdGO0lBRTdCLEtBQUt5TCxXQUFXO1FBQ2QsTUFBTSxJQUFJQyxpQkFDUiwwQkFBMEIxTDtBQUU5QjtJQUVBLE9BQU95TDtBQUNUOztBQ05BLE1BQU1FLG9CQUFxQkMsYUFDbEJBLFVBQ0pDLE1BQU0sS0FDTmpOLE9BQVF3RSxLQUFNQSxFQUFFTCxXQUFXLE1BQzNCbEUsSUFBS3VFLEtBQU1BLEVBQUUwSSxNQUFNOztBQUd4QixNQUFNQyxlQUFnQnpJLFNBQVk7SUFDaENBO0lBQ0FDLGFBQWEsR0FBR0Q7SUFDaEJsRSxVQUFVO0lBQ1ZyQyxNQUFNeUc7OztBQUdSLFNBQVN3SSxhQUFhQyxPQUFnQkM7SUFDcEMsSUFBSUQsaUJBQWlCRSxXQUFXLE9BQU9GO0lBQ3ZDLE9BQU8sSUFBSUcsY0FDVEgsaUJBQWlCSSxRQUFRLEdBQUdILG9CQUFvQkQsTUFBTUssWUFBWUo7QUFFdEU7O0FBRU0sU0FBVUssaUJBQ2RDLFlBQ0FaLFdBQ0FhLFVBQ0FDLHFCQUE4QjtJQUU5QixNQUFNQyxtQkFBbUJuQixvQkFBb0JpQjtJQUM3QyxNQUFNRyxnQkFBZ0JqQixrQkFBa0JDLFdBQVcvTSxJQUFJa047SUFFdkQsTUFBTWMscUJBQXFCO0lBQzNCLElBQUlKLGFBQWEsU0FBU0Msb0JBQW9CO1FBQzVDRyxtQkFBbUIzQixLQUNqQjRCLFNBQVM7WUFDUHhKLE1BQU07WUFDTmxFLFVBQVU7WUFDVkcsTUFBTXdOO1lBQ054SixhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhOztBQUduQjtJQUVBLE9BQU87UUFDTHlKLFFBQVEsRUFDTkwsaUJBQWlCZixlQUNkZ0IsY0FBYy9OLElBQUlvTyxjQUNsQkosb0JBQ0hLLGFBQWE7WUFDWEMsU0FBUyx3Q0FBd0NYO1lBRW5EWSxjQUFjO1lBQ1o3SixhQUFhO1lBRWY4SixxQkFBcUI7WUFDbkI5SixhQUFhOztRQUdqQm9CLFFBQVEsRUFBQ08sWUFBWTBILGdCQUFnQlU7O0FBRXpDOztBQUVNLFNBQVVDLG1CQUNkM1IsUUFDQTRRLFlBQ0ExUSxZQUNBcUg7SUFFQSxNQUFNcUssUUFBUTVSLFFBQVFrQyxhQUFhbEM7SUFDbkN1SCxXQUFXNkosT0FBT1MsUUFBU0MsS0FBTUEsRUFBRUYsT0FBT2hCLFlBQVkxUTtJQUN0RHFILFdBQVd3QixRQUFROEksUUFBUSxDQUFDQyxHQUFHQyxVQUFVRCxFQUFFRixPQUFPaEIsWUFBWW1CO0FBQ2hFOztBQUVNLFNBQVVDLHlCQUNkQyxhQUNBckIsZUFDR3NCO0lBRUgsSUFBSUQsdUJBQXVCRSxjQUFjO1FBQ3ZDLGNBQWVGLFlBQW9CckIsZ0JBQWdCLGFBQzlDcUIsWUFBb0JyQixlQUFlc0IsUUFDcENELFlBQVlHLFVBQVV4QixlQUFlc0I7QUFDM0M7SUFFQSxXQUFZRCxZQUFvQnJCLGdCQUFnQixZQUM5QyxPQUFRcUIsWUFBb0JyQixlQUFlc0I7SUFFN0MsTUFBTSxJQUFJMUIsY0FDUix1QkFBdUJJLDRCQUE0QnFCLGFBQWE3USxhQUFhc0c7QUFFakY7O0FBRU0sU0FBVTJLLG1CQUFzQnpCO0lBQ3BDLE9BQU8wQixlQUVMQyxZQUNBQztRQUVBLE1BQU1wRixNQUFjekIsS0FBS3lCLElBQUlFLElBQUlzRDtRQUVqQztZQUNFeEQsSUFBSVcsTUFDRixnQ0FBZ0M2QyxpQ0FBaUM2QixLQUFLQyxVQUFVSCxXQUFXbko7WUFFN0YsT0FBTXVKLFdBQUVBLFdBQVNoSixPQUFFQSxPQUFLSSxRQUFFQSxVQUFXeUk7WUFDckMsYUFBYVIseUJBQ1hyRyxLQUFLc0csZUFDTHJCLGVBQ0cyQixXQUFXbkosZUFDZHVKLFdBQ0FoSixPQUNBSTtBQUVKLFVBQUUsT0FBT3NDO1lBQ1BlLElBQUlpRCxNQUFNLGlCQUFpQk8sc0JBQXNCdkU7WUFDakQsTUFBTStELGFBQWEvRCxHQUFHLGlCQUFpQnVFO0FBQ3pDO0FBQ0Y7QUFDRjs7U0FFZ0JnQyxrQkFDZEMsaUJBQ0FqQyxZQUNBa0M7SUFFQXBSLE9BQU9xUixlQUNMRixnQkFBZ0IzUSxhQUFhMlEsaUJBQzdCakMsWUFDQTtRQUNFdFEsT0FBT3dTO1FBQ1BFLFVBQVU7O0lBSWQsT0FBT3RSLE9BQU9VLHlCQUNaeVEsZ0JBQWdCM1EsYUFBYTJRLGlCQUM3QmpDO0FBRUo7O0FDaktNLE1BQU9xQyx5QkFBeUJDO0lBSzFCLFlBQUFDLENBQWF0SztRQUNyQixNQUFNdUssV0FBV3ZLLElBQUk2QyxRQUFRMkgsZUFBZXBELE1BQU0sS0FBSztRQUN2RCxPQUFPbUQ7QUFDVDtJQUVVLGVBQUFFLENBQWdCdEw7UUFDeEIsTUFBTWEsTUFBTWIsSUFBSUUsZUFBZUM7UUFDL0IsTUFBTWlMLFdBQVd6SCxLQUFLd0gsYUFBYXRLO1FBQ25DLEtBQUt1SyxVQUFVLE1BQU0sSUFBSUcsbUJBQW1CO1FBQzVDLE9BQU87WUFBRXJGLE1BQU1rRjtZQUFVMUQsT0FBTyxFQUFDMEQ7O0FBQ25DOzs7QUFRSSxNQUFPSSw2QkFBNkJQOzs7O0FDdkJuQyxJQUFNUSxrQkFBZUMsb0JBQXJCLE1BQU1EO0lBQ1gsY0FBT0UsQ0FDTDdQLFVBQWtDO1FBRWxDLE1BQU04UCxZQUF3QyxFQUM1QzlHO1FBR0YsSUFBSWhKLFFBQVFnUCxTQUFTO1lBQ25CYyxVQUFVdEUsS0FBS3hMLFFBQVFnUDtZQUN2QmMsVUFBVXRFLEtBQUs7Z0JBQ2J1RSxTQUFTNUk7Z0JBQ1Q2SSxVQUFVaFEsUUFBUWdQOztBQUV0QjtRQUVBLElBQUloUCxRQUFRaVEsUUFBUTtZQUNqQkgsVUFBb0J0RSxLQUFLO2dCQUN4QnVFLFNBQVNHO2dCQUNUQyxhQUFhbkg7O0FBRWpCO1FBRUEsT0FBTztZQUNMb0gsUUFBUVI7WUFDUkssUUFBUWpRLFFBQVFpUSxVQUFVO1lBQzFCSDtZQUNBTyxTQUFTLEVBQUNySCxpQkFBaUI3Qjs7QUFFL0I7OztBQTdCV3dJLGtCQUFlQyxvQkFBQW5ILFdBQUEsRUFEM0I2SCxPQUFPLENBQUEsTUFDS1g7Ozs7QUNzQ04sSUFBTVksdUJBQW9CQyx5QkFBMUIsTUFBTUQ7SUFDWCxXQUFBalQsQ0FDMkNtVCxVQUN4QkM7UUFEd0I3SSxLQUFBNEksV0FBQUE7UUFDeEI1SSxLQUFBNkksVUFBQUE7QUFDaEI7SUFFSCxVQUFNQyxDQUFLNUwsS0FBYzZMO1FBQ3ZCLE1BQU10SCxNQUFNQyxRQUFRQyxJQUFJZ0gsdUJBQXFCNU0sTUFBTTRGLElBQUkzQixLQUFLOEk7UUFDNURySCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLNkksUUFBUTVJLGdCQUFnQkQsS0FBSzRJLFNBQVNoUiwrQkFBK0JzRixJQUFJdUksVUFBVXZJLElBQUk4TDtRQUV6RyxLQUFLLE1BQU03QixXQUFXbkgsS0FBSzRJLFVBQVU7a0JBQzdCekIsUUFBUXZFLE9BQU81QyxLQUFLNkksU0FBUzNMLEtBQUs2TDtBQUMxQztBQUNGOzs7QUFkV0wsdUJBQW9CQyx5QkFBQS9ILFdBQUEsRUFEaENDLFdBQVc7SUFBRUMsT0FBT0MsTUFBTUM7SUFHdEJDLFFBQUEsR0FBQUMsT0FBT3hDLDJEQUNrQmlCLDBCQUhqQitJOztBQ3pDTixJQUFNTywyQkFBTixNQUFNQTtJQUNYLFdBQUF4VCxDQUFzQjRHO1FBQUEyRCxLQUFBM0QsTUFBQUE7QUFBMkI7SUFFakQsU0FBQWtGLENBQVVzSCxTQUEyQnJIO1FBQ25DLElBQUkwSCxXQUFXTCxRQUFRdE0sZUFBZTRNO1FBRXRDLE9BQU8zSCxLQUFLb0IsU0FBU3dHLEtBRW5CQyxJQUFLak47WUFDSDhNLFdBQVdsSixLQUFLM0QsSUFBSWlOLFdBQVdKOztBQUdyQzs7O0FBWldELDJCQUF3QnJJLFdBQUEsRUFEcENDLGdEQUU0QmxCLDBCQURoQnNKOztBQ0lQLE1BQWdCTSx3QkFHWkM7SUFDUixXQUFBL1QsQ0FDcUJnVSxlQUNuQkM7UUFFQTdKLE1BQU00SjtRQUhhekosS0FBQXlKLGdCQUFBQTtBQUlyQjs7O0FBR0ksTUFBZ0JFLDZCQUdaSjtJQUdSLFdBQUE5VCxDQUM4QmdVLGVBQzVCQztRQUVBN0osTUFBTTRKLGVBQWVDO1FBSE8xSixLQUFBeUosZ0JBQUFBO0FBSTlCO0lBSUEsV0FBQW5ELENBQVlqSztRQUNWLEtBQUsyRCxLQUFLNEosY0FDUjtZQUNFNUosS0FBSzRKLGVBQWVDLFVBQVFwSixJQUFxQlQsS0FBS25EO0FBQ3hELFVBQUU7WUFDQTtnQkFDRW1ELEtBQUs0SixlQUFlcEQsYUFBYXNELFdBQy9COUosS0FBS25EO0FBRVQsY0FBRTtnQkFDQW1ELEtBQUs0SixlQUFlRyxhQUFXQyxTQUFTaEssS0FBS25EO0FBQy9DO0FBQ0Y7UUFFRixNQUFNMkQsWUFBWVIsS0FBS3lKLGNBQWNRO1FBRXJDLE9BQU81TixNQUNIMkQsS0FBSzRKLHdCQUF3QkcsZUFDM0IvSixLQUFLNEosYUFBYU0sU0FBUzFKLGFBQzNCUixLQUFLNEosYUFBYWpJLElBQUluQixhQUN4QlIsS0FBSzRKO0FBQ1g7OztBQ2xERixNQUFNTyxXQUFXLElBQUlDOztBQThCZixTQUFVQyxPQUNkQyxJQUNBaEgsT0FDQWlILFFBQStCLElBQUlDO0lBRW5DLEtBQUtDLHlCQUF5QnhWLFNBQVNxVixLQUFLO1FBQzFDLE9BQU9oSDtBQUNUO0lBRUEsTUFBTW9ILFFBQVFDLFlBQVlMO0lBQzFCLE1BQU1NLFNBQVNGLE1BQU1qSyxJQUFJNkM7SUFDekIsSUFBSXNILFFBQVEsT0FBT0E7SUFFbkIsTUFBTUMsYUFBYSxFQUNqQmhTLGNBQWNPLFFBQ2RjLHNCQUFzQkcsYUFDdEJwRixTQUFTcVY7SUFFWCxNQUFNUTtJQUNOSixNQUFNeEwsSUFBSW9FLE9BQU93SDtJQUVqQi9VLE9BQU9xUixlQUFlMEQsWUFBWSxRQUFRO1FBQ3hDblcsT0FBTyxHQUFHb1csYUFBYXpILE1BQU12SCxRQUFRZ1AsYUFBYVQ7O0lBR3BELE1BQU1VLFNBQVM7UUFDYjtZQUNFLE9BQU9DLE1BQU1DLEdBQUc1SDtBQUNsQixVQUFFO1lBQ0EsT0FBT3JMO0FBQ1Q7QUFDRCxNQU5jO0lBUWYsTUFBTWtULGtCQUFrQkgsU0FBU0MsTUFBTUcsUUFBUTlILFNBQWdCckw7SUFDL0QsTUFBTW9ULGVBQWVMLFNBQ2pCdlcsUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVd5VSxVQUNwRC9TO0lBQ0osTUFBTXFULGtCQUNKRCxpQkFBaUJuTixVQUFVbU4saUJBQWlCRTtJQUM5QyxNQUFNQyxrQkFDRkwsaUJBQWlCTSxjQUNsQlQsU0FDR0MsTUFBTVMsb0JBQW9CcEksT0FBYzBILFdBQ3hDVyxxQ0FBcUNySSxPQUFPMEgsV0FDNUNNLGtCQUNBO0lBRU4sTUFBTU0sV0FBV2hXLE1BQU1zTixLQUFLLElBQUlzSCxJQUFJdkwsU0FBU2pLLFdBQVdzTyxVQUFVO0lBQ2xFLE1BQU11SSxZQUFZLElBQUlyQixJQUFhUyxNQUFNWSxVQUFVdkksVUFBdUI7SUFDMUUsTUFBTXdJLGNBQXdCO0lBRTlCLEtBQUssTUFBTUMsUUFBUUgsVUFBVTtRQUMzQixLQUFLRyxNQUFNO1FBQ1gsSUFBSUYsVUFBVUcsSUFBSUQsT0FBTztRQUV6QixJQUFJQSxTQUFTZixXQUFXSCxjQUFjVyxlQUFlO1FBQ3JELElBQUlPLFNBQVNmLFVBQVVXLHFDQUFxQ3JJLE9BQU95SSxPQUNqRTtRQUVGRCxZQUFZbkksS0FBS29JO0FBQ25CO0lBRUEsS0FBSyxNQUFNQSxRQUFRRCxhQUFhO1FBQzlCLE1BQU1HLGFBQWFDLCtCQUErQjVJLE9BQU95STtRQUN6RCxNQUFNSSxlQUFlRixhQUFhRyxlQUFlQztRQUNqRCxNQUFNQyxXQUNKQyx5QkFBeUJqSixPQUFPeUksU0FDaEN0WCxRQUFRQyxZQUFZLGVBQWU0TyxNQUFNL00sV0FBV3dWO1FBRXRELE1BQU1TLGFBQWdEO1lBQ3BEM1UsVUFBVXNVOztRQUVaLElBQUlHLFVBQVVFLFdBQVdoWCxPQUFPOFc7UUFFaENwVSxZQUFZc1UsV0FBWnRVLENBQXdCNFMsV0FBV3ZVLFdBQVd3VjtRQUU5QyxNQUFNVSxhQUNKaFksUUFBUUMsWUFBWSxlQUFlNE8sTUFBTS9NLFdBQVd3VixTQUFTTztRQUMvRCxXQUFXRyxlQUFlLGFBQWE7WUFDckNoWSxRQUFRRyxlQUNOLGVBQ0E2WCxZQUNBM0IsV0FBV3ZVLFdBQ1h3VjtBQUVKO1FBRUFoVyxPQUFPcVIsZUFBZTBELFdBQVd2VSxXQUFXd1YsTUFBTTtZQUNoRHBYLE9BQU9zRDtZQUNQb1AsVUFBVTtZQUNWcUYsWUFBWTtZQUNaQyxjQUFjOztBQUVsQjtJQUVBLEtBQUssTUFBTUMsWUFBWWYsV0FBVztRQUNoQyxNQUFNZ0IsZUFBZTVOLFNBQVM0TSxVQUFVdkksT0FBT3NKO1FBQy9DLEtBQUtDLGNBQWM7WUFDakIsTUFBTSxJQUFJaEksY0FBYyx5QkFBeUIrSDtBQUNuRDtRQUVBLElBQUlFLGVBQ0ZELGFBQWFoUTtRQUNmLFdBQVdpUSxpQkFBaUIsZUFBZUEsYUFBYS9RLE1BQU07WUFDNUQrUSxlQUFnQkE7QUFDbEI7UUFDQSxLQUFLQSx1QkFBdUJBLGlCQUFpQixZQUFZO1lBQ3ZELE1BQU0sSUFBSWpJLGNBQWMscUJBQXFCK0g7QUFDL0M7UUFDQSxLQUFLM0IsTUFBTXhLLElBQUlxTSxhQUFhL1EsT0FBTztZQUNqQztBQUNGO1FBRUEsTUFBTWdSLE9BQU85TixTQUFTK04sY0FBYzFKLE9BQU9zSjtRQUMzQyxNQUFNL1csWUFBYWtYLE9BQWVYLGVBQWVhO1FBQ2pELE1BQU1kLGVBQWdCWSxPQUFlWCxlQUFlQztRQU1wRCxNQUFNYSxhQUFhM0MsTUFBTXlCLElBQUljO1FBRTdCLElBQUlJLFlBQVk7WUFDZCxNQUFNQyxhQUFhQyxpQkFBaUJOO1lBQ3BDTyxpQkFBaUJ2QyxZQUFZOEIsVUFBVU8sWUFBWXRYLFNBQVNzVztZQUM1RDtBQUNGO1FBRUEsTUFBTW1CLGNBQWNqRCxPQUFPQyxJQUFJd0MsY0FBYyxJQUFJdEMsSUFBSUQsT0FBT2dELElBQUlqSztRQUVoRSxJQUFJdUgsWUFBWTtZQUNkMkMsa0JBQ0UxQyxZQUNBOEIsVUFDQUUsY0FDQVEsYUFDQXpYLFNBQ0FzVztBQUVKLGVBQU87WUFDTHNCLFlBQVkzQyxZQUFZOEIsVUFBVVUsYUFBYXpYLFNBQVNzVztBQUMxRDtBQUNGO0lBRUEsT0FBT3JCO0FBQ1Q7O0FBRUEsU0FBUzJDLFlBQ1BDLFVBQ0FkLFVBQ0FVLGFBQ0F6WCxTQUNBc1c7SUFFQSxNQUFNSyxhQUFnRDtRQUNwRGhYLE1BQU04WDtRQUNOelYsVUFBVXNVO1FBQ1Z0Vzs7SUFFRnFDLFlBQVlzVSxXQUFadFUsQ0FBd0J3VixTQUFTblgsV0FBV3FXO0lBQzVDblksUUFBUUcsZUFDTixlQUNBaUIsVUFBVUQsUUFBUTBYLGFBQ2xCSSxTQUFTblgsV0FDVHFXO0lBRUY3VyxPQUFPcVIsZUFBZXNHLFNBQVNuWCxXQUFXcVcsVUFBVTtRQUNsRGpZLE9BQU9zRDtRQUNQb1AsVUFBVTtRQUNWcUYsWUFBWTtRQUNaQyxjQUFjOztBQUVsQjs7QUFNQSxTQUFTVSxpQkFDUEssVUFDQWQsVUFDQU8sWUFDQXRYLFNBQ0FzVztJQUVBLE1BQU1LLGFBQWdEM1csVUFDakQ7UUFBRUwsTUFBTTtRQUFTOEMsT0FBTztZQUFFOUMsTUFBTTJYOztRQUFjdFYsVUFBVXNVO1FBQ3hEO1FBQUUzVyxNQUFNMlgsZUFBZSxZQUFZalAsU0FBU2pDO1FBQVFwRSxVQUFVc1U7O0lBQ25FalUsWUFBWXNVLFdBQVp0VSxDQUF3QndWLFNBQVNuWCxXQUFXcVc7SUFDNUNuWSxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFTdVgsZUFBZSxZQUFZalAsU0FBU2pDLFFBQ3ZEeVIsU0FBU25YLFdBQ1RxVztJQUVGN1csT0FBT3FSLGVBQWVzRyxTQUFTblgsV0FBV3FXLFVBQVU7UUFDbERqWSxPQUFPc0Q7UUFDUG9QLFVBQVU7UUFDVnFGLFlBQVk7UUFDWkMsY0FBYzs7QUFFbEI7O0FBRUEsU0FBU2Esa0JBQ1BFLFVBQ0FkLFVBQ0FFLGNBQ0FRLGFBQ0F6WCxTQUNBc1c7SUFFQSxNQUFNd0IsY0FDSmxaLFFBQVFDLFlBQVloQyxXQUFXYyxrQkFBa0JrYSxhQUFhO0lBQ2hFLEtBQUtDLFlBQVkxWSxTQUFTcVksY0FBYztRQUN0QzdZLFFBQVFHLGVBQ05sQyxXQUFXYyxrQkFDWCxLQUFJbWEsYUFBYUwsZUFDakJJO0FBRUo7SUFFQSxNQUFNRSxTQUFTLHdCQUF3Qk4sWUFBWXZSO0lBQ25ELE1BQU1vUixhQUFhQyxpQkFBaUJOO0lBQ3BDLE1BQU1lLGFBQWEsRUFBQztRQUFFQyxNQUFNRjtPQUFVO1FBQUVwWSxNQUFNMlg7O0lBRTlDLE1BQU1YLGFBQWdEM1csVUFDakQ7UUFBRUwsTUFBTTtRQUFTcUMsVUFBVXNVO1FBQVk0QixPQUFPRjtRQUM5QztRQUFFclksTUFBTU87UUFBUThCLFVBQVVzVTtRQUFZNEIsT0FBT0Y7O0lBRWxEM1YsWUFBWXNVLFdBQVp0VSxDQUF3QndWLFNBQVNuWCxXQUFXcVc7SUFDNUNuWSxRQUFRRyxlQUNOLGVBQ0FpQixVQUFVRCxRQUFRRyxRQUNsQjJYLFNBQVNuWCxXQUNUcVc7SUFFRjdXLE9BQU9xUixlQUFlc0csU0FBU25YLFdBQVdxVyxVQUFVO1FBQ2xEalksT0FBT3NEO1FBQ1BvUCxVQUFVO1FBQ1ZxRixZQUFZO1FBQ1pDLGNBQWM7O0FBRWxCOztBQUVBLFNBQVNTLGlCQUFpQk47SUFDeEI7UUFDRSxNQUFNM0Isa0JBQWtCRixNQUFNRyxRQUFRMEI7UUFDdEMsTUFBTWtCLFNBQVM3QyxpQkFBaUIzVjtRQUNoQyxJQUFJd1ksV0FBVzlQLFVBQVU4UCxXQUFXekMsUUFBUSxPQUFPO1FBQ25ELE9BQU87QUFDVCxNQUFFO1FBQ0EsT0FBTztBQUNUO0FBQ0Y7O0FBRUEsU0FBU0kscUNBQ1BySSxPQUNBeUk7SUFFQSxJQUFJa0MsVUFBZTNLO0lBQ25CLE9BQU8ySyxXQUFXQSxZQUFZbFksVUFBVWtZLFlBQVlDLFVBQVU7UUFDNUQsSUFBSWpELE1BQU1RLFVBQVV3QyxTQUFTbEMsT0FBYyxPQUFPO1FBQ2xEa0MsVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU87QUFDVDs7QUFFQSxTQUFTL0IsK0JBQ1A1SSxPQUNBeUk7SUFFQSxJQUFJa0MsVUFBZTNLO0lBQ25CLE9BQU8ySyxXQUFXQSxZQUFZbFksVUFBVWtZLFlBQVlDLFVBQVU7UUFDNUQsTUFBTWpDLGFBQWFoTixTQUFTK04sY0FBY2lCLFNBQVNsQztRQUNuRCxJQUFJRSxZQUFZLE9BQU9BO1FBQ3ZCZ0MsVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU9oVztBQUNUOztBQUVBLFNBQVNzVSx5QkFBeUJqSixPQUF5QnlJO0lBQ3pELElBQUlrQyxVQUFlM0s7SUFDbkIsT0FBTzJLLFdBQVdBLFlBQVlsWSxVQUFVa1ksWUFBWUMsVUFBVTtRQUM1RCxNQUFNMVksT0FBT3lKLFNBQVN6SixLQUFLeVksU0FBU2xDO1FBQ3BDLElBQUl2VyxNQUFNLE9BQU9BO1FBQ2pCeVksVUFBVWxZLE9BQU9vWSxlQUFlRjtBQUNsQztJQUNBLE9BQU9oVztBQUNUOztBQUVBLFNBQVMwUyxZQUNQTDtJQUVBLEtBQUtILFNBQVM2QixJQUFJMUIsS0FBSztRQUNyQkgsU0FBU2pMLElBQUlvTCxJQUFJLElBQUk4RDtBQUN2QjtJQUNBLE9BQU9qRSxTQUFTMUosSUFBSTZKO0FBQ3RCOztBQ2hWQ3pILFFBQWdCSSxpQkFBaUIsU0FBU29MLGVBRXpDQztJQUNBLE1BQU1DLGVBQ0dELFlBQVksV0FBV0EsVUFBV0EsUUFBUUM7SUFDbkQsT0FBT3RQLFNBQVMsWUFBWU4sT0FBT2dELElBQUksaUJBQWlCNE07QUFDMUQsRUFBRUMsS0FBSzNMOztBQUVOQSxRQUFnQkMsc0JBQXNCLFNBQVMyTDtJQUc5QyxNQUFNMUIsT0FBTzlOLFNBQVMsWUFBWU4sT0FBT2dELElBQUk7SUFDN0MsS0FBS29MLE1BQU0sT0FBTzlVO0lBQ2xCLE9BQU9sQyxPQUFPeUIsS0FBS3VWO0FBQ3JCLEVBQUV5QixLQUFLM0w7O0FBRU42TCxRQUFnQm5ZLFVBQVUrUyxhQUFhLFNBQVNBLFdBRWhDUDtJQUNmLE1BQU00RixVQUFVM08sS0FBSzJPO0lBQ3JCLElBQUlBLFNBQVM1RixJQUFJNkYsT0FBTyxrQkFBa0I5SCxLQUFLQyxVQUFVNEg7SUFDekQsT0FBTzVGO0FBQ1Q7O0FDZEEsTUFBTXhTLFlBQVlzWSxhQUFhdFk7O0FBSS9CLEtBQUtBLFVBQVV1WSxlQUFlO0lBQzVCdlksVUFBVXVZLGdCQUFnQixTQUFVNUs7UUFDbEMsS0FBTWxFLEtBQWErTyxrQkFBa0I7WUFDbEMvTyxLQUFhK08sbUJBQW1CO0FBQ25DO1FBQ0MvTyxLQUFhK08saUJBQWlCcEwsS0FBS087UUFDcEMsT0FBT2xFO0FBQ1Q7QUFDRjs7QUFFQXpKLFVBQVU4TSxPQUFPLFNBQVVDO0lBQ3pCLE9BQU90RCxLQUFLOE8sY0FBY3pMLEtBQUtDO0FBQ2pDOztBQUVBLEtBQU0vTSxVQUFrQnlZLDRCQUE0QjtJQUNsRCxNQUFNQyxnQkFBZ0IxWSxVQUFVMlk7SUFDaEMzWSxVQUFVMlksUUFBUTtRQUNoQixJQUFJQyxTQUFTRixjQUFjRyxLQUFLcFA7UUFDaEMsTUFBTXBFLGFBQWNvRSxLQUFhK087UUFDakMsSUFBSW5ULFlBQVloRSxRQUFRO1lBQ3RCLEtBQUssTUFBTXNNLGFBQWF0SSxZQUFZO2dCQUNsQyxNQUFNeVQsWUFBWW5MLFVBQVVpTDtnQkFDNUIsSUFBSUUsV0FBVztvQkFDYkYsU0FBU0U7QUFDWDtBQUNGO0FBQ0Y7UUFDQSxPQUFPRjtBQUNUO0lBQ0M1WSxVQUFrQnlZLDZCQUE2QjtBQUNsRDs7OztNQ2tCYU07O1FBQ2F0UCxLQUFBeUIsTUFBTUMsUUFBUUMsSUFBSTJOLG9CQUFvQnZUO0FBQU07SUFFNUQsbUJBQU8wSSxDQUNiQyxPQUNBQztRQUVBLElBQUlELGlCQUFpQkUsV0FBVyxPQUFPRjtRQUN2QyxPQUFPLElBQUlHLGNBQ1RILGlCQUFpQkksUUFDYixHQUFHSCxvQkFBb0JELE1BQU1LLFlBQzdCSjtBQUVSO0lBRUEscUJBQU80SyxDQUNMQztRQUVBO1lBQ0UsT0FBTzNGLFVBQVFwSixJQUFxQitPO0FBQ3RDLFVBQUUsT0FBTzlPO1lBQ1A7Z0JBQ0UsT0FBTzhGLGFBQWFzRCxXQUFXMEY7QUFDakMsY0FBRSxPQUFPQztnQkFDUCxPQUFPMUYsYUFBV0MsU0FBU3dGO0FBQzdCO0FBQ0Y7QUFDRjtJQUVBLHNDQUFPRSxDQUNMcEosYUFDQXFKLFNBQWlCQyxnQkFBZ0JDO1FBRWpDLE1BQU1DLE9BQ0p4Six1QkFBdUJFLGVBQWVGLFlBQVl3SixPQUFPeEo7UUFDM0QsTUFBTXlKLGVBQ0o5USxTQUFTd0IsSUFDUHFQLEtBQUtyYSxhQUNMd0osU0FBUzNLLElBQUlzYixnQkFBZ0JDLFdBQzFCLENBQUE7UUFFUCxNQUFNRyxlQUNKL1EsU0FBU3dCLElBQ1A2RixZQUFZN1EsYUFDWndKLFNBQVMzSyxJQUFJbUssaUJBQ1YsQ0FBQTtRQUVQLE1BQU13Uix3QkFBd0J0RztZQUM1QixTQUFhO2dCQUNYLE1BQU0sSUFBSTlFLGNBQWM7QUFDMUI7WUFDQSxXQUFBcFAsQ0FBWWdVLGVBQW9DMU47Z0JBQzlDOEQsTUFBTTRKLGVBQWUxTjtBQUN2Qjs7UUFHRixLQUFLLE9BQU9rSixZQUFZN0gsV0FBV3JILE9BQU9tYSxRQUFRRixlQUFlO1lBQy9ELE1BQU0zTCxZQUFZLEVBQUNqSCxPQUFPMUUsS0FBSzhCLFFBQVEsY0FBYyxNQUNsRG5ELE9BQVE4WSxXQUFvQkEsV0FBV0EsUUFBUUMsUUFDL0NDLEtBQUs7WUFFUixNQUFNbEosVUFBVW1JLG9CQUFvQmdCLDBCQUNsQ3JMO1lBRUZxSyxvQkFBb0JpQixhQUFhTixpQkFBaUJoTCxZQUFZa0M7WUFFOUQsTUFBTXFKLGdCQUFnQnZNLG9CQUFvQjdHLE9BQU9xVCxXQUEzQnhNLENBQ3BCSSxhQUFhcE07WUFFZixNQUFNMkQsYUFBYTBULG9CQUFvQm9CLG1CQUNyQ3pMLFlBQ0FaLFdBQ0FqSCxPQUFPcVQ7WUFFVG5CLG9CQUFvQnBULGdCQUFnQitULGlCQUFpQmhMLFlBQVksRUFDL0R1TCxrQkFDRzVVO0FBRVA7UUFFQSxLQUFLLE9BQU9xSixZQUFZMEwsY0FBYzVhLE9BQU9tYSxRQUFRSCxlQUFlO1lBQ2xFLE1BQU1hLFNBQVNELFVBQVVDLFVBQVU7WUFDbkMsTUFBTXZNLFlBQVksRUFBQ3NMLFFBQVExSyxlQUFlMkwsT0FBT3RaLElBQUt1WixLQUFNLElBQUlBLE9BQzdEeFosT0FBUThZLFdBQVlBLFdBQVdBLFFBQVFDLFFBQ3ZDQyxLQUFLO1lBRVIsTUFBTWxKLFVBQVVtSSxvQkFBb0JnQiwwQkFDbENyTDtZQUVGcUssb0JBQW9CaUIsYUFBYU4saUJBQWlCaEwsWUFBWWtDO1lBRTlELE1BQU1xSixnQkFBZ0J2TSxvQkFBb0IsTUFBcEJBLENBQ3BCSSxhQUFhcE07WUFFZixNQUFNMkQsYUFBYTBULG9CQUFvQm9CLG1CQUNyQ3pMLFlBQ0FaLFdBQ0EsT0FDQTtZQUVGaUwsb0JBQW9CcFQsZ0JBQWdCK1QsaUJBQWlCaEwsWUFBWSxFQUMvRHVMLGtCQUNHNVU7QUFFUDtRQUVBLE9BQU9xVTtBQUNUO0lBRU8sYUFBQWEsQ0FDTGxVLGFBQ0FtVSx1QkFDQUM7UUFFQSxNQUFNdlAsTUFBTTZOLG9CQUFvQjdOLElBQUlFLElBQUkyTixvQkFBb0J3QjtRQUM1RCxNQUFNRyxZQUFZaEcsTUFBTWdHLFVBQVVyVTtRQUNsQyxNQUFNeUgsWUFBWTZNLFlBQVlEO1FBQzlCLE1BQU1FLGlCQUFpQnZVLFlBQVliO1FBQ25DLE1BQU11SyxjQUFjZ0osb0JBQW9CQyxlQUFlM1M7UUFLdkQsTUFBTXdVLHFCQUNKOUssdUJBQXVCRSxlQUFlRixZQUFZd0osT0FBT3hKO1FBRTNELE1BQU0rSyxrQkFBa0JwUyxTQUFTd0IsSUFDL0I3RCxhQUNBcUMsU0FBUzNLLElBQUl1SztRQUVmLE1BQU15UyxpQkFBaUJQLHdCQUF3Qm5VLFlBQVliO1FBQzNELE1BQU13VixlQUE2QztlQUM3Q1Asa0JBQWtCLENBQUE7ZUFDbEJLLG1CQUFtQixDQUFBO2VBQ25CQyxrQkFBa0IsQ0FBQTs7UUFHeEIsTUFBTUUsb0JBQW9CQyx1QkFBdUJYLE9BQy9DbFUsYUFDQXdVLG9CQUNBRztRQUVGLE1BQU1HLGdCQUFpQkYsa0JBQTBCRztRQUlqRCxPQUFNQyxPQUNKQSxPQUFLQyxlQUNMQSxlQUNBblosTUFBTW9aLFVBQ0p4QyxvQkFBb0J5Qyw0QkFBNEJuVjtRQUVwRDZFLElBQUlXLE1BQ0Ysa0NBQWtDK08sdUJBQXVCTyxlQUFlOVosVUFBVTtRQUdwRixNQUFNb2EsYUFBcUNULGFBQWFVO1FBRXhELFNBQVNDLGVBQWU3ZDtZQUN0QixJQUFJMmQsWUFBWUcsUUFBUTtnQkFDdEJ0TyxTQUFTeFA7QUFDWCxtQkFBTyxJQUFJMmQsWUFBWWpPLE9BQU9uTSxRQUFRO2dCQUNwQ2tNLGdCQUFnQmtPLFdBQVdqTyxNQUEzQkQsQ0FBa0N6UDtBQUNwQyxtQkFBTztnQkFDTGdQLEtBQUt6RyxZQUFMeUcsQ0FBa0JoUDtBQUNwQjtZQUNBLElBQUkyZCxZQUFZL1AsZ0JBQWdCO2dCQUM5QjJCLFlBQVlsRSxzQkFBc0IsS0FBbENrRSxDQUF3Q3ZQO0FBQzFDO0FBQ0Y7UUFFQSxJQUdNK2QseUJBQXNCQywyQkFINUIsTUFHTUQsK0JBQStCekk7WUFHekIsZ0JBQVc7Z0JBQ25CLE9BQU8vTTtBQUNUO1lBRUEsU0FBYTtnQkFDWCxPQUFPQTtBQUNUO1lBRUEsV0FBQW5ILENBQVlnVTtnQkFDVjVKLE1BQU00SixlQUFlNEkseUJBQXVCdFc7Z0JBWDdCaUUsS0FBQWtMLEtBQWFELE1BQU1DLEdBQUd0TztnQkFZckM2RSxJQUFJNlEsS0FDRiw2Q0FBNkN0UyxLQUFLbkQsTUFBTWQsZ0JBQWdCc0k7QUFFNUU7O1FBaEJJK04seUJBQXNCQywyQkFBQXpSLFdBQUEsRUFIM0IyUixXQUFXbE8sWUFDWG1PLFFBQVFyQixpQkFDUnNCLGVBQWU3VixnREFZYStDLDBCQVh2QnlTO1FBbUJORixlQUFlRTtRQUVmLElBQUlWLGVBQWU7WUFDakIsTUFBTWdCLGVBQWUsS0FBSWhCLGdCQUFlaUIsS0FBSyxDQUFDQyxHQUFHQztnQkFDL0MsTUFBTUMsWUFBWUYsRUFBRWxhLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFPMGI7Z0JBQzNDLE1BQU1DLFlBQVlILEVBQUVuYSxLQUFLNEwsTUFBTSxLQUFLak4sT0FBTzBiO2dCQUMzQyxNQUFNRSxjQUFjSCxVQUFVemIsT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQU01RDtnQkFDL0QsTUFBTXViLGNBQWNILFVBQVUzYixPQUFRNmIsS0FBTUEsRUFBRTFYLFdBQVcsTUFBTTVEO2dCQUMvRCxNQUFNd2IsZ0JBQWdCTixVQUFVbGIsU0FBU3FiO2dCQUN6QyxNQUFNSSxnQkFBZ0JMLFVBQVVwYixTQUFTdWI7Z0JBQ3pDLElBQUlDLGtCQUFrQkMsZUFDcEIsT0FBT0EsZ0JBQWdCRDtnQkFDekIsSUFBSUgsZ0JBQWdCRSxhQUFhLE9BQU9GLGNBQWNFO2dCQUN0RCxPQUFPOztZQUdULEtBQUssTUFBTUcsU0FBU1osY0FBYztnQkFDaEMsTUFBTXpOLGFBQ0pxTyxNQUFNQyxnQkFBZ0J4WCxRQUFRdVgsTUFBTTdOLE9BQU8rTjtnQkFDN0MsTUFBTUMsZUFBZW5FLG9CQUFvQm9FLFdBQ3ZDek8sWUFDQXFPLE9BQ0F4QixRQUNBRCxlQUNBRCxPQUNBaFYsYUFDQXVVO2dCQUVGLEtBQUtzQyxjQUFjO2dCQUVuQixPQUNFeE8sWUFBWTBPLHNCQUFvQnhNLFNBQ2hDQSxTQUFPdkwsWUFDUEEsWUFBVWdZLGlCQUNWQSxtQkFDRUg7Z0JBRUosTUFBTWxmLGFBQWErYSxvQkFBb0JpQixhQUNyQzZCLHdCQUNBdUIsc0JBQ0F4TTtnQkFHRixJQUFJNVMsWUFBWTtvQkFDZCxNQUFNaWMsZ0JBQWdCdk0sb0JBQW9CcVAsTUFBTTdOLE9BQTFCeEIsQ0FDcEJxUCxNQUFNNWEsS0FBSzhCLFFBQVEsY0FBYyxPQUFPdkM7b0JBRTFDcVgsb0JBQW9CcFQsZ0JBQ2xCa1csd0JBQ0F1QixzQkFDQSxFQUFDbkQsa0JBQWtCNVUsY0FDbkJnWTtBQUVKO0FBQ0Y7QUFDRjtRQUVBLE9BQU94QjtBQUNUO0lBRUEsa0NBQU9MLENBQ0x2QztRQU9BLE1BQU10RSxLQUFLRCxNQUFNQyxHQUFHc0U7UUFDcEIsTUFBTXFFLFdBQVc1VSxTQUFTd0IsSUFDeEIrTyxZQUNBdlEsU0FBUzNLLElBQUl3ZixPQUFPQyxVQUFVN0k7UUFFaEMsTUFBTThJLGVBQWVILFVBQVV0TixRQUFRO1FBRXZDLE1BQU0wTixhQUNKcmUsTUFBTUMsUUFBUW1lLGlCQUFpQkEsYUFBYXBjLFNBQVMsSUFDakRoQyxNQUFNc04sS0FBSyxJQUFJc0gsSUFBSSxLQUFJd0osbUJBQ3ZCcGUsTUFBTXNOLEtBQUssSUFBSXNILElBQUksRUFBQ1U7UUFFMUIsTUFBTWxQLGNBQWNpRCxTQUFTakQsWUFBWXdULGVBQWU7UUFDeEQsTUFBTTlXLE9BQU8sSUFBSXViLFdBQVc1RCxLQUFLO1FBQ2pDLE1BQU13QixnQkFBb0NvQyxXQUFXM2MsSUFBS2hELFFBQ2pEO1lBQ0x5SCxNQUFNekg7WUFDTjBILGFBQWFpRCxTQUFTakQsWUFBWXdULFlBQVlsYjtZQUM5Q3VELFVBQVU7WUFDVnJDLE1BQU15Rzs7UUFJVixPQUFPO1lBQ0x2RDtZQUNBc0Q7WUFDQTZWO1lBQ0FELE9BQU8sSUFBSXhVLFdBQ1R5VyxVQUFVSyxZQUFZOVcsT0FBT2lULEtBQUt3RCxTQUFTSyxhQUFhOVcsT0FBT2lULEtBQUs7O0FBRTFFO0lBRVEsMkJBQU84RCxDQUNiemI7UUFFQSxJQUFJMGIsYUFBYTtRQUNqQixPQUFPMWIsS0FDSjRMLE1BQU0sS0FDTmpOLE9BQU8wYixTQUNQc0IsUUFBU2xFO1lBQ1IsSUFBSUEsUUFBUTNVLFdBQVcsTUFBTTtnQkFDM0IsT0FBTyxFQUNMO29CQUFFMEksV0FBV29RLE1BQU1uRSxRQUFRNUwsTUFBTTtvQkFBWTZCLE9BQU9nTzs7QUFFeEQ7WUFDQSxJQUFJakUsUUFBUTNVLFdBQVcsTUFBTTtnQkFDM0IsT0FBTyxFQUNMO29CQUFFMEksV0FBV29RLE1BQU1uRSxRQUFRNUwsTUFBTTtvQkFBWTZCLE9BQU9nTzs7QUFFeEQ7WUFDQSxPQUFPOztBQUViO0lBRVEsbUJBQU83RCxDQUNibGMsUUFDQTRRLFlBQ0FrQztRQUVBcFIsT0FBT3FSLGVBQWUvUyxPQUFPa0MsYUFBYWxDLFFBQVE0USxZQUFZO1lBQzVEdFEsT0FBT3dTO1lBQ1BFLFVBQVU7WUFDVnNGLGNBQWM7WUFDZEQsWUFBWTs7UUFHZCxPQUFPM1csT0FBT1UseUJBQ1pwQyxPQUFPa0MsYUFBYWxDLFFBQ3BCNFE7QUFFSjtJQUVRLHNCQUFPL0ksQ0FDYjdILFFBQ0E0USxZQUNBc1Asa0JBQ0FYLGtCQUdLO1FBRUwsTUFBTTNOLFFBQVE1UixRQUFRa0MsYUFBYWxDO1FBQ25DLE1BQU1FLGFBQWF3QixPQUFPVSx5QkFBeUJ3UCxPQUFPaEI7UUFDMURzUCxpQkFBaUJyTyxRQUFTQyxLQUFNQSxFQUFFRixPQUFPaEIsWUFBWTFRO1FBQ3JEcWYsZ0JBQWdCMU4sUUFBUSxFQUFHaEMsc0JBQVdrQyxrQkFDcENsQyxVQUFVK0IsT0FBT2hCLFlBQVltQjtBQUVqQztJQUVRLGlCQUFPc04sQ0FDYnpPLFlBQ0FxTyxPQUNBeEIsUUFDQUQsZUFDQUQsT0FDQWhWLGFBQ0F1VTtRQVlBLE9BQU0xTCxRQUFFQSxRQUFNL00sTUFBRUEsUUFBUzRhO1FBQ3pCLE1BQU1rQixpQkFBaUI5YixLQUFLOEIsUUFBUSxjQUFjO1FBQ2xELE1BQU0yTSxVQUFVbU0sTUFBTUM7UUFFdEIsSUFBSTlOLFdBQVcsVUFBVStPLG1CQUFtQixJQUFJO1lBQzlDLE9BQU9sRixvQkFBb0JtRixtQkFDekIsVUFDQXROLFNBQ0FtSSxvQkFBb0JvRix1QkFBdUI5WCxhQUFhdVUsaUJBQ3hELEVBQ0U7Z0JBQUVqTixXQUFXL0g7Z0JBQW9CaUssT0FBTztlQUN4QztnQkFBRWxDLFdBQVd5USxTQUFTO29CQUFFQyxhQUFhOztnQkFBZ0J4TyxPQUFPOztBQUdsRTtRQUVBLElBQUlYLFdBQVcsVUFBVStPLG1CQUFtQixRQUFRO1lBQ2xELE9BQU9sRixvQkFBb0JtRixtQkFDekIsYUFDQXROLFNBQ0FtSSxvQkFBb0J1RixxQkFBcUJqWSxhQUFhdVUsaUJBQ3RELEVBQ0U7Z0JBQUVqTixXQUFXL0g7Z0JBQW9CaUssT0FBTztlQUN4QztnQkFBRWxDLFdBQVd5USxTQUFTO29CQUFFQyxhQUFhOztnQkFBZ0J4TyxPQUFPOztBQUdsRTtRQUVBLElBQUlYLFdBQVcsU0FBUytPLG1CQUFtQixRQUFRO1lBQ2pELE9BQU9sRixvQkFBb0JtRixtQkFDekIsV0FDQXROLFNBQ0FtSSxvQkFBb0J3RixtQkFBbUJsWSxhQUFhdVUsaUJBQ3BELEVBQUM7Z0JBQUVqTixXQUFXNkIsTUFBTTtnQkFBZUssT0FBTzs7QUFFOUM7UUFFQSxJQUFJWCxXQUFXLFNBQVMrTyxtQkFBbUIsUUFBUTtZQUNqRCxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CeUYscUJBQ2xCblksYUFDQXVVLGdCQUNBVSxnQkFFRixFQUNFO2dCQUFFM04sV0FBVy9IO2dCQUFvQmlLLE9BQU87ZUFDeEM7Z0JBQUVsQyxXQUFXeVEsU0FBUztvQkFBRUMsYUFBYTs7Z0JBQWdCeE8sT0FBTzs7QUFHbEU7UUFFQSxJQUFJWCxXQUFXLFlBQVkrTyxtQkFBbUIsUUFBUTtZQUNwRCxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CMEYscUJBQ2xCcFksYUFDQXVVLGdCQUNBVSxnQkFFRixFQUNFO2dCQUFFM04sV0FBVzZCLE1BQU07Z0JBQWVLLE9BQU87ZUFDekM7Z0JBQUVsQyxXQUFXeVEsU0FBUztvQkFBRUMsYUFBYTs7Z0JBQWdCeE8sT0FBTzs7QUFHbEU7UUFFQSxJQUFJWCxXQUFXLFNBQVMrTyxtQkFBbUIxQyxRQUFRO1lBQ2pELE9BQU94QyxvQkFBb0JtRixtQkFDekIsUUFDQXROLFNBQ0FtSSxvQkFBb0IyRixlQUNsQnJZLGFBQ0F1VSxnQkFDQVUsZUFDQUMsU0FFRnhDLG9CQUFvQjZFLHFCQUFxQks7QUFFN0M7UUFFQSxJQUFJL08sV0FBVyxTQUFTK08sbUJBQW1CMUMsUUFBUTtZQUNqRCxNQUFNb0QsY0FDSjVGLG9CQUFvQjZFLHFCQUFxQks7WUFDM0MsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixVQUNBdE4sU0FDQW1JLG9CQUFvQjZGLGlCQUNsQnZZLGFBQ0F1VSxnQkFDQVUsZUFDQUMsU0FFRixFQUNFO2dCQUFFNU4sV0FBVy9IO2dCQUFvQmlLLE9BQU87a0JBQ3JDOE8sWUFBWTVkLElBQUksRUFBRzRNLHNCQUFXa0MsbUJBQU87Z0JBQ3RDbEM7Z0JBQ0FrQyxPQUFPQSxRQUFROztBQUl2QjtRQUVBLElBQUlYLFdBQVcsWUFBWStPLG1CQUFtQjFDLFFBQVE7WUFDcEQsTUFBTW9ELGNBQ0o1RixvQkFBb0I2RSxxQkFBcUJLO1lBQzNDLE9BQU9sRixvQkFBb0JtRixtQkFDekIsVUFDQXROLFNBQ0FtSSxvQkFBb0I4RixpQkFDbEJ4WSxhQUNBdVUsZ0JBQ0FVLGVBQ0FDLFNBRUZvRDtBQUVKO1FBR0EsTUFBTUcsbUJBQW1CYixlQUFlbFEsTUFBTSxLQUFLak4sT0FBTzBiO1FBQzFELE1BQU11QyxjQUNKRCxpQkFBaUJ6ZCxTQUFTLEtBQzFCeWQsaUJBQWlCRSxNQUFPckMsS0FBTUEsRUFBRTFYLFdBQVc7UUFDN0MsSUFBSThaLGVBQWVkLG1CQUFtQjFDLFFBQVE7WUFDNUMsTUFBTTBELG1CQUFtQkgsaUJBQ3RCL2QsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNLElBQ25Cak4sSUFBS3lFLFNBQUk7Z0JBQ1JBO2dCQUNBQyxhQUFhLEdBQUdEO2dCQUNoQmxFLFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBRVYsTUFBTXdaLFNBQVNKLGlCQUFpQi9kLElBQUs0YixLQUFNQSxFQUFFM08sTUFBTSxJQUFJOEwsS0FBSztZQUM1RCxNQUFNNkUsY0FDSjVGLG9CQUFvQjZFLHFCQUFxQks7WUFDM0MsSUFBSS9PLFdBQVcsT0FBTztnQkFDcEIsT0FBTzZKLG9CQUFvQm1GLG1CQUN6QixTQUFTZ0IsVUFDVHRPLFNBQ0FtSSxvQkFBb0IyRixlQUNsQnJZLGFBQ0F1VSxnQkFDQXFFLGtCQUNBaEIsaUJBRUZVO0FBRUo7WUFDQSxJQUFJelAsV0FBVyxPQUFPO2dCQUNwQixPQUFPNkosb0JBQW9CbUYsbUJBQ3pCLFdBQVdnQixVQUNYdE8sU0FDQW1JLG9CQUFvQjZGLGlCQUNsQnZZLGFBQ0F1VSxnQkFDQXFFLGtCQUNBaEIsaUJBRUYsRUFDRTtvQkFBRXRRLFdBQVcvSDtvQkFBb0JpSyxPQUFPO3NCQUNyQzhPLFlBQVk1ZCxJQUFJLEVBQUc0TSxzQkFBV2tDLG1CQUFPO29CQUN0Q2xDO29CQUNBa0MsT0FBT0EsUUFBUTs7QUFJdkI7WUFDQSxJQUFJWCxXQUFXLFVBQVU7Z0JBQ3ZCLE9BQU82SixvQkFBb0JtRixtQkFDekIsV0FBV2dCLFVBQ1h0TyxTQUNBbUksb0JBQW9COEYsaUJBQ2xCeFksYUFDQXVVLGdCQUNBcUUsa0JBQ0FoQixpQkFFRlU7QUFFSjtBQUNGO1FBRUEsSUFBSXpQLFdBQVcsU0FBUytPLG1CQUFtQiwyQkFBMkI7WUFDcEUsT0FBT2xGLG9CQUFvQm1GLG1CQUN6QixhQUNBdE4sU0FDQW1JLG9CQUFvQm9HLG9CQUFvQjlZLGFBQWF1VSxpQkFDckQsRUFDRTtnQkFBRWpOLFdBQVdvUSxNQUFNO2dCQUFrQmxPLE9BQU87ZUFDNUM7Z0JBQUVsQyxXQUFXb1EsTUFBTTtnQkFBZ0JsTyxPQUFPO2VBQzFDO2dCQUFFbEMsV0FBV3RHO2dCQUFxQndJLE9BQU87O0FBRy9DO1FBRUEsSUFBSVgsV0FBVyxTQUFTK08sbUJBQW1CLHlCQUF5QjtZQUNsRSxPQUFPbEYsb0JBQW9CbUYsbUJBQ3pCLGFBQ0F0TixTQUNBbUksb0JBQW9CcUcsNEJBQ2xCL1ksYUFDQXVVLGdCQUNBcUQsZ0JBQ0E5WixzQkFBc0JLLGNBRXhCdVUsb0JBQW9Cc0csd0JBQXdCcEI7QUFFaEQ7UUFFQSxNQUFNcUIsa0JBQTBDO1lBQzlDLGVBQWVuYixzQkFBc0JDO1lBQ3JDLHlCQUF5QkQsc0JBQXNCRTtZQUMvQyxlQUFlRixzQkFBc0JHO1lBQ3JDLGVBQWVILHNCQUFzQkk7WUFDckMseUJBQXlCSixzQkFBc0JLO1lBQy9DLHNCQUFzQkwsc0JBQXNCTTtZQUM1QyxrQkFBa0JOLHNCQUFzQk87WUFDeEMsZ0JBQWdCUCxzQkFBc0JRO1lBQ3RDLGdCQUFnQlIsc0JBQXNCUztZQUN0QyxnQkFBZ0JULHNCQUFzQlU7WUFDdEMsZ0JBQWdCVixzQkFBc0JXO1lBQ3RDLHFCQUFxQlgsc0JBQXNCWTtZQUMzQyxrQkFBa0JaLHNCQUFzQmE7O1FBRzFDLE1BQU11YSxlQUFlRCxnQkFBZ0JyQjtRQUNyQyxJQUFJc0IsZ0JBQWdCclEsV0FBVyxPQUFPO1lBQ3BDLE9BQU82SixvQkFBb0JtRixtQkFDekJuRixvQkFBb0J5RyxvQkFBb0J2QixpQkFDeENyTixTQUNBbUksb0JBQW9CcUcsNEJBQ2xCL1ksYUFDQXVVLGdCQUNBcUQsZ0JBQ0FzQixlQUVGeEcsb0JBQW9Cc0csd0JBQXdCcEI7QUFFaEQ7UUFFQSxJQUFJL08sV0FBVyxTQUFTK08sZUFBZWhaLFdBQVcsV0FBVztZQUMzRCxNQUFNd2EsY0FBY3hCLGVBQWVoYSxRQUFRLFlBQVksSUFBSThKLE1BQU0sS0FBSztZQUN0RSxPQUFPZ0wsb0JBQW9CbUYsbUJBQ3pCdUIsYUFDQTdPLFNBQ0FtSSxvQkFBb0JvQixtQkFDbEJzRixhQUNBeEIsZ0JBQ0EsT0FDQSxPQUVGbEYsb0JBQW9CMkcsbUJBQW1CekI7QUFFM0M7UUFFQSxNQUFNMEIsZUFBZTFCLGVBQWVsUSxNQUFNLEtBQUtqTixPQUFPMGI7UUFDdEQsTUFBTW9ELGdCQUFnQixJQUFJM0wsSUFBWSxFQUNwQyxVQUNBLFVBQ0Esa0JBQ0EsYUFDQSxjQUNBLFFBQ0EsUUFDQSxXQUNBLFNBQ0EsU0FDQSxTQUNBLFNBQ0EsY0FDQSxXQUNBLGFBQ0EsUUFDQTtRQUVGLElBQ0UwTCxhQUFhdGUsU0FBUyxNQUNyQjRjLGVBQWVoWixXQUFXLGNBQzFCZ1osZUFBZWhaLFdBQVcsa0JBQzFCMmEsY0FBY25LLElBQUlrSyxhQUFhLEtBQ2hDO1lBQ0EsTUFBTTdRLGdCQUFnQjZRLGFBQ25CN2UsT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQzNCbEUsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNLElBQ25Cak4sSUFBS3lFLFNBQUk7Z0JBQ1JBO2dCQUNBQyxhQUFhLEdBQUdEO2dCQUNoQmxFLFVBQVU7Z0JBQ1ZyQyxNQUFNeUc7O1lBR1YsT0FBT3FULG9CQUFvQm1GLG1CQUN6QnhQLFlBQ0FrQyxTQUNBLEtBQ0s5QixjQUFjL04sSUFBS3VFLEtBQU02SixTQUFTN0osS0FDckM4SixhQUFhO2dCQUFFQyxTQUFTLDJCQUEyQlg7Z0JBQ25EWSxjQUFjO2dCQUFFN0osYUFBYTtnQkFDN0I4SixxQkFBcUI7Z0JBQ25COUosYUFBYTtrQkFHakJzVCxvQkFBb0I2RSxxQkFBcUJLO0FBRTdDO1FBRUEsT0FBT3ZjO0FBQ1Q7SUFFUSx5QkFBT3djLENBQ2J4UCxZQUNBa0MsU0FDQXZMLFlBQ0FnWTtRQUVBLE9BQU87WUFBRTNPO1lBQVlrQztZQUFTdkw7WUFBWWdZOztBQUM1QztJQUVRLDBCQUFPbUMsQ0FBb0JyZDtRQUNqQyxNQUFNMGQsZUFBZTFkLEtBQUs0TCxNQUFNLEtBQUs7UUFDckMsT0FBTzhSO0FBQ1Q7SUFFUSw4QkFBT1IsQ0FDYmxkO1FBRUEsTUFBTTJkLFdBQVczZCxLQUFLNEwsTUFBTSxLQUFLak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXO1FBQzVELE1BQU00QixTQUFrRTtRQUN4RWlaLFNBQVNuUSxRQUFRLENBQUNvUSxLQUFLQztZQUNyQixNQUFNeGEsT0FBT3VhLElBQUk5YixRQUFRLEtBQUs7WUFDOUI0QyxPQUFPdUcsS0FBSztnQkFBRU8sV0FBV29RLE1BQU12WTtnQkFBY3FLLE9BQU9tUTs7O1FBRXRELElBQ0U3ZCxLQUFLOEMsV0FBVyxjQUNoQjlDLEtBQUs4QyxXQUFXLGtCQUNoQjlDLEtBQUs4QyxXQUFXLFlBQ2hCOUMsS0FBSzhDLFdBQVcsVUFDaEI7WUFDQTRCLE9BQU91RyxLQUFLO2dCQUFFTyxXQUFXdEc7Z0JBQXFCd0ksT0FBT2lRLFNBQVN6ZTs7QUFDaEU7UUFDQSxPQUFPd0Y7QUFDVDtJQUVRLHlCQUFPNlksQ0FDYnZkO1FBRUEsTUFBTTJkLFdBQVczZCxLQUFLNEwsTUFBTSxLQUFLak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXO1FBQzVELE1BQU00QixTQUFrRTtRQUN4RWlaLFNBQVNuUSxRQUFRLENBQUNvUSxLQUFLQztZQUNyQixNQUFNeGEsT0FBT3VhLElBQUk5YixRQUFRLEtBQUs7WUFDOUI0QyxPQUFPdUcsS0FBSztnQkFBRU8sV0FBV29RLE1BQU12WTtnQkFBY3FLLE9BQU9tUTs7O1FBRXRELElBQUk3ZCxLQUFLOEMsV0FBVyxXQUFXO1lBQzdCNEIsT0FBT3VHLEtBQUs7Z0JBQUVPLFdBQVd0RztnQkFBcUJ3SSxPQUFPaVEsU0FBU3plOztBQUNoRTtRQUNBLE9BQU93RjtBQUNUO0lBRVEsZ0NBQU9rVCxDQUEwQnJMO1FBQ3ZDLE9BQU8wQixlQUFlNlAsZ0JBRWpCalE7WUFFSCxNQUFNOUUsTUFBV3pCLEtBQUt5QixLQUFLRSxNQUFNNlU7WUFDakM7Z0JBQ0UsSUFBSS9VLEtBQUtBLElBQUlXLE1BQU0sMEJBQTBCNkM7Z0JBQzdDLE9BQU01SSxLQUFFQSxjQUFlMkQsS0FBS3lXLE9BQU8sSUFBSXhSLFlBQVksT0FBT3RELElBQ3hENlU7Z0JBRUYsTUFBTWxRLGNBQWN0RyxLQUFLc0csWUFBWWpLO2dCQUNyQyxNQUFNcWEsYUFBYXBILG9CQUFvQnFILG1CQUFtQnBRO2dCQUMxRCxJQUNFRCxhQUFhd0osZUFDTnhKLFlBQVl3SixLQUFLN0ssZ0JBQWdCLFlBQ3hDO29CQUNBLE9BQU9xQixZQUFZd0osS0FBSzdLLGVBQWV5UjtBQUN6QztnQkFDQSxXQUFXcFEsWUFBWXJCLGdCQUFnQixZQUFZO29CQUNqRCxPQUFPcUIsWUFBWXJCLGVBQWV5UjtBQUNwQztnQkFDQSxJQUFJcFEsYUFBYXhJLGdCQUFnQndJLFlBQVl4SSxVQUFVLFlBQVk7b0JBQ2pFLE9BQU93SSxZQUFZeEksTUFBTW1ILGVBQWV5UjtBQUMxQztnQkFDQSxXQUFXcFEsWUFBWUcsY0FBYyxZQUFZO29CQUMvQyxPQUFPSCxZQUFZRyxVQUFVeEIsZUFBZXlSLFlBQVlyYTtBQUMxRDtnQkFDQSxNQUFNLElBQUl3SSxjQUNSLHVCQUF1QkksNEJBQTRCcUIsYUFBYTdRLGFBQWFzRztBQUVqRixjQUFFLE9BQU8yRTtnQkFDUCxJQUFJZSxLQUFLQSxJQUFJaUQsTUFBTSxpQkFBaUJPLHNCQUFzQnZFO2dCQUMxRCxNQUFNNE8sb0JBQW9CN0ssYUFDeEIvRCxHQUNBLGlCQUFpQnVFO0FBRXJCO0FBQ0Y7QUFDRjtJQUVRLHVCQUFPMlIsQ0FBaUJyUTtRQUM5QixJQUFJQSxLQUFLM08sV0FBVyxHQUFHLE9BQU8yTztRQUM5QixNQUFNc1EsT0FBT3RRLEtBQUtBLEtBQUszTyxTQUFTO1FBQ2hDLElBQUlpZixlQUFlQSxTQUFTLGFBQWFqaEIsTUFBTUMsUUFBUWdoQixPQUFPO1lBQzVELE1BQU1DLFdBQVd2USxLQUFLd1E7WUFDdEIsTUFBTUMsZUFBZUYsU0FBUzlQLGNBQWMvTztZQUM1QyxNQUFNZ2YsV0FBV0gsU0FBUzlZLFVBQVUvRjtZQUNwQyxNQUFNaWYsWUFBWUosU0FBUzFZLFdBQVduRztZQUN0QyxLQUFLK2UsaUJBQWlCQyxhQUFhQyxXQUFXLE9BQU8zUTtZQUNyRCxNQUFNNFEsU0FBZ0I7WUFDdEIsSUFBSUgsY0FBY0csT0FBT3hULEtBQUttVCxTQUFTOVAsaUJBQ2xDLElBQUlpUSxZQUFZQyxXQUFXQyxPQUFPeFQsS0FBSzFMO1lBQzVDLElBQUlnZixVQUFVRSxPQUFPeFQsS0FBS21ULFNBQVM5WTtZQUNuQyxJQUFJa1osV0FBV0MsT0FBT3hULEtBQUttVCxTQUFTMVk7WUFDcEMsT0FBTyxLQUFJbUksU0FBUzRRO0FBQ3RCO1FBQ0EsT0FBTzVRO0FBQ1Q7SUFFUSx5QkFBT29RLENBQW1CcFE7UUFDaEMsTUFBTWhNLGFBQWErVSxvQkFBb0JzSCxpQkFBaUJyUTtRQUN4RCxJQUFJaE0sV0FBVzNDLFdBQVcsR0FBRyxPQUFPMkM7UUFFcEMsTUFBTXNjLE9BQU90YyxXQUFXQSxXQUFXM0MsU0FBUztRQUM1QyxLQUFLaWYsZUFBZUEsU0FBUyxZQUFZamhCLE1BQU1DLFFBQVFnaEIsT0FBTztZQUM1RCxPQUFPdGM7QUFDVDtRQUVBLE1BQU11YyxXQUFXRDtRQUNqQixNQUFNTyxpQkFDSk4sU0FBUzlQLGNBQWMvTyxhQUN2QjZlLFNBQVM5WSxVQUFVL0YsYUFDbkI2ZSxTQUFTMVksV0FBV25HLGFBQ3BCNmUsU0FBU3pZLGFBQWFwRztRQUV4QixLQUFLbWYsZ0JBQWdCO1lBQ25CN2MsV0FBV3djO1lBQ1gsT0FBT3hjO0FBQ1Q7UUFFQUEsV0FBV3djO1FBQ1gsSUFBSUQsU0FBUzlQLGNBQWMvTyxXQUFXc0MsV0FBV29KLEtBQUttVCxTQUFTOVA7UUFDL0QsSUFBSThQLFNBQVM5WSxVQUFVL0YsV0FBV3NDLFdBQVdvSixLQUFLbVQsU0FBUzlZO1FBQzNELElBQUk4WSxTQUFTMVksV0FBV25HLFdBQVdzQyxXQUFXb0osS0FBS21ULFNBQVMxWTtRQUM1RCxJQUFJMFksU0FBU3pZLGFBQWFwRyxXQUFXc0MsV0FBV29KLEtBQUttVCxTQUFTelk7UUFDOUQsT0FBTzlEO0FBQ1Q7SUFFUSw2QkFBT21hLENBQ2I5WCxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLFNBQ25DK0ksYUFBYTtZQUFFQyxTQUFTLGdCQUFnQnVMO1lBQ3hDa0csUUFBUTtZQUNOcmIsYUFBYSxlQUFlbVY7WUFDNUIzYixNQUFNNlUsT0FBT3hSLGNBQWNJLFFBQVEyRDtZQUVyQzBhLG1CQUFtQjtZQUNqQnRiLGFBQWEsR0FBR21WO1lBQ2hCb0csUUFBUTtnQkFBRXpKLE1BQU0wSixjQUFjNWE7O1lBRWhDNmEsc0JBQXNCO1lBQUV6YixhQUFhO1lBQ3JDMGIsK0JBQStCO1lBQzdCMWIsYUFBYTs7QUFHbkI7SUFFUSwyQkFBTzZZLENBQ2JqWSxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLFFBQVEsU0FDM0MrSSxhQUFhO1lBQUVDLFNBQVMsZ0JBQWdCdUw7WUFDeENrRyxRQUFRO1lBQ05yYixhQUFhLGVBQWVtVjtZQUM1Qm9HLFFBQVE7Z0JBQ04vaEIsTUFBTTtnQkFDTjhDLE9BQU87b0JBQUV3VixNQUFNMEosY0FBYzVhOzs7WUFHakMwYSxtQkFBbUI7WUFDakJ0YixhQUFhLEdBQUdtVjtZQUNoQm9HLFFBQVE7Z0JBQ04vaEIsTUFBTTtnQkFDTjhDLE9BQU87b0JBQUV3VixNQUFNMEosY0FBYzVhOzs7WUFHakM2YSxzQkFBc0I7WUFBRXpiLGFBQWE7WUFDckMwYiwrQkFBK0I7WUFDN0IxYixhQUFhOztBQUduQjtJQUVRLHlCQUFPOFksQ0FDYmxZLGFBQ0F1VTtRQUVBLE9BQU8sRUFDTDVZLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQytJLGFBQWE7WUFBRUMsU0FBUyxZQUFZdUw7WUFDcEM1TCxTQUFTO1lBQUV4SixNQUFNO1lBQU9sRSxVQUFVO1lBQU1yQyxNQUFNO1lBQzlDcVEsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEsMkJBQU80RCxDQUNiblksYUFDQXVVLGdCQUNBVTtRQUVBLE9BQU8sRUFDTHRaLHNCQUFzQnFFLGFBQWEsT0FBTyxTQUMxQ2xCLG1CQUFtQm1XLGdCQUNuQmxNLGFBQWE7WUFDWEMsU0FBUyxvQkFBb0J1TDtZQUUvQmtHLFFBQVE7WUFDTnJiLGFBQWEsNkNBQTZDbVY7WUFDMURvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ05zWSxNQUFNMEosY0FBY25OLE9BQU94UixjQUFjTyxRQUFRd0Q7O1lBR3JEaUosY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7WUFFckJzRyxzQkFBc0I7WUFBRXpiLGFBQWE7O0FBRXpDO0lBRVEsMkJBQU9nWixDQUNicFksYUFDQXVVLGdCQUNBVTtRQUVBLE9BQU8sRUFDTHRaLHNCQUFzQnFFLGFBQWEsVUFBVSxTQUM3Q2xCLG1CQUFtQm1XLGdCQUNuQmxNLGFBQWE7WUFBRUMsU0FBUyxVQUFVdUw7WUFDbEM1TCxTQUFTO1lBQUV4SixNQUFNO1lBQU9sRSxVQUFVO1lBQU1yQyxNQUFNO1lBQzlDcVEsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUNOL2hCLE1BQU07Z0JBQ044QyxPQUFPO29CQUFFd1YsTUFBTTBKLGNBQWM1YTs7O1lBR2pDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEscUJBQU84RCxDQUNiclksYUFDQXVVLGdCQUNBVSxlQUNBQztRQUVBLE9BQU8sRUFDTHZaLHNCQUFzQnFFLGFBQWEsT0FBT2tWLFNBQzFDcFcsbUJBQW1CbVcsZ0JBQ25CbE0sYUFBYTtZQUFFQyxTQUFTLGNBQWN1TDtZQUN0Q3RMLGNBQWM7WUFDWjdKLGFBQWEsR0FBR21WO1lBQ2hCb0csUUFBUTtnQkFBRXpKLE1BQU0wSixjQUFjNWE7O1lBRWhDK2Esb0JBQW9CO1lBQ2xCM2IsYUFBYSxNQUFNbVY7O0FBR3pCO0lBRVEsdUJBQU9nRSxDQUNidlksYUFDQXVVLGdCQUNBVSxlQUNBQztRQUVBLE9BQU8sRUFDTHZaLHNCQUFzQnFFLGFBQWEsT0FBT2tWLFNBQzFDcFcsbUJBQW1CbVcsZ0JBQ25CbE0sYUFBYTtZQUNYQyxTQUFTLHVCQUF1QnVMO1lBRWxDa0csUUFBUTtZQUNOcmIsYUFBYSwrQ0FBK0NtVjtZQUM1RDNiLE1BQU02VSxPQUFPeFIsY0FBY08sUUFBUXdEO1lBRXJDaUosY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUFFekosTUFBTTBKLGNBQWM1YTs7WUFFaEMrYSxvQkFBb0I7WUFDbEIzYixhQUFhLE1BQU1tVjtZQUVyQnNHLHNCQUFzQjtZQUFFemIsYUFBYTs7QUFFekM7SUFFUSx1QkFBT29aLENBQ2J4WSxhQUNBdVUsZ0JBQ0FVLGVBQ0FDO1FBRUEsT0FBTyxFQUNMdlosc0JBQXNCcUUsYUFBYSxVQUFVa1YsU0FDN0NwVyxtQkFBbUJtVyxnQkFDbkJsTSxhQUFhO1lBQUVDLFNBQVMsWUFBWXVMO1lBQ3BDdEwsY0FBYztZQUNaN0osYUFBYSxHQUFHbVY7WUFDaEJvRyxRQUFRO2dCQUFFekosTUFBTTBKLGNBQWM1YTs7WUFFaEMrYSxvQkFBb0I7WUFDbEIzYixhQUFhLE1BQU1tVjs7QUFHekI7SUFFUSwwQkFBT3VFLENBQ2I5WSxhQUNBdVU7UUFFQSxPQUFPLEVBQ0w1WSxzQkFBc0JxRSxhQUFhLE9BQU8sNEJBQzFDK0ksYUFBYTtZQUNYQyxTQUFTLG9DQUFvQ3VMO1lBRS9DekwsU0FBUztZQUNQM0osTUFBTTtZQUNOQyxhQUFhO1lBRWYwSixTQUFTO1lBQ1AzSixNQUFNO1lBQ05DLGFBQ0U7WUFFSnVKLFNBQVM7WUFDUHhKLE1BQU07WUFDTmxFLFVBQVU7WUFDVkcsTUFBTXdOO1lBQ054SixhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWZ1SixTQUFTO1lBQ1B4SixNQUFNO1lBQ05sRSxVQUFVO1lBQ1ZtRSxhQUFhO1lBRWY2SixjQUFjO1lBQUU3SixhQUFhLEdBQUdtVjtZQUNoQ3dHLG9CQUFvQjtZQUNsQjNiLGFBQWEsTUFBTW1WOztBQUd6QjtJQUVRLGtDQUFPd0UsQ0FDYi9ZLGFBQ0F1VSxnQkFDQXpZLE1BQ0FvZDtRQUVBLE1BQU04QixPQUE2RCxFQUNqRXJmLHNCQUFzQnFFLGFBQWEsT0FBT2xFLE9BQzFDaU4sYUFBYTtZQUFFQyxTQUFTLFlBQVl1TDtZQUNwQ3RMLGNBQWM7WUFDWjdKLGFBQWEsR0FBR21WOztRQUlwQixNQUFNa0YsV0FBVzNkLEtBQUs0TCxNQUFNLEtBQUtqTixPQUFRNmIsS0FBTUEsRUFBRTFYLFdBQVc7UUFDNUQ2YSxTQUFTblEsUUFBU29RO1lBQ2hCLE1BQU12YSxPQUFPdWEsSUFBSTliLFFBQVEsS0FBSztZQUM5Qm9kLEtBQUtqVSxLQUFLK0IsU0FBUztnQkFBRTNKO2dCQUFNQyxhQUFhLE9BQU9EOzs7UUFHakQsSUFDRXJELEtBQUs4QyxXQUFXLGNBQ2hCOUMsS0FBSzhDLFdBQVcsa0JBQ2hCOUMsS0FBSzhDLFdBQVcsWUFDaEI5QyxLQUFLOEMsV0FBVyxVQUNoQjtZQUNBb2MsS0FBS2pVLEtBQ0g0QixTQUFTO2dCQUNQeEosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZHLE1BQU13TjtnQkFDTnhKLGFBQWE7O0FBR25CO1FBQ0EsSUFBSXRELEtBQUs4QyxXQUFXLGtCQUFrQjlDLEtBQUs4QyxXQUFXLFVBQVU7WUFDOURvYyxLQUFLalUsS0FDSDRCLFNBQVM7Z0JBQUV4SixNQUFNO2dCQUFTbEUsVUFBVTtnQkFBT21FLGFBQWE7Z0JBQ3hEdUosU0FBUztnQkFDUHhKLE1BQU07Z0JBQ05sRSxVQUFVO2dCQUNWbUUsYUFBYTtnQkFFZnVKLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7O0FBR25CO1FBRUEsSUFBSXRELEtBQUs4QyxXQUFXLGlCQUFpQjlDLEtBQUs4QyxXQUFXLFlBQVk7WUFDL0RvYyxLQUFLalUsS0FDSGdVLG9CQUFvQjtnQkFDbEIzYixhQUFhLE1BQU1tVjs7QUFHekI7UUFFQSxJQUNFMkUsaUJBQWlCcGIsc0JBQXNCTyxZQUN2QzZhLGlCQUFpQnBiLHNCQUFzQlUsVUFDdkMwYSxpQkFBaUJwYixzQkFBc0JXLFFBQ3ZDO1lBQ0F1YyxLQUFLalUsS0FDSGtDLGNBQWM7Z0JBQ1o3SixhQUFhLGNBQWNtVjtnQkFDM0IzYixNQUFNMEk7O0FBR1o7UUFDQSxJQUFJNFgsaUJBQWlCcGIsc0JBQXNCWSxhQUFhO1lBQ3REc2MsS0FBS2pVLEtBQ0hrQyxjQUFjO2dCQUNaN0osYUFBYSx1QkFBdUJtVjtnQkFDcEMzYixNQUFNLEVBQUN5Rzs7QUFHYjtRQUVBLE9BQU8yYjtBQUNUO0lBRVEseUJBQU9sSCxDQUNiekwsWUFDQVosV0FDQWEsVUFDQUMscUJBQThCO1FBRTlCLE1BQU1mLG9CQUFxQnZJLEtBQ3pCQSxFQUNHeUksTUFBTSxLQUNOak4sT0FBUTZiLEtBQU1BLEVBQUUxWCxXQUFXLE1BQzNCbEUsSUFBSzRiLEtBQU1BLEVBQUUzTyxNQUFNO1FBRXhCLE1BQU1jLGdCQUFnQmpCLGtCQUFrQkMsV0FBVy9NLElBQUt5RSxTQUFJO1lBQzFEQTtZQUNBQyxhQUFhLEdBQUdEO1lBQ2hCbEUsVUFBVTtZQUNWckMsTUFBTXlHOztRQUdSLE1BQU1MLGFBQW1FLEtBQ3BFeUosY0FBYy9OLElBQUt1RSxLQUFNNkosU0FBUzdKLEtBQ3JDOEosYUFBYTtZQUFFQyxTQUFTLDJCQUEyQlg7WUFDbkRZLGNBQWM7WUFBRTdKLGFBQWE7WUFDN0I4SixxQkFBcUI7WUFDbkI5SixhQUFhOztRQUlqQixJQUFJa0osYUFBYSxTQUFTQyxvQkFBb0I7WUFDNUN2SixXQUFXK0gsS0FDVDRCLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVkcsTUFBTXdOO2dCQUNOeEosYUFBYTtnQkFFZnVKLFNBQVM7Z0JBQ1B4SixNQUFNO2dCQUNObEUsVUFBVTtnQkFDVm1FLGFBQWE7Z0JBRWZ1SixTQUFTO2dCQUNQeEosTUFBTTtnQkFDTmxFLFVBQVU7Z0JBQ1ZtRSxhQUFhOztBQUduQjtRQUVBLE9BQU9KO0FBQ1Q7OztBQ3h0Q0ksU0FBVWljLGFBQWE5VTs7SUFFM0IsSUFBTStVLG1CQUFOLE1BQU1BOzs7OztZQUNZOVgsS0FBQXlCLE1BQU1DLFFBQVFDLElBQUlvVyxtQkFBaUJoYyxNQUFNNEYsSUFBSW9CO0FBQVM7UUFFdEUsMEJBQU9pVixDQUNMQztZQUVBLE9BQU9BLE9BQU8zZ0IsSUFBS2dNLFVBQUs7Z0JBQ3RCNEUsU0FBUyxHQUFHNUUsTUFBTXZIO2dCQUNsQm1jLFlBQVksTUFBTTFSLGFBQWF3RCxTQUFTMUc7O0FBRTVDO1FBRUEsZ0JBQU82VSxDQUNMN1UsT0FDQThVO1lBRUEsTUFBTWxPLFdBQVdrTyxXQUFXOVUsTUFBTXZIO1lBQ2xDLE1BQU1wSCxlQUNHdVYsYUFBYSxjQUNoQkEsV0FDQWpMLFNBQVN3QixJQUFJNkMsT0FBT3JFLFNBQVMzSyxJQUFJc0s7WUFFdkMsV0FBV2pLLFVBQVUsYUFBYSxPQUFPO1lBQ3pDLElBQUlBLFVBQVUsTUFBTSxPQUFPO1lBQzNCLElBQUlpQixNQUFNQyxRQUFRbEIsUUFBUSxPQUFPQSxNQUFNTSxTQUFTOE47WUFDaEQsT0FBTztBQUNUO1FBRUEsY0FBT2lGLENBQ0xqRixTQUNBNUssVUFBdUM7WUFFdkMsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtnSTtZQUM5QnZHLElBQUk2USxLQUFLO1lBRVQsTUFBTStGLGdCQUFnQnhWLFFBQVFvVixPQUFPbFYsU0FBUzFMLE9BQVFpTSxTQUNwRHRELEtBQUttWSxVQUFVN1UsT0FBT25MLFFBQVFtZ0I7WUFNaEMsS0FBSyxNQUFNaFYsU0FBUytVLGVBQWU3UixhQUFhd0QsU0FBUzFHO1lBRXpELElBQUlpVixnQkFBNEI7WUFDaEMsSUFBSXBnQixRQUFRcWdCLGNBQWM7Z0JBQ3hCL1csSUFBSTZRLEtBQUs7Z0JBQ1RpRyxnQkFBZ0J2WSxLQUFLZ1ksb0JBQW9CSztnQkFDekM1VyxJQUFJNlEsS0FDRiw0QkFBNEJpRyxjQUFjM2dCO0FBRTlDO1lBRUEsTUFBTW9aLGlCQUF3RCxDQUFBO1lBQzlELElBQUk3WSxRQUFRc2dCLGlCQUFpQixPQUFPO2dCQUNsQ3pILGVBQWUwSCx1QkFBdUI7QUFDeEM7WUFFQSxNQUFNQyxjQUFjTixjQUFjL2dCLElBQUtnTSxTQUNyQ2dNLG9CQUFvQndCLE9BQU94TixPQUFPbkwsUUFBUWdILGtCQUFrQjZSO1lBRTlEdlAsSUFBSTZRLEtBQUssYUFBYXFHLFlBQVkvZ0I7WUFFbEMsT0FBTztnQkFDTDJRLFFBQVF3UDtnQkFDUlk7Z0JBQ0ExUSxXQUFXLEtBQ05zUTs7QUFHVDs7SUF0RUlULG1CQUFnQkMscUJBQUFuWCxXQUFBLEVBRHJCNkgsT0FBTyxDQUFBLE1BQ0ZxUDtJQXdFTi9oQixPQUFPQyxPQUFPOGhCLGtCQUFrQixRQUFRO1FBQ3RDbmpCLE9BQU8sY0FBY29POztJQUV2QixPQUFPK1U7QUFDVDs7QUMzRUFjLFdBQVdqWCxJQUFJa1gsZ0JBQWdCQyxZQUM1QkMsT0FBTztJQUNON1UsV0FBVyxTQUFTOFUsZUFDbEJDLFVBQ0FDO1FBRUFBLE1BQ0VBLGVBQ1FELGFBQWEsV0FDakJsakIsT0FBT0MsT0FDTGlqQixVQUNBRSw0QkFFRkE7UUFDTixPQUFPdFksV0FBVztZQUNoQkMsT0FBT29ZLElBQUlFLFlBQVlyWSxNQUFNc1ksVUFBVXRZLE1BQU1DO1lBQzdDc1ksU0FBU0osSUFBSUUsWUFBWW5oQixZQUFZOztBQUV6QztHQUVEOEI7O0FBRUg2ZSxXQUFXalgsSUFBSWtYLGdCQUFnQlUsUUFDNUJSLE9BQU87SUFDTjdVLFdBQVcsU0FBU3NWLFdBQ2xCUCxVQUVBQztRQUVBLE9BQU8sU0FBU08sZ0JBQ2RwbEIsUUFDQVUsYUFDQVI7WUFFQSxPQUFPMk0sT0FBTytYLFlBQWE1a0IsT0FBcEI2TSxDQUNMN00sUUFDQVUsYUFDQVI7QUFFSjtBQUNGO0dBRUR3Rjs7QUFFSDZlLFdBQVdqWCxJQUFJeUssZUFBZUMsVUFDM0IwTSxPQUNDN2dCLFlBQVk7SUFDVkwsVUFBVTtJQUdia0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWVzTixLQUMzQlgsT0FBTztJQUNON1UsV0FBVyxTQUFTeVYsT0FBT0M7UUFDekIsT0FBTzFoQixZQUFZO1lBQUUyaEIsU0FBU0Q7WUFBSy9oQixVQUFVOztBQUMvQztHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWUwTixLQUMzQmYsT0FBTztJQUNON1UsV0FBVyxTQUFTNlYsT0FBT0M7UUFDekIsT0FBTzloQixZQUFZO1lBQUUraEIsU0FBU0Q7WUFBS25pQixVQUFVOztBQUMvQztHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWU4TixZQUMzQm5CLE9BQU87SUFDTjdVLFdBQVcsU0FBU2lXLGFBQWFQO1FBQy9CLE9BQU8xaEIsWUFBWTtZQUFFa2lCLFdBQVdSO1lBQUsvaEIsVUFBVTs7QUFDakQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUl5SyxlQUFlaU8sWUFDM0J0QixPQUFPO0lBQ043VSxXQUFXLFNBQVNvVyxhQUFhTjtRQUMvQixPQUFPOWhCLFlBQVk7WUFBRXFpQixXQUFXUDtZQUFLbmlCLFVBQVU7O0FBQ2pEO0dBRURrQzs7QUFFSDZlLFdBQVdqWCxJQUFJeUssZUFBZW9PLE1BQzNCekIsT0FBTztJQUNON1UsV0FBVyxTQUFTdVcsUUFDbEJqbEI7UUFLQSxPQUFPLENBQUNuQixRQUFnQjBYO1lBQ3RCdlcsT0FBT0ksTUFBTUMsUUFBUUwsUUFBUUEsS0FBSyxLQUFLQTtZQUN2QyxXQUFXQSxTQUFTLGVBQWVBLEtBQUt1RyxNQUN0Q3ZHLE9BQVFBO1lBQ1YsT0FBTzBDLFlBQVk7Z0JBQ2pCMUMsTUFBTUE7Z0JBQ05xQyxVQUFVO2NBRkxLLENBR0o3RCxRQUFRMFg7O0FBRWY7R0FFRGhTOztBQXNCSDZlLFdBQVdqWCxJQUFJeUssZUFBZXNPLE1BQzNCM0IsT0FBTztJQUVON1UsV0FBVyxTQUFTeVcsUUFBUUM7UUFDMUIsT0FBTzFpQixZQUFZO1lBQ2pCMUMsTUFBTXlHO1lBQ04yZSxRQUFRO1lBQ1IvaUIsVUFBVTs7QUFHZDtHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSXlLLGVBQWV5TyxNQUMzQjlCLE9BQU87SUFDTjdVLFdBQVcsU0FBUzRXLFVBQVUzaUI7UUFDNUIsTUFBTUosT0FBT25DLE1BQU1DLFFBQVFzQyxXQUFXQSxVQUFVcEMsT0FBT3FCLE9BQU9lO1FBQzlELE9BQU9ELFlBQVk7WUFDakJGLE1BQU1EO1lBQ05GLFVBQVU7O0FBRWQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUl5SyxlQUFlMk8sU0FDM0JoQyxPQUFPO0lBQ043VSxXQUFXLFNBQVM4VyxXQUFXQztRQUM3QixPQUFPL2lCLFlBQVk7WUFDakJnakIsZ0JBQWdCRCxRQUFRLFdBQVdBLE1BQU1BLElBQUlFO1lBQzdDdGpCLFVBQVU7O0FBRWQ7R0FFRGtDOztBQUVINmUsV0FBV2pYLElBQUlpTyxnQkFBZ0J3TCxRQUM1QnJDLE9BQU87SUFDTjdVLFdBQVcsU0FBU21YLFVBQVV0ZjtRQUM1QixPQUFPN0QsWUFBWTtZQUNqQjZELE1BQU1BO1lBQ05sRSxVQUFVOztBQUVkO0dBRURrQzs7QUFFSDZlLFdBQVdqWCxJQUFJMlosZUFBZUMsYUFDM0J4QyxPQUFPO0lBQ043VSxXQUFXLFNBQVNzWCxlQUFleGY7UUFDakMsT0FBTzlELFlBQVk7WUFDakI4RCxhQUFhQTtZQUNibkUsVUFBVTs7QUFFZDtHQUVEa0M7O0FBRUg2ZSxXQUFXalgsSUFBSWlPLGdCQUFnQjZMLE1BQU0xQyxPQUFPO0lBQUU3VSxXQUFXYjtHQUFRdEo7O0FDbk0zRCxNQUFPMmhCLGtCQUFrQkM7SUFDN0IsV0FBQWxtQixDQUFZbW1CO1FBQ1YvYixNQUFNK2IsS0FBS0YsVUFBVTNmO0FBQ3ZCOzs7QUNISSxNQUFPOGYsNEJBQTRCalg7SUFDdkMsV0FBQW5QLENBQVltbUI7UUFDVi9iLE1BQU1nYyxvQkFBb0I5ZixNQUFNNmYsS0FBTTtBQUN4Qzs7O0FDUUssSUFBTUUsdUJBQU4sTUFBTUE7SUFDWCxNQUFNQyxXQUFrQkM7UUFDdEIsTUFBTTNmLE1BQU0yZixLQUFLemY7UUFDakIsTUFBTTJNLFdBQVc3TSxJQUFJOE07UUFDckIsTUFBTTdNLFVBQVVELElBQUlHO1FBRXBCLE1BQU15ZixlQUFlQyxrQkFBa0JDLFFBQVE7UUFDL0MsSUFBSUM7UUFFSixJQUNFTCxxQkFBcUJNLHFCQUNyQk4scUJBQXFCNVgsa0JBQ3JCO1lBQ0E0WCxZQUFZLElBQUlPLHVCQUF1QlAsVUFBVWhYO1lBQ2pEcVgsYUFBY0wsVUFBcUNRO0FBQ3JELGVBQU8sTUFBTVIscUJBQXFCblgsWUFBWTtZQUM1QyxJQUFJbVgsVUFBa0JTLFdBQVcsS0FBSTtnQkFDbkNULFlBQVksSUFBSUYsb0JBQW9CRSxVQUFVaFg7QUFDaEQsbUJBQUs7Z0JBQ0hnWCxZQUFZLElBQUlsWCxjQUFja1gsVUFBVWhYO0FBQzFDO0FBQ0Y7UUFFQW1FLFNBQVNzVCxPQUFRVCxVQUF3QlUsUUFBUUwsWUFBWU0sS0FBSztZQUNoRUYsUUFBU1QsVUFBd0JVLFFBQVFMO1lBQ3pDMVgsT0FBT3VYLGVBQWVGLFVBQVVoZ0IsT0FBT2dnQixVQUFVaFg7WUFDakQ0WCxZQUFXLElBQUlDLE1BQU9DO1lBQ3RCbmtCLE1BQU00RCxRQUFRME07WUFDZHZELFFBQVFuSixRQUFRbUo7O0FBRXBCOzs7QUE5QldxVyx1QkFBb0JsYixXQUFBLEVBRGhDa2MsV0FDWWhCOztTQ1RHaUI7SUFDZCxPQUFPQyxXQUFXLElBQUlsQjtBQUN4Qjs7U0FFZ0JtQjtJQUNkLE9BQU92WixnQkFBZ0J1RjtBQUN6Qjs7QUNvQk8sTUFBTWlVLHVCQUF1QztJQUNsREMsT0FBTztJQUNQbmhCLGFBQWE7SUFDYm9oQixTQUFTO0lBQ1Qxa0IsTUFBTTtJQUNOMmtCLGlCQUFpQjtJQUNqQkMsb0JBQW9CO0lBQ3BCckwsTUFBTTtRQUNKemMsTUFBTTtRQUNOK25CLFFBQVE7UUFDUkMsY0FBYztRQUNkemhCLE1BQU07UUFDTkMsYUFBYTtRQUNieWhCLElBQUk7O0lBRU5DLHNCQUFzQjtJQUN0QkMsZUFBZTs7O01DaENKQztJQVVYLFdBQUFub0IsQ0FBWTBDO1FBQ1Y2SCxLQUFLN0gsVUFBVTtlQUNWQTs7QUFFUDtJQUVRLFNBQUEwbEI7UUFDTixJQUFJQyxNQUFNO1FBQ1YsSUFBSTlkLEtBQUs3SCxRQUFRNGxCLGdCQUFnQjtZQUMvQixNQUFNQyxNQUFNaGUsS0FBS2llLElBQUlqZSxLQUFLN0gsUUFBUTRsQjtZQUNsQ0QsT0FBTyx5REFBeURFO0FBQ2xFO1FBQ0EsT0FDRUYsTUFDQSwwR0FFNEM5ZCxLQUFLN0gsUUFBUXdsQixpQkFBaUJULHFCQUFxQlM7QUFHbkc7SUFFQSxnQkFBQU87UUFDRSxNQUFNQyxVQUErQixDQUFBO1FBQ3JDLElBQUluZSxLQUFLN0gsUUFBUWltQixhQUFhO1lBQzVCRCxRQUFRLG1CQUFtQm5lLEtBQUtpZSxJQUFJamUsS0FBSzdILFFBQVFpbUIsYUFBYTtBQUNoRTtRQUVBLE9BQU87WUFDTEMsaUJBQWlCcmUsS0FBSzdILFFBQVFnbEI7ZUFDM0JnQjtZQUNIRyxXQUFXdGUsS0FBSzZkO1lBQ2hCVSxnQkFBZ0I7Z0JBQ2RiLHNCQUFzQjFkLEtBQUs3SCxRQUFRdWxCOzs7QUFHekM7SUFFQSxHQUFBTyxDQUFJTyxNQUFjUixNQUFlO1FBQy9CLE1BQU1TLFdBQVcvbEIsS0FBSzJYLEtBQUtyUSxLQUFLN0gsUUFBUXVtQixjQUFjLElBQUlGO1FBQzFELE1BQU1QLE1BQU1VLGFBQWFGLFVBQVU7WUFBRUcsVUFBVTs7UUFDL0MsT0FBT1osTUFBTSwyQkFBMkJDLE1BQU1BO0FBQ2hEOzs7TUMzRFdZO0lBQ1gsV0FBQXBwQixDQUNtQnFwQixLQUNBM21CO1FBREE2SCxLQUFBOGUsTUFBQUE7UUFDQTllLEtBQUE3SCxVQUFBQTtBQUNoQjtJQUVLLGNBQUE0bUI7UUFDTixNQUFNL2lCLGNBQWNnRSxLQUFLN0gsUUFBUU8sT0FDN0JzSCxLQUFLN0gsUUFBUTZELGNBQ2IsS0FDQSxvQkFBb0JnRSxLQUFLN0gsUUFBUTZtQiw4Q0FDakMsWUFBWWhmLEtBQUs3SCxRQUFROG1CLDJDQUN6QmpmLEtBQUs3SCxRQUFRNkQ7UUFFakIsTUFBTW9ELFVBQVMsSUFBSThmLGlCQUNoQkMsU0FBU25mLEtBQUs3SCxRQUFRZ2xCLE9BQ3RCaUMsZUFBZXBqQixhQUNmcWpCLFdBQVdyZixLQUFLN0gsUUFBUWlsQixXQUFXLFNBQ25Da0MsY0FBY3RmLEtBQUs3SCxRQUFROFosUUFBUWlMLHFCQUFxQmpMLE1BQ3hEL0M7UUFFSCxPQUFPcVEsY0FBY1IsZUFBZS9lLEtBQUs4ZSxLQUFLMWYsUUFBUTtZQUNwRHVPLGFBQWEzTixLQUFLN0gsUUFBUXdWLGVBQWU7O0FBRTdDO0lBRVEsb0JBQUE2UixDQUNOOW1CLE1BQ0ErbUIsYUFDQUM7UUFFQSxLQUFLaG5CLE1BQU07UUFFWCxNQUFNaW5CLGNBQWMzZixLQUFLOGUsSUFBSWM7UUFDN0JsbkIsT0FBT0EsS0FBSzhDLFdBQVcsT0FBTzlDLE9BQU8sSUFBSUE7UUFDekNpbkIsWUFBWWxmLElBQUkvSCxNQUFNLENBQUNtbkIsTUFBVzlXO1lBQ2hDNFcsWUFBWUcsTUFBTS9XLEtBQUsyVyxlQUFlLEtBQUs7Z0JBQ3pDLGdCQUFnQkQ7OztBQUd0QjtJQUVPLFlBQUFNO1FBQ0wsTUFBTUMsV0FBV2hnQixLQUFLK2U7UUFDdEIsTUFBTWtCLFlBQVksSUFBSXJDLGdCQUFnQjtZQUNwQ1QsT0FBT25kLEtBQUs3SCxRQUFRZ2xCO1lBQ3BCemtCLE1BQU1zSCxLQUFLN0gsUUFBUU8sUUFBUXdrQixxQkFBcUJ4a0I7WUFDaERnbEIsc0JBQXNCMWQsS0FBSzdILFFBQVF1bEIsd0JBQXdCO1lBQzNEZ0IsWUFBWTFlLEtBQUs3SCxRQUFRdW1CO1lBQ3pCTixhQUFhcGUsS0FBSzdILFFBQVFrbEI7WUFDMUJVLGdCQUFnQi9kLEtBQUs3SCxRQUFRbWxCO1lBQzdCSyxlQUFlM2QsS0FBSzdILFFBQVF3bEI7O1FBRTlCNEIsY0FBY1csTUFDWmxnQixLQUFLN0gsUUFBUU8sUUFBUXdrQixxQkFBcUJ4a0IsTUFDMUNzSCxLQUFLOGUsS0FDTGtCLFVBQ0E7ZUFDS0MsVUFBVS9CO1lBQ2JpQyxpQkFBaUJuZ0IsS0FBSzdILFFBQVE2bUIsa0JBQzFCLEdBQUdoZixLQUFLN0gsUUFBUTZtQixvQkFDaEIvbUI7WUFDSm1vQixpQkFBaUJwZ0IsS0FBSzdILFFBQVE4bUIsa0JBQzFCLEdBQUdqZixLQUFLN0gsUUFBUThtQixvQkFDaEJobkI7O1FBSVIrSCxLQUFLd2YscUJBQ0h4ZixLQUFLN0gsUUFBUTZtQixpQkFDYixvQkFDQSxNQUFNZ0I7UUFHUmhnQixLQUFLd2YscUJBQ0h4ZixLQUFLN0gsUUFBUThtQixpQkFDYixzQkFDQSxNQUFNb0IsS0FBS3RaLFVBQVVpWjtBQUV6Qjs7O01DZ0JXTTtJQWNILGlCQUFXM2Q7UUFDakIsS0FBSzNDLEtBQUt1Z0IsU0FBUztZQUVqQnZnQixLQUFLdWdCLFVBQVUsSUFBSUMsT0FBTztBQUM1QjtRQUNBLE9BQU94Z0IsS0FBS3VnQjtBQUNkO0lBYUEsaUJBQU9FLENBQVczQjtRQUNoQjllLEtBQUs4ZSxNQUFNQTtRQUNYLE9BQU85ZTtBQUNUO0lBY0EsbUJBQU8wZ0IsQ0FBYUM7UUFDbEIzZ0IsS0FBS3VnQixVQUFVSSxnQkFBZ0IsSUFBSUgsT0FBTztRQUMxQ3hnQixLQUFLOGUsSUFBSThCLFVBQVU1Z0IsS0FBS3VnQjtRQUN4QixPQUFPdmdCO0FBQ1Q7SUFnQkEsaUJBQU82Z0IsQ0FDTEMsVUFBMEIsSUFDMUJDLGVBQXlCLEVBQUMsT0FBTyxRQUFRLE9BQU87UUFFaEQsTUFBTUMsaUJBQ0pGLFlBQVksTUFBTSxNQUFNQSxRQUFReHBCLElBQUsycEIsS0FBTUEsRUFBRTdRLE9BQU9vRDtRQUV0RCxNQUFNME4sY0FBMkI7WUFDL0JDLFFBQVEsQ0FBQ0EsUUFBUUM7Z0JBRWYsS0FBS0QsUUFBUSxPQUFPQyxTQUFTLE1BQU07Z0JBRW5DLElBQ0VKLG1CQUFtQixPQUNsQnByQixNQUFNQyxRQUFRbXJCLG1CQUNiQSxlQUFlL3JCLFNBQVNrc0IsT0FBTzNOLGdCQUNqQztvQkFDQSxPQUFPNE4sU0FBUyxNQUFNO0FBQ3hCO2dCQUVBQSxTQUFTLElBQUkxRixVQUFVLFVBQVV5Rjs7WUFFbkNFLGFBQWE7WUFDYkMsU0FBU1AsYUFBYTFRLEtBQUs7O1FBRzdCclEsS0FBSzhlLElBQUkrQixXQUFXSztRQUNwQixPQUFPbGhCO0FBQ1Q7SUFjQSxnQkFBT3VoQixDQUFVcHBCO1FBQ2Y7WUFFRSxNQUFNcXBCLFNBQVNDLFFBQVE7WUFDdkJ6aEIsS0FBSzhlLElBQUk0QyxJQUFJRixPQUFPcnBCO1lBQ3BCNkgsS0FBSzJDLE9BQU9sQixJQUFJO0FBQ2xCLFVBQUU7WUFDQXpCLEtBQUsyQyxPQUFPZ2YsS0FBSztBQUNuQjtRQUVBLE9BQU8zaEI7QUFDVDtJQWNBLG1CQUFPK2YsQ0FBYTVuQjtRQUNsQixNQUFNeXBCLFVBQVUsSUFBSS9DLGVBQWU3ZSxLQUFLOGUsS0FBSztZQUMzQzNCLE9BQU9obEIsUUFBUWdsQjtZQUNmbmhCLGFBQWE3RCxRQUFRNkQ7WUFDckJvaEIsU0FBU2psQixRQUFRaWxCO1lBQ2pCMWtCLE1BQU1QLFFBQVFPLFFBQVE7WUFDdEJnbEIsc0JBQXNCdmxCLFFBQVF1bEIsd0JBQXdCO1lBQ3REZ0IsWUFBWXZtQixRQUFRdW1CO1lBQ3BCckIsaUJBQWlCbGxCLFFBQVFpbUI7WUFDekJkLG9CQUFvQm5sQixRQUFRNGxCO1lBQzVCSixlQUFleGxCLFFBQVF3bEI7WUFDdkJxQixpQkFBaUI3bUIsUUFBUTZtQjtZQUN6QkMsaUJBQWlCOW1CLFFBQVE4bUI7O1FBRTNCMkMsUUFBUTdCO1FBQ1IsT0FBTy9mO0FBQ1Q7SUFjQSxxQkFBTzZoQixJQUFrQkM7UUFDdkIsSUFBSUEsTUFBTWxxQixTQUFTLEdBQUdvSSxLQUFLOGUsSUFBSStDLGtCQUFrQkM7UUFDakQsT0FBTzloQjtBQUNUO0lBYUEsdUJBQU8raEIsSUFBb0JDO1FBQ3pCaGlCLEtBQUs4ZSxJQUFJaUQsb0JBQ0hDLFFBQVFwcUIsU0FBUyxJQUFJb3FCLFVBQVUsRUFBQyxJQUFJbEc7UUFFMUMsT0FBTzliO0FBQ1Q7SUFjQSw0QkFBT2lpQixJQUF5QkM7UUFDOUIsSUFBSUEsYUFBYXRxQixTQUFTLEdBQ3hCb0ksS0FBSzhlLElBQUltRCx5QkFBeUJDO1FBQ3BDLE9BQU9saUI7QUFDVDtJQWdCQSxrQkFBYW1pQixDQUNYQyxPQUFlbGtCLE9BQU9ta0IsUUFBUWxHLElBQUltRyxTQUFTLEtBQzNDdEcsT0FBMkIvakIsV0FDM0J3SixNQUFlO1FBRWZ6QixLQUFLOGUsSUFBSXlELE9BQU9ILE1BQU1wRyxNQUFhd0csS0FBSzdiO1lBQ3RDLElBQUlsRixLQUFLO2dCQUNQLE1BQU11SCxZQUFZaEosS0FBSzhlLElBQUkyRDtnQkFDM0J6aUIsS0FBSzJDLE9BQU9sQixJQUFJLGlDQUFpQ3VIO0FBQ25EOztBQUVKOzs7OztBQ2xSSyxJQUFNMFosaUNBQThCQyxtQ0FBcEMsTUFBTUQ7SUFDWCxXQUFBanRCLENBQ3FCNEwsZ0JBQ0F1aEI7UUFEQTVpQixLQUFBcUIsaUJBQUFBO1FBQ0FyQixLQUFBNGlCLFdBQUFBO0FBQ2xCO0lBRU8sbUJBQU1DLENBQWMzbEI7UUFDNUIsTUFBTTZDLFVBQVU3QyxJQUFJNkM7UUFDcEIsTUFBTStpQixRQUEwQjtZQUM5Qi9pQixTQUFTQTtZQUNUUyxXQUFXLENBQUE7O1FBR2IsTUFBTXVpQixLQUFLQyxVQUFVOWxCO1FBQ3JCLE1BQU15RixTQUFTakIsUUFBUWpCLE1BQU1rQixJQUFJO1lBQUVvaEI7O1FBRW5DL2lCLEtBQUtxQixlQUFlVixXQUNsQjVLLE9BQU9DLE9BQ0wsQ0FBQSxHQUNBaXRCLHFCQUNBO1lBQ0V0Z0I7WUFDQWdhLFdBQVcsSUFBSUM7WUFDZnNHLFdBQVcsR0FBR2htQixJQUFJdUksVUFBVXZJLElBQUk4TDtXQUVsQzhaO0FBR047SUFFQSxlQUFNdmhCLENBQVVzSCxTQUEyQnJIO1FBQ3pDLE1BQU10RSxNQUFNMkwsUUFBUXRNLGVBQWVDO1FBQ25DLE1BQU11TSxNQUFNRixRQUFRdE0sZUFBZTRNO1FBQ25DLE1BQU0xSCxNQUFNQyxRQUFRQyxJQUFJZ2hCLGtDQUFnQ2hoQixJQUFJM0IsS0FBS3VCO1FBQ2pFRSxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLG1CQUFtQi9DLElBQUl1SSxVQUFVdkksSUFBSThMO2NBRWhFaEosS0FBSzZpQixjQUFjM2xCO1FBQ3pCdUUsSUFBSVcsTUFDRixXQUFXcEMsS0FBS3FCLGVBQWVwQixrQ0FBa0MvQyxJQUFJdUksVUFBVXZJLElBQUk4TDtjQUcvRWhKLEtBQUs0aUIsU0FBUzlaLEtBQUs1TCxLQUFLNkw7UUFDOUJ0SCxJQUFJVyxNQUNGLFdBQVdwQyxLQUFLcUIsZUFBZXBCLHNDQUFzQy9DLElBQUl1SSxVQUFVdkksSUFBSThMO1FBRXpGLE9BQU94SCxLQUFLb0I7QUFDZDs7O0FBL0NXOGYsaUNBQThCQyxtQ0FBQS9oQixXQUFBLEVBRDFDQyxXQUFXO0lBQUVDLE9BQU9DLE1BQU1DO3NDQUdZckIscUJBQ04rSSwyQkFIcEJnYTs7QUFrRGIsU0FBU00sVUFBVTlsQjtJQUNqQixNQUFNNkMsVUFBVTdDLElBQUk2QztJQUNwQixTQUFTb2pCLGNBQWN4dUI7UUFDckIsS0FBS0EsT0FBTyxPQUFPc0Q7UUFDbkIsTUFBTW1yQixZQUFZeHRCLE1BQU1DLFFBQVFsQixTQUFTQSxNQUFNLEtBQUtBO1FBQ3BELE9BQU95dUIsVUFDSjllLE1BQU0sS0FDTmhOLElBQUs2WSxXQUFZQSxRQUFRQyxRQUN6Qi9ZLE9BQU8wYixTQUFTO0FBQ3JCO0lBQ0EsT0FDRW9RLGNBQWNwakIsVUFBVSx1QkFDeEJvakIsY0FBY3BqQixVQUFVLGlCQUN4Qm9qQixjQUFjcGpCLFVBQVUsdUJBQ3hCb2pCLGNBQWNwakIsVUFBVSxpQkFDeEI3QyxJQUFJNmxCO0FBRVI7O0FDL0dBLE1BQU1NLG1CQUFtQixJQUFJalo7O1NBUWJrWjtJQUNkLE9BQU8xdEIsTUFBTXNOLEtBQUttZ0IsaUJBQWlCanNCO0FBQ3JDOztBQUVBLFNBQVNtc0IsaUJBQWlCQyxPQUFldEw7SUFDdkMsSUFBSW1MLGlCQUFpQnJYLElBQUl3WCxRQUFRO0lBQ2pDSCxpQkFBaUJua0IsSUFBSXNrQixPQUFPO1FBQUV0YixTQUFTc2I7UUFBT3RMOztBQUNoRDs7QUFFQSxTQUFTdUwsbUJBQW1COXVCO0lBQzFCLGNBQWNBLFVBQVUsY0FBY0EsTUFBTTRCLHFCQUFxQjBVO0FBQ25FOztBQUVBLFNBQVN5WSxrQkFBa0JwZ0I7SUFDekIsT0FBTyxHQUFHQSxNQUFNdkg7QUFDbEI7O0FBRUEsU0FBUzRuQixxQkFDUHJnQixPQUNBUDtJQUVBLE9BQU9BLFVBQVUsR0FBR08sTUFBTXZILGtCQUFrQmdILFlBQVksR0FBR08sTUFBTXZIO0FBQ25FOztBQWNNLFNBQVU4TixRQUFRdlY7SUFDdEIsT0FBTyxDQUNMRCxRQUNBVSxhQUNBNnVCO1FBRUEsSUFBSUMsV0FBa0R2dkI7UUFDdEQsV0FBV3V2QixhQUFhLGFBQWE7WUFDbkMsTUFBTUMsYUFDSnJ2QixRQUFRQyxZQUFZLHFCQUFxQkwsV0FBVztZQUN0RHd2QixXQUFXQyxXQUFXRjtBQUN4QjtRQUNBLFdBQVdDLGFBQWEsYUFBYTtZQUNuQyxNQUFNLElBQUloZixjQUNSLGtFQUFrRStlLHFCQUFzQnZ2QixPQUE0QjBIO0FBRXhIO1FBRUEsTUFBTWdvQixpQkFBaUJGLGFBQWEsWUFBWUosbUJBQW1CSTtRQUNuRSxNQUFNTCxRQUFRTyxVQUNWTCxrQkFBa0JHLFlBQ2xCRyxxQkFBcUJIO1FBRXpCTixpQkFBaUJDLE9BQU87WUFDdEIsSUFBSU8sU0FBUyxPQUFPdmQsYUFBYXdELFNBQVM2WjtZQUMxQyxjQUFjQSxhQUFhLFdBQ3ZCSSxVQUFZeGpCLElBQUlvakIsWUFDaEJJLFVBQVl4akIsSUFBSW9qQjs7UUFHdEIsT0FBTzNpQixPQUFPc2lCLE1BQVB0aUIsQ0FBYzdNLFFBQVFVLGFBQWE2dUI7O0FBRTlDOztBQVVNLFNBQVU3WixXQUNkekcsT0FDQVA7SUFFQSxPQUFPLENBQ0wxTyxRQUNBVSxhQUNBNnVCO1FBRUEsTUFBTUosUUFBUUcscUJBQXFCcmdCLE9BQU9QO1FBQzFDd2dCLGlCQUFpQkMsT0FBTyxNQUFNVSxhQUFlbGEsU0FBUzFHLE9BQU9QO1FBQzdELE9BQU83QixPQUFPc2lCLE1BQVB0aUIsQ0FBYzdNLFFBQVFVLGFBQWE2dUI7O0FBRTlDOzs7O0FDckZPLElBQU1PLGtCQUFOLE1BQU1BOzs7O0lBT0Qsc0JBQVc3ZDtRQUNuQixLQUFLdEcsS0FBSzRKLGNBQ1IsTUFBTSxJQUFJL0UsY0FBYztRQUMxQixPQUFPN0UsS0FBSzRKO0FBQ2Q7SUFFVSxjQUFXbkk7UUFDbkIsS0FBS3pCLEtBQUt1Z0IsU0FBU3ZnQixLQUFLdWdCLFVBQVU3ZSxRQUFRQyxJQUFJeWlCO1FBQzlDLE9BQU9wa0IsS0FBS3VnQjtBQUNkO0lBRUEsV0FBQTlxQixDQUVtQjBDLFNBQ0Frc0I7UUFEQXJrQixLQUFBN0gsVUFBQUE7UUFDQTZILEtBQUFxa0IsWUFBQUE7QUFDaEI7SUFFSCxjQUFPcmMsQ0FBUTdQO1FBQ2IsTUFBTXNKLE1BQU16QixLQUFLeUIsSUFBSUUsSUFBSTNCLEtBQUtnSTtRQUM5QixNQUFNc2MsaUJBQWlCaEI7UUFDdkIsT0FBTztZQUNML2EsUUFBUTZiO1lBQ1JuYyxXQUFXLEVBQ1Q7Z0JBQUVDLFNBQVM1SjtnQkFBc0JpbUIsVUFBVXBzQjtlQUMzQztnQkFBRStQLFNBQVMzSjtnQkFBa0JnbUIsVUFBVXZrQixLQUFLc0csYUFBYWtlO2VBQ3pEO2dCQUNFdGMsU0FBU3hKO2dCQUNUd1osWUFBWSxNQUNWL2YsUUFBUXlRLFVBQVV0UixJQUFLbXRCO29CQUNyQmhqQixJQUFJNlEsS0FBSywrQkFBK0JtUyxFQUFFMW9CO29CQUMxQyxPQUFPLElBQUkwb0I7c0JBQ1A7ZUFFVjlrQixxQkFDQStJLHNCQUNBO2dCQUNFUixTQUFTRztnQkFDVEYsVUFBVXVhO2tCQUVUNEI7WUFFTDliLFNBQVMsRUFDUGxLLHNCQUNBQyxrQkFDQUcsZ0JBQ0FpQixxQkFDQStJLHlCQUNHNGIsZUFBZWh0QixJQUFLb3RCLFlBQWFBLFNBQVN4Yzs7QUFHbkQ7SUFFQSw0QkFBYXljLENBQ1h4c0I7UUFFQSxNQUFNc0osTUFBTXpCLEtBQUt5QixJQUFJRSxJQUFJM0IsS0FBSzJrQjtRQUU5QixLQUFLM2tCLEtBQUs0SixjQUFjO1lBQ3RCLE1BQU1nYixVQUFVenNCLFFBQVEwc0IsS0FBS3Z0QixJQUFJLEVBQUV3dEIsT0FBTzVMLFFBQVEzUztnQkFDaEQsTUFBTXdlLFdBQVd4ZSxLQUFLd1E7Z0JBQ3RCLEtBQUtnTyxVQUFVLE9BQU8sRUFBQ0QsT0FBTzVMO2dCQUM5QixPQUFPLEVBQUM0TCxPQUFPNUwsUUFBUTNTOztZQUV6QnZHLEtBQUs0SixlQUFlLElBQUlvYjtrQkFDbEJobEIsS0FBSzRKLGFBQWFxYixLQUFLTDtZQUM3QixNQUFNTSxVQUFVbGxCLEtBQUs0SixhQUFhNGE7WUFDbEMsS0FBSyxJQUFJak8sSUFBSSxHQUFHQSxJQUFJMk8sUUFBUXR0QixRQUFRMmUsS0FBSztnQkFDdkMsTUFBTTRPLElBQUlodEIsUUFBUTBzQixLQUFLdE87Z0JBQ3ZCLE1BQU02TyxpQkFBaUJELEVBQUU1Z0IsTUFBTSxHQUFHNGdCLEVBQUV2dEI7Z0JBQ3BDLElBQUlvTCxjQUFjb2lCLGVBQWVyTztnQkFDakMsS0FDRy9ULGdCQUNDQSxZQUFpREUsTUFDbkQ7b0JBQ0EsTUFBTTRoQixRQUFRamlCLFFBQVFJLGVBQWVpaUIsUUFBUTNPLEdBQUd4VDtvQkFDaEQsS0FBSytoQixPQUNILE1BQU0sSUFBSWpnQixjQUNSLG9DQUFvQ3FnQixRQUFRM08sR0FBR3hUO29CQUVuRDt3QkFDRUMsY0FBZThoQixNQUEyQzVoQixPQUN0RDRoQixRQUNBLElBQUtBO0FBQ1gsc0JBQUUsT0FBT3BrQjt3QkFDUCxNQUFNLElBQUltRSxjQUNSLGtDQUFrQ3FnQixRQUFRM08sR0FBR3hULFlBQVlyQztBQUU3RDtBQUNGO2dCQUNBMmtCLDRCQUE0QkgsUUFBUTNPLEdBQUd4VCxRQUF2Q3NpQixDQUFnRHJpQjtBQUNsRDtZQUNBdkIsSUFBSTZRLEtBQUs7WUFFVCxJQUFJbmEsUUFBUW10QixnQkFBZ0I7Z0JBQzFCOzBCQUNRbnRCLFFBQVFtdEI7QUFDaEIsa0JBQUUsT0FBTzVrQjtvQkFDUCxNQUFNLElBQUltRSxjQUFjLHFDQUFxQ25FO0FBQy9EO0FBQ0Y7QUFDRjtRQUVBLE9BQU9WLEtBQUtzRyxZQUFZa2U7QUFDMUI7SUFFQSwyQkFBTWU7UUFDSixNQUFNOWpCLE1BQU0yaUIsa0JBQWdCM2lCLElBQUlFLElBQUkzQixLQUFLdWxCO1FBQ3pDLE1BQU1DLFdBQ0p4bEIsS0FBS3FrQixVQUFVNWpCLElBQVNsQztRQUMxQixLQUFLLE1BQU0rUCxXQUFXa1gsVUFDcEI7WUFDRSxJQUFJbFgsU0FBUztnQkFDWDdNLElBQUk2USxLQUFLLGlCQUFpQmhFLFFBQVEvVztzQkFDNUIrVyxRQUFRbVg7QUFDaEI7QUFDRixVQUFFLE9BQU8va0I7WUFDUGUsSUFBSWlELE1BQU0sa0NBQWtDaEU7QUFDOUM7UUFDRjtrQkFDUW1KLFVBQVE0YjtBQUNoQixVQUFFLE9BQU8va0I7WUFDUGUsSUFBSWlELE1BQU0sK0JBQStCaEU7QUFDM0M7QUFDRjs7O0FBbElXeWpCLGtCQUFlQyxvQkFBQXhqQixXQUFBLEVBRjNCOGtCLFVBQ0FqZCxPQUFPLENBQUEsSUFvQkh4SCxRQUFBLEdBQUFDLE9BQU81QyxrRUFFb0JxbkIsZ0JBckJuQnhCOztBQzlCTixNQUFNeUIsOEJBQThCam5CLE9BQ3pDOztBQ0RJLFNBQVVrbkIsdUJBQXVCdGY7SUFDckMsT0FBT3VmLGFBQWE1QyxXQUFXNkMsSUFBSUMsV0FBV3pmO0lBRTlDLE1BQU14RSxZQUFZK2pCLGFBQWEvcEIsUUFBUStwQjtJQUV2QyxNQUFNRyxvQkFBb0Jyd0IsTUFBTUMsUUFBUW13QixXQUNwQ0EsUUFBUTF1QixJQUFLb0o7UUFDWDtZQUNFLFdBQVdBLEVBQUV3bEIsY0FBYyxZQUFZLE9BQU94bEIsRUFBRXdsQjtZQUVoREMsUUFBUXhFLEtBQ04sb0JBQW9CNWYsNkRBQTZEckIsOENBQThDQTtZQUVqSSxjQUFjQSxNQUFNLFdBQVdBLElBQUlvRyxLQUFLQyxVQUFVckc7QUFDcEQsVUFBRSxPQUFPMGxCO1lBQ1BELFFBQVF4RSxLQUFLLG1DQUFtQzVmLGNBQWNxa0I7WUFDOUQsT0FBT251QjtBQUNUO1NBRUYrdEIsa0JBQWtCQSxRQUFRRSxjQUFjLGFBQ3RDRixRQUFRRSxxQkFDREYsWUFBWSxXQUNqQkEsVUFDQWxmLEtBQUtDLFVBQVVpZjtJQUV2QkcsUUFBUS9qQixNQUNOLHVDQUF1Q0wsd0JBQXdCbWhCLGlCQUFpQjZDLE9BQ2hGRTtJQUdGLE9BQU8sRUFBQ2xrQixXQUFXbWhCLFdBQVc2QyxJQUFJRTtBQUNwQzs7OztBQ25CTyxJQUFNSSxtQkFBZ0JDLHFCQUF0QixNQUFNRCx5QkFBeUI5YztJQUdwQyxXQUFBOVQsQ0FDRWdVLGVBQ3FDeks7UUFFckNhLE1BQU00SixlQUFlNmMsbUJBQWlCdnFCO1FBQ3RDaUUsS0FBS3dsQixXQUFXeG1CLFNBQVMxSCxJQUFLeUwsV0FBYUYsUUFBZ0JwQyxJQUFJc0M7QUFDakU7SUFHQSxNQUFBd2Y7UUFDRSxNQUFNNWYsU0FBU2pCLFFBQVFDLElBQUkya0IsbUJBQWlCdnFCO1FBRTVDLE1BQU13cUIsVUFBVSxJQUFJQyxXQUEwQkM7WUFDNUMsTUFBTUMsYUFDSixLQUFLQyxLQUFLQyxTQUFTcnZCLFNBQVMsSUFBSWdOLE1BQU0sR0FBRyxLQUFLc2lCO1lBRWhEbGtCLE9BQU8yUCxLQUNMLDBCQUEwQm9VLHlCQUF5QjFtQixLQUFLeUosY0FBY3hKO1lBRXhFLE1BQU02bUIsS0FBSyxJQUFBO2dCQUFLLFdBQUFyeEI7b0JBQ2R1SyxLQUFBMG1CLGFBQWFBO0FBYWY7Z0JBWkUsT0FBQUssSUFBV3hnQjtvQkFDVDVELE9BQU9QLE1BQ0wsZ0JBQWdCcEMsS0FBSzBtQjtvQkFFdkIsT0FBT00sUUFBUUMsVUFBVXpFLEtBQUs7d0JBQzVCLE1BQU1wbUIsT0FBT3lwQix1QkFBdUJ0Zjt3QkFDcENrZ0IsU0FBU2psQixLQUFLOzRCQUFFaE0sTUFBTTs0QkFBVzRHOzt3QkFDakN1RyxPQUFPUCxNQUNMLGdCQUFnQnBDLEtBQUswbUI7O0FBRzNCOztZQUdGL2pCLE9BQU9SLFFBQ0wsd0JBQXdCdWtCLHFCQUFxQjFtQixLQUFLd2xCLFNBQVM1dEI7WUFFN0QsS0FBSyxNQUFNMFcsV0FBV3RPLEtBQUt3bEIsVUFBVTtnQkFDbkMsTUFBTTBCLGNBQWM1WSxTQUFTN1ksYUFBYXNHLFFBQVE7Z0JBQ2xEO29CQUNFNEcsT0FBT1AsTUFDTCx3QkFBd0Jza0IseUJBQXlCUTtvQkFFbkQ1WSxRQUFRNlksUUFBUUw7QUFDbEIsa0JBQUUsT0FBT3BtQjtvQkFDUGlDLE9BQU9QLE1BQ0wsK0JBQStCc2tCLHlCQUF5QlEsZ0JBQWdCeG1CLEdBQUdxRSxXQUFXckU7b0JBRXhGaUMsT0FBTytCLE1BQU1oRTtBQUNmO0FBQ0Y7WUFFQSxPQUFPO2dCQUNMaUMsT0FBT1AsTUFBTSw0QkFBNEJza0I7Z0JBRXpDLEtBQUssTUFBTXBZLFdBQVd0TyxLQUFLd2xCLFVBQVU7b0JBQ25DLE1BQU0wQixjQUFjNVksU0FBUzdZLGFBQWFzRyxRQUFRO29CQUNsRDt3QkFDRTRHLE9BQU9QLE1BQ0wsMEJBQTBCc2tCLDJCQUEyQlE7d0JBRXZENVksUUFBUThZLFVBQVVOO0FBQ3BCLHNCQUFFLE9BQU9wbUI7d0JBQ1BpQyxPQUFPUCxNQUNMLHFDQUFxQ3NrQix5QkFBeUJRLGdCQUFnQnhtQixHQUFHcUUsV0FBV3JFO3dCQUU5RmlDLE9BQU8rQixNQUFNaEU7QUFDZjtBQUNGOzs7UUFJSixNQUFNMm1CLHdCQUF3QjtRQUM5QixNQUFNQyxhQUFhQyxTQUFTRix1QkFBdUJqZSxLQUNqREMsTUFBSTtZQUNGMUcsT0FBT1AsTUFBTTtZQUVmOUssSUFDRSxPQUFBO1lBQ0U5QixNQUFNO1lBQ040RyxNQUFNO2dCQUNKb3JCLEtBQUksSUFBSTVLLE1BQU9DOzs7UUFNdkIsT0FBTzRLLE1BQU1sQixTQUFTZTtBQUN4QjtJQUlBLGNBQUFJLENBQStCcGtCO1FBQzdCLE1BQU1YLFNBQVNqQixRQUFRQyxJQUFJMmtCLG1CQUFpQnZxQjtRQUU1QyxPQUFPLElBQUl5cUIsV0FBMEJDO1lBQ25DLE1BQU1LLEtBQUssSUFBQTtnQkFDVCxPQUFBQyxJQUFXeGdCO29CQUNULE9BQU95Z0IsUUFBUUMsVUFBVXpFLEtBQUs7d0JBQzVCaUUsU0FBU2psQixLQUFLOzRCQUFFcEYsTUFBTW1LOzs7QUFFMUI7O1lBR0Y7Z0JBQ0UsS0FBSyxNQUFNK0gsV0FBV3RPLEtBQUt3bEIsVUFBVTtvQkFDbkNsWCxRQUFRNlksUUFBUUw7QUFDbEI7QUFDRixjQUFFLE9BQU9wbUI7Z0JBQ1ArbEIsU0FBUy9oQixNQUFNLDRCQUE0QmhFLEVBQUVxRSxXQUFXckU7QUFDMUQ7WUFFQSxPQUFPO2dCQUNMO29CQUNFLEtBQUssTUFBTTROLFdBQVd0TyxLQUFLd2xCLFVBQVU7d0JBQ25DbFgsUUFBUThZLFVBQVVOO0FBQ3BCO0FBQ0Ysa0JBQUUsT0FBT3BtQjtvQkFDUGlDLE9BQU8rQixNQUFNaEU7QUFDZjs7O0FBR047OztBQWxIQUUsV0FBQSxFQURDK21CLGlIQUNTbkIsZUFnRlRILGlCQUFBOXZCLFdBQUEsVUFBQTs7QUFJRHFLLFdBQUEsRUFGQyttQixJQUFJLFlBRVcxbUIsUUFBQSxHQUFBOEUsTUFBTSw2SEFBeUJ5Z0IsZUE4QjlDSCxpQkFBQTl2QixXQUFBLGtCQUFBOztBQTlIVTh2QixtQkFBZ0JDLHFCQUFBMWxCLFdBQUEsRUFENUIyUixjQU1JdFIsUUFBQSxHQUFBQyxPQUFPMGtCLGlFQURPam1CLHFCQUFtQi9KLFlBSnpCeXdCOzs7O0FDTE4sSUFBTXVCLG9CQUFpQkMsc0JBQXZCLE1BQU1EO0lBQ1gsa0JBQU9FLENBQ0w5b0IsVUFDQXRHLE9BQWU7UUFFZixPQUFPO1lBQ0w2UCxRQUFRc2Y7WUFDUmxQLGFBQWEsRUFBQzBOO1lBQ2QwQixTQUFTLEVBQ1BDLGFBQWFDLFNBQVMsRUFDcEI7Z0JBQ0V2dkIsTUFBTUEsS0FBSzhCLFFBQVEsT0FBTztnQkFDMUIrTixRQUFRc2Y7O1lBSWQ1ZixXQUFXLEVBQ1R0SSxxQkFDQTtnQkFDRXVJLFNBQVMwZDtnQkFDVHJCLFVBQVV2bEIsWUFBWTs7O0FBSTlCOzs7QUF4Qlc0b0Isb0JBQWlCQyxzQkFBQWpuQixXQUFBLEVBRDdCNkgsT0FBTyxDQUFBLE1BQ0ttZjs7OztBQ0lOLElBQU1NLGNBQVdDLGdCQUFqQixNQUFNRDtJQUNYLHlCQUFhRSxDQUNYandCO1FBRUEsT0FBTWt3QixpQkFBRUEsaUJBQWU3UCxjQUFFQSxnQkFBaUJyZ0I7UUFFMUMsTUFBTXF0QixpQkFDRXJCLGdCQUFnQlEsZ0JBQWdCeHNCO1FBQ3hDLE1BQU02RyxXQUFXd21CLFNBQVNsdUIsSUFBS2dYLFdBQVlBLFFBQVF2TDtRQUVuRCxNQUFNZ2xCLFVBT1UsRUFBQzVELGdCQUFnQm5jLFFBQVE3UDtRQUV6QyxJQUFJa3dCLGlCQUFpQjtZQUNqQnJwQixTQUFTa0gsUUFBU25EO2dCQUNoQmdsQixRQUFRcGtCLEtBQ05rVSxhQUFhOVUsU0FBU2lGLFFBQVFqRixTQUFTO29CQUNyQ3lWO29CQUNBRixvQkFBb0JuZ0IsUUFBUW1nQjtvQkFDNUJuWixrQkFBa0JoSCxRQUFRZ0g7b0JBQzFCc1osY0FBY3RnQixRQUFRc2dCOzs7QUFJOUI7UUFFRixJQUFJdGdCLFFBQVFtd0IsaUJBQWlCQyxzQkFBc0I7WUFDakRSLFFBQVFwa0IsS0FDTmlrQixrQkFBa0JFLFlBQ2hCM3ZCLFFBQVFtd0IsZ0JBQWdCRSxvQkFBb0J4cEI7QUFHbEQ7UUFFQSxPQUFPO1lBQ0x1SixRQUFRNGY7WUFDUkosU0FBU0E7O0FBRWI7OztBQTVDV0csY0FBV0MsZ0JBQUF2bkIsV0FBQSxFQUR2QjZILE9BQU8sQ0FBQSxNQUNLeWY7O0FBK0NOdmhCLGVBQWU4aEIsaUJBQWdDOztBQ3REaEQsU0FBVUMsYUFBYXBsQjtJQUM1QixNQUFNcWxCLElBQUkxZCxNQUFNeEssSUFBSTZDO0lBQ3BCLEtBQUtxbEIsR0FDSixNQUFNLElBQUk5akIsY0FBYyxpQ0FBaUN2QjtJQUMxRCxNQUFNd00sT0FBTy9GLGFBQVdDLFNBQVMyZTtJQUNqQyxPQUFPN1k7QUFDUjs7QUNzQ08sTUFBTThZLFVBQVU7O0FBUWhCLE1BQU1DLFNBQVM7O0FBUWYsTUFBTUMsZUFBZTs7QUFFckIsTUFBTUMsZUFBZTs7QUFFNUI5cEIsU0FBUytwQixvQkFBb0I7O0FBQzdCL3BCLFNBQVNncUIsZ0JBQWdCRixjQUFjSDs7QUFDdkMzcEIsU0FBUytwQixvQkFBb0I7OyJ9
|
|
2565
|
+
//# 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/OiBFbnVtU2NoZW1hQXR0cmlidXRlcztcbiAgICB9KTtcblxuY29uc3QgaXNFbnVtQXJyYXkgPSAoXG4gIG9wdHM6IEFwaVByb3BlcnR5T3B0aW9uc1xuKTogb3B0cyBpcyB7XG4gIGlzQXJyYXk6IHRydWU7XG4gIGVudW06IEVudW1BbGxvd2VkVHlwZXM7XG4gIHR5cGU6IGFueTtcbiAgaXRlbXM6IGFueTtcbn0gPT4gKG9wdHMuaXNBcnJheSAmJiBcImVudW1cIiBpbiBvcHRzICYmIG9wdHMuZW51bSAhPT0gdW5kZWZpbmVkKSBhcyBib29sZWFuO1xuXG4vKipcbiAqIEBwdWJsaWNBcGlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVByb3BlcnR5KFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gY3JlYXRlQXBpUHJvcGVydHlEZWNvcmF0b3Iob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge30sXG4gIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IFt0eXBlLCBpc0FycmF5XSA9IGdldFR5cGVJc0FycmF5VHVwbGUoXG4gICAgb3B0aW9ucy50eXBlLFxuICAgIG9wdGlvbnMuaXNBcnJheSBhcyBhbnlcbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIGNvZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuIiwiaW1wb3J0IHsgYXBwbHkgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEFwaUV4Y2x1ZGVFbmRwb2ludCB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIEJ1bGtDcnVkT3BlcmF0aW9uS2V5cyxcbiAgT3BlcmF0aW9uS2V5cyxcbiAgQ3J1ZE9wZXJhdGlvbnMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgTW9kZWxDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IERlbGV0ZSwgR2V0LCBQYXRjaCwgUG9zdCwgUHV0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5cbmltcG9ydCB7IGlzT3BlcmF0aW9uQmxvY2tlZCBhcyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBQcmVwYXJlZFN0YXRlbWVudEtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEh0dHBWZXJicyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgYSBnaXZlbiBDUlVEIG9wZXJhdGlvbiBpcyBibG9ja2VkIGZvciBhIHNwZWNpZmljIG1vZGVsIGNvbnN0cnVjdG9yLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBvcGVyYXRpb24tYmxvY2tpbmcgaGFuZGxlciBtZXRhZGF0YSBzdG9yZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsIGNvbnN0cnVjdG9yICh1bmRlciBgT3BlcmF0aW9uS2V5cy5SRUZMRUNUICsgT3BlcmF0aW9uS2V5cy5CTE9DS2ApLCBleGVjdXRlcyBpdCAoaWYgcHJlc2VudCkgd2l0aCBpdHMgcGVyc2lzdGVkIGFyZ3VtZW50cyBwbHVzIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLCBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZC4gSWYgbm8gaGFuZGxlciBleGlzdHMsIHRoZSBvcGVyYXRpb24gaXMgY29uc2lkZXJlZCBhbGxvd2VkIChyZXR1cm5zIGBmYWxzZWApLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgdGFyZ2V0IG1vZGVsIGNvbnN0cnVjdG9yIHdob3NlIG1ldGFkYXRhIG1heSBpbmNsdWRlIGEgYmxvY2tpbmcgaGFuZGxlci5cbiAqIEBwYXJhbSB7Q3J1ZE9wZXJhdGlvbnN9IG9wIC0gVGhlIENSVUQgb3BlcmF0aW9uIHRvIGV2YWx1YXRlIChlLmcuLCBgT3BlcmF0aW9uS2V5cy5DUkVBVEVgLCBgT3BlcmF0aW9uS2V5cy5SRUFEYCwgYE9wZXJhdGlvbktleXMuVVBEQVRFYCwgYE9wZXJhdGlvbktleXMuREVMRVRFYCkuXG4gKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGV4cGxpY2l0bHkgYmxvY2tlZCBieSB0aGUgbW9kZWwncyBoYW5kbGVyOyBvdGhlcndpc2UgYGZhbHNlYC5cbiAqIEBmdW5jdGlvbiBpc09wZXJhdGlvbkJsb2NrZWRcbiAqL1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZGl0aW9uYWxseSBhcHBsaWVzIGFuIEhUVFAgbWV0aG9kIGRlY29yYXRvciBmb3IgYSBnaXZlbiBtb2RlbCBhbmQgdmVyYiwgaGlkaW5nIHRoZSBlbmRwb2ludCBpbiBTd2FnZ2VyIChhbmQgbm90IHJlZ2lzdGVyaW5nIHRoZSByb3V0ZSkgd2hlbiB0aGUgbW9kZWwgYmxvY2tzIHRoYXQgQ1JVRCBvcGVyYXRpb24uXG4gKiBAc3VtbWFyeSBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBgQ3J1ZE9wZXJhdGlvbnNgIGtleSBhbmQgTmVzdCBIVFRQIGRlY29yYXRvciAoYEBHZXRgLCBgQFBvc3RgLCBldGMuKS4gSXQgY2hlY2tzIGBpc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgY3J1ZE9wKWAgYW5kLCBpZiBibG9ja2VkLCBhcHBsaWVzIG9ubHkgYEBBcGlFeGNsdWRlRW5kcG9pbnQoKWAgKFN3YWdnZXItaGlkZGVuLCBubyBOZXN0IHJvdXRlKS4gSWYgcGVybWl0dGVkLCBpdCBhcHBsaWVzIHRoZSBhcHByb3ByaWF0ZSBIVFRQIGRlY29yYXRvciB3aXRoIHRoZSBvcHRpb25hbCBgcGF0aGAuXG4gKiBAcGFyYW0ge01vZGVsQ29uc3RydWN0b3I8YW55Pn0gTW9kZWxDb25zdHJ1Y3RvciAtIFRoZSBtb2RlbCBjb25zdHJ1Y3RvciB1c2VkIHRvIHJlc29sdmUgb3BlcmF0aW9uLWJsb2NraW5nIHJ1bGVzLlxuICogQHBhcmFtIHtIdHRwVmVyYnN9IHZlcmIgLSBUaGUgSFRUUCB2ZXJiIHRvIG1hcCAoZS5nLiwgYFwiR0VUXCIgfCBcIlBPU1RcIiB8IFwiUFVUXCIgfCBcIlBBVENIXCIgfCBcIkRFTEVURVwiYCkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcm91dGUgcGF0aCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29ycmVzcG9uZGluZyBOZXN0IEhUVFAgbWV0aG9kIGRlY29yYXRvci5cbiAqIEByZXR1cm4ge01ldGhvZERlY29yYXRvcn0gQSBtZXRob2QgZGVjb3JhdG9yIHRoYXQgZWl0aGVyIGV4Y2x1ZGVzIHRoZSBlbmRwb2ludCBmcm9tIFN3YWdnZXIgKGFuZCByb3V0ZSByZWdpc3RyYXRpb24pIG9yIGFwcGxpZXMgdGhlIGNvcnJlY3QgSFRUUCBkZWNvcmF0b3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoXG4gIE1vZGVsQ29uc3RydWN0b3I6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgdmVyYjogSHR0cFZlcmJzLFxuICBwYXRoPzogc3RyaW5nXG4pOiBNZXRob2REZWNvcmF0b3Ige1xuICBjb25zdCBodHRwVG9DcnVkOiBSZWNvcmQ8XG4gICAgSHR0cFZlcmJzLFxuICAgIFtDcnVkT3BlcmF0aW9ucywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtPcGVyYXRpb25LZXlzLlJFQUQsIEdldF0sXG4gICAgUE9TVDogW09wZXJhdGlvbktleXMuQ1JFQVRFLCBQb3N0XSxcbiAgICBQVVQ6IFtPcGVyYXRpb25LZXlzLlVQREFURSwgUHV0XSxcbiAgICBQQVRDSDogW09wZXJhdGlvbktleXMuVVBEQVRFLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbT3BlcmF0aW9uS2V5cy5ERUxFVEUsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSByZXNvbHZlQmxvY2tUYXJnZXQodmVyYiwgcGF0aCk7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgdGFyZ2V0LmtpbmQgYXMgYW55LCB0YXJnZXQudmFsdWUpXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKVxuICAgIDogY29yZUlzT3BlcmF0aW9uQmxvY2tlZChNb2RlbENvbnN0cnVjdG9yLCBjcnVkT3ApXG4gICAgICA/IGFwcGx5KEFwaUV4Y2x1ZGVFbmRwb2ludCgpKVxuICAgICAgOiBhcHBseShIdHRwTWV0aG9kRGVjb3JhdG9yKHBhdGgpKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgYXBwbGllcyBhbiBIVFRQIG1ldGhvZCBkZWNvcmF0b3IgZm9yIGEgZ2l2ZW4gbW9kZWwgYW5kIHZlcmIsIGhpZGluZyB0aGUgZW5kcG9pbnQgaW4gU3dhZ2dlciAoYW5kIG5vdCByZWdpc3RlcmluZyB0aGUgcm91dGUpIHdoZW4gdGhlIG1vZGVsIGJsb2NrcyB0aGF0IENSVUQgb3BlcmF0aW9uLlxuICogQHN1bW1hcnkgTWFwcyBhbiBIVFRQIHZlcmIgdG8gaXRzIGNvcnJlc3BvbmRpbmcgYENydWRPcGVyYXRpb25zYCBrZXkgYW5kIE5lc3QgSFRUUCBkZWNvcmF0b3IgKGBAR2V0YCwgYEBQb3N0YCwgZXRjLikuIEl0IGNoZWNrcyBgaXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIGNydWRPcClgIGFuZCwgaWYgYmxvY2tlZCwgYXBwbGllcyBvbmx5IGBAQXBpRXhjbHVkZUVuZHBvaW50KClgIChTd2FnZ2VyLWhpZGRlbiwgbm8gTmVzdCByb3V0ZSkuIElmIHBlcm1pdHRlZCwgaXQgYXBwbGllcyB0aGUgYXBwcm9wcmlhdGUgSFRUUCBkZWNvcmF0b3Igd2l0aCB0aGUgb3B0aW9uYWwgYHBhdGhgLlxuICogQHBhcmFtIHtNb2RlbENvbnN0cnVjdG9yPGFueT59IE1vZGVsQ29uc3RydWN0b3IgLSBUaGUgbW9kZWwgY29uc3RydWN0b3IgdXNlZCB0byByZXNvbHZlIG9wZXJhdGlvbi1ibG9ja2luZyBydWxlcy5cbiAqIEBwYXJhbSB7SHR0cFZlcmJzfSB2ZXJiIC0gVGhlIEhUVFAgdmVyYiB0byBtYXAgKGUuZy4sIGBcIkdFVFwiIHwgXCJQT1NUXCIgfCBcIlBVVFwiIHwgXCJQQVRDSFwiIHwgXCJERUxFVEVcImApLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXSAtIE9wdGlvbmFsIHJvdXRlIHBhdGggcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTmVzdCBIVFRQIG1ldGhvZCBkZWNvcmF0b3IuXG4gKiBAcmV0dXJuIHtNZXRob2REZWNvcmF0b3J9IEEgbWV0aG9kIGRlY29yYXRvciB0aGF0IGVpdGhlciBleGNsdWRlcyB0aGUgZW5kcG9pbnQgZnJvbSBTd2FnZ2VyIChhbmQgcm91dGUgcmVnaXN0cmF0aW9uKSBvciBhcHBsaWVzIHRoZSBjb3JyZWN0IEhUVFAgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbChcbiAgTW9kZWxDb25zdHJ1Y3RvcjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICB2ZXJiOiBIdHRwVmVyYnMsXG4gIHBhdGg/OiBzdHJpbmdcbik6IE1ldGhvZERlY29yYXRvciB7XG4gIGNvbnN0IGh0dHBUb0NydWQ6IFJlY29yZDxcbiAgICBIdHRwVmVyYnMsXG4gICAgW0J1bGtDcnVkT3BlcmF0aW9uS2V5cywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcl1cbiAgPiA9IHtcbiAgICBHRVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuUkVBRF9BTEwsIEdldF0sXG4gICAgUE9TVDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5DUkVBVEVfQUxMLCBQb3N0XSxcbiAgICBQVVQ6IFtCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCwgUHV0XSxcbiAgICBQQVRDSDogW0J1bGtDcnVkT3BlcmF0aW9uS2V5cy5VUERBVEVfQUxMLCBQYXRjaF0sXG4gICAgREVMRVRFOiBbQnVsa0NydWRPcGVyYXRpb25LZXlzLkRFTEVURV9BTEwsIERlbGV0ZV0sXG4gIH07XG5cbiAgY29uc3QgW2NydWRPcCwgSHR0cE1ldGhvZERlY29yYXRvcl0gPSBodHRwVG9DcnVkW3ZlcmJdO1xuICBjb25zdCB0YXJnZXQgPSBwYXRoID8gcmVzb2x2ZUJsb2NrVGFyZ2V0KHZlcmIsIHBhdGgpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyBjb3JlSXNPcGVyYXRpb25CbG9ja2VkKE1vZGVsQ29uc3RydWN0b3IsIHRhcmdldC5raW5kIGFzIGFueSwgdGFyZ2V0LnZhbHVlKVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSlcbiAgICA6IGNvcmVJc09wZXJhdGlvbkJsb2NrZWQoTW9kZWxDb25zdHJ1Y3RvciwgXCJidWxrXCIgYXMgYW55LCBjcnVkT3AgYXMgYW55KVxuICAgICAgPyBhcHBseShBcGlFeGNsdWRlRW5kcG9pbnQoKSlcbiAgICAgIDogYXBwbHkoSHR0cE1ldGhvZERlY29yYXRvcihwYXRoKSk7XG59XG5mdW5jdGlvbiByZXNvbHZlQmxvY2tUYXJnZXQoXG4gIHZlcmI6IEh0dHBWZXJicyxcbiAgcGF0aD86IHN0cmluZ1xuKTpcbiAgfCB7IGtpbmQ6IFwiY3J1ZFwiIHwgXCJzdGF0ZW1lbnRcIiB8IFwicXVlcnlcIiB8IFwiYnVsa1wiOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB1bmRlZmluZWQge1xuICBpZiAoIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBhdGgucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIik7XG4gIGNvbnN0IHN0YXRlbWVudFRhcmdldHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgXCJsaXN0QnkvOmtleVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTElTVF9CWSxcbiAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICBcImZpbmQvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5ELFxuICAgIFwicGFnZS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlBBR0UsXG4gICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgIFwiZmluZEJ5LzprZXkvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5GSU5EX0JZLFxuICAgIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIjogXCJzdGF0ZW1lbnRcIixcbiAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICBcIm1heE9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUFYX09GLFxuICAgIFwibWluT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NSU5fT0YsXG4gICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICBcInN1bU9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuU1VNX09GLFxuICAgIFwiZGlzdGluY3RPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkRJU1RJTkNUX09GLFxuICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICB9O1xuXG4gIGlmIChub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICByZXR1cm4geyBraW5kOiBcInF1ZXJ5XCIsIHZhbHVlOiBub3JtYWxpemVkLnJlcGxhY2UoL15xdWVyeVxcLy8sIFwiXCIpIH07XG4gIH1cblxuICBjb25zdCBzdGF0ZW1lbnRWYWx1ZSA9IHN0YXRlbWVudFRhcmdldHNbbm9ybWFsaXplZF07XG4gIGlmIChzdGF0ZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwic3RhdGVtZW50XCIsIHZhbHVlOiBzdGF0ZW1lbnRWYWx1ZSB9O1xuICB9XG5cbiAgaWYgKHZlcmIgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZCA9PT0gXCJcIikge1xuICAgIHJldHVybiB7IGtpbmQ6IFwiY3J1ZFwiLCB2YWx1ZTogT3BlcmF0aW9uS2V5cy5SRUFEIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwiaW1wb3J0IHsgYXBwbHlEZWNvcmF0b3JzIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBcGlQYXJhbSBhcyBBcGlQYXJhbURlYyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGVjYWZBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFwcGxpZXMgYSBzZXQgb2YgU3dhZ2dlciBgQEFwaVBhcmFtYCBkZWNvcmF0b3JzIGdlbmVyYXRlZCBmcm9tIGEgdHlwZWQgc3BlY2lmaWNhdGlvbiBhcnJheS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgZWFjaCBlbnRyeSBvZiB0aGUgcHJvdmlkZWQgYEFwaVBhcmFtW11gIGludG8gYSBjb3JyZXNwb25kaW5nIGBAQXBpUGFyYW0oKWAgZGVjb3JhdG9yIChkZWZhdWx0aW5nIGBkZXNjcmlwdGlvbmAsIGByZXF1aXJlZGAsIGFuZCBgdHlwZWAgd2hlbiBvbWl0dGVkKSBhbmQgY29tcG9zZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGRlY29yYXRvciB2aWEgTmVzdCdzIGBhcHBseURlY29yYXRvcnNgLiBVc2VmdWwgZm9yIHN5bmNocm9uaXppbmcgcnVudGltZSByb3V0ZSBwYXJhbXMgd2l0aCBPcGVuQVBJIGRvY3VtZW50YXRpb24gaW4gYSBjb25jaXNlLCBkZWNsYXJhdGl2ZSB3YXkuXG4gKiBAcGFyYW0ge0FwaVBhcmFtW119IFtwcm9wcz1bXV0gQXJyYXkgZGVzY3JpYmluZyBwYXRoIHBhcmFtZXRlcnMgdG8gYmUgZG9jdW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wc1tdLm5hbWUgVGhlIHBhcmFtZXRlcidzIG5hbWUgYXMgaXQgYXBwZWFycyBpbiB0aGUgcm91dGUgdGVtcGxhdGUgKGUuZy4sIGA6aWRgKS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcHNbXS5kZXNjcmlwdGlvbl0gSHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gb2YgdGhlIHBhcmFtZXRlcjsgZGVmYXVsdHMgdG8gYFwiUGF0aCBwYXJhbWV0ZXI6IDxuYW1lPlwiYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Byb3BzW10ucmVxdWlyZWQ9dHJ1ZV0gV2hldGhlciB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkOyBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPGFueT59IFtwcm9wc1tdLnR5cGU9U3RyaW5nXSBDb25zdHJ1Y3Rvci90eXBlIHVzZWQgYnkgU3dhZ2dlciB0byBpbmZlciBzY2hlbWEgKGUuZy4sIGBTdHJpbmdgLCBgTnVtYmVyYCwgYFVVSURgLCBjdXN0b20gY2xhc3MpLlxuICogQHJldHVybiB7YW55fSBBIGNvbXBvc2VkIGRlY29yYXRvciBhcHBseWluZyBhbGwgZ2VuZXJhdGVkIGBAQXBpUGFyYW1gIGRlY29yYXRvcnMgdG8gdGhlIHRhcmdldCBtZXRob2Qgb3IgY29udHJvbGxlci5cbiAqIEBmdW5jdGlvbiBBcGlQYXJhbXNGcm9tTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEFwaVBhcmFtc0Zyb21Nb2RlbChcbiAgcHJvcHM6IERlY2FmQXBpUHJvcGVydHlbXSA9IFtdXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvcnMgPSBwcm9wcy5tYXAoKHApID0+XG4gICAgQXBpUGFyYW1EZWMoe1xuICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IHAuZGVzY3JpcHRpb24gPz8gYFBhdGggcGFyYW1ldGVyOiAke3AubmFtZX1gLFxuICAgICAgcmVxdWlyZWQ6IHAucmVxdWlyZWQgPz8gdHJ1ZSxcbiAgICAgIC8vIHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgdHlwZTogcC50eXBlID8/IFN0cmluZyxcbiAgICB9KVxuICApO1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKC4uLmRlY29yYXRvcnMpO1xufVxuIiwiaW1wb3J0IHtcbiAgY3JlYXRlUGFyYW1EZWNvcmF0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXN0b20gZGVjb3JhdG9yIHRoYXQgZXh0cmFjdHMgdGhlIHJlcXVlc3QgYm9keSBhbmQgaW5zdGFudGlhdGVzIGl0IHVzaW5nIHRoZSBNb2RlbCBjb25zdHJ1Y3RvclxuICogZm91bmQgb24gdGhlIGNvbnRyb2xsZXIuIEhhbmRsZXMgYm90aCBzaW5nbGUgb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgY29uc3QgRGVjYWZCb2R5ID0gY3JlYXRlUGFyYW1EZWNvcmF0b3IoXG4gIChkYXRhOiB1bmtub3duLCBjdHg6IEV4ZWN1dGlvbkNvbnRleHQpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCBib2R5ID0gcmVxdWVzdC5ib2R5O1xuXG4gICAgLy8gVGhlIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgd2lsbCBoYXZlICdNb2RlbENvbnN0cicgYXZhaWxhYmxlXG4gICAgY29uc3QgY29udHJvbGxlciA9IGN0eC5nZXRDbGFzcygpO1xuICAgIC8vIFdlIGFjY2VzcyB0aGUgc3RhdGljIHByb3BlcnR5IHdlIHdpbGwgYWRkIHRvIHRoZSBEeW5hbWljTW9kZWxDb250cm9sbGVyXG4gICAgY29uc3QgTW9kZWxDb25zdHIgPSAoY29udHJvbGxlciBhcyBhbnkpLmNsYXNzO1xuXG4gICAgaWYgKCFNb2RlbENvbnN0cikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oXG4gICAgICAgIGBNb2RlbENvbnN0cnVjdG9yIG5vdCBmb3VuZCBvbiBjb250cm9sbGVyICR7Y29udHJvbGxlci5uYW1lfS4gRW5zdXJlIHRoZSBjb250cm9sbGVyIHdhcyBjcmVhdGVkIHZpYSBGcm9tTW9kZWxDb250cm9sbGVyLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFib2R5KSByZXR1cm4gYm9keTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGJvZHkpKSB7XG4gICAgICByZXR1cm4gYm9keS5tYXAoKGl0ZW0pID0+IG5ldyBNb2RlbENvbnN0cihpdGVtKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbENvbnN0cihib2R5KTtcbiAgfVxuKTtcbiIsImltcG9ydCB7IGNyZWF0ZVBhcmFtRGVjb3JhdG9yLCBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlBhcmFtUHJvcHMsIERlY2FmQXBpUHJvcGVydHkgfSBmcm9tIFwiLi90eXBlc1wiO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGN1c3RvbSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGV4dHJhY3RzIGFuZCByZXR1cm5zIHJvdXRlIHBhcmFtZXRlcnMgb3JkZXJlZCBieSBhIHNwZWNpZmljIGtleSBzZXF1ZW5jZS5cbiAqIEBzdW1tYXJ5IFRoZSBgT3JkZXJlZFBhcmFtc2AgZGVjb3JhdG9yIHJlYWRzIHRoZSBpbmNvbWluZyBIVFRQIHJlcXVlc3QncyBgcGFyYW1zYCBvYmplY3QsIG9wdGlvbmFsbHkgb3JkZXJzIGl0IGFjY29yZGluZyB0byBhIHByb3ZpZGVkIGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzLCBhbmQgcmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyYW1zLCB0aGUgb3JkZXJlZCB2YWx1ZXMsIGFuZCB0aGUgYXBwbGllZCBvcmRlciBsaXN0LiBUaGlzIGVuc3VyZXMgZGV0ZXJtaW5pc3RpYyBwYXJhbWV0ZXIgYWNjZXNzIGZvciByb3V0ZXMgd2l0aCBtdWx0aXBsZSBwYXRoIHBhcmFtZXRlcnMuXG4gKiBAdGVtcGxhdGUge3N0cmluZ1tdfSBUT3JkZXIgLSBSZXByZXNlbnRzIHRoZSBleHBlY3RlZCBzZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMuXG4gKiBAcGFyYW0ge1RPcmRlciB8IHVuZGVmaW5lZH0gb3JkZXIgQW4gb3B0aW9uYWwgYXJyYXkgc3BlY2lmeWluZyB0aGUgcGFyYW1ldGVyIG5hbWVzJyBkZXNpcmVkIG9yZGVyLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmVzZXJ2ZSB0aGUgb3JkZXIgb2YgdGhlIGtleXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIGByZXEucGFyYW1zYCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4ZWN1dGlvbkNvbnRleHR9IGN0eCBUaGUgTmVzdEpTIGV4ZWN1dGlvbiBjb250ZXh0LCB1c2VkIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IEhUVFAgcmVxdWVzdCBvYmplY3QuXG4gKiBAcmV0dXJuIHtEZWNhZlBhcmFtUHJvcHN9IEFuIG9iamVjdCBjb250YWluaW5nOlxuICogLSBgb3JpZ2luYWxgOiB0aGUgcmF3IHBhcmFtZXRlciBtYXAgZnJvbSBgcmVxLnBhcmFtc2A7XG4gKiAtIGBvcmRlcmVkYDogYW4gYXJyYXkgb2YgcGFyYW1ldGVyIHZhbHVlcyBpbiB0aGUgcmVxdWVzdGVkIG9yZGVyO1xuICogLSBgb3JkZXJgOiB0aGUgZWZmZWN0aXZlIG9yZGVyIGxpc3QgdXNlZC5cbiAqIEBmdW5jdGlvbiBPcmRlcmVkUGFyYW1zXG4gKi9cbmNvbnN0IE9yZGVyZWRQYXJhbXMgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKG9yZGVyOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCwgY3R4OiBFeGVjdXRpb25Db250ZXh0KTogRGVjYWZQYXJhbVByb3BzID0+IHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJlcT8ucGFyYW1zID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNvbnN0IG9yZGVyTGlzdCA9IG9yZGVyID8/IE9iamVjdC5rZXlzKG9yaWdpbmFsKTtcbiAgICBjb25zdCBvcmRlcmVkID0gb3JkZXJMaXN0Lm1hcCgoaykgPT4gb3JpZ2luYWxba10pO1xuICAgIHJldHVybiB7IHJhdzogb3JpZ2luYWwsIHZhbHVlc0luT3JkZXI6IG9yZGVyZWQsIGtleXNJbk9yZGVyOiBvcmRlckxpc3QgfTtcbiAgfVxuKTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBoaWdoZXItbGV2ZWwgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBsZXZlcmFnZXMgYE9yZGVyZWRQYXJhbXNgIHRvIGV4dHJhY3Qgcm91dGUgcGFyYW1ldGVycyBpbiBhIHNwZWNpZmljIG9yZGVyIGRlcml2ZWQgZnJvbSBhIGxpc3Qgb2YgYEFwaVBhcmFtYCBkZWZpbml0aW9ucy5cbiAqIEBzdW1tYXJ5IGBEZWNhZlBhcmFtc2AgY29tcHV0ZXMgdGhlIG9yZGVyIG9mIHJvdXRlIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBBcGlQYXJhbVtdYCBzcGVjaWZpY2F0aW9uICh1c2luZyBlYWNoIGVsZW1lbnTigJlzIGBuYW1lYCksIHRoZW4gYXBwbGllcyBgT3JkZXJlZFBhcmFtcyhvcmRlcilgIGFzIGEgcGFyYW1ldGVyIGRlY29yYXRvci4gVGhpcyBlbmFibGVzIHBhcmFtZXRlci1sZXZlbCBiaW5kaW5nIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIGRvY3VtZW50ZWQgQVBJIHBhcmFtZXRlciBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7QXBpUGFyYW1bXX0gW3Byb3BzPVtdXSBBcnJheSBvZiBgQXBpUGFyYW1gIGRlZmluaXRpb25zIHdob3NlIGBuYW1lYCBmaWVsZHMgZGV0ZXJtaW5lIHRoZSBwYXJhbWV0ZXIgZXh0cmFjdGlvbiBvcmRlci5cbiAqIEByZXR1cm4ge1BhcmFtZXRlckRlY29yYXRvcn0gQSBOZXN0SlMgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYW4gb3JkZXJlZCBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIG1ldGFkYXRhIGludG8gdGhlIGNvbnRyb2xsZXIgbWV0aG9kIGFyZ3VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRGVjYWZQYXJhbXMoXG4gIHByb3BzOiBEZWNhZkFwaVByb3BlcnR5W10gPSBbXVxuKTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgY29uc3Qgb3JkZXIgPSBwcm9wcy5tYXAoKHApID0+IHAubmFtZSk7XG4gIHJldHVybiBPcmRlcmVkUGFyYW1zKG9yZGVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IERlY2FmUXVlcnkgPSBjcmVhdGVQYXJhbURlY29yYXRvcihcbiAgKF86IHVua25vd24sIGN0eDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGN0eC5zd2l0Y2hUb0h0dHAoKS5nZXRSZXF1ZXN0KCk7XG4gICAgY29uc3QgcXVlcnkgPSByZXEucXVlcnkgPz8ge307XG5cbiAgICBjb25zdCBwYXJzZWQ6IGFueSA9IHsgLi4ucXVlcnkgfTtcblxuICAgIC8vIFBhcnNlIGxpbWl0ICYgb2Zmc2V0XG4gICAgaWYgKHBhcnNlZC5saW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5saW1pdCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihuKSkgcGFyc2VkLmxpbWl0ID0gbjtcbiAgICB9XG5cbiAgICBpZiAocGFyc2VkLm9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBuID0gTnVtYmVyKHBhcnNlZC5vZmZzZXQpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4obikpIHBhcnNlZC5vZmZzZXQgPSBuO1xuICAgIH1cblxuICAgIC8vIFBhcnNlIGJvb2ttYXJrIG9ubHkgaWYgbnVtZXJpY1xuICAgIGlmIChwYXJzZWQuYm9va21hcmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgbiA9IE51bWJlcihwYXJzZWQuYm9va21hcmspO1xuICAgICAgcGFyc2VkLmJvb2ttYXJrID0gTnVtYmVyLmlzTmFOKG4pID8gcGFyc2VkLmJvb2ttYXJrIDogbjtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG4pO1xuIiwiaW1wb3J0IHsgQWRhcHRlckZsYWdzLCBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9UQVNLX1NFUlZJQ0VfSUQgPSBcIkRlY2FmVGFza1NlcnZpY2VcIjtcblxuZXhwb3J0IGNvbnN0IERFQ0FGX1JPVVRFID0gXCJEZWNhZlJvdXRlXCI7XG5leHBvcnQgY29uc3QgREVDQUZfSEFORExFUlMgPSBTeW1ib2woXCJEZWNhZkhhbmRsZXJzXCIpO1xuZXhwb3J0IGNvbnN0IERFQ0FGX0VYUE9TRSA9IFwiRGVjYWZFeHBvc2VcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRyA9IFwiRGVjYWZDb250cm9sbGVyQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCBERUNBRl9DT05URVhUX0tFWSA9IFN5bWJvbChcImRlY2FmOmNvbnRleHRcIik7XG5cbmV4cG9ydCB0eXBlIERlY2FmU2VydmVyRmxhZ3M8TE9HIGV4dGVuZHMgTG9nZ2VyID0gTG9nZ2VyPiA9XG4gIEFkYXB0ZXJGbGFnczxMT0c+ICYge1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB9O1xuXG5leHBvcnQgdHlwZSBEZWNhZlNlcnZlckN0eCA9IENvbnRleHQ8RGVjYWZTZXJ2ZXJGbGFncz47XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBERUNBRl9FWFBPU0UgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBvc2UoLi4uZmxhdm91cnM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBmdW5jdGlvbiBleHBvc2UodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQoXG4gICAgICB0YXJnZXQsXG4gICAgICBERUNBRl9FWFBPU0UsXG4gICAgICAoZmxhdm91cnMubGVuZ3RoID8gZmxhdm91cnMgOiB0cnVlKSBhcyBhbnlcbiAgICApO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ2xhc3MgZGVjb3JhdG9yIHRoYXQgYXR0YWNoZXMgYSB7QGxpbmsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZ30gdG8gYSBNb2RlbCxcbiAqIHNvIGBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSgpYCBjYW4gcGFzcyBpdCB0byBgTW9kZWxDb250cm9sbGVyRmFjdG9yeS5jcmVhdGUoKWAuXG4gKlxuICogVGhlIHBlci1tb2RlbCBjb25maWcgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIG1vZHVsZS1sZXZlbCBgY29udHJvbGxlckNvbmZpZ2BcbiAqIG9wdGlvbiBpbiBgRGVjYWZNb2R1bGVPcHRpb25zYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIEBjb250cm9sbGVyQ29uZmlnKHsgYWxsb3dHcm91cGluZ1F1ZXJpZXM6IHRydWUsIGFsbG93QnVsa1N0YXRlbWVudDogeyBjcmVhdGU6IHRydWUsIHJlYWQ6IHRydWUsIHVwZGF0ZTogZmFsc2UsIGRlbGV0ZTogdHJ1ZSB9IH0pXG4gKiBAbW9kZWwoKVxuICogY2xhc3MgT3JkZXIgZXh0ZW5kcyBNb2RlbDxPcmRlcj4geyAuLi4gfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIEZhY3RvcnkgY29uZmlndXJhdGlvbiBrbm9icyAoYWxsb3dTdGF0ZW1lbnRsZXNzUXVlcnksIGFsbG93R3JvdXBpbmdRdWVyaWVzLCBhbGxvd0J1bGtTdGF0ZW1lbnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckNvbmZpZyhjb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnRyb2xsZXJDb25maWdEZWNvcmF0b3IodGFyZ2V0OiBhbnkpIHtcbiAgICBNZXRhZGF0YS5zZXQodGFyZ2V0LCBERUNBRl9DT05UUk9MTEVSX0NPTkZJRywgY29uZmlnIGFzIGFueSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbn1cbiIsImV4cG9ydCBjb25zdCBBVVRIX0hBTkRMRVIgPSBTeW1ib2woXCJBVVRIX0hBTkRMRVJcIik7XG5leHBvcnQgY29uc3QgQVVUSF9NRVRBX0tFWSA9IFwiYXV0aDptZXRhXCI7XG5leHBvcnQgY29uc3QgSVNfUFVCTElDX0tFWSA9IFwiaXNQdWJsaWNcIjtcbmV4cG9ydCBjb25zdCBSRVFVSVJFRF9ST0xFU19LRVkgPSBcInJlcXVpcmVkUm9sZXNcIjtcbmV4cG9ydCBjb25zdCBTS0lQX01PREVMX1JPTEVTX0tFWSA9IFwic2tpcE1vZGVsUm9sZXNcIjtcbiIsImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJFUVVFU1QgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3QgfSBmcm9tIFwiZXhwcmVzc1wiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuQEluamVjdGFibGUoeyBzY29wZTogU2NvcGUuUkVRVUVTVCB9KVxuZXhwb3J0IGNsYXNzIERlY2FmUmVxdWVzdENvbnRleHQ8XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgQyBleHRlbmRzIERlY2FmU2VydmVyQ3R4ID0gRGVjYWZTZXJ2ZXJDdHgsXG4+IGV4dGVuZHMgUmVxdWVzdENvbnRleHQ8UmVxdWVzdD4ge1xuICB1dWlkID0gVVVJRC5pbnN0YW5jZS5nZW5lcmF0ZSgpO1xuICBvdmVycmlkZSByZWFkb25seSByZXF1ZXN0OiBSZXF1ZXN0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUkVRVUVTVCkgcHJpdmF0ZSByZWFkb25seSByZXE6IFJlcXVlc3QpIHtcbiAgICBzdXBlcihcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyc09mOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gKHJlcXVlc3QgYXMgYW55KT8uaGVhZGVycyB8fCB1bmRlZmluZWQsXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHJlcVxuICAgICk7XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgZ2V0IGhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRPclVuZGVmaW5lZChcImhlYWRlcnNcIiBhcyBhbnkpO1xuICB9XG5cbiAgcHV0KHJlY29yZDogUmVjb3JkPGFueSwgYW55Pikge1xuICAgIGxldCBvdmVycmlkZXM6IGFueTtcbiAgICB0cnkge1xuICAgICAgb3ZlcnJpZGVzID0gdGhpcy5nZXQoXCJvdmVycmlkZXNcIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgb3ZlcnJpZGVzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5hY2N1bXVsYXRlKHtcbiAgICAgIG92ZXJyaWRlczogT2JqZWN0LmFzc2lnbihvdmVycmlkZXMsIHJlY29yZCksXG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgRXhlY3V0aW9uQ29udGV4dCxcbiAgQ2FsbEhhbmRsZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IFJlZmxlY3RvciB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQWRhcHRlciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcblxuaW1wb3J0IHtcbiAgQVVUSF9IQU5ETEVSLFxuICBBVVRIX01FVEFfS0VZLFxuICBJU19QVUJMSUNfS0VZLFxuICBSRVFVSVJFRF9ST0xFU19LRVksXG4gIFNLSVBfTU9ERUxfUk9MRVNfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdC9EZWNhZlJlcXVlc3RDb250ZXh0XCI7XG5cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBBdXRoSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlZmxlY3RvcjogUmVmbGVjdG9yLFxuICAgIHByb3RlY3RlZCByZWFkb25seSByZXF1ZXN0Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfSEFORExFUikgcHJpdmF0ZSByZWFkb25seSBhdXRoSGFuZGxlcj86IEF1dGhIYW5kbGVyXG4gICkge31cblxuICBhc3luYyBpbnRlcmNlcHQoXG4gICAgY3R4OiBFeGVjdXRpb25Db250ZXh0LFxuICAgIG5leHQ6IENhbGxIYW5kbGVyXG4gICk6IFByb21pc2U8T2JzZXJ2YWJsZTxhbnk+PiB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IodGhpcyBhcyBhbnkpLmZvcih0aGlzLmludGVyY2VwdCk7XG5cbiAgICBjb25zdCBpc1B1YmxpYyA9IHRoaXMucmVmbGVjdG9yLmdldEFsbEFuZE92ZXJyaWRlPGJvb2xlYW4+KElTX1BVQkxJQ19LRVksIFtcbiAgICAgIGN0eC5nZXRIYW5kbGVyKCksXG4gICAgICBjdHguZ2V0Q2xhc3MoKSxcbiAgICBdKTtcblxuICAgIGNvbnN0IG1vZGVsTmFtZSA9XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KFxuICAgICAgICBBVVRIX01FVEFfS0VZLFxuICAgICAgICBjdHguZ2V0SGFuZGxlcigpXG4gICAgICApID8/XG4gICAgICB0aGlzLnJlZmxlY3Rvci5nZXQ8c3RyaW5nIHwgQ29uc3RydWN0b3I+KEFVVEhfTUVUQV9LRVksIGN0eC5nZXRDbGFzcygpKTtcblxuICAgIGNvbnN0IHJlcXVpcmVkUm9sZXMgPSB0aGlzLnJlZmxlY3Rvci5nZXRBbGxBbmRPdmVycmlkZTxzdHJpbmdbXT4oXG4gICAgICBSRVFVSVJFRF9ST0xFU19LRVksXG4gICAgICBbY3R4LmdldEhhbmRsZXIoKSwgY3R4LmdldENsYXNzKCldXG4gICAgKTtcblxuICAgIGNvbnN0IHNraXBNb2RlbFJvbGVzID0gdGhpcy5yZWZsZWN0b3IuZ2V0QWxsQW5kT3ZlcnJpZGU8Ym9vbGVhbj4oXG4gICAgICBTS0lQX01PREVMX1JPTEVTX0tFWSxcbiAgICAgIFtjdHguZ2V0SGFuZGxlcigpLCBjdHguZ2V0Q2xhc3MoKV1cbiAgICApO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlTW9kZWwgPSBza2lwTW9kZWxSb2xlcyA/IHVuZGVmaW5lZCA6IG1vZGVsTmFtZTtcblxuICAgIGxvZy52ZXJib3NlKGBJbnRlcmNlcHRlZCByZXF1ZXN0JHttb2RlbE5hbWUgPyBgIGZvciAke21vZGVsTmFtZX1gIDogXCJcIn1gKTtcblxuICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgbG9nLmRlYnVnKGBQdWJsaWMgcm91dGUg4oCUIHNraXBwaW5nIGF1dGhgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXV0aEhhbmRsZXIpIHtcbiAgICAgIGF3YWl0IHRoaXMuYXV0aEhhbmRsZXIuYXV0aG9yaXplKFxuICAgICAgICBjdHgsXG4gICAgICAgIGVmZmVjdGl2ZU1vZGVsIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICAgICAgICByZXF1aXJlZFJvbGVzLFxuICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuZGVidWcoYE5vIGF1dGggaGFuZGxlciByZWdpc3RlcmVkYCk7XG4gICAgfVxuXG4gICAgLy8gVHJhbnNmb3JtZXJzIHJ1biBBRlRFUiBhdXRoIHNvIHRoZXkgY2FuIHJlYWQgYXV0aC1wb3B1bGF0ZWQgZmllbGRzXG4gICAgLy8gKGUuZy4gYHVzZXJgKSBmcm9tIHRoZSBjb250ZXh0IGFuZCBtYXAgdGhlbSB0byBhZGFwdGVyLXNwZWNpZmljIGtleXNcbiAgICAvLyAoZS5nLiBgVVVJRGAgZm9yIFJhbUFkYXB0ZXIncyBAY3JlYXRlZEJ5L0B1cGRhdGVkQnkgaGFuZGxlcnMpLlxuICAgIGF3YWl0IHRoaXMuYXBwbHlUcmFuc2Zvcm1lcnMoKTtcblxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldE9yVW5kZWZpbmVkKFwidXNlclwiIGFzIGFueSk7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRPclVuZGVmaW5lZChcbiAgICAgIFwib3JnYW5pemF0aW9uXCIgYXMgYW55XG4gICAgKTtcbiAgICBpZiAodXNlciB8fCBvcmdhbml6YXRpb24pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMb2cgPSB0aGlzLnJlcXVlc3RDb250ZXh0LmdldChcImxvZ2dlclwiIGFzIGFueSk7XG4gICAgICBjb25zdCBjaGlsZExvZyA9IGN1cnJlbnRMb2cuZm9yKHsgdXNlciwgb3JnYW5pemF0aW9uIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5hY2N1bXVsYXRlKHsgbG9nZ2VyOiBjaGlsZExvZyB9IGFzIGFueSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlUcmFuc2Zvcm1lcnMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmxhdm91cnMgPSBBZGFwdGVyLmZsYXZvdXJzVG9UcmFuc2Zvcm0oKTtcbiAgICBpZiAoIWZsYXZvdXJzKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGZsYXZvdXIgb2YgZmxhdm91cnMpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gQWRhcHRlci50cmFuc2Zvcm1lckZvcihcbiAgICAgICAgZmxhdm91clxuICAgICAgKSBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PjtcbiAgICAgIGlmICghdHJhbnNmb3JtZXIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSAodHJhbnNmb3JtZXIgYXMgYW55KS5mcm9tXG4gICAgICAgID8gdHJhbnNmb3JtZXJcbiAgICAgICAgOiBuZXcgKHRyYW5zZm9ybWVyIGFzIGFueSkoKTtcbiAgICAgIGNvbnN0IGZyb20gPSBhd2FpdCBpbnN0YW5jZS5mcm9tKHRoaXMucmVxdWVzdENvbnRleHQpO1xuICAgICAgaWYgKGZyb20pIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShmcm9tKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGFwcGx5RGVjb3JhdG9ycywgU2V0TWV0YWRhdGEsIFVzZUludGVyY2VwdG9ycyB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQXBpQmVhcmVyQXV0aCwgQXBpU2VjdXJpdHkgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5pbXBvcnQgeyBBVVRIX01FVEFfS0VZLCBJU19QVUJMSUNfS0VZLCBSRVFVSVJFRF9ST0xFU19LRVkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvciB9IGZyb20gXCIuL0F1dGhJbnRlcmNlcHRvclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gQXV0aChtb2RlbD86IHN0cmluZyB8IENvbnN0cnVjdG9yKSB7XG4gIGNvbnN0IHJlc291cmNlID0gbW9kZWxcbiAgICA/IHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBtb2RlbFxuICAgICAgOiBtb2RlbC5uYW1lXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlY3MgPSBbQXBpQmVhcmVyQXV0aCgpLCBVc2VJbnRlcmNlcHRvcnMoQXV0aEludGVyY2VwdG9yKV07XG4gIGlmIChyZXNvdXJjZSkgZGVjcy5wdXNoKFNldE1ldGFkYXRhKEFVVEhfTUVUQV9LRVksIHJlc291cmNlKSk7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoLi4uZGVjcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBQdWJsaWMoKSB7XG4gIHJldHVybiBhcHBseURlY29yYXRvcnMoU2V0TWV0YWRhdGEoSVNfUFVCTElDX0tFWSwgdHJ1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gUmVxdWlyZVJvbGVzKC4uLnJvbGVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlEZWNvcmF0b3JzKFxuICAgIEFwaVNlY3VyaXR5KFwiYmVhcmVyXCIpLFxuICAgIFNldE1ldGFkYXRhKFJFUVVJUkVEX1JPTEVTX0tFWSwgcm9sZXMpLFxuICAgIFVzZUludGVyY2VwdG9ycyhBdXRoSW50ZXJjZXB0b3IpXG4gICk7XG59XG4iLCJpbXBvcnQgeyBEZWxldGUsIEdldCwgUGF0Y2gsIFBvc3QsIFB1dCB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgSHR0cFZlcmJzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFVuc3VwcG9ydGVkRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuLyoqXG4gKiBNYXBzIGFuIEhUVFAgdmVyYiB0byBpdHMgY29ycmVzcG9uZGluZyBOZXN0SlMgbWV0aG9kIGRlY29yYXRvci5cbiAqXG4gKiBAcGFyYW0gdmVyYiAtIEhUVFAgdmVyYiB0byBiZSBjb252ZXJ0ZWQgKGUuZy4gR0VULCBQT1NULCBQVVQsIFBBVENILCBERUxFVEUpLlxuICogQHJldHVybnMgQSBOZXN0SlMgbWV0aG9kIGRlY29yYXRvciBtYXRjaGluZyB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvdmlkZWQgSFRUUCB2ZXJiIGlzIG5vdCBzdXBwb3J0ZWQgb3Igbm90IG1hcHBlZFxuICogdG8gYSBOZXN0SlMgZGVjb3JhdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gSHR0cFZlcmJUb0RlY29yYXRvcihcbiAgdmVyYjogSHR0cFZlcmJzXG4pOiAocGF0aD86IHN0cmluZykgPT4gTWV0aG9kRGVjb3JhdG9yIHtcbiAgY29uc3QgaHR0cFRvQ3J1ZDogUmVjb3JkPEh0dHBWZXJicywgKHBhdGg/OiBzdHJpbmcpID0+IE1ldGhvZERlY29yYXRvcj4gPSB7XG4gICAgR0VUOiBHZXQsXG4gICAgUE9TVDogUG9zdCxcbiAgICBQVVQ6IFB1dCxcbiAgICBQQVRDSDogUGF0Y2gsXG4gICAgREVMRVRFOiBEZWxldGUsXG4gIH07XG5cbiAgY29uc3QgZGVjb3JhdG9yID0gaHR0cFRvQ3J1ZFt2ZXJiXTtcblxuICBpZiAoIWRlY29yYXRvcikge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgYFVuc3VwcG9ydGVkIEhUVFAgdmVyYiBcIiR7dmVyYn1cIi4gTm8gTmVzdEpTIGRlY29yYXRvciBtYXBwaW5nIHdhcyBmb3VuZC5gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvcmF0b3I7XG59XG4iLCJpbXBvcnQgeyBRdWVyeSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyB0eXBlIERlY29yYXRvckJ1bmRsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBcGlOb0NvbnRlbnRSZXNwb25zZSxcbiAgQXBpT2tSZXNwb25zZSxcbiAgQXBpT3BlcmF0aW9uLFxuICBBcGlQYXJhbSxcbiAgQXBpUXVlcnksXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIERlY2FmQXBpUHJvcGVydHksXG4gIHR5cGUgRGVjYWZQYXJhbVByb3BzLFxuICBEZWNhZlBhcmFtcyxcbn0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBIdHRwVmVyYnMgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3R5cGVzXCI7XG5pbXBvcnQge1xuICBEaXJlY3Rpb25MaW1pdE9mZnNldCxcbiAgTW9kZWxTZXJ2aWNlLFxuICBPcmRlckRpcmVjdGlvbixcbiAgUmVwbyxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb250cm9sbGVyc1wiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHJvdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICByZXR1cm4gcm91dGVQYXRoXG4gICAgLnNwbGl0KFwiL1wiKVxuICAgIC5maWx0ZXIoKHApID0+IHAuc3RhcnRzV2l0aChcIjpcIikpXG4gICAgLm1hcCgocCkgPT4gcC5zbGljZSgxKSk7XG59O1xuXG5jb25zdCBhcGlQYXJhbVNwZWMgPSAobmFtZTogc3RyaW5nKTogRGVjYWZBcGlQcm9wZXJ0eSA9PiAoe1xuICBuYW1lLFxuICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyIGZvciB0aGUgcXVlcnlgLFxuICByZXF1aXJlZDogdHJ1ZSxcbiAgdHlwZTogU3RyaW5nLFxufSk7XG5cbmZ1bmN0aW9uIHRvRGVjYWZFcnJvcihlcnJvcjogdW5rbm93biwgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmcpOiBCYXNlRXJyb3Ige1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgcmV0dXJuIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtmYWxsYmFja01lc3NhZ2V9OiAke2Vycm9yLm1lc3NhZ2V9YCA6IGZhbGxiYWNrTWVzc2FnZVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpRGVjb3JhdG9ycyhcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgaHR0cFZlcmI6IEh0dHBWZXJicyxcbiAgaW5jbHVkZVF1ZXJ5UGFyYW1zOiBib29sZWFuID0gZmFsc2Vcbik6IERlY29yYXRvckJ1bmRsZSB7XG4gIGNvbnN0IE5lc3RIdHRwUm91dGVEZWMgPSBIdHRwVmVyYlRvRGVjb3JhdG9yKGh0dHBWZXJiKTtcbiAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IGV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlUGF0aCkubWFwKGFwaVBhcmFtU3BlYyk7XG5cbiAgY29uc3Qgc3dhZ2dlclF1ZXJ5UGFyYW1zID0gW107XG4gIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICBzd2FnZ2VyUXVlcnlQYXJhbXMucHVzaChcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICBlbnVtOiBPcmRlckRpcmVjdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXIgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJsaW1pdFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcImxpbWl0IG9yIHBhZ2Ugc2l6ZSB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcIm9mZnNldFwiLFxuICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWV0aG9kOiBbXG4gICAgICBOZXN0SHR0cFJvdXRlRGVjKHJvdXRlUGF0aCksXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcChBcGlQYXJhbSksXG4gICAgICAuLi5zd2FnZ2VyUXVlcnlQYXJhbXMsXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBhY2NvcmRpbmcgdG8gXCIke21ldGhvZE5hbWV9XCIuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUmVzdWx0IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQuYCxcbiAgICAgIH0pLFxuICAgICAgQXBpTm9Db250ZW50UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vIGNvbnRlbnQgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC5gLFxuICAgICAgfSksXG4gICAgXSxcbiAgICBwYXJhbXM6IFtEZWNhZlBhcmFtcyhhcGlQYXRoUGFyYW1zKSwgUXVlcnkoKV0sIC8vICwgRGVjYWZCb2R5KCldLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBcGlEZWNvcmF0b3JzKFxuICB0YXJnZXQ6IGFueSxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGRlY29yYXRvcnM6IERlY29yYXRvckJ1bmRsZVxuKSB7XG4gIGNvbnN0IHByb3RvID0gdGFyZ2V0Py5wcm90b3R5cGUgPz8gdGFyZ2V0O1xuICBkZWNvcmF0b3JzLm1ldGhvZC5mb3JFYWNoKChkKSA9PiBkKHByb3RvLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKSk7XG4gIGRlY29yYXRvcnMucGFyYW1zPy5mb3JFYWNoKChkLCBpbmRleCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQZXJzaXN0ZW5jZU1ldGhvZDxUIGV4dGVuZHMgTW9kZWw8Ym9vbGVhbj4+KFxuICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOiBhbnlbXVxuKTogYW55IHtcbiAgaWYgKHBlcnNpc3RlbmNlIGluc3RhbmNlb2YgTW9kZWxTZXJ2aWNlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiAocGVyc2lzdGVuY2UgYXMgYW55KVttZXRob2ROYW1lXSA9PT0gXCJmdW5jdGlvblwiXG4gICAgICA/IChwZXJzaXN0ZW5jZSBhcyBhbnkpW21ldGhvZE5hbWVdKC4uLmFyZ3MpXG4gICAgICA6IHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gKHBlcnNpc3RlbmNlIGFzIGFueSlbbWV0aG9kTmFtZV0oLi4uYXJncyk7XG5cbiAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgYFBlcnNpc3RlbmNlIG1ldGhvZCBcIiR7bWV0aG9kTmFtZX1cIiBub3QgZm91bmQgb24gJHtwZXJzaXN0ZW5jZT8uY29uc3RydWN0b3I/Lm5hbWV9YFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVIYW5kbGVyPFQ+KG1ldGhvZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgIHRoaXM6IERlY2FmTW9kZWxDb250cm9sbGVyPGFueT4sXG4gICAgcGF0aFBhcmFtczogRGVjYWZQYXJhbVByb3BzLFxuICAgIHF1ZXJ5UGFyYW1zOiBEaXJlY3Rpb25MaW1pdE9mZnNldFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBsb2c6IExvZ2dlciA9IHRoaXMubG9nLmZvcihtZXRob2ROYW1lKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBJbnZva2luZyBwZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgZ2l2ZW4gcGFyYW1ldGVyczogJHtKU09OLnN0cmluZ2lmeShwYXRoUGFyYW1zLnZhbHVlc0luT3JkZXIpfWBcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRpcmVjdGlvbiwgbGltaXQsIG9mZnNldCB9ID0gcXVlcnlQYXJhbXM7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzb2x2ZVBlcnNpc3RlbmNlTWV0aG9kKFxuICAgICAgICB0aGlzLnBlcnNpc3RlbmNlKCksXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIC4uLnBhdGhQYXJhbXMudmFsdWVzSW5PcmRlcixcbiAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICBsaW1pdCxcbiAgICAgICAgb2Zmc2V0XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgbG9nLmVycm9yKGBDdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCIgZmFpbGVkYCwgZSk7XG4gICAgICB0aHJvdyB0b0RlY2FmRXJyb3IoZSwgYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSb3V0ZU1ldGhvZChcbiAgQ29udHJvbGxlckNsYXNzOiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnksXG4gIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbik6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lLFxuICAgIHtcbiAgICAgIHZhbHVlOiBoYW5kbGVyLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIH1cbiAgKTtcblxuICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICBDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlIHx8IENvbnRyb2xsZXJDbGFzcyxcbiAgICBtZXRob2ROYW1lXG4gICk7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhIYW5kbGVyLCBBdXRoRGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG4vKipcbiAqIFNpbXBsZSBhdXRoIGhhbmRsZXIgdGhhdCByZWFkcyBhIHJvbGUgc3RyaW5nIGZyb20gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHJvbGU+YCBoZWFkZXIuXG4gKlxuICogT25seSBvdmVycmlkZXMge0BsaW5rIEF1dGhIYW5kbGVyLmV4dHJhY3RGcm9tQXV0aH0gdG8gcmV0dXJuIHRoZSBiZWFyZXIgdG9rZW4gYXNcbiAqIGJvdGggdGhlIHVzZXIgaWRlbnRpZmllciBhbmQgdGhlIHNpbmdsZSByb2xlLiBUaGUgYmFzZSBjbGFzcyBgYmluZFRvQ29udGV4dGBcbiAqIChgY3R4LmFjY3VtdWxhdGUoZGF0YSlgKSBpcyBzdWZmaWNpZW50IOKAlCB0aGUgdHJhbnNmb3JtZXIvYWRhcHRlciBpcyByZXNwb25zaWJsZVxuICogZm9yIG1hcHBpbmcgY29udGV4dCBmaWVsZHMgdG8gYWRhcHRlci1zcGVjaWZpYyBrZXlzIGxpa2UgYFVVSURgLlxuICovXG5leHBvcnQgY2xhc3MgRGVjYWZBdXRoSGFuZGxlciBleHRlbmRzIEF1dGhIYW5kbGVyPFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICBBdXRoRGF0YVxuPiB7XG4gIHByb3RlY3RlZCBwYXJzZVJlcXVlc3QocmVxOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IHVzZXJSb2xlID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbj8uc3BsaXQoXCIgXCIpWzFdIGFzIHN0cmluZztcbiAgICByZXR1cm4gdXNlclJvbGU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZXh0cmFjdEZyb21BdXRoKGN0eDogRXhlY3V0aW9uQ29udGV4dCk6IEF1dGhEYXRhIHtcbiAgICBjb25zdCByZXEgPSBjdHguc3dpdGNoVG9IdHRwKCkuZ2V0UmVxdWVzdCgpO1xuICAgIGNvbnN0IHVzZXJSb2xlID0gdGhpcy5wYXJzZVJlcXVlc3QocmVxKTtcbiAgICBpZiAoIXVzZXJSb2xlKSB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFwiVW5hdXRoZW50aWNhdGVkXCIpO1xuICAgIHJldHVybiB7IHVzZXI6IHVzZXJSb2xlLCByb2xlczogW3VzZXJSb2xlXSB9O1xuICB9XG59XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBEZWNhZkF1dGhIYW5kbGVyfSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICogVGhlIFwicm9sZVwiIHZhcmlhbnQgcHJldmlvdXNseSByZXR1cm5lZCByb2xlcyBmcm9tIGBhdXRob3JpemVgOyB3aXRoIHRoZSBiYXNlXG4gKiBjbGFzcyBub3cgb3JjaGVzdHJhdGluZyByb2xlIGNoZWNrcyBpbnRlcm5hbGx5LCB0aGUgdHdvIGNsYXNzZXMgYXJlIGVxdWl2YWxlbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWNhZlJvbGVBdXRoSGFuZGxlciBleHRlbmRzIERlY2FmQXV0aEhhbmRsZXIge31cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQVBQX0lOVEVSQ0VQVE9SIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi9BdXRoSW50ZXJjZXB0b3JcIjtcbmltcG9ydCB7IEFVVEhfSEFORExFUiB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQXV0aEhhbmRsZXIgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZBdXRoTW9kdWxlT3B0aW9ucyA9IHtcbiAgZ2xvYmFsPzogYm9vbGVhbjtcbiAgaGFuZGxlcj86IFR5cGU8QXV0aEhhbmRsZXI+O1xufTtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChcbiAgICBvcHRpb25zOiBEZWNhZkF1dGhNb2R1bGVPcHRpb25zID0ge31cbiAgKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgcHJvdmlkZXJzOiBEeW5hbWljTW9kdWxlW1wicHJvdmlkZXJzXCJdID0gW1xuICAgICAgQXV0aEludGVyY2VwdG9yLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5oYW5kbGVyKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChvcHRpb25zLmhhbmRsZXIpO1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBVVRIX0hBTkRMRVIsXG4gICAgICAgIHVzZUNsYXNzOiBvcHRpb25zLmhhbmRsZXIsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5nbG9iYWwpIHtcbiAgICAgIChwcm92aWRlcnMgYXMgYW55W10pLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUFBfSU5URVJDRVBUT1IsXG4gICAgICAgIHVzZUV4aXN0aW5nOiBBdXRoSW50ZXJjZXB0b3IsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkF1dGhNb2R1bGUsXG4gICAgICBnbG9iYWw6IG9wdGlvbnMuZ2xvYmFsID8/IGZhbHNlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0czogW0F1dGhJbnRlcmNlcHRvciwgQVVUSF9IQU5ETEVSXSxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIFNjb3BlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuaW1wb3J0IHsgdHlwZSBEZWNhZlJlcXVlc3RIYW5kbGVyIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUNBRl9IQU5ETEVSUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIGFsbCByZWdpc3RlcmVkIHtAbGluayBEZWNhZlJlcXVlc3RIYW5kbGVyfSBpbnN0YW5jZXMgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QsXG4gKiBwcm92aWRpbmcgdGhlbSB3aXRoIGEgc2hhcmVkIHtAbGluayBEZWNhZlJlcXVlc3RDb250ZXh0fS5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIG9yY2hlc3RyYXRpbmcgYW5kIGV4ZWN1dGluZ1xuICogYSBzZXF1ZW5jZSBvZiByZXF1ZXN0IGhhbmRsZXJzLiBFYWNoIGhhbmRsZXIgcmVjZWl2ZXMgdGhlIHNhbWUgcmVxdWVzdC1zY29wZWQgY29udGV4dCxcbiAqIGFsbG93aW5nIGNvb3JkaW5hdGVkIHByb2Nlc3Npbmcgc3VjaCBhcyBhdXRoZW50aWNhdGlvbiwgbWV0YWRhdGEgZXh0cmFjdGlvbiwgYXVkaXRpbmcsXG4gKiBhbmQgY3VzdG9tIHBpcGVsaW5lIGJlaGF2aW9yLiBIYW5kbGVycyBhcmUgaW5qZWN0ZWQgdmlhIHRoZSB7QGxpbmsgREVDQUZfSEFORExFUlN9IHRva2VuLFxuICogZW5zdXJpbmcgZXh0ZW5zaWJpbGl0eSBhbmQgbG9vc2UgY291cGxpbmcuXG4gKlxuICogQGNsYXNzIERlY2FmSGFuZGxlckV4ZWN1dG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBFeGFtcGxlIGhhbmRsZXI6XG4gKiBjbGFzcyBBdXRoSGFuZGxlciBpbXBsZW1lbnRzIERlY2FmUmVxdWVzdEhhbmRsZXIge1xuICogICBhc3luYyBoYW5kbGUoY29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCwgcmVxOiBSZXF1ZXN0KSB7XG4gKiAgICAgY29uc3QgdG9rZW4gPSByZXEuaGVhZGVyc1tcImF1dGhvcml6YXRpb25cIl07XG4gKiAgICAgY29uc3QgcmVzdWx0ID0gTXlTZXJ2aWNlLmRvU29tZXRoaW5nKHRva2VuKTtcbiAqICAgICBjb250ZXh0LnNldChcIm15LWtleVwiLCByZXN1bHQpO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gRXhlY3V0b3IgdXNhZ2UgaW4gYSByZXF1ZXN0OlxuICogYXdhaXQgZXhlY3V0b3IuZXhlYyhyZXF1ZXN0KTtcbiAqIC8vIEFsbCBoYW5kbGVycyB3aWxsIHJ1biBpbiBzZXF1ZW5jZVxuICogYGBgXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICAgIHBhcnRpY2lwYW50IEV4ZWN1dG9yXG4gKiAgICAgcGFydGljaXBhbnQgSGFuZGxlckFcbiAqICAgICBwYXJ0aWNpcGFudCBIYW5kbGVyQlxuICpcbiAqICAgICBDbGllbnQtPj5FeGVjdXRvcjogZXhlYyhyZXEpXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQTogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQS0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItPj5IYW5kbGVyQjogaGFuZGxlKGNvbnRleHQsIHJlcSlcbiAqICAgICBIYW5kbGVyQi0tPj5FeGVjdXRvcjogY29tcGxldGVkXG4gKiAgICAgRXhlY3V0b3ItLT4+Q2xpZW50OiBwcm9jZXNzaW5nIGZpbmlzaGVkXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZkhhbmRsZXJFeGVjdXRvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfSEFORExFUlMpIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnM6IERlY2FmUmVxdWVzdEhhbmRsZXJbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHRcbiAgKSB7fVxuXG4gIGFzeW5jIGV4ZWMocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSB7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZIYW5kbGVyRXhlY3V0b3IubmFtZSkuZm9yKHRoaXMuZXhlYyk7XG4gICAgbG9nLmRlYnVnKFxuICAgICAgYENPTlRFWFQgJHt0aGlzLmNvbnRleHQudXVpZH0gcnVubmluZyAke3RoaXMuaGFuZGxlcnMubGVuZ3RofSBoYW5kbGVycyBmb3IgcmVxdWVzdCAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgYXdhaXQgaGFuZGxlci5oYW5kbGUodGhpcy5jb250ZXh0LCByZXEsIHJlcyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIEV4ZWN1dGlvbkNvbnRleHQsXG4gIENhbGxIYW5kbGVyLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4vRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIGltcGxlbWVudHMgTmVzdEludGVyY2VwdG9yIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGN0eDogRGVjYWZSZXF1ZXN0Q29udGV4dCkge31cblxuICBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCByZXNwb25zZSA9IGNvbnRleHQuc3dpdGNoVG9IdHRwKCkuZ2V0UmVzcG9uc2UoKTtcblxuICAgIHJldHVybiBuZXh0LmhhbmRsZSgpLnBpcGUoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgcmVzcG9uc2UgPSB0aGlzLmN0eC50b1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHlwZSBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCB7IERlY2FmQ29udHJvbGxlciBhcyBIdHRwRGVjYWZDb250cm9sbGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItaHR0cC9zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIENvbnRleHQsXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwbyxcbiAgUmVwb3NpdG9yeSxcbiAgU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCwgdHlwZSBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5pbXBvcnQgeyBEZWNhZlNlcnZlckN0eCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3QvRGVjYWZSZXF1ZXN0Q29udGV4dFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGVjYWZDb250cm9sbGVyPFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIENPTlRFWFQgZXh0ZW5kcyBEZWNhZlNlcnZlckN0eCA9IERlY2FmU2VydmVyQ3R4LFxuPiBleHRlbmRzIEh0dHBEZWNhZkNvbnRyb2xsZXI8UmVxdWVzdCwgYW55LCBEZWNhZlJlcXVlc3RDb250ZXh0PiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xpZW50Q29udGV4dDogRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICBfbmFtZTogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGNsaWVudENvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWNhZk1vZGVsQ29udHJvbGxlcjxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+LFxuICBDIGV4dGVuZHMgRGVjYWZTZXJ2ZXJDdHggPSBEZWNhZlNlcnZlckN0eCxcbj4gZXh0ZW5kcyBEZWNhZkNvbnRyb2xsZXI8Qz4ge1xuICBwcml2YXRlIF9wZXJzaXN0ZW5jZT86IFJlcG88TT4gfCBNb2RlbFNlcnZpY2U8TT47XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSByZWFkb25seSBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIF9uYW1lOiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgX25hbWUpO1xuICB9XG5cbiAgYWJzdHJhY3QgZ2V0IGNsYXNzKCk6IE1vZGVsQ29uc3RydWN0b3I8TT47XG5cbiAgcGVyc2lzdGVuY2UoY3R4PzogQ29udGV4dDxhbnk+KTogUmVwbzxNPiB8IE1vZGVsU2VydmljZTxNPiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gU2VydmljZS5nZXQ8TW9kZWxTZXJ2aWNlPE0+Pih0aGlzLmNsYXNzKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gTW9kZWxTZXJ2aWNlLmdldFNlcnZpY2UoXG4gICAgICAgICAgICB0aGlzLmNsYXNzXG4gICAgICAgICAgKSBhcyBNb2RlbFNlcnZpY2U8TT47XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuX3BlcnNpc3RlbmNlID0gUmVwb3NpdG9yeS5mb3JNb2RlbCh0aGlzLmNsYXNzKSBhcyBSZXBvPE0+O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmNsaWVudENvbnRleHQudG9PdmVycmlkZXMoKTtcblxuICAgIHJldHVybiBjdHhcbiAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBSZXBvc2l0b3J5XG4gICAgICAgID8gdGhpcy5fcGVyc2lzdGVuY2Uub3ZlcnJpZGUob3ZlcnJpZGVzKVxuICAgICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlLmZvcihvdmVycmlkZXMpXG4gICAgICA6IHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuLi8uLi9vdmVycmlkZXMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyB0b1Bhc2NhbENhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiLi4vLi4vb3ZlcnJpZGVzL2NvbnN0YW50c1wiO1xuXG5jb25zdCBkdG9DYWNoZSA9IG5ldyBNYXA8XG4gIE9wZXJhdGlvbktleXMsXG4gIFdlYWtNYXA8Q29uc3RydWN0b3I8YW55PiwgQ29uc3RydWN0b3I8YW55Pj5cbj4oKTtcblxuLyoqXG4gKiBCdWlsZHMgYSBOZXN0L1N3YWdnZXIgRFRPIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbW9kZWwgYW5kIENSVUQgb3BlcmF0aW9uLlxuICpcbiAqIFJ1bGVzOlxuICogIC0gT25seSBDUkVBVEUgYW5kIFVQREFURSAoYW5kIHRoZWlyIGJ1bGsgdmFyaWFudHMpIHByb2R1Y2UgYSBEVE87XG4gKiAgICBhbGwgb3RoZXIgb3BlcmF0aW9ucyByZXR1cm4gdGhlIG9yaWdpbmFsIG1vZGVsIGNsYXNzIHVuY2hhbmdlZC5cbiAqICAtIEBnZW5lcmF0ZWQoKSBwcm9wZXJ0aWVzIChjcmVhdGVkQXQsIHVwZGF0ZWRBdCwgY3JlYXRlZEJ5LCB1cGRhdGVkQnksXG4gKiAgICB1dWlkLCB2ZXJzaW9uLCBAY29tcG9zZWQgcGtzLCDigKYpIGFyZSAqKm5ldmVyKiogZXhwb3NlZCBpbiBhbnkgRFRPLlxuICogIC0gVGhlIEBwaygpIHByb3BlcnR5OlxuICogICAgICDigKIgVVBEQVRFIOKAkyBhbHdheXMgaW5jbHVkZWQuXG4gKiAgICAgIOKAoiBDUkVBVEUgIOKAkyBpbmNsdWRlZCBvbmx5IHdoZW4gdGhlIHBrIGlzIE5PVCBhdXRvLWdlbmVyYXRlZFxuICogICAgICAgICAgICAgICAgICAoY2hlY2tlZCB2aWEgTW9kZWwucGtQcm9wcygpLmdlbmVyYXRlZCBBTkQgTW9kZWwuZ2VuZXJhdGVkKCkpLlxuICogIC0gUmVsYXRpb24gcHJvcGVydGllcyAoQG9uZVRvT25lLCBAb25lVG9NYW55LCDigKYpOlxuICogICAgICDigKIgQ1JFQVRFICDigJMgbmVzdGVkIGFzIER0b0ZvcihDUkVBVEUsIFJlbGF0ZWRNb2RlbCkuIFdoZW4gdGhlIHJlbGF0aW9uXG4gKiAgICAgICAgICAgICAgICAgIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UgKG1vZGVsIEEg4oaSIG1vZGVsIEIg4oaSIG1vZGVsIEEpLFxuICogICAgICAgICAgICAgICAgICB0aGUgYmFjay1yZWZlcmVuY2UgdXNlcyB0aGUgcmVsYXRlZCBtb2RlbCdzIFBLIHR5cGVcbiAqICAgICAgICAgICAgICAgICAgKHN0cmluZy9pbnRlZ2VyKSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVhayB0aGUgY3ljbGUuXG4gKiAgICAgIOKAoiBVUERBVEUgIOKAkyB1bmlvbiBvZiBEdG9Gb3IoVVBEQVRFLCBSZWxhdGVkTW9kZWwpICoqb3IqKiB0aGVcbiAqICAgICAgICAgICAgICAgICAgcmVsYXRlZCBtb2RlbCdzIHByaW1hcnkta2V5IHR5cGUgKHN0cmluZyAvIGludGVnZXIpLFxuICogICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgYSBTd2FnZ2VyIG9uZU9mLiBDaXJjdWxhciBiYWNrLXJlZmVyZW5jZXNcbiAqICAgICAgICAgICAgICAgICAgb21pdCB0aGUgRFRPICRyZWYgYW5kIG9ubHkgaW5jbHVkZSB0aGUgUEsgdHlwZS5cbiAqXG4gKiBNZXRhZGF0YS5wcm9wZXJ0aWVzKCkgbm93IHJldHVybnMgQUxMIHByb3BlcnRpZXMgYWNyb3NzIHRoZSBwcm90b3R5cGUgY2hhaW4sXG4gKiBzbyBEVE8gaW5oZXJpdGFuY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgZXZlcnkgRFRPIGlzIGEgZmxhdCBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIER0b0ZvcjxNIGV4dGVuZHMgTW9kZWw+KFxuICBvcDogT3BlcmF0aW9uS2V5cyxcbiAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICBzdGFjazogU2V0PENvbnN0cnVjdG9yPGFueT4+ID0gbmV3IFNldCgpXG4pOiBDb25zdHJ1Y3Rvcjxhbnk+IHtcbiAgaWYgKCFUcmFuc2FjdGlvbk9wZXJhdGlvbktleXMuaW5jbHVkZXMob3ApKSB7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBnZXREdG9DYWNoZShvcCk7XG4gIGNvbnN0IGNhY2hlZCA9IGNhY2hlLmdldChtb2RlbCk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgaXNVcGRhdGVPcCA9IFtcbiAgICBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICBCdWxrQ3J1ZE9wZXJhdGlvbktleXMuVVBEQVRFX0FMTCxcbiAgXS5pbmNsdWRlcyhvcCBhcyBhbnkpO1xuXG4gIGNsYXNzIER5bmFtaWNEVE8ge31cbiAgY2FjaGUuc2V0KG1vZGVsLCBEeW5hbWljRFRPKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRHluYW1pY0RUTywgXCJuYW1lXCIsIHtcbiAgICB2YWx1ZTogYCR7dG9QYXNjYWxDYXNlKG1vZGVsLm5hbWUpfSR7dG9QYXNjYWxDYXNlKG9wKX1EVE9gLFxuICB9KTtcblxuICBjb25zdCBwa1Byb3AgPSAoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gTW9kZWwucGsobW9kZWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0pKCk7XG5cbiAgY29uc3QgcGtQcm9wc01ldGFkYXRhID0gcGtQcm9wID8gTW9kZWwucGtQcm9wcyhtb2RlbCBhcyBhbnkpIDogdW5kZWZpbmVkO1xuICBjb25zdCBwa0Rlc2lnblR5cGUgPSBwa1Byb3BcbiAgICA/IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHBrUHJvcCBhcyBzdHJpbmcpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBrVHlwZUlzTnVtZXJpYyA9XG4gICAgcGtEZXNpZ25UeXBlID09PSBOdW1iZXIgfHwgcGtEZXNpZ25UeXBlID09PSBCaWdJbnQ7XG4gIGNvbnN0IHBrSXNHZW5lcmF0ZWQgPVxuICAgICEhcGtQcm9wc01ldGFkYXRhPy5nZW5lcmF0ZWQgfHxcbiAgICAocGtQcm9wXG4gICAgICA/IE1vZGVsLmdlbmVyYXRlZEJ5U2VxdWVuY2UobW9kZWwgYXMgYW55LCBwa1Byb3AgYXMgYW55KSB8fFxuICAgICAgICBpc1Byb3BlcnR5R2VuZXJhdGVkQWNyb3NzSW5oZXJpdGFuY2UobW9kZWwsIHBrUHJvcCBhcyBzdHJpbmcpIHx8XG4gICAgICAgIHBrVHlwZUlzTnVtZXJpY1xuICAgICAgOiBmYWxzZSk7XG5cbiAgY29uc3QgYWxsUHJvcHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoTWV0YWRhdGEucHJvcGVydGllcyhtb2RlbCkgfHwgW10pKTtcbiAgY29uc3QgcmVsYXRpb25zID0gbmV3IFNldDxzdHJpbmc+KChNb2RlbC5yZWxhdGlvbnMobW9kZWwpIGFzIHN0cmluZ1tdKSB8fCBbXSk7XG4gIGNvbnN0IHNjYWxhclByb3BzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBhbGxQcm9wcykge1xuICAgIGlmICghcHJvcCkgY29udGludWU7XG4gICAgaWYgKHJlbGF0aW9ucy5oYXMocHJvcCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKHByb3AgPT09IHBrUHJvcCAmJiAhaXNVcGRhdGVPcCAmJiBwa0lzR2VuZXJhdGVkKSBjb250aW51ZTtcbiAgICBpZiAocHJvcCAhPT0gcGtQcm9wICYmIGlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkpXG4gICAgICBjb250aW51ZTtcblxuICAgIHNjYWxhclByb3BzLnB1c2gocHJvcCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGFyUHJvcHMpIHtcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gZ2V0VmFsaWRhdGlvbkFjcm9zc0luaGVyaXRhbmNlKG1vZGVsLCBwcm9wKTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISF2YWxpZGF0aW9uPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuICAgIGNvbnN0IHR5cGVIaW50ID1cbiAgICAgIGdldFR5cGVBY3Jvc3NJbmhlcml0YW5jZShtb2RlbCwgcHJvcCkgPz9cbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBtb2RlbC5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0ge1xuICAgICAgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsXG4gICAgfTtcbiAgICBpZiAodHlwZUhpbnQpIGFwaU9wdGlvbnMudHlwZSA9IHR5cGVIaW50O1xuXG4gICAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHluYW1pY0RUTy5wcm90b3R5cGUsIHByb3ApO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgbW9kZWwucHJvdG90eXBlLCBwcm9wKSA/PyB0eXBlSGludDtcbiAgICBpZiAodHlwZW9mIGRlc2lnblR5cGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICAgICAgZGVzaWduVHlwZSxcbiAgICAgICAgRHluYW1pY0RUTy5wcm90b3R5cGUsXG4gICAgICAgIHByb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KER5bmFtaWNEVE8ucHJvdG90eXBlLCBwcm9wLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgZm9yIChjb25zdCByZWxhdGlvbiBvZiByZWxhdGlvbnMpIHtcbiAgICBjb25zdCByZWxhdGlvbk1ldGEgPSBNZXRhZGF0YS5yZWxhdGlvbnMobW9kZWwsIHJlbGF0aW9uIGFzIGFueSk7XG4gICAgaWYgKCFyZWxhdGlvbk1ldGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBNZXRhZGF0YSBmb3IgcmVsYXRpb24gJHtyZWxhdGlvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgbGV0IHJlbGF0aW9uVHlwZTogQ29uc3RydWN0b3I8YW55PiB8IHVuZGVmaW5lZCA9XG4gICAgICByZWxhdGlvbk1ldGEuY2xhc3MgYXMgQ29uc3RydWN0b3I8YW55PjtcbiAgICBpZiAodHlwZW9mIHJlbGF0aW9uVHlwZSA9PT0gXCJmdW5jdGlvblwiICYmICFyZWxhdGlvblR5cGUubmFtZSkge1xuICAgICAgcmVsYXRpb25UeXBlID0gKHJlbGF0aW9uVHlwZSBhcyBhbnkpKCk7XG4gICAgfVxuICAgIGlmICghcmVsYXRpb25UeXBlIHx8IHR5cGVvZiByZWxhdGlvblR5cGUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYFR5cGUgZm9yIHJlbGF0aW9uICR7cmVsYXRpb259IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBpZiAoIU1vZGVsLmdldChyZWxhdGlvblR5cGUubmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1ldGEgPSBNZXRhZGF0YS52YWxpZGF0aW9uRm9yKG1vZGVsLCByZWxhdGlvbiBhcyBhbnkpO1xuICAgIGNvbnN0IGlzQXJyYXkgPSAhIShtZXRhIGFzIGFueSk/LltWYWxpZGF0aW9uS2V5cy5MSVNUXTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gISEobWV0YSBhcyBhbnkpPy5bVmFsaWRhdGlvbktleXMuUkVRVUlSRURdO1xuXG4gICAgLy8gRGV0ZWN0IGNpcmN1bGFyIHJlZmVyZW5jZTogaWYgdGhlIHJlbGF0ZWQgbW9kZWwgaXMgYWxyZWFkeSBpbiB0aGVcbiAgICAvLyByZWN1cnNpb24gc3RhY2ssIHVzZSB0aGUgUEsgdHlwZSBpbnN0ZWFkIG9mIHRoZSBmdWxsIERUTyB0byBicmVha1xuICAgIC8vIHRoZSBjeWNsZS4gVGhpcyBwcmV2ZW50cyBAbmVzdGpzL3N3YWdnZXIncyBTY2hlbWFPYmplY3RGYWN0b3J5IGZyb21cbiAgICAvLyBpbmZpbml0ZWx5IHJlY3Vyc2luZyB3aGVuIGV4cGxvcmluZyB0aGUgc2NoZW1hcy5cbiAgICBjb25zdCBpc0NpcmN1bGFyID0gc3RhY2suaGFzKHJlbGF0aW9uVHlwZSk7XG5cbiAgICBpZiAoaXNDaXJjdWxhcikge1xuICAgICAgY29uc3QgcGtUeXBlTmFtZSA9IGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlKTtcbiAgICAgIGFkZFJlbGF0aW9uUGtSZWYoRHluYW1pY0RUTywgcmVsYXRpb24sIHBrVHlwZU5hbWUsIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb25EdG8gPSBEdG9Gb3Iob3AsIHJlbGF0aW9uVHlwZSwgbmV3IFNldChzdGFjaykuYWRkKG1vZGVsKSk7XG5cbiAgICBpZiAoaXNVcGRhdGVPcCkge1xuICAgICAgYWRkUmVsYXRpb25VcGRhdGUoXG4gICAgICAgIER5bmFtaWNEVE8sXG4gICAgICAgIHJlbGF0aW9uLFxuICAgICAgICByZWxhdGlvblR5cGUsXG4gICAgICAgIHJlbGF0aW9uRHRvLFxuICAgICAgICBpc0FycmF5LFxuICAgICAgICBpc1JlcXVpcmVkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRSZWxhdGlvbihEeW5hbWljRFRPLCByZWxhdGlvbiwgcmVsYXRpb25EdG8sIGlzQXJyYXksIGlzUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBEeW5hbWljRFRPO1xufVxuXG5mdW5jdGlvbiBhZGRSZWxhdGlvbihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcmVsYXRpb25EdG86IGFueSxcbiAgaXNBcnJheTogYm9vbGVhbixcbiAgaXNSZXF1aXJlZDogYm9vbGVhblxuKTogdm9pZCB7XG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IHtcbiAgICB0eXBlOiByZWxhdGlvbkR0byxcbiAgICByZXF1aXJlZDogaXNSZXF1aXJlZCxcbiAgICBpc0FycmF5LFxuICB9O1xuICBBcGlQcm9wZXJ0eShhcGlPcHRpb25zKShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uKTtcbiAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICBcImRlc2lnbjp0eXBlXCIsXG4gICAgaXNBcnJheSA/IEFycmF5IDogcmVsYXRpb25EdG8sXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkcyBhIHJlbGF0aW9uIHByb3BlcnR5IHRoYXQgdXNlcyB0aGUgUEsgdHlwZSAoc3RyaW5nL2ludGVnZXIpIGluc3RlYWQgb2ZcbiAqIGEgZnVsbCBEVE8gY2xhc3MuIFVzZWQgdG8gYnJlYWsgY2lyY3VsYXIgcmVmZXJlbmNlcyAoZS5nLiBDdXN0b21lciDihpIgT3JkZXIg4oaSIEN1c3RvbWVyKS5cbiAqL1xuZnVuY3Rpb24gYWRkUmVsYXRpb25Qa1JlZihcbiAgRHRvQ2xhc3M6IGFueSxcbiAgcmVsYXRpb246IHN0cmluZyxcbiAgcGtUeXBlTmFtZTogc3RyaW5nLFxuICBpc0FycmF5OiBib29sZWFuLFxuICBpc1JlcXVpcmVkOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgY29uc3QgYXBpT3B0aW9uczogUGFyYW1ldGVyczx0eXBlb2YgQXBpUHJvcGVydHk+WzBdID0gaXNBcnJheVxuICAgID8gKHsgdHlwZTogXCJhcnJheVwiLCBpdGVtczogeyB0eXBlOiBwa1R5cGVOYW1lIH0sIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogcGtUeXBlTmFtZSA9PT0gXCJpbnRlZ2VyXCIgPyBOdW1iZXIgOiBTdHJpbmcsIHJlcXVpcmVkOiBpc1JlcXVpcmVkIH0gYXMgYW55KTtcbiAgQXBpUHJvcGVydHkoYXBpT3B0aW9ucykoRHRvQ2xhc3MucHJvdG90eXBlLCByZWxhdGlvbik7XG4gIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgXCJkZXNpZ246dHlwZVwiLFxuICAgIGlzQXJyYXkgPyBBcnJheSA6IChwa1R5cGVOYW1lID09PSBcImludGVnZXJcIiA/IE51bWJlciA6IFN0cmluZyksXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFkZFJlbGF0aW9uVXBkYXRlKFxuICBEdG9DbGFzczogYW55LFxuICByZWxhdGlvbjogc3RyaW5nLFxuICByZWxhdGlvblR5cGU6IENvbnN0cnVjdG9yPGFueT4sXG4gIHJlbGF0aW9uRHRvOiBhbnksXG4gIGlzQXJyYXk6IGJvb2xlYW4sXG4gIGlzUmVxdWlyZWQ6IGJvb2xlYW5cbik6IHZvaWQge1xuICBjb25zdCBleHRyYU1vZGVscyA9XG4gICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9FWFRSQV9NT0RFTFMsIER0b0NsYXNzKSB8fCBbXTtcbiAgaWYgKCFleHRyYU1vZGVscy5pbmNsdWRlcyhyZWxhdGlvbkR0bykpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgREVDT1JBVE9SUy5BUElfRVhUUkFfTU9ERUxTLFxuICAgICAgWy4uLmV4dHJhTW9kZWxzLCByZWxhdGlvbkR0b10sXG4gICAgICBEdG9DbGFzc1xuICAgICk7XG4gIH1cblxuICBjb25zdCBkdG9SZWYgPSBgIy9jb21wb25lbnRzL3NjaGVtYXMvJHtyZWxhdGlvbkR0by5uYW1lfWA7XG4gIGNvbnN0IHBrVHlwZU5hbWUgPSBnZXRQa09wZW5BcGlUeXBlKHJlbGF0aW9uVHlwZSk7XG4gIGNvbnN0IG9uZU9mSXRlbXMgPSBbeyAkcmVmOiBkdG9SZWYgfSwgeyB0eXBlOiBwa1R5cGVOYW1lIH1dO1xuXG4gIGNvbnN0IGFwaU9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIEFwaVByb3BlcnR5PlswXSA9IGlzQXJyYXlcbiAgICA/ICh7IHR5cGU6IFwiYXJyYXlcIiwgcmVxdWlyZWQ6IGlzUmVxdWlyZWQsIG9uZU9mOiBvbmVPZkl0ZW1zIH0gYXMgYW55KVxuICAgIDogKHsgdHlwZTogT2JqZWN0LCByZXF1aXJlZDogaXNSZXF1aXJlZCwgb25lT2Y6IG9uZU9mSXRlbXMgfSBhcyBhbnkpO1xuXG4gIEFwaVByb3BlcnR5KGFwaU9wdGlvbnMpKER0b0NsYXNzLnByb3RvdHlwZSwgcmVsYXRpb24pO1xuICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgIFwiZGVzaWduOnR5cGVcIixcbiAgICBpc0FycmF5ID8gQXJyYXkgOiBPYmplY3QsXG4gICAgRHRvQ2xhc3MucHJvdG90eXBlLFxuICAgIHJlbGF0aW9uXG4gICk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEdG9DbGFzcy5wcm90b3R5cGUsIHJlbGF0aW9uLCB7XG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFBrT3BlbkFwaVR5cGUocmVsYXRpb25UeXBlOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwa1Byb3BzTWV0YWRhdGEgPSBNb2RlbC5wa1Byb3BzKHJlbGF0aW9uVHlwZSBhcyBhbnkpO1xuICAgIGNvbnN0IHBrVHlwZSA9IHBrUHJvcHNNZXRhZGF0YT8udHlwZTtcbiAgICBpZiAocGtUeXBlID09PSBOdW1iZXIgfHwgcGtUeXBlID09PSBCaWdJbnQpIHJldHVybiBcImludGVnZXJcIjtcbiAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQcm9wZXJ0eUdlbmVyYXRlZEFjcm9zc0luaGVyaXRhbmNlKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgcHJvcDogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgbGV0IGN1cnJlbnQ6IGFueSA9IG1vZGVsO1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBPYmplY3QgJiYgY3VycmVudCAhPT0gRnVuY3Rpb24pIHtcbiAgICBpZiAoTW9kZWwuZ2VuZXJhdGVkKGN1cnJlbnQsIHByb3AgYXMgYW55KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIHByb3A6IHN0cmluZ1xuKTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IE1ldGFkYXRhLnZhbGlkYXRpb25Gb3IoY3VycmVudCwgcHJvcCBhcyBhbnkpO1xuICAgIGlmICh2YWxpZGF0aW9uKSByZXR1cm4gdmFsaWRhdGlvbiBhcyBhbnk7XG4gICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UobW9kZWw6IENvbnN0cnVjdG9yPGFueT4sIHByb3A6IHN0cmluZyk6IGFueSB7XG4gIGxldCBjdXJyZW50OiBhbnkgPSBtb2RlbDtcbiAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPT0gT2JqZWN0ICYmIGN1cnJlbnQgIT09IEZ1bmN0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IE1ldGFkYXRhLnR5cGUoY3VycmVudCwgcHJvcCk7XG4gICAgaWYgKHR5cGUpIHJldHVybiB0eXBlO1xuICAgIGN1cnJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RHRvQ2FjaGUoXG4gIG9wOiBPcGVyYXRpb25LZXlzXG4pOiBXZWFrTWFwPENvbnN0cnVjdG9yPGFueT4sIENvbnN0cnVjdG9yPGFueT4+IHtcbiAgaWYgKCFkdG9DYWNoZS5oYXMob3ApKSB7XG4gICAgZHRvQ2FjaGUuc2V0KG9wLCBuZXcgV2Vha01hcCgpKTtcbiAgfVxuICByZXR1cm4gZHRvQ2FjaGUuZ2V0KG9wKSE7XG59XG4iLCJpbXBvcnQgeyBDb25zdHJ1Y3RvciwgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFJlcXVlc3RUb0NvbnRleHRUcmFuc2Zvcm1lciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBDb250ZXh0T2YsIENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcblxuKEFkYXB0ZXIgYXMgYW55KS50cmFuc2Zvcm1lckZvciA9IGZ1bmN0aW9uIHRvQ29udGV4dEZsYWdzPFxuICBBIGV4dGVuZHMgQWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+LFxuPihhZGFwdGVyOiBBIHwgc3RyaW5nKTogQ29uc3RydWN0b3I8UmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyPENvbnRleHRPZjxBPj4+IHtcbiAgY29uc3QgYWxpYXMgPVxuICAgIHR5cGVvZiBhZGFwdGVyID09PSBcInN0cmluZ1wiID8gYWRhcHRlciA6IChhZGFwdGVyLmFsaWFzIGFzIHN0cmluZyk7XG4gIHJldHVybiBNZXRhZGF0YVtcImlubmVyR2V0XCJdKFN5bWJvbC5mb3IoXCJ0cmFuc2Zvcm1lcnNcIiksIGFsaWFzKTtcbn0uYmluZChBZGFwdGVyKTtcblxuKEFkYXB0ZXIgYXMgYW55KS5mbGF2b3Vyc1RvVHJhbnNmb3JtID0gZnVuY3Rpb24gcmVxdWVzdFRyYW5zZm9ybWVycygpOlxuICB8IHN0cmluZ1tdXG4gIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWV0YSA9IE1ldGFkYXRhW1wiaW5uZXJHZXRcIl0oU3ltYm9sLmZvcihcInRyYW5zZm9ybWVyc1wiKSk7XG4gIGlmICghbWV0YSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldGEpO1xufS5iaW5kKEFkYXB0ZXIpO1xuXG4oQ29udGV4dCBhcyBhbnkpLnByb3RvdHlwZS50b1Jlc3BvbnNlID0gZnVuY3Rpb24gdG9SZXNwb25zZTxcbiAgUkVTIGV4dGVuZHMgeyBoZWFkZXI6IGFueSB9LFxuPih0aGlzOiBDb250ZXh0LCByZXM6IFJFUyk6IFJFUyB7XG4gIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmcoKTtcbiAgaWYgKHBlbmRpbmcpIHJlcy5oZWFkZXIoXCJ4LXBlbmRpbmctdGFza1wiLCBKU09OLnN0cmluZ2lmeShwZW5kaW5nKSk7XG4gIHJldHVybiByZXM7XG59O1xuIiwiaW1wb3J0IFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxCdWlsZGVyIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gXCIuLi9kZWNhZi1tb2RlbC9kZWNvcmF0b3JzL2RlY29yYXRvcnNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9kZWxCdWlsZGVyPE0+IHtcbiAgICBBdXRoKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcik6IE1vZGVsQnVpbGRlcjxNPjtcbiAgICBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpOiBNb2RlbEJ1aWxkZXI8TT47XG4gIH1cbn1cblxuY29uc3QgcHJvdG90eXBlID0gTW9kZWxCdWlsZGVyLnByb3RvdHlwZSBhcyBNb2RlbEJ1aWxkZXI8YW55PiAmIHtcbiAgQXV0aDogKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcikgPT4gTW9kZWxCdWlsZGVyPGFueT47XG59O1xuXG5pZiAoIXByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzKSB7XG4gIHByb3RvdHlwZS5kZWNvcmF0ZUNsYXNzID0gZnVuY3Rpb24gKGRlY29yYXRvcjogQ2xhc3NEZWNvcmF0b3IpIHtcbiAgICBpZiAoISh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycykge1xuICAgICAgKHRoaXMgYXMgYW55KS5fY2xhc3NEZWNvcmF0b3JzID0gW107XG4gICAgfVxuICAgICh0aGlzIGFzIGFueSkuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG59XG5cbnByb3RvdHlwZS5BdXRoID0gZnVuY3Rpb24gKG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcikge1xuICByZXR1cm4gdGhpcy5kZWNvcmF0ZUNsYXNzKEF1dGgobW9kZWwpKTtcbn07XG5cbmlmICghKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0KSB7XG4gIGNvbnN0IG9yaWdpbmFsQnVpbGQgPSBwcm90b3R5cGUuYnVpbGQ7XG4gIHByb3RvdHlwZS5idWlsZCA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVzdWx0ID0gb3JpZ2luYWxCdWlsZC5jYWxsKHRoaXMpO1xuICAgIGNvbnN0IGRlY29yYXRvcnMgPSAodGhpcyBhcyBhbnkpLl9jbGFzc0RlY29yYXRvcnM7XG4gICAgaWYgKGRlY29yYXRvcnM/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3IocmVzdWx0IGFzIGFueSkgYXMgdHlwZW9mIHJlc3VsdCB8IHZvaWQ7XG4gICAgICAgIGlmIChkZWNvcmF0ZWQpIHtcbiAgICAgICAgICByZXN1bHQgPSBkZWNvcmF0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgKHByb3RvdHlwZSBhcyBhbnkpLl9faGFzQ2xhc3NEZWNvcmF0b3JTdXBwb3J0ID0gdHJ1ZTtcbn1cbiIsImltcG9ydCB7XG4gIENvbnRyb2xsZXIsXG4gIFBhcmFtLFxuICBRdWVyeSxcbiAgUmVzcG9uc2UsXG4gIFNldE1ldGFkYXRhLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7XG4gIEFwaUJhZFJlcXVlc3RSZXNwb25zZSxcbiAgQXBpQm9keSxcbiAgQXBpQ3JlYXRlZFJlc3BvbnNlLFxuICBBcGlFeHRyYU1vZGVscyxcbiAgQXBpTm9Db250ZW50UmVzcG9uc2UsXG4gIEFwaU5vdEZvdW5kUmVzcG9uc2UsXG4gIEFwaU9rUmVzcG9uc2UsXG4gIEFwaU9wZXJhdGlvbixcbiAgQXBpUGFyYW0sXG4gIEFwaVF1ZXJ5LFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7XG4gIE1vZGVsU2VydmljZSxcbiAgT3JkZXJEaXJlY3Rpb24sXG4gIFBlcnNpc3RlbmNlS2V5cyxcbiAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLFxuICB0eXBlIFJlcG8sXG4gIFJlcG9zaXRvcnksXG4gIFNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCB0b0tlYmFiQ2FzZSB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgREJLZXlzLFxuICBCYXNlRXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwsXG4gIEFwaVBhcmFtc0Zyb21Nb2RlbCxcbiAgdHlwZSBEZWNhZkFwaVByb3BlcnR5LFxuICBEZWNhZkJvZHksXG4gIERlY2FmUXVlcnksXG59IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEh0dHBWZXJiVG9EZWNvcmF0b3IgfSBmcm9tIFwiLi9kZWNvcmF0b3JzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEh0dHBWZXJicyB9IGZyb20gXCIuL2RlY29yYXRvcnMvdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgREVDQUZfQ09OVFJPTExFUl9DT05GSUcsIERFQ0FGX1JPVVRFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgU0tJUF9NT0RFTF9ST0xFU19LRVkgfSBmcm9tIFwiLi4vYXV0aC9jb25zdGFudHNcIjtcbmltcG9ydCB7IEF1dGgsIFB1YmxpYywgUmVxdWlyZVJvbGVzIH0gZnJvbSBcIi4uL2F1dGgvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgQ29udHJvbGxlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmTW9kZWxDb250cm9sbGVyIH0gZnJvbSBcIi4uL2NvbnRyb2xsZXJzXCI7XG5pbXBvcnQgeyBEdG9Gb3IgfSBmcm9tIFwiLi4vZmFjdG9yeS9vcGVuYXBpL0R0b0J1aWxkZXJcIjtcbmltcG9ydCBcIi4uL292ZXJyaWRlc1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxDb250cm9sbGVyRmFjdG9yeSxcbiAgdHlwZSBNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnLFxuICB0eXBlIEF1dGhDb25maWcsXG4gIHR5cGUgU2VydmVyUm91dGUsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBGcm9tTW9kZWxDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nID0gTG9nZ2luZy5mb3IoRnJvbU1vZGVsQ29udHJvbGxlci5uYW1lKTtcblxuICBwcml2YXRlIHN0YXRpYyB0b0RlY2FmRXJyb3IoXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgZmFsbGJhY2tNZXNzYWdlOiBzdHJpbmdcbiAgKTogQmFzZUVycm9yIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgID8gYCR7ZmFsbGJhY2tNZXNzYWdlfTogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgOiBmYWxsYmFja01lc3NhZ2VcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGdldFBlcnNpc3RlbmNlPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiBSZXBvPFQ+IHwgTW9kZWxTZXJ2aWNlPFQ+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFNlcnZpY2UuZ2V0PE1vZGVsU2VydmljZTxUPj4oTW9kZWxDbGF6eik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsU2VydmljZS5nZXRTZXJ2aWNlKE1vZGVsQ2xhenopIGFzIE1vZGVsU2VydmljZTxUPjtcbiAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBSZXBvc2l0b3J5LmZvck1vZGVsKE1vZGVsQ2xhenopIGFzIFJlcG88VD47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVF1ZXJ5Um91dGVzRnJvbVJlcG9zaXRvcnk8VCBleHRlbmRzIE1vZGVsPGJvb2xlYW4+PihcbiAgICBwZXJzaXN0ZW5jZTogUmVwbzxUPiB8IE1vZGVsU2VydmljZTxUPixcbiAgICBwcmVmaXg6IHN0cmluZyA9IFBlcnNpc3RlbmNlS2V5cy5RVUVSWVxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IHJlcG86IFJlcG88VD4gPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG4gICAgY29uc3QgcXVlcnlNZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCB7IGZpZWxkcz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH0+ID1cbiAgICAgIE1ldGFkYXRhLmdldChcbiAgICAgICAgcmVwby5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KFBlcnNpc3RlbmNlS2V5cy5RVUVSWSlcbiAgICAgICkgPz8ge307XG5cbiAgICBjb25zdCByb3V0ZU1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgTWV0YWRhdGEuZ2V0KFxuICAgICAgICBwZXJzaXN0ZW5jZS5jb25zdHJ1Y3RvciBhcyBDb25zdHJ1Y3RvcixcbiAgICAgICAgTWV0YWRhdGEua2V5KERFQ0FGX1JPVVRFKVxuICAgICAgKSA/PyB7fTtcblxuICAgIGNsYXNzIFF1ZXJ5Q29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJNZXRob2Qgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0cnVjdG9yKGNsaWVudENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsIG5hbWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcihjbGllbnRDb250ZXh0LCBuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBwYXJhbXNdIG9mIE9iamVjdC5lbnRyaWVzKHJvdXRlTWV0aG9kcykpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IFtwYXJhbXMucGF0aC5yZXBsYWNlKC9eXFwvK3xcXC8rJC9nLCBcIlwiKV1cbiAgICAgICAgLmZpbHRlcigoc2VnbWVudDogc3RyaW5nKSA9PiBzZWdtZW50ICYmIHNlZ21lbnQudHJpbSgpKVxuICAgICAgICAuam9pbihcIi9cIik7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZUNvbXBsZXhRdWVyeUhhbmRsZXIoXG4gICAgICAgIG1ldGhvZE5hbWVcbiAgICAgICkgYXMgYW55O1xuICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWZpbmVNZXRob2QoUXVlcnlDb250cm9sbGVyLCBtZXRob2ROYW1lLCBoYW5kbGVyKTtcblxuICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3IocGFyYW1zLmh0dHBNZXRob2QgYXMgSHR0cFZlcmJzKShcbiAgICAgICAgcm91dGVQYXRoIHx8IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFF1ZXJ5RGVjb3JhdG9ycyhcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcm91dGVQYXRoLFxuICAgICAgICBwYXJhbXMuaHR0cE1ldGhvZFxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgb2JqVmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeU1ldGhvZHMpKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBvYmpWYWx1ZXMuZmllbGRzID8/IFtdO1xuICAgICAgY29uc3Qgcm91dGVQYXRoID0gW3ByZWZpeCwgbWV0aG9kTmFtZSwgLi4uZmllbGRzLm1hcCgoZikgPT4gYDoke2Z9YCldXG4gICAgICAgIC5maWx0ZXIoKHNlZ21lbnQpID0+IHNlZ21lbnQgJiYgc2VnbWVudC50cmltKCkpXG4gICAgICAgIC5qb2luKFwiL1wiKTtcblxuICAgICAgY29uc3QgaGFuZGxlciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ29tcGxleFF1ZXJ5SGFuZGxlcihcbiAgICAgICAgbWV0aG9kTmFtZVxuICAgICAgKSBhcyBhbnk7XG4gICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlZmluZU1ldGhvZChRdWVyeUNvbnRyb2xsZXIsIG1ldGhvZE5hbWUsIGhhbmRsZXIpO1xuXG4gICAgICBjb25zdCBodHRwRGVjb3JhdG9yID0gSHR0cFZlcmJUb0RlY29yYXRvcihcIkdFVFwiIGFzIEh0dHBWZXJicykoXG4gICAgICAgIHJvdXRlUGF0aCB8fCB1bmRlZmluZWRcbiAgICAgICk7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgIHJvdXRlUGF0aCxcbiAgICAgICAgXCJHRVRcIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYXBwbHlEZWNvcmF0b3JzKFF1ZXJ5Q29udHJvbGxlciwgbWV0aG9kTmFtZSwgW1xuICAgICAgICBodHRwRGVjb3JhdG9yLFxuICAgICAgICAuLi5kZWNvcmF0b3JzLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1ZXJ5Q29udHJvbGxlcjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGU8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPFQ+LFxuICAgIG1vZHVsZUNvbmZpZ092ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWc+LFxuICAgIGdsb2JhbERlZmF1bHRzPzogUGFydGlhbDxNb2RlbENvbnRyb2xsZXJGYWN0b3J5Q29uZmlnPlxuICApOiBDb250cm9sbGVyQ29uc3RydWN0b3I8VD4ge1xuICAgIGNvbnN0IGxvZyA9IEZyb21Nb2RlbENvbnRyb2xsZXIubG9nLmZvcihGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZSk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gTW9kZWwudGFibGVOYW1lKE1vZGVsQ29uc3RyKTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDb25zdHIubmFtZTtcbiAgICBjb25zdCBwZXJzaXN0ZW5jZSA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZ2V0UGVyc2lzdGVuY2UoTW9kZWxDb25zdHIpO1xuXG4gICAgLy8gV2hlbiBwZXJzaXN0ZW5jZSBpcyBhIE1vZGVsU2VydmljZSwgdGhlIEBxdWVyeS9Acm91dGUgbWV0YWRhdGEgbGl2ZXMgb25cbiAgICAvLyB0aGUgdW5kZXJseWluZyByZXBvc2l0b3J5IGNsYXNzIChjdXN0b20gcmVwbyksIG5vdCBvbiBNb2RlbFNlcnZpY2UgaXRzZWxmLlxuICAgIC8vIFBhc3MgdGhlIHJlcG8gdG8gdGhlIGZhY3Rvcnkgc28gYWRkQ29tcGxleFF1ZXJpZXMoKSBjYW4gZGlzY292ZXIgdGhlbS5cbiAgICBjb25zdCBmYWN0b3J5UGVyc2lzdGVuY2UgPVxuICAgICAgcGVyc2lzdGVuY2UgaW5zdGFuY2VvZiBNb2RlbFNlcnZpY2UgPyBwZXJzaXN0ZW5jZS5yZXBvIDogcGVyc2lzdGVuY2U7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JDb25maWcgPSBNZXRhZGF0YS5nZXQoXG4gICAgICBNb2RlbENvbnN0cixcbiAgICAgIE1ldGFkYXRhLmtleShERUNBRl9DT05UUk9MTEVSX0NPTkZJRylcbiAgICApIGFzIE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbW9kdWxlT3ZlcnJpZGUgPSBtb2R1bGVDb25maWdPdmVycmlkZXM/LltNb2RlbENvbnN0ci5uYW1lXTtcbiAgICBjb25zdCBtZXJnZWRDb25maWc6IE1vZGVsQ29udHJvbGxlckZhY3RvcnlDb25maWcgPSB7XG4gICAgICAuLi4oZ2xvYmFsRGVmYXVsdHMgfHwge30pLFxuICAgICAgLi4uKGRlY29yYXRvckNvbmZpZyB8fCB7fSksXG4gICAgICAuLi4obW9kdWxlT3ZlcnJpZGUgfHwge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBGYWN0b3J5Q29udHJvbGxlciA9IE1vZGVsQ29udHJvbGxlckZhY3RvcnkuY3JlYXRlPFQ+KFxuICAgICAgTW9kZWxDb25zdHIsXG4gICAgICBmYWN0b3J5UGVyc2lzdGVuY2UsXG4gICAgICBtZXJnZWRDb25maWdcbiAgICApO1xuICAgIGNvbnN0IGZhY3RvcnlSb3V0ZXMgPSAoRmFjdG9yeUNvbnRyb2xsZXIgYXMgYW55KS5fX3JvdXRlc19fIGFzXG4gICAgICB8IFNlcnZlclJvdXRlW11cbiAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qge1xuICAgICAgZ2V0UEssXG4gICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgcGF0aDogcGtQYXRoLFxuICAgIH0gPSBGcm9tTW9kZWxDb250cm9sbGVyLmdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbChNb2RlbENvbnN0cik7XG5cbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ3JlYXRpbmcgY29udHJvbGxlciBmb3IgbW9kZWw6ICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggJHtmYWN0b3J5Um91dGVzPy5sZW5ndGggPz8gMH0gZmFjdG9yeSByb3V0ZXNgXG4gICAgKTtcblxuICAgIGNvbnN0IGF1dGhDb25maWc6IEF1dGhDb25maWcgfCB1bmRlZmluZWQgPSBtZXJnZWRDb25maWcuYXV0aDtcblxuICAgIGZ1bmN0aW9uIGFwcGx5Q2xhc3NBdXRoKHRhcmdldDogYW55KSB7XG4gICAgICBpZiAoYXV0aENvbmZpZz8ucHVibGljKSB7XG4gICAgICAgIFB1YmxpYygpKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGF1dGhDb25maWc/LnJvbGVzPy5sZW5ndGgpIHtcbiAgICAgICAgUmVxdWlyZVJvbGVzKC4uLmF1dGhDb25maWcucm9sZXMpKHRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBBdXRoKE1vZGVsQ29uc3RyKSh0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dGhDb25maWc/LnNraXBNb2RlbFJvbGVzKSB7XG4gICAgICAgIFNldE1ldGFkYXRhKFNLSVBfTU9ERUxfUk9MRVNfS0VZLCB0cnVlKSh0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDb25zdHIpXG4gICAgY2xhc3MgRHluYW1pY01vZGVsQ29udHJvbGxlciBleHRlbmRzIERlY2FmTW9kZWxDb250cm9sbGVyPFQ+IHtcbiAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGs6IHN0cmluZyA9IE1vZGVsLnBrKE1vZGVsQ29uc3RyKSBhcyBzdHJpbmc7XG5cbiAgICAgIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGNsYXNzKCkge1xuICAgICAgICByZXR1cm4gTW9kZWxDb25zdHI7XG4gICAgICB9XG5cbiAgICAgIG92ZXJyaWRlIGdldCBjbGFzcygpOiBNb2RlbENvbnN0cnVjdG9yPFQ+IHtcbiAgICAgICAgcmV0dXJuIE1vZGVsQ29uc3RyO1xuICAgICAgfVxuXG4gICAgICBjb25zdHJ1Y3RvcihjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIHN1cGVyKGNsaWVudENvbnRleHQsIER5bmFtaWNNb2RlbENvbnRyb2xsZXIubmFtZSk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke3RoaXMuY2xhc3MubmFtZX0gcm91dGU6IC8ke3JvdXRlUGF0aH1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlDbGFzc0F1dGgoRHluYW1pY01vZGVsQ29udHJvbGxlcik7XG5cbiAgICBpZiAoZmFjdG9yeVJvdXRlcykge1xuICAgICAgY29uc3Qgc29ydGVkUm91dGVzID0gWy4uLmZhY3RvcnlSb3V0ZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYVNlZ21lbnRzID0gYS5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGNvbnN0IGJTZWdtZW50cyA9IGIucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBjb25zdCBhUGFyYW1Db3VudCA9IGFTZWdtZW50cy5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYlBhcmFtQ291bnQgPSBiU2VnbWVudHMuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGFMaXRlcmFsQ291bnQgPSBhU2VnbWVudHMubGVuZ3RoIC0gYVBhcmFtQ291bnQ7XG4gICAgICAgIGNvbnN0IGJMaXRlcmFsQ291bnQgPSBiU2VnbWVudHMubGVuZ3RoIC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIGlmIChhTGl0ZXJhbENvdW50ICE9PSBiTGl0ZXJhbENvdW50KVxuICAgICAgICAgIHJldHVybiBiTGl0ZXJhbENvdW50IC0gYUxpdGVyYWxDb3VudDtcbiAgICAgICAgaWYgKGFQYXJhbUNvdW50ICE9PSBiUGFyYW1Db3VudCkgcmV0dXJuIGFQYXJhbUNvdW50IC0gYlBhcmFtQ291bnQ7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc29ydGVkUm91dGVzKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPVxuICAgICAgICAgIHJvdXRlLmltcGxlbWVudGF0aW9uPy5uYW1lIHx8IHJvdXRlLm1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCByZWdpc3RyYXRpb24gPSBGcm9tTW9kZWxDb250cm9sbGVyLm1hdGNoUm91dGUoXG4gICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICBwa1BhdGgsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBnZXRQSyxcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlZ2lzdHJhdGlvbikgY29udGludWU7XG5cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1ldGhvZE5hbWU6IHJlZ2lzdGVyZWRNZXRob2ROYW1lLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgZGVjb3JhdG9ycyxcbiAgICAgICAgICBwYXJhbURlY29yYXRvcnMsXG4gICAgICAgIH0gPSByZWdpc3RyYXRpb247XG5cbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IEZyb21Nb2RlbENvbnRyb2xsZXIuZGVmaW5lTWV0aG9kKFxuICAgICAgICAgIER5bmFtaWNNb2RlbENvbnRyb2xsZXIsXG4gICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgaGFuZGxlclxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICAgICAgY29uc3QgaHR0cERlY29yYXRvciA9IEh0dHBWZXJiVG9EZWNvcmF0b3Iocm91dGUubWV0aG9kIGFzIEh0dHBWZXJicykoXG4gICAgICAgICAgICByb3V0ZS5wYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICk7XG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5hcHBseURlY29yYXRvcnMoXG4gICAgICAgICAgICBEeW5hbWljTW9kZWxDb250cm9sbGVyLFxuICAgICAgICAgICAgcmVnaXN0ZXJlZE1ldGhvZE5hbWUsXG4gICAgICAgICAgICBbaHR0cERlY29yYXRvciwgLi4uZGVjb3JhdG9yc10sXG4gICAgICAgICAgICBwYXJhbURlY29yYXRvcnNcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIER5bmFtaWNNb2RlbENvbnRyb2xsZXIgYXMgYW55O1xuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbDxUIGV4dGVuZHMgTW9kZWw8YW55Pj4oXG4gICAgTW9kZWxDbGF6ejogTW9kZWxDb25zdHJ1Y3RvcjxUPlxuICApOiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgYXBpUHJvcGVydGllczogRGVjYWZBcGlQcm9wZXJ0eVtdO1xuICAgIGdldFBLOiAoLi4ucGFyYW1zOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmc7XG4gIH0ge1xuICAgIGNvbnN0IHBrID0gTW9kZWwucGsoTW9kZWxDbGF6eikgYXMga2V5b2YgTW9kZWw8YW55PjtcbiAgICBjb25zdCBjb21wb3NlZCA9IE1ldGFkYXRhLmdldChcbiAgICAgIE1vZGVsQ2xhenosXG4gICAgICBNZXRhZGF0YS5rZXkoREJLZXlzLkNPTVBPU0VELCBwaylcbiAgICApO1xuICAgIGNvbnN0IGNvbXBvc2VkS2V5cyA9IGNvbXBvc2VkPy5hcmdzID8/IFtdO1xuXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9XG4gICAgICBBcnJheS5pc0FycmF5KGNvbXBvc2VkS2V5cykgJiYgY29tcG9zZWRLZXlzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBBcnJheS5mcm9tKG5ldyBTZXQoWy4uLmNvbXBvc2VkS2V5c10pKVxuICAgICAgICA6IEFycmF5LmZyb20obmV3IFNldChbcGtdKSk7XG5cbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenopID8/IFwiXCI7XG4gICAgY29uc3QgcGF0aCA9IGA6JHt1bmlxdWVLZXlzLmpvaW4oXCIvOlwiKX1gO1xuICAgIGNvbnN0IGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSA9IHVuaXF1ZUtleXMubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgZGVzY3JpcHRpb246IE1ldGFkYXRhLmRlc2NyaXB0aW9uKE1vZGVsQ2xhenosIGtleSksXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGFwaVByb3BlcnRpZXMsXG4gICAgICBnZXRQSzogKC4uLnBhcmFtczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPikgPT5cbiAgICAgICAgY29tcG9zZWQ/LnNlcGFyYXRvciA/IHBhcmFtcy5qb2luKGNvbXBvc2VkLnNlcGFyYXRvcikgOiBwYXJhbXMuam9pbihcIlwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcm91dGVQYXJhbURlY29yYXRvcnMoXG4gICAgcGF0aDogc3RyaW5nXG4gICk6IEFycmF5PHsgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7IGluZGV4OiBudW1iZXIgfT4ge1xuICAgIGxldCBwYXJhbUluZGV4ID0gMDtcbiAgICByZXR1cm4gcGF0aFxuICAgICAgLnNwbGl0KFwiL1wiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZsYXRNYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIjpcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQuc3RhcnRzV2l0aChcIipcIikpIHtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IFBhcmFtKHNlZ21lbnQuc2xpY2UoMSkpIGFzIGFueSwgaW5kZXg6IHBhcmFtSW5kZXgrKyB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWZpbmVNZXRob2QoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gICk6IFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldC5wcm90b3R5cGUgfHwgdGFyZ2V0LCBtZXRob2ROYW1lLCB7XG4gICAgICB2YWx1ZTogaGFuZGxlcixcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICB0YXJnZXQucHJvdG90eXBlIHx8IHRhcmdldCxcbiAgICAgIG1ldGhvZE5hbWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYXBwbHlEZWNvcmF0b3JzKFxuICAgIHRhcmdldDogYW55LFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBtZXRob2REZWNvcmF0b3JzOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+LFxuICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgZGVjb3JhdG9yOiBQYXJhbWV0ZXJEZWNvcmF0b3I7XG4gICAgICBpbmRleDogbnVtYmVyO1xuICAgIH0+ID0gW11cbiAgKSB7XG4gICAgY29uc3QgcHJvdG8gPSB0YXJnZXQ/LnByb3RvdHlwZSA/PyB0YXJnZXQ7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG1ldGhvZE5hbWUpO1xuICAgIG1ldGhvZERlY29yYXRvcnMuZm9yRWFjaCgoZCkgPT4gZChwcm90bywgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcikpO1xuICAgIHBhcmFtRGVjb3JhdG9ycy5mb3JFYWNoKCh7IGRlY29yYXRvciwgaW5kZXggfSkgPT5cbiAgICAgIGRlY29yYXRvcihwcm90bywgbWV0aG9kTmFtZSwgaW5kZXgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG1hdGNoUm91dGUoXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIHJvdXRlOiBTZXJ2ZXJSb3V0ZSxcbiAgICBwa1BhdGg6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgZ2V0UEs6ICguLi5wOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+KSA9PiBzdHJpbmcsXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6XG4gICAgfCB7XG4gICAgICAgIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgICAgICAgaGFuZGxlcjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk7XG4gICAgICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD47XG4gICAgICAgIHBhcmFtRGVjb3JhdG9yczogQXJyYXk8e1xuICAgICAgICAgIGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yO1xuICAgICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIH0+O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB7IG1ldGhvZCwgcGF0aCB9ID0gcm91dGU7XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLnJlcGxhY2UoL15cXC8rfFxcLyskL2csIFwiXCIpO1xuICAgIGNvbnN0IGhhbmRsZXIgPSByb3V0ZS5pbXBsZW1lbnRhdGlvbiBhcyAoLi4uYXJnczogYW55W10pID0+IGFueTtcblxuICAgIGlmIChtZXRob2QgPT09IFwiUE9TVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICB7IGRlY29yYXRvcjogUmVzcG9uc2UoeyBwYXNzdGhyb3VnaDogdHJ1ZSB9KSBhcyBhbnksIGluZGV4OiAxIH0sXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQT1NUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwiY3JlYXRlQWxsXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuYnVsa0NyZWF0ZURlY29yYXRvcnMoTW9kZWxDb25zdHIsIG1vZGVsQ2xhenpOYW1lKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZkJvZHkoKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiYnVsa1wiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwicmVhZEFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtSZWFkRGVjb3JhdG9ycyhNb2RlbENvbnN0ciwgbW9kZWxDbGF6ek5hbWUpLFxuICAgICAgICBbeyBkZWNvcmF0b3I6IFF1ZXJ5KFwiaWRzXCIpIGFzIGFueSwgaW5kZXg6IDAgfV1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJQVVRcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gXCJidWxrXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJ1cGRhdGVBbGxcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5idWxrVXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzXG4gICAgICAgICksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogRGVjYWZCb2R5KCkgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBSZXNwb25zZSh7IHBhc3N0aHJvdWdoOiB0cnVlIH0pIGFzIGFueSwgaW5kZXg6IDEgfSxcbiAgICAgICAgXVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcImJ1bGtcIikge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZUFsbFwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIGFwaVByb3BlcnRpZXNcbiAgICAgICAgKSxcbiAgICAgICAgW1xuICAgICAgICAgIHsgZGVjb3JhdG9yOiBRdWVyeShcImlkc1wiKSBhcyBhbnksIGluZGV4OiAwIH0sXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IFJlc3BvbnNlKHsgcGFzc3Rocm91Z2g6IHRydWUgfSkgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IHBrUGF0aCkge1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcInJlYWRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IHJvdXRlUGFyYW1zID1cbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yb3V0ZVBhcmFtRGVjb3JhdG9ycyhub3JtYWxpemVkUGF0aCk7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIFwidXBkYXRlXCIsXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIudXBkYXRlRGVjb3JhdG9ycyhcbiAgICAgICAgICBNb2RlbENvbnN0cixcbiAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICBhcGlQcm9wZXJ0aWVzLFxuICAgICAgICAgIHBrUGF0aFxuICAgICAgICApLFxuICAgICAgICBbXG4gICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAuLi5yb3V0ZVBhcmFtcy5tYXAoKHsgZGVjb3JhdG9yLCBpbmRleCB9KSA9PiAoe1xuICAgICAgICAgICAgZGVjb3JhdG9yLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICB9KSksXG4gICAgICAgIF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJERUxFVEVcIiAmJiBub3JtYWxpemVkUGF0aCA9PT0gcGtQYXRoKSB7XG4gICAgICBjb25zdCByb3V0ZVBhcmFtcyA9XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBcImRlbGV0ZVwiLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLmRlbGV0ZURlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgYXBpUHJvcGVydGllcyxcbiAgICAgICAgICBwa1BhdGhcbiAgICAgICAgKSxcbiAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZWQgUEsgZmFsbGJhY2sgcm91dGVzIChmaWx0ZXJFbXB0eSkg4oCUIHBhdGggZGlmZmVycyBmcm9tIHBrUGF0aFxuICAgIGNvbnN0IGZhbGxiYWNrU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGlzQWxsUGFyYW1zID1cbiAgICAgIGZhbGxiYWNrU2VnbWVudHMubGVuZ3RoID4gMCAmJlxuICAgICAgZmFsbGJhY2tTZWdtZW50cy5ldmVyeSgocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgaWYgKGlzQWxsUGFyYW1zICYmIG5vcm1hbGl6ZWRQYXRoICE9PSBwa1BhdGgpIHtcbiAgICAgIGNvbnN0IGZhbGxiYWNrQXBpUHJvcHMgPSBmYWxsYmFja1NlZ21lbnRzXG4gICAgICAgIC5tYXAoKHMpID0+IHMuc2xpY2UoMSkpXG4gICAgICAgIC5tYXAoKG5hbWUpID0+ICh7XG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYCR7bmFtZX0gcGFyYW1ldGVyYCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGZhbGxiYWNrU2VnbWVudHMubWFwKChzKSA9PiBzLnNsaWNlKDEpKS5qb2luKFwiQW5kXCIpO1xuICAgICAgY29uc3Qgcm91dGVQYXJhbXMgPVxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnJvdXRlUGFyYW1EZWNvcmF0b3JzKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICAgIGByZWFkQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5yZWFkRGVjb3JhdG9ycyhcbiAgICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgICBmYWxsYmFja0FwaVByb3BzLFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGhcbiAgICAgICAgICApLFxuICAgICAgICAgIHJvdXRlUGFyYW1zXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIlBVVFwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgdXBkYXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci51cGRhdGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBkZWNvcmF0b3I6IERlY2FmQm9keSgpIGFzIGFueSwgaW5kZXg6IDAgfSxcbiAgICAgICAgICAgIC4uLnJvdXRlUGFyYW1zLm1hcCgoeyBkZWNvcmF0b3IsIGluZGV4IH0pID0+ICh7XG4gICAgICAgICAgICAgIGRlY29yYXRvcixcbiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4ICsgMSxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICBdXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobWV0aG9kID09PSBcIkRFTEVURVwiKSB7XG4gICAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgICBgZGVsZXRlQnkke3N1ZmZpeH1gLFxuICAgICAgICAgIGhhbmRsZXIsXG4gICAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5kZWxldGVEZWNvcmF0b3JzKFxuICAgICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgICBtb2RlbENsYXp6TmFtZSxcbiAgICAgICAgICAgIGZhbGxiYWNrQXBpUHJvcHMsXG4gICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICksXG4gICAgICAgICAgcm91dGVQYXJhbXNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoID09PSBcInN0YXRlbWVudC86bWV0aG9kLyphcmdzXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnREZWNvcmF0b3JzKE1vZGVsQ29uc3RyLCBtb2RlbENsYXp6TmFtZSksXG4gICAgICAgIFtcbiAgICAgICAgICB7IGRlY29yYXRvcjogUGFyYW0oXCJtZXRob2RcIikgYXMgYW55LCBpbmRleDogMCB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBQYXJhbShcImFyZ3NcIikgYXMgYW55LCBpbmRleDogMSB9LFxuICAgICAgICAgIHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogMiB9LFxuICAgICAgICBdXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChtZXRob2QgPT09IFwiR0VUXCIgJiYgbm9ybWFsaXplZFBhdGggPT09IFwiZmluZE9uZUJ5LzprZXkvOnZhbHVlXCIpIHtcbiAgICAgIHJldHVybiBGcm9tTW9kZWxDb250cm9sbGVyLmNyZWF0ZVJlZ2lzdHJhdGlvbihcbiAgICAgICAgXCJmaW5kT25lQnlcIixcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5zdGF0ZW1lbnRTaG9ydGN1dERlY29yYXRvcnMoXG4gICAgICAgICAgTW9kZWxDb25zdHIsXG4gICAgICAgICAgbW9kZWxDbGF6ek5hbWUsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXRQYXJhbXMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlbWVudFJvdXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFwibGlzdEJ5LzprZXlcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkxJU1RfQlksXG4gICAgICBcInBhZ2luYXRlQnkvOmtleS86cGFnZVwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuUEFHRV9CWSxcbiAgICAgIFwiZmluZC86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkQsXG4gICAgICBcInBhZ2UvOnZhbHVlXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5QQUdFLFxuICAgICAgXCJmaW5kT25lQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfT05FX0JZLFxuICAgICAgXCJmaW5kQnkvOmtleS86dmFsdWVcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkZJTkRfQlksXG4gICAgICBcImNvdW50T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5DT1VOVF9PRixcbiAgICAgIFwibWF4T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5NQVhfT0YsXG4gICAgICBcIm1pbk9mLzpmaWVsZFwiOiBQcmVwYXJlZFN0YXRlbWVudEtleXMuTUlOX09GLFxuICAgICAgXCJhdmdPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkFWR19PRixcbiAgICAgIFwic3VtT2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5TVU1fT0YsXG4gICAgICBcImRpc3RpbmN0T2YvOmZpZWxkXCI6IFByZXBhcmVkU3RhdGVtZW50S2V5cy5ESVNUSU5DVF9PRixcbiAgICAgIFwiZ3JvdXBPZi86ZmllbGRcIjogUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkdST1VQX09GLFxuICAgIH07XG5cbiAgICBjb25zdCBzdGF0ZW1lbnRLZXkgPSBzdGF0ZW1lbnRSb3V0ZXNbbm9ybWFsaXplZFBhdGhdO1xuICAgIGlmIChzdGF0ZW1lbnRLZXkgJiYgbWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICByZXR1cm4gRnJvbU1vZGVsQ29udHJvbGxlci5jcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50TWV0aG9kTmFtZShub3JtYWxpemVkUGF0aCksXG4gICAgICAgIGhhbmRsZXIsXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuc3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzKFxuICAgICAgICAgIE1vZGVsQ29uc3RyLFxuICAgICAgICAgIG1vZGVsQ2xhenpOYW1lLFxuICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLFxuICAgICAgICAgIHN0YXRlbWVudEtleVxuICAgICAgICApLFxuICAgICAgICBGcm9tTW9kZWxDb250cm9sbGVyLnN0YXRlbWVudFNob3J0Y3V0UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSBcIkdFVFwiICYmIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJxdWVyeS9cIikpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5TWV0aG9kID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXnF1ZXJ5XFwvLywgXCJcIikuc3BsaXQoXCIvXCIpWzBdO1xuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBxdWVyeU1ldGhvZCxcbiAgICAgICAgaGFuZGxlcixcbiAgICAgICAgRnJvbU1vZGVsQ29udHJvbGxlci5nZXRRdWVyeURlY29yYXRvcnMoXG4gICAgICAgICAgcXVlcnlNZXRob2QsXG4gICAgICAgICAgbm9ybWFsaXplZFBhdGgsXG4gICAgICAgICAgXCJHRVRcIixcbiAgICAgICAgICB0cnVlXG4gICAgICAgICksXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY29tcGxleFF1ZXJ5UGFyYW1zKG5vcm1hbGl6ZWRQYXRoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoU2VnbWVudHMgPSBub3JtYWxpemVkUGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IGtub3duUHJlZml4ZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgICAgXCJsaXN0QnlcIixcbiAgICAgIFwiZmluZEJ5XCIsXG4gICAgICBcImZpbmRCeVBhZ2luYXRlXCIsXG4gICAgICBcImZpbmRPbmVCeVwiLFxuICAgICAgXCJwYWdpbmF0ZUJ5XCIsXG4gICAgICBcImZpbmRcIixcbiAgICAgIFwicGFnZVwiLFxuICAgICAgXCJjb3VudE9mXCIsXG4gICAgICBcIm1heE9mXCIsXG4gICAgICBcIm1pbk9mXCIsXG4gICAgICBcImF2Z09mXCIsXG4gICAgICBcInN1bU9mXCIsXG4gICAgICBcImRpc3RpbmN0T2ZcIixcbiAgICAgIFwiZ3JvdXBPZlwiLFxuICAgICAgXCJzdGF0ZW1lbnRcIixcbiAgICAgIFwiYnVsa1wiLFxuICAgICAgXCJxdWVyeVwiLFxuICAgIF0pO1xuICAgIGlmIChcbiAgICAgIHBhdGhTZWdtZW50cy5sZW5ndGggPiAwICYmXG4gICAgICAhbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSAmJlxuICAgICAgIW5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoXCJzdGF0ZW1lbnQvXCIpICYmXG4gICAgICAha25vd25QcmVmaXhlcy5oYXMocGF0aFNlZ21lbnRzWzBdKVxuICAgICkge1xuICAgICAgY29uc3QgYXBpUGF0aFBhcmFtcyA9IHBhdGhTZWdtZW50c1xuICAgICAgICAuZmlsdGVyKChzKSA9PiBzLnN0YXJ0c1dpdGgoXCI6XCIpKVxuICAgICAgICAubWFwKChzKSA9PiBzLnNsaWNlKDEpKVxuICAgICAgICAubWFwKChuYW1lKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlUmVnaXN0cmF0aW9uKFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBoYW5kbGVyLFxuICAgICAgICBbXG4gICAgICAgICAgLi4uYXBpUGF0aFBhcmFtcy5tYXAoKHApID0+IEFwaVBhcmFtKHApKSxcbiAgICAgICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgcmVjb3JkcyB1c2luZyBcIiR7bWV0aG9kTmFtZX1cIi5gIH0pLFxuICAgICAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgICAgICBBcGlOb0NvbnRlbnRSZXNwb25zZSh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJObyBjb250ZW50IHJldHVybmVkIGJ5IHRoZSBtZXRob2QuXCIsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIucm91dGVQYXJhbURlY29yYXRvcnMobm9ybWFsaXplZFBhdGgpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVSZWdpc3RyYXRpb24oXG4gICAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55LFxuICAgIGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4sXG4gICAgcGFyYW1EZWNvcmF0b3JzOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+XG4gICkge1xuICAgIHJldHVybiB7IG1ldGhvZE5hbWUsIGhhbmRsZXIsIGRlY29yYXRvcnMsIHBhcmFtRGVjb3JhdG9ycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhdGVtZW50TWV0aG9kTmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZpcnN0U2VnbWVudCA9IHBhdGguc3BsaXQoXCIvXCIpWzBdO1xuICAgIHJldHVybiBmaXJzdFNlZ21lbnQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGF0ZW1lbnRTaG9ydGN1dFBhcmFtcyhcbiAgICBwYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBwYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoKHMpID0+IHMuc3RhcnRzV2l0aChcIjpcIikpO1xuICAgIGNvbnN0IHBhcmFtczogQXJyYXk8eyBkZWNvcmF0b3I6IFBhcmFtZXRlckRlY29yYXRvcjsgaW5kZXg6IG51bWJlciB9PiA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goKHNlZywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHNlZy5yZXBsYWNlKFwiOlwiLCBcIlwiKTtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBQYXJhbShuYW1lKSBhcyBhbnksIGluZGV4OiBpIH0pO1xuICAgIH0pO1xuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIHBhcmFtcy5wdXNoKHsgZGVjb3JhdG9yOiBEZWNhZlF1ZXJ5KCkgYXMgYW55LCBpbmRleDogc2VnbWVudHMubGVuZ3RoIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY29tcGxleFF1ZXJ5UGFyYW1zKFxuICAgIHBhdGg6IHN0cmluZ1xuICApOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgY29uc3QgcGFyYW1zOiBBcnJheTx7IGRlY29yYXRvcjogUGFyYW1ldGVyRGVjb3JhdG9yOyBpbmRleDogbnVtYmVyIH0+ID0gW107XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnLCBpKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IFBhcmFtKG5hbWUpIGFzIGFueSwgaW5kZXg6IGkgfSk7XG4gICAgfSk7XG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcInF1ZXJ5L1wiKSkge1xuICAgICAgcGFyYW1zLnB1c2goeyBkZWNvcmF0b3I6IERlY2FmUXVlcnkoKSBhcyBhbnksIGluZGV4OiBzZWdtZW50cy5sZW5ndGggfSk7XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyKG1ldGhvZE5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiBjb21wbGV4UXVlcnkoXG4gICAgICB0aGlzOiBhbnksXG4gICAgICAuLi5hcmdzOiBhbnlbXVxuICAgICk6IFByb21pc2U8YW55PiB7XG4gICAgICBjb25zdCBsb2c6IGFueSA9IHRoaXMubG9nPy5mb3I/Lihjb21wbGV4UXVlcnkpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGxvZykgbG9nLmRlYnVnKGBJbnZva2luZyBjdXN0b20gcXVlcnkgXCIke21ldGhvZE5hbWV9XCJgKTtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IChhd2FpdCB0aGlzLmxvZ0N0eChbXSwgbWV0aG9kTmFtZSwgdHJ1ZSkpLmZvcihcbiAgICAgICAgICBjb21wbGV4UXVlcnlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlKGN0eCk7XG4gICAgICAgIGNvbnN0IHNwcmVhZEFyZ3MgPSBGcm9tTW9kZWxDb250cm9sbGVyLm5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHBlcnNpc3RlbmNlPy5yZXBvICYmXG4gICAgICAgICAgdHlwZW9mIHBlcnNpc3RlbmNlLnJlcG9bbWV0aG9kTmFtZV0gPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2UucmVwb1ttZXRob2ROYW1lXSguLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlW21ldGhvZE5hbWVdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICByZXR1cm4gcGVyc2lzdGVuY2VbbWV0aG9kTmFtZV0oLi4uc3ByZWFkQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBlcnNpc3RlbmNlPy5xdWVyeSAmJiB0eXBlb2YgcGVyc2lzdGVuY2UucXVlcnkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHJldHVybiBwZXJzaXN0ZW5jZS5xdWVyeShtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBlcnNpc3RlbmNlLnN0YXRlbWVudCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlLnN0YXRlbWVudChtZXRob2ROYW1lLCAuLi5zcHJlYWRBcmdzLCBjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBQZXJzaXN0ZW5jZSBtZXRob2QgXCIke21ldGhvZE5hbWV9XCIgbm90IGZvdW5kIG9uICR7cGVyc2lzdGVuY2U/LmNvbnN0cnVjdG9yPy5uYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBpZiAobG9nKSBsb2cuZXJyb3IoYEN1c3RvbSBxdWVyeSBcIiR7bWV0aG9kTmFtZX1cIiBmYWlsZWRgLCBlKTtcbiAgICAgICAgdGhyb3cgRnJvbU1vZGVsQ29udHJvbGxlci50b0RlY2FmRXJyb3IoXG4gICAgICAgICAgZSxcbiAgICAgICAgICBgQ3VzdG9tIHF1ZXJ5IFwiJHttZXRob2ROYW1lfVwiIGZhaWxlZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBhcmdzO1xuICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKGxhc3QgJiYgdHlwZW9mIGxhc3QgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkobGFzdCkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5T2JqID0gYXJncy5wb3AoKTtcbiAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IHF1ZXJ5T2JqLmRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzTGltaXQgPSBxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzT2Zmc2V0ID0gcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWhhc0RpcmVjdGlvbiAmJiAhaGFzTGltaXQgJiYgIWhhc09mZnNldCkgcmV0dXJuIGFyZ3M7XG4gICAgICBjb25zdCBleHRyYXM6IGFueVtdID0gW107XG4gICAgICBpZiAoaGFzRGlyZWN0aW9uKSBleHRyYXMucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgICAgZWxzZSBpZiAoaGFzTGltaXQgfHwgaGFzT2Zmc2V0KSBleHRyYXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgaWYgKGhhc0xpbWl0KSBleHRyYXMucHVzaChxdWVyeU9iai5saW1pdCk7XG4gICAgICBpZiAoaGFzT2Zmc2V0KSBleHRyYXMucHVzaChxdWVyeU9iai5vZmZzZXQpO1xuICAgICAgcmV0dXJuIFsuLi5hcmdzLCAuLi5leHRyYXNdO1xuICAgIH1cbiAgICByZXR1cm4gYXJncztcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5vcm1hbGl6ZVF1ZXJ5QXJncyhhcmdzOiBhbnlbXSk6IGFueVtdIHtcbiAgICBjb25zdCBub3JtYWxpemVkID0gRnJvbU1vZGVsQ29udHJvbGxlci5leHRyYWN0UXVlcnlBcmdzKGFyZ3MpO1xuICAgIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5vcm1hbGl6ZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gbm9ybWFsaXplZFtub3JtYWxpemVkLmxlbmd0aCAtIDFdO1xuICAgIGlmICghbGFzdCB8fCB0eXBlb2YgbGFzdCAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KGxhc3QpKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeU9iaiA9IGxhc3QgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBjb25zdCBoYXNRdWVyeUZpZWxkcyA9XG4gICAgICBxdWVyeU9iai5kaXJlY3Rpb24gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoubGltaXQgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgcXVlcnlPYmoub2Zmc2V0ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWhhc1F1ZXJ5RmllbGRzKSB7XG4gICAgICBub3JtYWxpemVkLnBvcCgpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gICAgfVxuXG4gICAgbm9ybWFsaXplZC5wb3AoKTtcbiAgICBpZiAocXVlcnlPYmouZGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5kaXJlY3Rpb24pO1xuICAgIGlmIChxdWVyeU9iai5saW1pdCAhPT0gdW5kZWZpbmVkKSBub3JtYWxpemVkLnB1c2gocXVlcnlPYmoubGltaXQpO1xuICAgIGlmIChxdWVyeU9iai5vZmZzZXQgIT09IHVuZGVmaW5lZCkgbm9ybWFsaXplZC5wdXNoKHF1ZXJ5T2JqLm9mZnNldCk7XG4gICAgaWYgKHF1ZXJ5T2JqLmJvb2ttYXJrICE9PSB1bmRlZmluZWQpIG5vcm1hbGl6ZWQucHVzaChxdWVyeU9iai5ib29rbWFyayk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVhdGVDcmVhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBPU1RcIiksXG4gICAgICBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHR5cGU6IER0b0ZvcihPcGVyYXRpb25LZXlzLkNSRUFURSwgTW9kZWxDb25zdHIpLFxuICAgICAgfSksXG4gICAgICBBcGlDcmVhdGVkUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgICAgQXBpVW5wcm9jZXNzYWJsZUVudGl0eVJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUmVwb3NpdG9yeSByZWplY3RlZCB0aGUgcHJvdmlkZWQgcGF5bG9hZC5cIixcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBidWxrQ3JlYXRlRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQT1NUXCIsIFwiYnVsa1wiKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBDcmVhdGUgYSBuZXcgJHttb2RlbENsYXp6TmFtZX0uYCB9KSxcbiAgICAgIEFwaUJvZHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYFBheWxvYWQgZm9yICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogXCJSZXBvc2l0b3J5IHJlamVjdGVkIHRoZSBwcm92aWRlZCBwYXlsb2FkLlwiLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtSZWFkRGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJHRVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMgYnkgaWRzLmAgfSksXG4gICAgICBBcGlRdWVyeSh7IG5hbWU6IFwiaWRzXCIsIHJlcXVpcmVkOiB0cnVlLCB0eXBlOiBcImFycmF5XCIgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICBpdGVtczogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtVcGRhdGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJQVVRcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkcyB3aXRoIG5ldyBwYXlsb2Fkcy5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgZXhpc3RpbmcgcmVjb3JkcyBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYToge1xuICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAkcmVmOiBnZXRTY2hlbWFQYXRoKER0b0ZvcihPcGVyYXRpb25LZXlzLlVQREFURSwgTW9kZWxDb25zdHIpKSxcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gdXBkYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICAgIEFwaUJhZFJlcXVlc3RSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBcIlBheWxvYWQgdmFsaWRhdGlvbiBmYWlsZWQuXCIgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1bGtEZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W11cbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgXCJidWxrXCIpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYERlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmRzIGJ5IGlkcy5gIH0pLFxuICAgICAgQXBpUXVlcnkoeyBuYW1lOiBcImlkc1wiLCByZXF1aXJlZDogdHJ1ZSwgdHlwZTogXCJhcnJheVwiIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gZGVsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgIGl0ZW1zOiB7ICRyZWY6IGdldFNjaGVtYVBhdGgoTW9kZWxDb25zdHIpIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIEFwaU5vdEZvdW5kUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICB9KSxcbiAgICBdO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIkdFVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIGEgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIGJ5IGlkLmAgfSksXG4gICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGAke21vZGVsQ2xhenpOYW1lfSByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHVwZGF0ZURlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nLFxuICAgIGFwaVByb3BlcnRpZXM6IERlY2FmQXBpUHJvcGVydHlbXSxcbiAgICBwa1BhdGg6IHN0cmluZ1xuICApOiBBcnJheTwodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nLCBkZXNjOiBhbnkpID0+IHZvaWQ+IHtcbiAgICByZXR1cm4gW1xuICAgICAgQXBpT3BlcmF0aW9uRnJvbU1vZGVsKE1vZGVsQ29uc3RyLCBcIlBVVFwiLCBwa1BhdGgpLFxuICAgICAgQXBpUGFyYW1zRnJvbU1vZGVsKGFwaVByb3BlcnRpZXMpLFxuICAgICAgQXBpT3BlcmF0aW9uKHtcbiAgICAgICAgc3VtbWFyeTogYFJlcGxhY2UgYW4gZXhpc3RpbmcgJHttb2RlbENsYXp6TmFtZX0gcmVjb3JkIHdpdGggYSBuZXcgcGF5bG9hZC5gLFxuICAgICAgfSksXG4gICAgICBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciByZXBsYWNpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIG9mICR7bW9kZWxDbGF6ek5hbWV9YCxcbiAgICAgICAgdHlwZTogRHRvRm9yKE9wZXJhdGlvbktleXMuVVBEQVRFLCBNb2RlbENvbnN0ciksXG4gICAgICB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgICBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pLFxuICAgIF07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBkZWxldGVEZWNvcmF0b3JzKFxuICAgIE1vZGVsQ29uc3RyOiBNb2RlbENvbnN0cnVjdG9yPGFueT4sXG4gICAgbW9kZWxDbGF6ek5hbWU6IHN0cmluZyxcbiAgICBhcGlQcm9wZXJ0aWVzOiBEZWNhZkFwaVByb3BlcnR5W10sXG4gICAgcGtQYXRoOiBzdHJpbmdcbiAgKTogQXJyYXk8KHRhcmdldDogYW55LCBrZXk6IHN0cmluZywgZGVzYzogYW55KSA9PiB2b2lkPiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIEFwaU9wZXJhdGlvbkZyb21Nb2RlbChNb2RlbENvbnN0ciwgXCJERUxFVEVcIiwgcGtQYXRoKSxcbiAgICAgIEFwaVBhcmFtc0Zyb21Nb2RlbChhcGlQcm9wZXJ0aWVzKSxcbiAgICAgIEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ29uc3RyKSB9LFxuICAgICAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudERlY29yYXRvcnMoXG4gICAgTW9kZWxDb25zdHI6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICBtb2RlbENsYXp6TmFtZTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIHJldHVybiBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIFwic3RhdGVtZW50LzptZXRob2QvKmFyZ3NcIiksXG4gICAgICBBcGlPcGVyYXRpb24oe1xuICAgICAgICBzdW1tYXJ5OiBgRXhlY3V0ZXMgYSBwcmVwYXJlZCBzdGF0ZW1lbnQgb24gJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcIm1ldGhvZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgcHJlcGFyZWQgc3RhdGVtZW50IHRvIGV4ZWN1dGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUGFyYW0oe1xuICAgICAgICBuYW1lOiBcImFyZ3NcIixcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJjb25jYXRlbmF0ZWQgbGlzdCBvZiBhcmd1bWVudHMgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBjYW4gYWNjZXB0XCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJkaXJlY3Rpb25cIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJ0aGUgc29ydCBvcmRlciB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpUXVlcnkoe1xuICAgICAgICBuYW1lOiBcImxpbWl0XCIsXG4gICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJsaW1pdCBvciBwYWdlIHNpemUgd2hlbiBhcHBsaWNhYmxlXCIsXG4gICAgICB9KSxcbiAgICAgIEFwaVF1ZXJ5KHtcbiAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIm9mZnNldCBvciBib29rbWFyayB3aGVuIGFwcGxpY2FibGVcIixcbiAgICAgIH0pLFxuICAgICAgQXBpT2tSZXNwb25zZSh7IGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gbGlzdGVkIGZvdW5kLmAgfSksXG4gICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSksXG4gICAgXTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN0YXRlbWVudFNob3J0Y3V0RGVjb3JhdG9ycyhcbiAgICBNb2RlbENvbnN0cjogTW9kZWxDb25zdHJ1Y3Rvcjxhbnk+LFxuICAgIG1vZGVsQ2xhenpOYW1lOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIHN0YXRlbWVudEtleTogc3RyaW5nXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGJhc2U6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICBBcGlPcGVyYXRpb25Gcm9tTW9kZWwoTW9kZWxDb25zdHIsIFwiR0VUXCIsIHBhdGgpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZHMuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJldHJpZXZlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSk7XG4gICAgc2VnbWVudHMuZm9yRWFjaCgoc2VnKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gc2VnLnJlcGxhY2UoXCI6XCIsIFwiXCIpO1xuICAgICAgYmFzZS5wdXNoKEFwaVBhcmFtKHsgbmFtZSwgZGVzY3JpcHRpb246IGBUaGUgJHtuYW1lfSBwYXJhbWV0ZXJgIH0pKTtcbiAgICB9KTtcblxuICAgIGlmIChcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcImxpc3RCeS9cIikgfHxcbiAgICAgIHBhdGguc3RhcnRzV2l0aChcInBhZ2luYXRlQnkvXCIpIHx8XG4gICAgICBwYXRoLnN0YXJ0c1dpdGgoXCJmaW5kL1wiKSB8fFxuICAgICAgcGF0aC5zdGFydHNXaXRoKFwicGFnZS9cIilcbiAgICApIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgZW51bTogT3JkZXJEaXJlY3Rpb24sXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwidGhlIHNvcnQgb3JkZXJcIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoXCJwYWdpbmF0ZUJ5L1wiKSB8fCBwYXRoLnN0YXJ0c1dpdGgoXCJwYWdlL1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlRdWVyeSh7IG5hbWU6IFwibGltaXRcIiwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjcmlwdGlvbjogXCJwYWdlIHNpemVcIiB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwib2Zmc2V0XCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInBhZ2UgbnVtYmVyXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJib29rbWFya1wiLFxuICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogXCJib29rbWFyayBmb3IgY3Vyc29yIHBhZ2luYXRpb25cIixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcImZpbmRPbmVCeS9cIikgfHwgcGF0aC5zdGFydHNXaXRoKFwiZmluZEJ5L1wiKSkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYE5vICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBtYXRjaGVzIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLmAsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLkNPVU5UX09GIHx8XG4gICAgICBzdGF0ZW1lbnRLZXkgPT09IFByZXBhcmVkU3RhdGVtZW50S2V5cy5BVkdfT0YgfHxcbiAgICAgIHN0YXRlbWVudEtleSA9PT0gUHJlcGFyZWRTdGF0ZW1lbnRLZXlzLlNVTV9PRlxuICAgICkge1xuICAgICAgYmFzZS5wdXNoKFxuICAgICAgICBBcGlPa1Jlc3BvbnNlKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYFJlc3VsdCBmb3IgJHttb2RlbENsYXp6TmFtZX0uYCxcbiAgICAgICAgICB0eXBlOiBOdW1iZXIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoc3RhdGVtZW50S2V5ID09PSBQcmVwYXJlZFN0YXRlbWVudEtleXMuRElTVElOQ1RfT0YpIHtcbiAgICAgIGJhc2UucHVzaChcbiAgICAgICAgQXBpT2tSZXNwb25zZSh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGBEaXN0aW5jdCB2YWx1ZXMgZm9yICR7bW9kZWxDbGF6ek5hbWV9LmAsXG4gICAgICAgICAgdHlwZTogW1N0cmluZ10sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UXVlcnlEZWNvcmF0b3JzKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICByb3V0ZVBhdGg6IHN0cmluZyxcbiAgICBodHRwVmVyYjogc3RyaW5nLFxuICAgIGluY2x1ZGVRdWVyeVBhcmFtczogYm9vbGVhbiA9IGZhbHNlXG4gICk6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4ge1xuICAgIGNvbnN0IGV4dHJhY3RQYXRoUGFyYW1zID0gKHA6IHN0cmluZyk6IHN0cmluZ1tdID0+XG4gICAgICBwXG4gICAgICAgIC5zcGxpdChcIi9cIilcbiAgICAgICAgLmZpbHRlcigocykgPT4gcy5zdGFydHNXaXRoKFwiOlwiKSlcbiAgICAgICAgLm1hcCgocykgPT4gcy5zbGljZSgxKSk7XG5cbiAgICBjb25zdCBhcGlQYXRoUGFyYW1zID0gZXh0cmFjdFBhdGhQYXJhbXMocm91dGVQYXRoKS5tYXAoKG5hbWUpID0+ICh7XG4gICAgICBuYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGAke25hbWV9IHBhcmFtZXRlciBmb3IgdGhlIHF1ZXJ5YCxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnM6IEFycmF5PCh0YXJnZXQ6IGFueSwga2V5OiBzdHJpbmcsIGRlc2M6IGFueSkgPT4gdm9pZD4gPSBbXG4gICAgICAuLi5hcGlQYXRoUGFyYW1zLm1hcCgocCkgPT4gQXBpUGFyYW0ocCkpLFxuICAgICAgQXBpT3BlcmF0aW9uKHsgc3VtbWFyeTogYFJldHJpZXZlIHJlY29yZHMgdXNpbmcgXCIke21ldGhvZE5hbWV9XCIuYCB9KSxcbiAgICAgIEFwaU9rUmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJSZXN1bHQgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZC5cIiB9KSxcbiAgICAgIEFwaU5vQ29udGVudFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFwiTm8gY29udGVudCByZXR1cm5lZCBieSB0aGUgbWV0aG9kLlwiLFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGlmIChodHRwVmVyYiA9PT0gXCJHRVRcIiAmJiBpbmNsdWRlUXVlcnlQYXJhbXMpIHtcbiAgICAgIGRlY29yYXRvcnMucHVzaChcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwiZGlyZWN0aW9uXCIsXG4gICAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgIGVudW06IE9yZGVyRGlyZWN0aW9uLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBcInRoZSBzb3J0IG9yZGVyIHdoZW4gYXBwbGljYWJsZVwiLFxuICAgICAgICB9KSxcbiAgICAgICAgQXBpUXVlcnkoe1xuICAgICAgICAgIG5hbWU6IFwibGltaXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwibGltaXQgb3IgcGFnZSBzaXplXCIsXG4gICAgICAgIH0pLFxuICAgICAgICBBcGlRdWVyeSh7XG4gICAgICAgICAgbmFtZTogXCJvZmZzZXRcIixcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgZGVzY3JpcHRpb246IFwib2Zmc2V0IG9yIGJvb2ttYXJrXCIsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0b3JzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEeW5hbWljTW9kdWxlLCBNb2R1bGUsIFByb3ZpZGVyIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBNb2RlbFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IEZyb21Nb2RlbENvbnRyb2xsZXIgfSBmcm9tIFwiLi9Gcm9tTW9kZWxDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IERFQ0FGX0VYUE9TRSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgTW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2R1bGVGb3IoZmxhdm91cjogc3RyaW5nKSB7XG4gIEBNb2R1bGUoe30pXG4gIGNsYXNzIERlY2FmTW9kZWxNb2R1bGUge1xuICAgIHN0YXRpYyByZWFkb25seSBsb2cgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlLm5hbWUpLmZvcihmbGF2b3VyKTtcblxuICAgIHN0YXRpYyBjcmVhdGVNb2RlbFNlcnZpY2VzPFQgZXh0ZW5kcyBNb2RlbDxib29sZWFuPj4oXG4gICAgICBtb2RlbHM6IE1vZGVsQ29uc3RydWN0b3I8VD5bXVxuICAgICk6IFByb3ZpZGVyW10ge1xuICAgICAgcmV0dXJuIG1vZGVscy5tYXAoKG1vZGVsKSA9PiAoe1xuICAgICAgICBwcm92aWRlOiBgJHttb2RlbC5uYW1lfVNlcnZpY2VgLFxuICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwobW9kZWwgYXMgYW55KSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNFeHBvc2VkKFxuICAgICAgbW9kZWw6IE1vZGVsQ29uc3RydWN0b3I8YW55PixcbiAgICAgIGV4cG9zdXJlPzogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZ1tdPlxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBleHBvc3VyZT8uW21vZGVsLm5hbWVdO1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICB0eXBlb2Ygb3ZlcnJpZGUgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IG92ZXJyaWRlXG4gICAgICAgICAgOiBNZXRhZGF0YS5nZXQobW9kZWwsIE1ldGFkYXRhLmtleShERUNBRl9FWFBPU0UpKTtcblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRydWU7XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWUuaW5jbHVkZXMoZmxhdm91cik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgICBvcHRpb25zOiBQYXJ0aWFsPERlY2FmTW9kdWxlT3B0aW9ucz4gPSB7fVxuICAgICk6IER5bmFtaWNNb2R1bGUge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgICBsb2cuaW5mbyhgR2VuZXJhdGluZyBjb250cm9sbGVycyBmb3IgZmxhdm91ci4uLmApO1xuXG4gICAgICBjb25zdCB0cmFja2VkTW9kZWxzID0gQWRhcHRlci5tb2RlbHMoZmxhdm91cikuZmlsdGVyKChtb2RlbCkgPT5cbiAgICAgICAgdGhpcy5pc0V4cG9zZWQobW9kZWwsIG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlKVxuICAgICAgKTtcblxuICAgICAgLy8gQ29udHJvbGxlcnMgYWx3YXlzIHJlbHkgb24gYSBiYWNraW5nIE1vZGVsU2VydmljZSwgZXZlbiB3aGVuIE5lc3QgcHJvdmlkZXJzXG4gICAgICAvLyBhcmUgbm90IGF1dG8tcmVnaXN0ZXJlZC4gV2FybSB0aGUgc2luZ2xldG9uIHJlZ2lzdHJ5IGhlcmUgc28gc2h1dGRvd24gY2FuXG4gICAgICAvLyBzZWUgdGhlIGxpdmUgc2VydmljZXMgY3JlYXRlZCBmb3IgdGhlIGdlbmVyYXRlZCBjb250cm9sbGVycy5cbiAgICAgIGZvciAoY29uc3QgbW9kZWwgb2YgdHJhY2tlZE1vZGVscykgTW9kZWxTZXJ2aWNlLmZvck1vZGVsKG1vZGVsIGFzIGFueSk7XG5cbiAgICAgIGxldCBtb2RlbFNlcnZpY2VzOiBQcm92aWRlcltdID0gW107XG4gICAgICBpZiAob3B0aW9ucy5hdXRvU2VydmljZXMpIHtcbiAgICAgICAgbG9nLmluZm8oXCJBdXRvLXNlcnZpY2VzIGVuYWJsZWQuIEluaXRpYWxpemluZyBzZXJ2aWNlIGdlbmVyYXRpb24uXCIpO1xuICAgICAgICBtb2RlbFNlcnZpY2VzID0gdGhpcy5jcmVhdGVNb2RlbFNlcnZpY2VzKHRyYWNrZWRNb2RlbHMpO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgQXV0by1zZXJ2aWNlcyBjb21wbGV0ZWQuICR7bW9kZWxTZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2VzIGluaXRpYWxpemVkLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ2xvYmFsRGVmYXVsdHM6IFBhcnRpYWw8TW9kZWxDb250cm9sbGVyRmFjdG9yeUNvbmZpZz4gPSB7fTtcbiAgICAgIGlmIChvcHRpb25zLmFnZ3JlZ2F0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgICAgZ2xvYmFsRGVmYXVsdHMuYWxsb3dHcm91cGluZ1F1ZXJpZXMgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udHJvbGxlcnMgPSB0cmFja2VkTW9kZWxzLm1hcCgobW9kZWwpID0+XG4gICAgICAgIEZyb21Nb2RlbENvbnRyb2xsZXIuY3JlYXRlKG1vZGVsLCBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsIGdsb2JhbERlZmF1bHRzKVxuICAgICAgKTtcbiAgICAgIGxvZy5pbmZvKGBHZW5lcmF0ZWQgJHtjb250cm9sbGVycy5sZW5ndGh9IGNvbnRyb2xsZXJzYCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgICAgY29udHJvbGxlcnMsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgIC4uLm1vZGVsU2VydmljZXMsXG4gICAgICAgIF0sXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBPYmplY3QuYXNzaWduKERlY2FmTW9kZWxNb2R1bGUsIFwibmFtZVwiLCB7XG4gICAgdmFsdWU6IGBEZWNhZk1vZHVsZSR7Zmxhdm91cn1gLFxuICB9KTtcbiAgcmV0dXJuIERlY2FmTW9kZWxNb2R1bGU7XG59XG4iLCJpbXBvcnQge1xuICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsXG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUtleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEFwaVByb3BlcnR5IH0gZnJvbSBcIi4vb3ZlcnJpZGVzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IEF1dGggfSBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZz86IEluamVjdGFibGVDb25maWdcbiAgICApIHtcbiAgICAgIGNmZyA9XG4gICAgICAgIGNmZyB8fFxuICAgICAgICAodHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgPyBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICBjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LFxuICAgICAgICAgICAgICBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZSh7XG4gICAgICAgIHNjb3BlOiBjZmcuc2luZ2xldG9uID8gU2NvcGUuREVGQVVMVCA6IFNjb3BlLlJFUVVFU1QsXG4gICAgICAgIGR1cmFibGU6IGNmZy5zaW5nbGV0b24gPyB1bmRlZmluZWQgOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbmVzdEluamVjdChcbiAgICAgIGNhdGVnb3J5OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIGNmZzogSW5qZWN0T3B0aW9uc1xuICAgICkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyTmVzdEluamVjdChcbiAgICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgICAgICBkZXNjcmlwdG9yPzogYW55XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIEluamVjdChjYXRlZ29yeSB8fCAodGFyZ2V0IGFzIENvbnN0cnVjdG9yKSkoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlJFUVVJUkVEKVxuICAuZXh0ZW5kKFxuICAgIEFwaVByb3BlcnR5KHtcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pXG4gIClcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1BWClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heGltdW06IG1heCwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5pbXVtOiBtaW4sIHJlcXVpcmVkOiBmYWxzZSB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4LCByZXF1aXJlZDogZmFsc2UgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTl9MRU5HVEgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWluTGVuZ3RoRGVjKG1pbjogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtaW5MZW5ndGg6IG1pbiwgcmVxdWlyZWQ6IGZhbHNlIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5UWVBFKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIHR5cGVEZWMoXG4gICAgICB0eXBlOlxuICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW11cbiAgICAgICAgfCBDb25zdHJ1Y3RvclxuICAgICAgICB8ICgoKSA9PiBDb25zdHJ1Y3RvcilcbiAgICApIHtcbiAgICAgIHJldHVybiAodGFyZ2V0OiBvYmplY3QsIHByb3A6IGFueSkgPT4ge1xuICAgICAgICB0eXBlID0gQXJyYXkuaXNBcnJheSh0eXBlKSA/IHR5cGVbMF0gOiB0eXBlO1xuICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIiAmJiAhdHlwZS5uYW1lKVxuICAgICAgICAgIHR5cGUgPSAodHlwZSBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbiAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgICB0eXBlOiB0eXBlIGFzIGFueSxcbiAgICAgICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICAgIH0pKHRhcmdldCwgcHJvcCk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuLy9cbi8vIERlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLkxJU1QpXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbGlzdERlYyhcbi8vICAgICAgIGNsYXp6OlxuLy8gICAgICAgICB8IENvbnN0cnVjdG9yXG4vLyAgICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yKVxuLy8gICAgICAgICB8IChDb25zdHJ1Y3RvciB8ICgoKSA9PiBDb25zdHJ1Y3RvcikpW10sXG4vLyAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4vLyAgICAgICBjb2xsZWN0aW9uOiBcIkFycmF5XCIgfCBcIlNldFwiID0gXCJBcnJheVwiXG4vLyAgICAgKSB7XG4vLyAgICAgICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wOiBhbnkpID0+IHtcbi8vICAgICAgICAgY2xhenogPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4vLyAgICAgICAgIGlmICh0eXBlb2YgY2xhenogPT09IFwiZnVuY3Rpb25cIiAmJiAhY2xhenoubmFtZSlcbi8vICAgICAgICAgICBjbGF6eiA9IChjbGF6eiBhcyAoKSA9PiBDb25zdHJ1Y3RvcikoKTtcbi8vICAgICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgdHlwZTogW2NsYXp6IGFzIGFueV0gfSkodGFyZ2V0LCBwcm9wKTtcbi8vICAgICAgIH07XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG4vLyAvL1xuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuREFURSlcbiAgLmV4dGVuZCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gZGF0ZURlYyhmb3JtYXQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBmb3JtYXQ6IFwiZGF0ZS10aW1lXCIsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgLy8gZXhhbXBsZTogcGFyc2VEYXRlKGZvcm1hdCwgbmV3IERhdGUoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuRU5VTSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBvcHRpb25EZWMob3B0aW9uczogc3RyaW5nW10gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICBjb25zdCBvcHRzID0gQXJyYXkuaXNBcnJheShvcHRpb25zKSA/IG9wdGlvbnMgOiBPYmplY3QudmFsdWVzKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgZW51bTogb3B0cyxcbiAgICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQ09MVU1OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGNvbHVtbkRlYyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihEZWNvcmF0aW9uS2V5cy5ERVNDUklQVElPTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBkZXNjcmlwdGlvbkRlYyhkZXNjcmlwdGlvbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihQZXJzaXN0ZW5jZUtleXMuQVVUSCkuZXh0ZW5kKHsgZGVjb3JhdG9yOiBBdXRoIH0pLmFwcGx5KCk7XG4iLCJpbXBvcnQgeyBGb3JiaWRkZW5FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgY2xhc3MgQ29yc0Vycm9yIGV4dGVuZHMgRm9yYmlkZGVuRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIobXNnLCBDb3JzRXJyb3IubmFtZSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgY2xhc3MgVG9NYW55UmVxdWVzdHNFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1zZzogc3RyaW5nIHwgRXJyb3IgKSB7XG4gICAgc3VwZXIoVG9NYW55UmVxdWVzdHNFcnJvci5uYW1lLCBtc2cgLCA0MjkpO1xuICB9XG59IiwiaW1wb3J0IHtcbiAgQXJndW1lbnRzSG9zdCxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQ2F0Y2gsXG4gIENvbmZsaWN0RXhjZXB0aW9uLFxuICBFeGNlcHRpb25GaWx0ZXIsXG4gIEZvcmJpZGRlbkV4Y2VwdGlvbixcbiAgSHR0cEV4Y2VwdGlvbixcbiAgSW5qZWN0YWJsZSxcbiAgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIE9wdGlvbmFsLFxuICBVbmF1dGhvcml6ZWRFeGNlcHRpb24sXG4gIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgQ29udGV4dElkRmFjdG9yeSwgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFkUmVxdWVzdEVycm9yLFxuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIEludGVybmFsRXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbkVycm9yLCBGb3JiaWRkZW5FcnJvciwgVW5zdXBwb3J0ZWRFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgVG9NYW55UmVxdWVzdHNFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMvdGhyb3R0bGluZ1wiO1xuaW1wb3J0IHsgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuLi8uLi9yZXF1ZXN0L0RlY2FmUmVxdWVzdENvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdExvZ2dlciB9IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHMgd2VsbC1rbm93biBOZXN0SlMgYEh0dHBFeGNlcHRpb25gIHN1YmNsYXNzZXMgKGFzIGd1YXJkcywgcGlwZXMsIG9yXG4gKiBvdGhlciBmcmFtZXdvcmstbGV2ZWwgY29kZSB3b3VsZCB0aHJvdyB0aGVtKSBvbnRvIHRoZSBlcXVpdmFsZW50IGRlY2FmLXRzIGBCYXNlRXJyb3JgLlxuICogQHN1bW1hcnkgT25seSBgQmFzZUVycm9yYCBpbnN0YW5jZXMgY2FycnkgdGhlIGAuY29kZWAgdGhlIHJlc3BvbnNlIGJvZHkgcmVsaWVzIG9uLCBzb1xuICogd2l0aG91dCB0aGlzIG1hcCBldmVyeSBub24tZGVjYWYgZXhjZXB0aW9uIOKAlCBpbmNsdWRpbmcgcGVyZmVjdGx5IGxlZ2l0aW1hdGUgb25lcyBsaWtlIGFcbiAqIGd1YXJkJ3MgYEZvcmJpZGRlbkV4Y2VwdGlvbmAg4oCUIHdvdWxkIGJlIGZsYXR0ZW5lZCBpbnRvIGEgZ2VuZXJpYyA1MDAgYEludGVybmFsRXJyb3JgLlxuICovXG5jb25zdCBIVFRQX0VYQ0VQVElPTl9UT19ERUNBRl9FUlJPUiA9IG5ldyBNYXA8XG4gIG5ldyAoLi4uYXJnczogYW55W10pID0+IEh0dHBFeGNlcHRpb24sXG4gIChtc2c6IHN0cmluZykgPT4gQmFzZUVycm9yXG4+KFtcbiAgW1VuYXV0aG9yaXplZEV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IEF1dGhvcml6YXRpb25FcnJvcihtc2cpXSxcbiAgW0ZvcmJpZGRlbkV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IEZvcmJpZGRlbkVycm9yKG1zZyldLFxuICBbQmFkUmVxdWVzdEV4Y2VwdGlvbiwgKG1zZykgPT4gbmV3IEJhZFJlcXVlc3RFcnJvcihtc2cpXSxcbiAgW0NvbmZsaWN0RXhjZXB0aW9uLCAobXNnKSA9PiBuZXcgQ29uZmxpY3RFcnJvcihtc2cpXSxcbiAgW1VucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIChtc2cpID0+IG5ldyBWYWxpZGF0aW9uRXJyb3IobXNnKV0sXG5dKTtcblxuQENhdGNoKClcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNhZkV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkZpbHRlciB7XG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIHByb3RlY3RlZCByZWFkb25seSBtb2R1bGVSZWY/OiBNb2R1bGVSZWYpIHt9XG5cbiAgYXN5bmMgY2F0Y2goZXhjZXB0aW9uOiBFcnJvciwgaG9zdDogQXJndW1lbnRzSG9zdCkge1xuICAgIGNvbnN0IGN0eCA9IGhvc3Quc3dpdGNoVG9IdHRwKCk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBjdHguZ2V0UmVzcG9uc2UoKTtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3R4LmdldFJlcXVlc3QoKTtcblxuICAgIGNvbnN0IGlzUHJvZHVjdGlvbiA9IExvZ2dlZEVudmlyb25tZW50LmVudiA9PT0gXCJwcm9kdWN0aW9uXCI7XG4gICAgbGV0IHN0YXR1c0NvZGU7XG5cbiAgICBpZiAoXG4gICAgICBleGNlcHRpb24gaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fFxuICAgICAgZXhjZXB0aW9uIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRFcnJvclxuICAgICkge1xuICAgICAgZXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgc3RhdHVzQ29kZSA9IChleGNlcHRpb24gYXMgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbikuZ2V0U3RhdHVzKCk7XG4gICAgfSBlbHNlIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEJhc2VFcnJvcikpIHtcbiAgICAgIGNvbnN0IHRvRGVjYWZFcnJvciA9IHRoaXMuZGVjYWZFcnJvckZvcihleGNlcHRpb24pO1xuICAgICAgaWYgKHRvRGVjYWZFcnJvcikge1xuICAgICAgICBleGNlcHRpb24gPSB0b0RlY2FmRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmICgoZXhjZXB0aW9uIGFzIGFueSkuc3RhdHVzID09PSA0MjkpIHtcbiAgICAgICAgZXhjZXB0aW9uID0gbmV3IFRvTWFueVJlcXVlc3RzRXJyb3IoZXhjZXB0aW9uLm1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBIdHRwRXhjZXB0aW9uKSB7XG4gICAgICAgIC8vIEEgcmVjb2duaXplZCBidXQgdW5tYXBwZWQgSHR0cEV4Y2VwdGlvbiAoZS5nLiB0aHJvd24gYnkgYSBndWFyZCBvclxuICAgICAgICAvLyBwaXBlKSDigJQgcHJlc2VydmUgaXRzIHJlYWwgc3RhdHVzIGluc3RlYWQgb2YgZmxhdHRlbmluZyBpdCB0byA1MDAuXG4gICAgICAgIHN0YXR1c0NvZGUgPSBleGNlcHRpb24uZ2V0U3RhdHVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNlcHRpb24gPSBuZXcgSW50ZXJuYWxFcnJvcihleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2dFcnJvcihyZXF1ZXN0LCBleGNlcHRpb24pO1xuXG4gICAgcmVzcG9uc2Uuc3RhdHVzKChleGNlcHRpb24gYXMgQmFzZUVycm9yKS5jb2RlIHx8IHN0YXR1c0NvZGUpLmpzb24oe1xuICAgICAgc3RhdHVzOiAoZXhjZXB0aW9uIGFzIEJhc2VFcnJvcikuY29kZSB8fCBzdGF0dXNDb2RlLFxuICAgICAgZXJyb3I6IGlzUHJvZHVjdGlvbiA/IGV4Y2VwdGlvbi5uYW1lIDogZXhjZXB0aW9uLm1lc3NhZ2UsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHBhdGg6IHJlcXVlc3QudXJsLFxuICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmluZHMgdGhlIGRlY2FmLXRzIGBCYXNlRXJyb3JgIGNvbnN0cnVjdG9yIG1hcHBlZCB0byB0aGlzIGV4Y2VwdGlvbidzIHR5cGUsIGlmIGFueS5cbiAgICogQHN1bW1hcnkgV2Fsa3MgYEhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SYCB3aXRoIGBpbnN0YW5jZW9mYCAocmF0aGVyIHRoYW4gYSBzdHJhaWdodFxuICAgKiBgTWFwLmdldGApIHNvIHN1YmNsYXNzZXMgb2YgYSBtYXBwZWQgZXhjZXB0aW9uIGFyZSBtYXRjaGVkIHRvby5cbiAgICovXG4gIHByb3RlY3RlZCBkZWNhZkVycm9yRm9yKFxuICAgIGV4Y2VwdGlvbjogRXJyb3JcbiAgKTogKChtc2c6IHN0cmluZykgPT4gQmFzZUVycm9yKSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBbdHlwZSwgZmFjdG9yeV0gb2YgSFRUUF9FWENFUFRJT05fVE9fREVDQUZfRVJST1IpIHtcbiAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiB0eXBlKSByZXR1cm4gZmFjdG9yeTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyB0aGUgZXhjZXB0aW9uIHdpdGhvdXQgZXZlciBsZXR0aW5nIGxvZ2dpbmcgZmFpbHVyZXMgYmxvY2sgdGhlIHJlc3BvbnNlLlxuICAgKiBAc3VtbWFyeSBBIGd1YXJkIChvciBtaWRkbGV3YXJlL0NPUlMgY2hlY2spIGNhbiB0aHJvdyBiZWZvcmUgYW55IGRlY2FmLWF3YXJlIHByb3ZpZGVyIHJhbixcbiAgICogc28gdGhlIHJlcXVlc3QtYm91bmQgQ29udGV4dCBtYXkgbm90IGV4aXN0IHlldCDigJQgb3IgdGhlIHJlc29sdmVkIGxvZ2dlcidzIGAuZXJyb3IoKWAgaXRzZWxmXG4gICAqIGNvdWxkIHRocm93IChicm9rZW4gdHJhbnNwb3J0LCBmb3JtYXR0ZXIgYnVnLCBldGMuKS4gRWl0aGVyIHdheSB0aGUgY2xpZW50LWZhY2luZyBlcnJvclxuICAgKiByZXNwb25zZSBiZWxvdyBtdXN0IHN0aWxsIGdvIG91dCwgc28gZXZlcnkgZmFpbHVyZSBtb2RlIGhlcmUgaXMgc3dhbGxvd2VkLCBmYWxsaW5nIGJhY2sgdG9cbiAgICogdGhlIHBsYWluIGBMb2dnaW5nLmdldCgpYCBsb2dnZXIgYW5kLCBhcyBhIGxhc3QgcmVzb3J0LCBkb2luZyBub3RoaW5nIGF0IGFsbC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBsb2dFcnJvcihcbiAgICByZXF1ZXN0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGV4Y2VwdGlvbjogRXJyb3JcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBVbmhhbmRsZWQgZXJyb3Igb24gJHtyZXF1ZXN0Py5tZXRob2R9ICR7cmVxdWVzdD8udXJsfWA7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvZyA9IGF3YWl0IHRoaXMucmVzb2x2ZUxvZ2dlcihyZXF1ZXN0KTtcbiAgICAgIGxvZy5lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdHJ5IHtcbiAgICAgICAgTG9nZ2luZy5nZXQoKS5lcnJvcihtZXNzYWdlLCBleGNlcHRpb24pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGxvZ2dpbmcgaXMgdW5hdmFpbGFibGUg4oCUIHRoZSByZXNwb25zZSBpcyBzdGlsbCBzZW50IGJlbG93XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXNvbHZlcyB0aGUgbG9nZ2VyIGJvdW5kIHRvIHRoZSBvcmlnaW5hdGluZyByZXF1ZXN0J3MgZGVjYWYtdHMgQ29udGV4dC5cbiAgICogQHN1bW1hcnkgR2xvYmFsIGZpbHRlcnMgYXJlIHNpbmdsZXRvbnMsIHNvIHRoZSByZXF1ZXN0LXNjb3BlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0Q29udGV4dH1cbiAgICogKGFuZCB0aGUgY2xpZW50L3VzZXItYm91bmQgbG9nZ2VyIGl0IGNhcnJpZXMpIGNhbid0IGJlIGNvbnN0cnVjdG9yLWluamVjdGVkLiBJbnN0ZWFkLCB0aGlzXG4gICAqIGxvb2tzIHVwIHRoZSBzYW1lIHJlcXVlc3QncyBjb250ZXh0IGlkIGFuZCByZS1yZXNvbHZlcyB0aGUgYWxyZWFkeS1hY2N1bXVsYXRlZCBpbnN0YW5jZVxuICAgKiB0aHJvdWdoIGBNb2R1bGVSZWZgLiBGYWxscyBiYWNrIHRvIHRoZSBnZW5lcmljIGBMb2dnaW5nLmdldCgpYCBsb2dnZXIgd2hlbiB0aGUgZmlsdGVyIHdhc24ndFxuICAgKiBjb25zdHJ1Y3RlZCB3aXRoIGEgYE1vZHVsZVJlZmAgKGUuZy4gbWFudWFsbHkgYG5ld2AnZCkgb3Igbm8gcmVxdWVzdC1zY29wZWQgY29udGV4dCBleGlzdHNcbiAgICogZm9yIHRoaXMgcmVxdWVzdCAoZS5nLiB0aGUgZXJyb3IgaGFwcGVuZWQgYmVmb3JlIGFueSBkZWNhZi1hd2FyZSBwcm92aWRlciByYW4sIGFzIGlzIHRoZVxuICAgKiBjYXNlIHdoZW4gYSBndWFyZCByZWplY3RzIHRoZSByZXF1ZXN0IGJlZm9yZSBpbnRlcmNlcHRvcnMgZ2V0IHRvIGJpbmQgdGhlIGNsaWVudC1zY29wZWRcbiAgICogbG9nZ2VyIG9udG8gdGhlIENvbnRleHQpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHJlc29sdmVMb2dnZXIoXG4gICAgcmVxdWVzdDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dnZXI+IHtcbiAgICBpZiAodGhpcy5tb2R1bGVSZWYpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHRJZCA9IENvbnRleHRJZEZhY3RvcnkuZ2V0QnlSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGF3YWl0IHRoaXMubW9kdWxlUmVmLnJlc29sdmUoXG4gICAgICAgICAgRGVjYWZSZXF1ZXN0Q29udGV4dCxcbiAgICAgICAgICBjb250ZXh0SWQsXG4gICAgICAgICAgeyBzdHJpY3Q6IGZhbHNlIH1cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0Py5sb2dnZXIpIHJldHVybiByZXF1ZXN0Q29udGV4dC5sb2dnZXI7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gbm8gcmVxdWVzdC1zY29wZWQgY29udGV4dCBib3VuZCBmb3IgdGhpcyByZXF1ZXN0IOKAlCBmYWxsIGJhY2sgYmVsb3dcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIExvZ2dpbmcuZ2V0KCkgYXMgdW5rbm93biBhcyBSZXF1ZXN0TG9nZ2VyO1xuICB9XG59XG4iLCJpbXBvcnQgeyBVc2VGaWx0ZXJzLCBVc2VJbnRlcmNlcHRvcnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmRXhjZXB0aW9uRmlsdGVyIH0gZnJvbSBcIi4vRGVjYWZFcnJvckZpbHRlclwiO1xuaW1wb3J0IHsgRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIH0gZnJvbSBcIi4uLy4uL3JlcXVlc3QvaW5kZXhcIjtcblxuLy8gTm8gTW9kdWxlUmVmIGF2YWlsYWJsZSBhdCBkZWNvcmF0aW9uIHRpbWUsIHNvIHRoaXMgaW5zdGFuY2UgZmFsbHMgYmFjayB0b1xuLy8gTG9nZ2luZy5nZXQoKSByYXRoZXIgdGhhbiB0aGUgcmVxdWVzdC1ib3VuZCBjb250ZXh0IGxvZ2dlcjsgcHJlZmVyXG4vLyBOZXN0Qm9vdHN0cmFwZXIudXNlR2xvYmFsRmlsdGVycygpIGZvciBjb250ZXh0LWF3YXJlIGVycm9yIGxvZ2dpbmcuXG5leHBvcnQgZnVuY3Rpb24gVXNlRGVjYWZGaWx0ZXIoKSB7XG4gIHJldHVybiBVc2VGaWx0ZXJzKG5ldyBEZWNhZkV4Y2VwdGlvbkZpbHRlcigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFVzZURlY2FmSGVhZGVycygpIHtcbiAgcmV0dXJuIFVzZUludGVyY2VwdG9ycyhEZWNhZlJlc3BvbnNlSW50ZXJjZXB0b3IpO1xufVxuIiwiaW1wb3J0IHsgQ29uc3RydWN0b3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCB7IFNlY3VyaXR5U2NoZW1lT2JqZWN0IH0gZnJvbSBcIi4uLy4uL3N3YWdnZXItdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTd2FnZ2VyT3B0aW9ucyB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGFzc2V0c1BhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25GaWxlUGF0aD86IHN0cmluZztcbiAgdG9wYmFySWNvbkZpbGVQYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbj86IGJvb2xlYW47XG4gIHBhdGg6IHN0cmluZztcbiAgYXV0aD86IFNlY3VyaXR5U2NoZW1lT2JqZWN0O1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xuICBleHRyYU1vZGVscz86IENvbnN0cnVjdG9yW107XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gSlNPTiBmb3JtYXQuXG4gICAqIEV4YW1wbGU6IC9hcGkvb3BlbmFwaS5qc29uXG4gICAqL1xuICBvcGVuQXBpSnNvblBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNvbnN0IFNXQUdHRVJfVUlfQ09OU1RBTlRTOiBTd2FnZ2VyT3B0aW9ucyA9IHtcbiAgdGl0bGU6IFwiU3dhZ2dlciB8IE9wZW5BUEkgU3BlY2lmaWNhdGlvbiAoT0FTKVwiLFxuICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZGl6ZWQgZm9ybWF0IGZvciBkZXNjcmliaW5nIFJFU1RmdWwgQVBJc1wiLFxuICB2ZXJzaW9uOiBcIjAuMC4xXCIsXG4gIHBhdGg6IFwiZG9jc1wiLFxuICBmYXZpY29uRmlsZVBhdGg6IFwiXCIsXG4gIHRvcGJhckljb25GaWxlUGF0aDogXCJcIixcbiAgYXV0aDoge1xuICAgIHR5cGU6IFwiaHR0cFwiLFxuICAgIHNjaGVtZTogXCJiZWFyZXJcIixcbiAgICBiZWFyZXJGb3JtYXQ6IFwiSldUXCIsXG4gICAgbmFtZTogXCJBdXRob3JpemF0aW9uXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRW50ZXIgSldUIHRva2VuXCIsXG4gICAgaW46IFwiaGVhZGVyXCIsXG4gIH0sXG4gIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0cnVlLFxuICB0b3BiYXJCZ0NvbG9yOiBcIiMwMDAwMDBcIixcbn07XG4iLCJpbXBvcnQgeyBTV0FHR0VSX1VJX0NPTlNUQU5UUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlclVJT3B0aW9ucyB7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwZXJzaXN0QXV0aG9yaXphdGlvbjogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgZmF2aWNvblBhdGg/OiBzdHJpbmc7XG4gIHRvcGJhckljb25QYXRoPzogc3RyaW5nO1xuICB0b3BiYXJCZ0NvbG9yPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU3dhZ2dlckN1c3RvbVVJIHtcbiAgcmVhZG9ubHkgb3B0aW9uczogU3dhZ2dlclVJT3B0aW9ucztcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBhc3NldHNQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gIC8vICAgX19kaXJuYW1lLFxuICAvLyAgIFwiLi5cIixcbiAgLy8gICBcIi4uXCIsXG4gIC8vICAgXCJ3b3JrZG9jc1wiLFxuICAvLyAgIFwiYXNzZXRzXCJcbiAgLy8gKTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBTd2FnZ2VyVUlPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjdXN0b21DU1MoKSB7XG4gICAgbGV0IGNzcyA9IFwiXCI7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b3BiYXJJY29uUGF0aCkge1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5iNjQodGhpcy5vcHRpb25zLnRvcGJhckljb25QYXRoKTtcbiAgICAgIGNzcyArPSBgLnRvcGJhci13cmFwcGVyIHsgY29udGVudDogdXJsKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJHtpbWd9Jyk7IHdpZHRoOiAyMDBweDsgaGVpZ2h0OiBhdXRvOyB9XFxuYDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNzcyArXG4gICAgICBgXG4gICAgICAgIC50b3BiYXItd3JhcHBlciBzdmcgeyB2aXNpYmlsaXR5OiBoaWRkZW47IH1cbiAgICAgICAgLnN3YWdnZXItdWkgLnRvcGJhciB7IGJhY2tncm91bmQtY29sb3I6ICR7dGhpcy5vcHRpb25zLnRvcGJhckJnQ29sb3IgfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMudG9wYmFyQmdDb2xvcn07IH1cbiAgICAgIGBcbiAgICApO1xuICB9XG5cbiAgZ2V0Q3VzdG9tT3B0aW9ucygpIHtcbiAgICBjb25zdCBmYXZpY29uOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgaWYgKHRoaXMub3B0aW9ucy5mYXZpY29uUGF0aCkge1xuICAgICAgZmF2aWNvbltcImN1c3RvbWZhdkljb25cIl0gPSB0aGlzLmI2NCh0aGlzLm9wdGlvbnMuZmF2aWNvblBhdGgsIHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjdXN0b21TaXRlVGl0bGU6IHRoaXMub3B0aW9ucy50aXRsZSxcbiAgICAgIC4uLmZhdmljb24sXG4gICAgICBjdXN0b21Dc3M6IHRoaXMuY3VzdG9tQ1NTKCksXG4gICAgICBzd2FnZ2VyT3B0aW9uczoge1xuICAgICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogdGhpcy5vcHRpb25zLnBlcnNpc3RBdXRob3JpemF0aW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgYjY0KGZpbGU6IHN0cmluZywgaW1nOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih0aGlzLm9wdGlvbnMuYXNzZXRzUGF0aCB8fCBcIlwiLCBmaWxlKTtcbiAgICBjb25zdCBiNjQgPSByZWFkRmlsZVN5bmMoZmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwiYmFzZTY0XCIgfSk7XG4gICAgcmV0dXJuIGltZyA/IFwiZGF0YTppbWFnZS9wbmc7YmFzZTY0LFwiICsgYjY0IDogYjY0O1xuICB9XG59XG4iLCJpbXBvcnQgeyBJTmVzdEFwcGxpY2F0aW9uIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEb2N1bWVudEJ1aWxkZXIsIFN3YWdnZXJNb2R1bGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyXCI7XG5pbXBvcnQgeyBTd2FnZ2VyQ3VzdG9tVUkgfSBmcm9tIFwiLi9Td2FnZ2VyQ3VzdG9tVUlcIjtcbmltcG9ydCB7IFNXQUdHRVJfVUlfQ09OU1RBTlRTLCBTd2FnZ2VyT3B0aW9ucyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IFlBTUwgZnJvbSBcInlhbWxcIjtcblxuZXhwb3J0IGNsYXNzIFN3YWdnZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcHA6IElOZXN0QXBwbGljYXRpb24sXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBTd2FnZ2VyT3B0aW9uc1xuICApIHt9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2N1bWVudCgpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMub3B0aW9ucy5wYXRoXG4gICAgICA/IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbiArXG4gICAgICAgIFwiXCIgK1xuICAgICAgICBgPGJyPjxicj48YSBocmVmPVwiJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofVwiPk9wZW5BUEkgSlNPTiBTcGVjPC9hPiB8IGAgK1xuICAgICAgICBgPGEgaHJlZj1cIiR7dGhpcy5vcHRpb25zLm9wZW5BcGlZYW1sUGF0aH1cIj5PcGVuQVBJIFlBTUwgU3BlYzwvYT5gXG4gICAgICA6IHRoaXMub3B0aW9ucy5kZXNjcmlwdGlvbjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IG5ldyBEb2N1bWVudEJ1aWxkZXIoKVxuICAgICAgLnNldFRpdGxlKHRoaXMub3B0aW9ucy50aXRsZSlcbiAgICAgIC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbilcbiAgICAgIC5zZXRWZXJzaW9uKHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IFwiMC4wLjFcIilcbiAgICAgIC5hZGRCZWFyZXJBdXRoKHRoaXMub3B0aW9ucy5hdXRoIHx8IFNXQUdHRVJfVUlfQ09OU1RBTlRTLmF1dGgpXG4gICAgICAuYnVpbGQoKTtcblxuICAgIHJldHVybiBTd2FnZ2VyTW9kdWxlLmNyZWF0ZURvY3VtZW50KHRoaXMuYXBwLCBjb25maWcsIHtcbiAgICAgIGV4dHJhTW9kZWxzOiB0aGlzLm9wdGlvbnMuZXh0cmFNb2RlbHMgfHwgW10sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyT3BlbkFwaVJvdXRlKFxuICAgIHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi9qc29uXCIgfCBcImFwcGxpY2F0aW9uL3gteWFtbFwiLFxuICAgIGJvZHlGYWN0b3J5OiAoKSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGlmICghcGF0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaHR0cEFkYXB0ZXIgPSB0aGlzLmFwcC5nZXRIdHRwQWRhcHRlcigpIGFzIGFueTtcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFwiL1wiKSA/IHBhdGggOiBgLyR7cGF0aH1gO1xuICAgIGh0dHBBZGFwdGVyLmdldChwYXRoLCAoX3JlcTogYW55LCByZXM6IGFueSkgPT4ge1xuICAgICAgaHR0cEFkYXB0ZXIucmVwbHkocmVzLCBib2R5RmFjdG9yeSgpLCAyMDAsIHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogY29udGVudFR5cGUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXR1cFN3YWdnZXIoKSB7XG4gICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLmNyZWF0ZURvY3VtZW50KCk7XG4gICAgY29uc3Qgc3dhZ2dlclVJID0gbmV3IFN3YWdnZXJDdXN0b21VSSh7XG4gICAgICB0aXRsZTogdGhpcy5vcHRpb25zLnRpdGxlLFxuICAgICAgcGF0aDogdGhpcy5vcHRpb25zLnBhdGggfHwgU1dBR0dFUl9VSV9DT05TVEFOVFMucGF0aCxcbiAgICAgIHBlcnNpc3RBdXRob3JpemF0aW9uOiB0aGlzLm9wdGlvbnMucGVyc2lzdEF1dGhvcml6YXRpb24gPz8gdHJ1ZSxcbiAgICAgIGFzc2V0c1BhdGg6IHRoaXMub3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvblBhdGg6IHRoaXMub3B0aW9ucy5mYXZpY29uRmlsZVBhdGgsXG4gICAgICB0b3BiYXJJY29uUGF0aDogdGhpcy5vcHRpb25zLnRvcGJhckljb25GaWxlUGF0aCxcbiAgICAgIHRvcGJhckJnQ29sb3I6IHRoaXMub3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgIH0pO1xuICAgIFN3YWdnZXJNb2R1bGUuc2V0dXAoXG4gICAgICB0aGlzLm9wdGlvbnMucGF0aCB8fCBTV0FHR0VSX1VJX0NPTlNUQU5UUy5wYXRoLFxuICAgICAgdGhpcy5hcHAsXG4gICAgICBkb2N1bWVudCxcbiAgICAgIHtcbiAgICAgICAgLi4uc3dhZ2dlclVJLmdldEN1c3RvbU9wdGlvbnMoKSxcbiAgICAgICAganNvbkRvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaUpzb25QYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgeWFtbERvY3VtZW50VXJsOiB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoXG4gICAgICAgICAgPyBgJHt0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRofWBcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH1cbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3Rlck9wZW5BcGlSb3V0ZShcbiAgICAgIHRoaXMub3B0aW9ucy5vcGVuQXBpSnNvblBhdGgsXG4gICAgICBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICgpID0+IGRvY3VtZW50XG4gICAgKTtcblxuICAgIHRoaXMucmVnaXN0ZXJPcGVuQXBpUm91dGUoXG4gICAgICB0aGlzLm9wdGlvbnMub3BlbkFwaVlhbWxQYXRoLFxuICAgICAgXCJhcHBsaWNhdGlvbi94LXlhbWxcIixcbiAgICAgICgpID0+IFlBTUwuc3RyaW5naWZ5KGRvY3VtZW50KVxuICAgICk7XG4gIH1cblxuICAvLyBwcml2YXRlIGdldFZlcnNpb24oKSB7XG4gIC8vICAgLy8gY29uc3QgcGFja2FnZUpzb24gPSBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwiLi5cIiwgXCJwYWNrYWdlLmpzb25cIik7XG4gIC8vICAgLy8gY29uc3Qge3ZlcnNpb259ID0gcmVxdWlyZShwYWNrYWdlSnNvbik7XG4gIC8vICAgcmV0dXJuIFwidmVyc2lvblwiO1xuICAvLyB9XG59XG4iLCJpbXBvcnQge1xuICBJTmVzdEFwcGxpY2F0aW9uLFxuICBMb2dnZXIsXG4gIE5lc3RJbnRlcmNlcHRvcixcbiAgUGlwZVRyYW5zZm9ybSxcbn0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBNb2R1bGVSZWYgfSBmcm9tIFwiQG5lc3Rqcy9jb3JlXCI7XG5pbXBvcnQgeyBEZWNhZkV4Y2VwdGlvbkZpbHRlciB9IGZyb20gXCIuL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCB7IFN3YWdnZXJCdWlsZGVyIH0gZnJvbSBcIi4vb3BlbmFwaVwiO1xuaW1wb3J0IHsgQ29yc09wdGlvbnMgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb24vaW50ZXJmYWNlcy9leHRlcm5hbC9jb3JzLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBDb3JzRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIERlZmluZXMgYWxsIGN1c3RvbWl6YWJsZSBwYXJhbWV0ZXJzIGZvciBTd2FnZ2VyIHNldHVwLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgZGV2ZWxvcGVycyB0byBjdXN0b21pemUgaG93IFN3YWdnZXIgVUkgaXMgY29uZmlndXJlZFxuICogd2l0aGluIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uIEl0IGluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHRpdGxlcywgcGF0aHMsXG4gKiBjb2xvciBzY2hlbWVzLCBhbmQgYXNzZXQgcGF0aHMgdG8gdGFpbG9yIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBleHBlcmllbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIFRpdGxlIGRpc3BsYXllZCBpbiBTd2FnZ2VyIFVJLlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uIC0gRGVzY3JpcHRpb24gc2hvd24gYmVsb3cgdGhlIHRpdGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBBUEkgdmVyc2lvbiBkaXNwbGF5ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdIC0gT3B0aW9uYWwgcGF0aCB3aGVyZSBTd2FnZ2VyIHdpbGwgYmUgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtib29sZWFufSBbcGVyc2lzdEF1dGhvcml6YXRpb25dIC0gV2hldGhlciBhdXRob3JpemF0aW9uIHRva2VucyBwZXJzaXN0IGFjcm9zcyByZWxvYWRzLlxuICogQHBhcmFtIHtzdHJpbmd9IFthc3NldHNQYXRoXSAtIFBhdGggdG8gY3VzdG9tIGFzc2V0cyBmb3IgU3dhZ2dlciBVSS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFyQmdDb2xvcl0gLSBDdXN0b20gYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIFN3YWdnZXIgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdG9wYmFySWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBpY29uIGRpc3BsYXllZCBpbiB0aGUgdG9wIGJhci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmF2aWNvblBhdGhdIC0gUGF0aCB0byBhIGN1c3RvbSBmYXZpY29uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3YWdnZXJTZXR1cE9wdGlvbnMge1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB2ZXJzaW9uOiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHBlcnNpc3RBdXRob3JpemF0aW9uPzogYm9vbGVhbjtcbiAgYXNzZXRzUGF0aD86IHN0cmluZztcbiAgdG9wYmFyQmdDb2xvcj86IHN0cmluZztcbiAgdG9wYmFySWNvblBhdGg/OiBzdHJpbmc7XG4gIGZhdmljb25QYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogUGF0aCB0byBleHBvc2UgdGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBpbiBKU09OIGZvcm1hdC5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLmpzb25cbiAgICovXG4gIG9wZW5BcGlKc29uUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIFBhdGggdG8gZXhwb3NlIHRoZSBPcGVuQVBJIHNwZWNpZmljYXRpb24gaW4gWUFNTCBmb3JtYXQuXG4gICAqIFJlcXVpcmVzICd5YW1sJyBwYWNrYWdlIGFzIHBlZXIgZGVwZW5kZW5jeS5cbiAgICogRXhhbXBsZTogL2FwaS9vcGVuYXBpLnlhbWxcbiAgICovXG4gIG9wZW5BcGlZYW1sUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgZmx1ZW50LCBzdGF0aWMgYm9vdHN0cmFwIGNsYXNzIGZvciBpbml0aWFsaXppbmcgYW5kIGNvbmZpZ3VyaW5nIGEgTmVzdEpTIGFwcGxpY2F0aW9uLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUgYE5lc3RCb290c3RyYXBlcmAgY2xhc3MgcHJvdmlkZXMgYSBjaGFpbmFibGUgQVBJIGZvciBjb25maWd1cmluZ1xuICogYSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UuIEl0IGluY2x1ZGVzIGJ1aWx0LWluIG1ldGhvZHMgZm9yIGVuYWJsaW5nXG4gKiBDT1JTLCBIZWxtZXQgc2VjdXJpdHksIFN3YWdnZXIgZG9jdW1lbnRhdGlvbiwgZ2xvYmFsIHBpcGVzLCBmaWx0ZXJzLFxuICogaW50ZXJjZXB0b3JzLCBhbmQgc3RhcnRpbmcgdGhlIHNlcnZlci5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb21vdGVzIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2VzIHJlcGV0aXRpdmUgc2V0dXAgY29kZVxuICogYWNyb3NzIG11bHRpcGxlIE5lc3RKUyBwcm9qZWN0cy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IE5lc3RGYWN0b3J5IH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuICogaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSBcIi4vYXBwLm1vZHVsZVwiO1xuICogaW1wb3J0IHsgTXlMb2dnZXIgfSBmcm9tIFwiLi9NeUxvZ2dlclwiO1xuICogaW1wb3J0IHsgTmVzdEJvb3RzdHJhcGVyIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItbmVzdFwiO1xuICpcbiAqIGFzeW5jIGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAqICAgY29uc3QgYXBwID0gYXdhaXQgTmVzdEZhY3RvcnkuY3JlYXRlKEFwcE1vZHVsZSk7XG4gKlxuICogICBhd2FpdCBOZXN0Qm9vdHN0cmFwZXJcbiAqICAgICAuaW5pdGlhbGl6ZShhcHApXG4gKiAgICAgLmVuYWJsZUxvZ2dlcihuZXcgTXlMb2dnZXIoKSlcbiAqICAgICAuZW5hYmxlQ29ycyhbXCJodHRwOi8vbG9jYWxob3N0OjQyMDBcIl0pXG4gKiAgICAgLnVzZUhlbG1ldCgpXG4gKiAgICAgLnNldHVwU3dhZ2dlcih7XG4gKiAgICAgICB0aXRsZTogXCJPcGVuQVBJIGJ5IFRyYWRlTWFya+KEolwiLFxuICogICAgICAgZGVzY3JpcHRpb246IFwiVHJhZGVNYXJr4oSiIEFQSSBkb2N1bWVudGF0aW9uXCIsXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gKiAgICAgICBwYXRoOiBcImFwaVwiLFxuICogICAgICAgcGVyc2lzdEF1dGhvcml6YXRpb246IHRydWUsXG4gKiAgICAgICB0b3BiYXJCZ0NvbG9yOiBcIiMyQzNFNTBcIixcbiAqICAgICAgIHRvcGJhckljb25QYXRoOiBcIi9hc3NldHMvbG9nby5zdmdcIixcbiAqICAgICAgIGZhdmljb25QYXRoOiBcIi9hc3NldHMvZmF2aWNvbi5pY29cIlxuICogICAgIH0pXG4gKiAgICAgLnVzZUdsb2JhbEZpbHRlcnMoKVxuICogICAgIC51c2VHbG9iYWxQaXBlcyguLi4pXG4gKiAgICAgLnVzZUdsb2JhbEludGVyY2VwdG9ycyguLi4pXG4gKiAgICAgLnN0YXJ0KDMwMDApO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcCgpO1xuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIE5lc3RCb290c3RyYXBlciB7XG4gIHByaXZhdGUgc3RhdGljIGFwcDogSU5lc3RBcHBsaWNhdGlvbjtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBsb2dnZXIgaW5zdGFuY2UsIGNyZWF0aW5nIGEgZGVmYXVsdCBvbmUgaWYgbm90IHNldC5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogRW5zdXJlcyB0aGF0IGEgdmFsaWQgYExvZ2dlcmAgaW5zdGFuY2UgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgKiBmb3IgbG9nZ2luZyBib290c3RyYXAtcmVsYXRlZCBtZXNzYWdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TG9nZ2VyfSBUaGUgYWN0aXZlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldCBsb2dnZXIoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2xvZ2dlcikge1xuICAgICAgLy8gZmFsbGJhY2tcbiAgICAgIHRoaXMuX2xvZ2dlciA9IG5ldyBMb2dnZXIoXCJOZXN0Qm9vdHN0cmFwXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbml0aWFsaXplcyB0aGUgYm9vdHN0cmFwcGVyIHdpdGggYSBnaXZlbiBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEJpbmRzIHRoZSBwcm92aWRlZCBOZXN0SlMgYXBwIGluc3RhbmNlIHRvIHRoZSBib290c3RyYXBwZXIsIGVuYWJsaW5nXG4gICAqIGNoYWluZWQgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0lOZXN0QXBwbGljYXRpb259IGFwcCAtIFRoZSBOZXN0SlMgYXBwbGljYXRpb24gaW5zdGFuY2UgdG8gaW5pdGlhbGl6ZS5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbiBtZXRob2RzLlxuICAgKi9cbiAgc3RhdGljIGluaXRpYWxpemUoYXBwOiBJTmVzdEFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgb3IgcmVwbGFjZXMgdGhlIGdsb2JhbCBsb2dnZXIgZm9yIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIElmIGEgY3VzdG9tIGxvZ2dlciBpcyBwcm92aWRlZCwgaXQgcmVwbGFjZXMgdGhlIGRlZmF1bHQgbG9nZ2VyLiBPdGhlcndpc2UsXG4gICAqIGEgbmV3IGxvZ2dlciBuYW1lZCBgXCJOZXN0Qm9vdHN0cmFwXCJgIGlzIHVzZWQuIFRoaXMgbG9nZ2VyIGlzIGFsc28gcmVnaXN0ZXJlZFxuICAgKiB3aXRoIHRoZSBOZXN0SlMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7TG9nZ2VyfSBbY3VzdG9tTG9nZ2VyXSAtIE9wdGlvbmFsIGN1c3RvbSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nLlxuICAgKi9cbiAgc3RhdGljIGVuYWJsZUxvZ2dlcihjdXN0b21Mb2dnZXI/OiBMb2dnZXIpIHtcbiAgICB0aGlzLl9sb2dnZXIgPSBjdXN0b21Mb2dnZXIgfHwgbmV3IExvZ2dlcihcIk5lc3RCb290c3RyYXBcIik7XG4gICAgdGhpcy5hcHAudXNlTG9nZ2VyKHRoaXMuX2xvZ2dlcik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEVuYWJsZXMgQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcgKENPUlMpIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEBzdW1tYXJ5XG4gICAqIEFsbG93cyBkZWZpbmluZyBlaXRoZXIgYSB3aWxkY2FyZCBvcmlnaW4gKGBcIipcImApIG9yIGEgbGlzdCBvZiBhbGxvd2VkIG9yaWdpbnMuXG4gICAqIEF1dG9tYXRpY2FsbHkgYWNjZXB0cyBsb2NhbCBkZXZlbG9wbWVudCByZXF1ZXN0cyBhbmQgdGhvc2Ugd2l0aG91dCBvcmlnaW4gaGVhZGVycy5cbiAgICogVGhyb3dzIGEgYENvcnNFcnJvcmAgZm9yIHVuYXV0aG9yaXplZCBvcmlnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0geycqJyB8IHN0cmluZ1tdfSBbb3JpZ2lucz1bXV0gLSBMaXN0IG9mIGFsbG93ZWQgb3JpZ2lucyBvciBgXCIqXCJgIHRvIGFsbG93IGFsbC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FsbG93TWV0aG9kcz1bJ0dFVCcsICdQT1NUJywgJ1BVVCcsICdERUxFVEUnXV0gLSBBbGxvd2VkIEhUVFAgbWV0aG9kcy5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBlbmFibGVDb3JzKFxuICAgIG9yaWdpbnM6IFwiKlwiIHwgc3RyaW5nW10gPSBbXSxcbiAgICBhbGxvd01ldGhvZHM6IHN0cmluZ1tdID0gW1wiR0VUXCIsIFwiUE9TVFwiLCBcIlBVVFwiLCBcIkRFTEVURVwiXVxuICApIHtcbiAgICBjb25zdCBhbGxvd2VkT3JpZ2lucyA9XG4gICAgICBvcmlnaW5zID09PSBcIipcIiA/IFwiKlwiIDogb3JpZ2lucy5tYXAoKG8pID0+IG8udHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgY29uc3QgY29yc09wdGlvbnM6IENvcnNPcHRpb25zID0ge1xuICAgICAgb3JpZ2luOiAob3JpZ2luLCBjYWxsYmFjaykgPT4ge1xuICAgICAgICAvLyBBbGxvdyByZXF1ZXN0IHdpdGhvdXQgb3JpZ2luLi4uXG4gICAgICAgIGlmICghb3JpZ2luKSByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFsbG93ZWRPcmlnaW5zID09PSBcIipcIiB8fFxuICAgICAgICAgIChBcnJheS5pc0FycmF5KGFsbG93ZWRPcmlnaW5zKSAmJlxuICAgICAgICAgICAgYWxsb3dlZE9yaWdpbnMuaW5jbHVkZXMob3JpZ2luLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhuZXcgQ29yc0Vycm9yKGBPcmlnaW4gJHtvcmlnaW59IG5vdCBhbGxvd2VkYCkpO1xuICAgICAgfSxcbiAgICAgIGNyZWRlbnRpYWxzOiB0cnVlLFxuICAgICAgbWV0aG9kczogYWxsb3dNZXRob2RzLmpvaW4oXCIsXCIpLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcC5lbmFibGVDb3JzKGNvcnNPcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQXBwbGllcyB0aGUgSGVsbWV0IG1pZGRsZXdhcmUgZm9yIGVuaGFuY2VkIHNlY3VyaXR5LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBEeW5hbWljYWxseSBsb2FkcyB0aGUgYGhlbG1ldGAgcGFja2FnZSBpZiBhdmFpbGFibGUgYW5kIHJlZ2lzdGVycyBpdFxuICAgKiBhcyBtaWRkbGV3YXJlIHRvIGltcHJvdmUgSFRUUCBoZWFkZXIgc2VjdXJpdHkuIElmIG5vdCBpbnN0YWxsZWQsIGxvZ3MgYSB3YXJuaW5nXG4gICAqIGFuZCBjb250aW51ZXMgZXhlY3V0aW9uIHdpdGhvdXQgdGhyb3dpbmcgZXJyb3JzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtvcHRpb25zXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFzc2VkIHRvIEhlbG1ldC5cbiAgICogQHJldHVybiB7TmVzdEJvb3RzdHJhcGVyfSBSZXR1cm5zIHRoZSBjbGFzcyBmb3IgY2hhaW5pbmcgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHN0YXRpYyB1c2VIZWxtZXQob3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0cnkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICAgIGNvbnN0IGhlbG1ldCA9IHJlcXVpcmUoXCJoZWxtZXRcIik7IC8vIER5bmFtaWMgaW1wb3J0IHRvIGF2b2lkIGhhcmQgZGVwZW5kZW5jeVxuICAgICAgdGhpcy5hcHAudXNlKGhlbG1ldChvcHRpb25zKSk7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coXCJIZWxtZXQgbWlkZGxld2FyZSBlbmFibGVkIHN1Y2Nlc3NmdWxseS5cIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiSGVsbWV0IG5vdCBpbnN0YWxsZWQuIFNraXBwaW5nIG1pZGRsZXdhcmUuXCIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDb25maWd1cmVzIGFuZCBpbml0aWFsaXplcyBTd2FnZ2VyIFVJIGZvciBBUEkgZG9jdW1lbnRhdGlvbi5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogVXNlcyB0aGUgYFN3YWdnZXJCdWlsZGVyYCB1dGlsaXR5IHRvIGNvbmZpZ3VyZSBBUEkgZG9jdW1lbnRhdGlvblxuICAgKiB3aXRoIGRldGFpbGVkIGN1c3RvbWl6YXRpb24gZm9yIHRpdGxlLCB2ZXJzaW9uLCBwYXRocywgYW5kIGNvbG9ycy5cbiAgICogU3dhZ2dlciBpcyBhdXRvbWF0aWNhbGx5IGV4cG9zZWQgYXQgdGhlIGNvbmZpZ3VyZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHtTd2FnZ2VyU2V0dXBPcHRpb25zfSBvcHRpb25zIC0gU3dhZ2dlciBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgc2V0dXBTd2FnZ2VyKG9wdGlvbnM6IFN3YWdnZXJTZXR1cE9wdGlvbnMpIHtcbiAgICBjb25zdCBzd2FnZ2VyID0gbmV3IFN3YWdnZXJCdWlsZGVyKHRoaXMuYXBwLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBvcHRpb25zLmRlc2NyaXB0aW9uLFxuICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uLFxuICAgICAgcGF0aDogb3B0aW9ucy5wYXRoIHx8IFwiYXBpXCIsXG4gICAgICBwZXJzaXN0QXV0aG9yaXphdGlvbjogb3B0aW9ucy5wZXJzaXN0QXV0aG9yaXphdGlvbiA/PyB0cnVlLFxuICAgICAgYXNzZXRzUGF0aDogb3B0aW9ucy5hc3NldHNQYXRoLFxuICAgICAgZmF2aWNvbkZpbGVQYXRoOiBvcHRpb25zLmZhdmljb25QYXRoLFxuICAgICAgdG9wYmFySWNvbkZpbGVQYXRoOiBvcHRpb25zLnRvcGJhckljb25QYXRoLFxuICAgICAgdG9wYmFyQmdDb2xvcjogb3B0aW9ucy50b3BiYXJCZ0NvbG9yLFxuICAgICAgb3BlbkFwaUpzb25QYXRoOiBvcHRpb25zLm9wZW5BcGlKc29uUGF0aCxcbiAgICAgIG9wZW5BcGlZYW1sUGF0aDogb3B0aW9ucy5vcGVuQXBpWWFtbFBhdGgsXG4gICAgfSk7XG4gICAgc3dhZ2dlci5zZXR1cFN3YWdnZXIoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCB2YWxpZGF0aW9uIHBpcGVzLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBFbmFibGVzIHJlcXVlc3QgcGF5bG9hZCB2YWxpZGF0aW9uIGFuZCB0cmFuc2Zvcm1hdGlvbiBnbG9iYWxseSBhY3Jvc3NcbiAgICogdGhlIGVudGlyZSBOZXN0SlMgYXBwbGljYXRpb24uIE11bHRpcGxlIHBpcGVzIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyXG4gICAqIGZvciBtb2R1bGFyIGlucHV0IHZhbGlkYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uUGlwZVRyYW5zZm9ybVtdfSBwaXBlcyAtIFBpcGUgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyIGdsb2JhbGx5LlxuICAgKiBAcmV0dXJuIHtOZXN0Qm9vdHN0cmFwZXJ9IFJldHVybnMgdGhlIGNsYXNzIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHN0YXRpYyB1c2VHbG9iYWxQaXBlcyguLi5waXBlczogUGlwZVRyYW5zZm9ybVtdKSB7XG4gICAgaWYgKHBpcGVzLmxlbmd0aCA+IDApIHRoaXMuYXBwLnVzZUdsb2JhbFBpcGVzKC4uLnBpcGVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIG9uZSBvciBtb3JlIGdsb2JhbCBleGNlcHRpb24gZmlsdGVycy5cbiAgICpcbiAgICogQHN1bW1hcnlcbiAgICogSWYgbm8gZmlsdGVycyBhcmUgcHJvdmlkZWQsIGl0IGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJzIGEgZGVmYXVsdFxuICAgKiBzZXQgb2Ygc3RhbmRhcmQgZXhjZXB0aW9uIGZpbHRlcnMgZm9yIGNvbW1vbiBlcnJvciB0eXBlcyBsaWtlXG4gICAqIGBIdHRwRXhjZXB0aW9uYCwgYFZhbGlkYXRpb25FeGNlcHRpb25gLCBgQ29uZmxpY3RFeGNlcHRpb25gLCBhbmQgb3RoZXJzLlxuICAgKlxuICAgKiBUaGUgZGVmYXVsdCBgRGVjYWZFeGNlcHRpb25GaWx0ZXJgIGlzIGNvbnN0cnVjdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9uJ3NcbiAgICogYE1vZHVsZVJlZmAgc28gaXQgY2FuIHJlc29sdmUgdGhlIHJlcXVlc3Qtc2NvcGVkIGBEZWNhZlJlcXVlc3RDb250ZXh0YCAoYW5kXG4gICAqIGl0cyBjbGllbnQtYm91bmQgbG9nZ2VyKSBmb3IgdGhlIHJlcXVlc3QgdGhhdCB0aHJldywgaW5zdGVhZCBvZiBsb2dnaW5nXG4gICAqIHRocm91Z2ggdGhlIGdlbmVyaWMgZ2xvYmFsIGxvZ2dlci5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5FeGNlcHRpb25GaWx0ZXJbXX0gZmlsdGVycyAtIE9wdGlvbmFsIGZpbHRlcnMgdG8gYXBwbHkgZ2xvYmFsbHkuXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsRmlsdGVycyguLi5maWx0ZXJzOiBhbnlbXSkge1xuICAgIHRoaXMuYXBwLnVzZUdsb2JhbEZpbHRlcnMoXG4gICAgICAuLi4oZmlsdGVycy5sZW5ndGggPiAwXG4gICAgICAgID8gZmlsdGVyc1xuICAgICAgICA6IFtuZXcgRGVjYWZFeGNlcHRpb25GaWx0ZXIodGhpcy5hcHAuZ2V0KE1vZHVsZVJlZiwgeyBzdHJpY3Q6IGZhbHNlIH0pKV0pXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmVnaXN0ZXJzIGdsb2JhbCBpbnRlcmNlcHRvcnMgZm9yIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBJbnRlcmNlcHRvcnMgYWxsb3cgYWR2YW5jZWQgcmVxdWVzdC9yZXNwb25zZSBtYW5pcHVsYXRpb24gc3VjaCBhc1xuICAgKiBzZXJpYWxpemF0aW9uLCBsb2dnaW5nLCBvciB0cmFuc2Zvcm1hdGlvbi4gTXVsdGlwbGUgaW50ZXJjZXB0b3JzXG4gICAqIGNhbiBiZSBhZGRlZCBmb3IgbW9kdWxhciBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLk5lc3RJbnRlcmNlcHRvcltdfSBpbnRlcmNlcHRvcnMgLSBJbnRlcmNlcHRvciBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm4ge05lc3RCb290c3RyYXBlcn0gUmV0dXJucyB0aGUgY2xhc3MgZm9yIGNoYWluaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgdXNlR2xvYmFsSW50ZXJjZXB0b3JzKC4uLmludGVyY2VwdG9yczogTmVzdEludGVyY2VwdG9yW10pIHtcbiAgICBpZiAoaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApXG4gICAgICB0aGlzLmFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMoLi4uaW50ZXJjZXB0b3JzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU3RhcnRzIHRoZSBOZXN0SlMgYXBwbGljYXRpb24gYW5kIGJpbmRzIGl0IHRvIHRoZSBnaXZlbiBwb3J0IGFuZCBob3N0LlxuICAgKlxuICAgKiBAc3VtbWFyeVxuICAgKiBMaXN0ZW5zIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCBhbmQgb3B0aW9uYWxseSBhIGhvc3QuIE9uY2Ugc3RhcnRlZCxcbiAgICogbG9ncyB0aGUgYXBwbGljYXRpb24gVVJMIGZvciBlYXN5IGFjY2Vzcy4gVGhlIHN0YXJ0dXAgcHJvY2VzcyByZXNvbHZlc1xuICAgKiBvbmNlIHRoZSBhcHBsaWNhdGlvbiBpcyBzdWNjZXNzZnVsbHkgcnVubmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwb3J0PTMwMDBdIC0gUG9ydCBudW1iZXIgdG8gbGlzdGVuIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3RdIC0gT3B0aW9uYWwgaG9zdCBvciBJUCBhZGRyZXNzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2xvZz10cnVlXSAtIFdoZXRoZXIgdG8gbG9nIHRoZSBhcHBsaWNhdGlvbiBVUkwgdXBvbiBzdGFydHVwLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBvbmNlIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgc3VjY2Vzc2Z1bGx5LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHN0YXJ0KFxuICAgIHBvcnQ6IG51bWJlciA9IE51bWJlcihwcm9jZXNzLmVudi5QT1JUKSB8fCAzMDAwLFxuICAgIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBsb2c6IGJvb2xlYW4gPSB0cnVlXG4gICkge1xuICAgIHRoaXMuYXBwLmxpc3Rlbihwb3J0LCBob3N0IGFzIGFueSkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IHRoaXMuYXBwLmdldFVybCgpO1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2coYPCfmoAgQXBwbGljYXRpb24gaXMgcnVubmluZyBhdDogJHt1cmx9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENhbGxIYW5kbGVyLFxuICBFeGVjdXRpb25Db250ZXh0LFxuICBJbmplY3RhYmxlLFxuICBOZXN0SW50ZXJjZXB0b3IsXG4gIFNjb3BlLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IERlY2FmSGFuZGxlckV4ZWN1dG9yLCBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcbmltcG9ydCB7IERlZmF1bHRBZGFwdGVyRmxhZ3MgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyRmxhZ3MgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgXCIuLi9vdmVycmlkZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEludGVyY2VwdG9yIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpbmcgYWxsIHJlZ2lzdGVyZWQgRGVjYWYgcmVxdWVzdCBoYW5kbGVyc1xuICogYmVmb3JlIHRoZSBjb250cm9sbGVyIG1ldGhvZCBpcyBpbnZva2VkLlxuICpcbiAqIEBzdW1tYXJ5XG4gKiBUaGUge0BsaW5rIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcn0gaW50ZWdyYXRlcyB0aGUgRGVjYWYgcmVxdWVzdC1oYW5kbGluZyBwaXBlbGluZVxuICogaW50byBOZXN0SlMnIGludGVyY2VwdG9yIG1lY2hhbmlzbS4gQmVmb3JlIHBhc3NpbmcgZXhlY3V0aW9uIHRvIHRoZSBuZXh0IGhhbmRsZXIgaW4gdGhlXG4gKiBOZXN0SlMgY2hhaW4sIGl0IGRlbGVnYXRlcyByZXF1ZXN0IHByb2Nlc3NpbmcgdG8gdGhlIHtAbGluayBEZWNhZkhhbmRsZXJFeGVjdXRvcn0sIHdoaWNoXG4gKiBzZXF1ZW50aWFsbHkgcnVucyBhbGwgcmVnaXN0ZXJlZCB7QGxpbmsgRGVjYWZSZXF1ZXN0SGFuZGxlcn0gaW5zdGFuY2VzLiBUaGlzIGFsbG93c1xuICogYmVoYXZpb3JzIHN1Y2ggYXMgYXV0aGVudGljYXRpb24sIGxvZ2dpbmcsIHRlbmFudCByZXNvbHV0aW9uLCBvciBtZXRhZGF0YSBlbnJpY2htZW50XG4gKiB0byBvY2N1ciBwcmlvciB0byBjb250cm9sbGVyIGV4ZWN1dGlvbi5cbiAqXG4gKiBAY2xhc3MgRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBcHBseSBnbG9iYWxseTpcbiAqIGFwcC51c2VHbG9iYWxJbnRlcmNlcHRvcnMobmV3IERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcihleGVjdXRvcikpO1xuICpcbiAqIC8vIE9yIGluIGEgbW9kdWxlOlxuICogQE1vZHVsZSh7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICogICAgIHtcbiAqICAgICAgIHByb3ZpZGU6IEFQUF9JTlRFUkNFUFRPUixcbiAqICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gKiAgICAgfSxcbiAqICAgXSxcbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgICAgcGFydGljaXBhbnQgSW50ZXJjZXB0b3JcbiAqICAgICBwYXJ0aWNpcGFudCBFeGVjdXRvclxuICogICAgIHBhcnRpY2lwYW50IENvbnRyb2xsZXJcbiAqXG4gKiAgICAgQ2xpZW50LT4+SW50ZXJjZXB0b3I6IEhUVFAgUmVxdWVzdFxuICogICAgIEludGVyY2VwdG9yLT4+RXhlY3V0b3I6IGV4ZWMocmVxdWVzdClcbiAqICAgICBFeGVjdXRvci0tPj5JbnRlcmNlcHRvcjogaGFuZGxlcnMgY29tcGxldGVkXG4gKiAgICAgSW50ZXJjZXB0b3ItPj5Db250cm9sbGVyOiBuZXh0LmhhbmRsZSgpXG4gKiAgICAgQ29udHJvbGxlci0tPj5DbGllbnQ6IFJlc3BvbnNlXG4gKi9cbkBJbmplY3RhYmxlKHsgc2NvcGU6IFNjb3BlLlJFUVVFU1QgfSlcbmV4cG9ydCBjbGFzcyBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBOZXN0SW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVxdWVzdENvbnRleHQ6IERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4ZWN1dG9yOiBEZWNhZkhhbmRsZXJFeGVjdXRvclxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbnRleHR1YWxpemUocmVxOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gcmVxLmhlYWRlcnM7XG4gICAgY29uc3QgZmxhZ3M6IERlY2FmU2VydmVyRmxhZ3MgPSB7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgb3ZlcnJpZGVzOiB7fSxcbiAgICB9IGFzIGFueTtcblxuICAgIGNvbnN0IGlwID0gZXh0cmFjdElwKHJlcSk7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5nZXQoKS5mb3IoeyBpcCB9KTtcblxuICAgIHRoaXMucmVxdWVzdENvbnRleHQuYWNjdW11bGF0ZShcbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgIHt9LFxuICAgICAgICBEZWZhdWx0QWRhcHRlckZsYWdzLFxuICAgICAgICB7XG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKSxcbiAgICAgICAgICBvcGVyYXRpb246IGAke3JlcS5tZXRob2R9ICR7cmVxLnVybH1gLFxuICAgICAgICB9LFxuICAgICAgICBmbGFnc1xuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnRlcmNlcHQoY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgbmV4dDogQ2FsbEhhbmRsZXIpIHtcbiAgICBjb25zdCByZXEgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlcXVlc3QoKTtcbiAgICBjb25zdCByZXMgPSBjb250ZXh0LnN3aXRjaFRvSHR0cCgpLmdldFJlc3BvbnNlKCk7XG4gICAgY29uc3QgbG9nID0gTG9nZ2luZy5mb3IoRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yKS5mb3IodGhpcy5pbnRlcmNlcHQpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY29udGV4dHVhbGl6ZShyZXEpO1xuICAgIGxvZy5kZWJ1ZyhcbiAgICAgIGBDT05URVhUICR7dGhpcy5yZXF1ZXN0Q29udGV4dC51dWlkfSBjb250ZXh0dWFsaXplZCAtIHJlcXVlc3Q6ICR7cmVxLm1ldGhvZH0gJHtyZXEudXJsfWBcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5leGVjdXRvci5leGVjKHJlcSwgcmVzKTtcbiAgICBsb2cuZGVidWcoXG4gICAgICBgQ09OVEVYVCAke3RoaXMucmVxdWVzdENvbnRleHQudXVpZH0gZXhlY3V0b3JzIGZpbmlzaGVkIC0gcmVxdWVzdDogJHtyZXEubWV0aG9kfSAke3JlcS51cmx9YFxuICAgICk7XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZXh0cmFjdElwKHJlcTogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzO1xuICBmdW5jdGlvbiBwYXJzZUlwSGVhZGVyKHZhbHVlPzogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgIC5zcGxpdChcIixcIilcbiAgICAgIC5tYXAoKHNlZ21lbnQpID0+IHNlZ21lbnQudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVswXTtcbiAgfVxuICByZXR1cm4gKFxuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wieC1mb3J3YXJkZWQtZm9yXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wieC1yZWFsLWlwXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wiWC1Gb3J3YXJkZWQtRm9yXCJdKSA/P1xuICAgIHBhcnNlSXBIZWFkZXIoaGVhZGVycz8uW1wiWC1SZWFsLUlQXCJdKSA/P1xuICAgIHJlcS5pcFxuICApO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0IH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgaW5qZWN0YWJsZVNlcnZpY2VLZXksXG4gIE1vZGVsU2VydmljZSxcbiAgUmVwb3NpdG9yeSBhcyBDb3JlUmVwb3NpdG9yeSxcbiAgU2VydmljZSBhcyBDb3JlU2VydmljZSxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuZXhwb3J0IHR5cGUgRGVjYWZGYWN0b3J5UHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IHN0cmluZztcbiAgdXNlRmFjdG9yeTogKCkgPT4gdW5rbm93bjtcbn07XG5cbmNvbnN0IHBlbmRpbmdQcm92aWRlcnMgPSBuZXcgTWFwPHN0cmluZywgRGVjYWZGYWN0b3J5UHJvdmlkZXI+KCk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERyYWlucyB0aGUgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgYnkge0BsaW5rIFNlcnZpY2V9L3tAbGluayBSZXBvc2l0b3J5fSB1c2FnZXMuXG4gKiBAc3VtbWFyeSBDb25zdW1lZCBieSB7QGxpbmsgRGVjYWZDb3JlTW9kdWxlLmZvclJvb3R9IHRvIHdpcmUgdGhlIHRva2VucyB0aGF0IHRob3NlIHBhcmFtZXRlclxuICogZGVjb3JhdG9ycyByZWZlcmVuY2UgYmFjayBpbnRvIE5lc3QncyBESSBjb250YWluZXIsIHNpbmNlIGEgcGFyYW1ldGVyIGRlY29yYXRvciBhbG9uZSBjYW5ub3RcbiAqIHN1cHBseSBhIHByb3ZpZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzKCk6IERlY2FmRmFjdG9yeVByb3ZpZGVyW10ge1xuICByZXR1cm4gQXJyYXkuZnJvbShwZW5kaW5nUHJvdmlkZXJzLnZhbHVlcygpKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcih0b2tlbjogc3RyaW5nLCB1c2VGYWN0b3J5OiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChwZW5kaW5nUHJvdmlkZXJzLmhhcyh0b2tlbikpIHJldHVybjtcbiAgcGVuZGluZ1Byb3ZpZGVycy5zZXQodG9rZW4sIHsgcHJvdmlkZTogdG9rZW4sIHVzZUZhY3RvcnkgfSk7XG59XG5cbmZ1bmN0aW9uIGlzTW9kZWxDb25zdHJ1Y3Rvcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIENvbnN0cnVjdG9yPGFueT4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgJiYgdmFsdWUucHJvdG90eXBlIGluc3RhbmNlb2YgTW9kZWw7XG59XG5cbmZ1bmN0aW9uIG1vZGVsU2VydmljZVRva2VuKG1vZGVsOiBDb25zdHJ1Y3Rvcjxhbnk+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZGVsLm5hbWV9U2VydmljZWA7XG59XG5cbmZ1bmN0aW9uIG1vZGVsUmVwb3NpdG9yeVRva2VuKFxuICBtb2RlbDogQ29uc3RydWN0b3I8YW55PixcbiAgZmxhdm91cj86IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZsYXZvdXIgPyBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlAJHtmbGF2b3VyfWAgOiBgJHttb2RlbC5uYW1lfVJlcG9zaXRvcnlgO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RvciBwYXJhbWV0ZXIgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlY2FmIHNlcnZpY2UuXG4gKiBAc3VtbWFyeSBUcmFuc2xhdGVzIGRlY2FmJ3Mgc2VydmljZSByZXNvbHV0aW9uIEFQSXMgaW50byBhIE5lc3QgYEBJbmplY3QoKWAgY2FsbDpcbiAqIC0gYEBTZXJ2aWNlKFNvbWVNb2RlbClgIGluamVjdHMgdGhlIGBNb2RlbFNlcnZpY2U8U29tZU1vZGVsPmAgc2luZ2xldG9uIGZvciB0aGF0IG1vZGVsXG4gKiAgICh2aWEge0BsaW5rIE1vZGVsU2VydmljZS5mb3JNb2RlbH0pLlxuICogLSBgQFNlcnZpY2UoU29tZVNlcnZpY2VDbGFzcylgIG9yIGBAU2VydmljZShcImFsaWFzXCIpYCBpbmplY3RzIHRoZSBtYXRjaGluZyBgQHNlcnZpY2UoKWAtZGVjb3JhdGVkXG4gKiAgIGRlY2FmIHtAbGluayBDb3JlU2VydmljZX0gKHZpYSB7QGxpbmsgQ29yZVNlcnZpY2UuZ2V0fSkuXG4gKiAtIGBAU2VydmljZSgpYCBpbmZlcnMgdGhlIHBhcmFtZXRlcidzIHR5cGUgZnJvbSBlbWl0dGVkIGNvbnN0cnVjdG9yIG1ldGFkYXRhIGFuZCByZXNvbHZlcyBpdCB0aGVcbiAqICAgc2FtZSB3YXksIHByb3ZpZGVkIHRoZSBwYXJhbWV0ZXIgaXMgdHlwZWQgYXMgYSBjb25jcmV0ZSBjbGFzcyAoZ2VuZXJpY3MgbGlrZSBgTW9kZWxTZXJ2aWNlPFg+YFxuICogICBhcmUgZXJhc2VkIGF0IHJ1bnRpbWUsIHNvIHRoZSBtb2RlbC1zZXJ2aWNlIGZvcm0gYWx3YXlzIHJlcXVpcmVzIGFuIGV4cGxpY2l0IGFyZ3VtZW50KS5cbiAqIEBwYXJhbSBrZXkgdGhlIG1vZGVsIGNsYXNzLCBzZXJ2aWNlIGNsYXNzLCBvciBhbGlhcyB0byByZXNvbHZlLiBPbWl0IHRvIGluZmVyIGZyb20gdGhlIHBhcmFtZXRlciB0eXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gU2VydmljZShrZXk/OiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+KTogUGFyYW1ldGVyRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBwcm9wZXJ0eUtleTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIHBhcmFtZXRlckluZGV4OiBudW1iZXJcbiAgKTogdm9pZCA9PiB7XG4gICAgbGV0IHJlc29sdmVkOiBzdHJpbmcgfCBDb25zdHJ1Y3Rvcjxhbnk+IHwgdW5kZWZpbmVkID0ga2V5O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHBhcmFtVHlwZXM6IGFueVtdID1cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIHRhcmdldCkgfHwgW107XG4gICAgICByZXNvbHZlZCA9IHBhcmFtVHlwZXNbcGFyYW1ldGVySW5kZXhdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHJlc29sdmVkID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEBTZXJ2aWNlKCkgY291bGQgbm90IGRldGVybWluZSBhbiBpbmplY3Rpb24gdHlwZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1ldGVySW5kZXh9IG9mICR7KHRhcmdldCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KS5uYW1lfS4gUHJvdmlkZSBhbiBleHBsaWNpdCBhcmd1bWVudCwgZS5nLiBAU2VydmljZShTb21lU2VydmljZSkuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc01vZGVsID0gdHlwZW9mIHJlc29sdmVkICE9PSBcInN0cmluZ1wiICYmIGlzTW9kZWxDb25zdHJ1Y3RvcihyZXNvbHZlZCk7XG4gICAgY29uc3QgdG9rZW4gPSBhc01vZGVsXG4gICAgICA/IG1vZGVsU2VydmljZVRva2VuKHJlc29sdmVkIGFzIENvbnN0cnVjdG9yPGFueT4pXG4gICAgICA6IGluamVjdGFibGVTZXJ2aWNlS2V5KHJlc29sdmVkIGFzIHN0cmluZyB8IENvbnN0cnVjdG9yPGFueT4pO1xuXG4gICAgcmVnaXN0ZXJQcm92aWRlcih0b2tlbiwgKCkgPT4ge1xuICAgICAgaWYgKGFzTW9kZWwpIHJldHVybiBNb2RlbFNlcnZpY2UuZm9yTW9kZWwocmVzb2x2ZWQgYXMgQ29uc3RydWN0b3I8YW55Pik7XG4gICAgICByZXR1cm4gdHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gQ29yZVNlcnZpY2UuZ2V0KHJlc29sdmVkKVxuICAgICAgICA6IENvcmVTZXJ2aWNlLmdldChyZXNvbHZlZCBhcyBDb25zdHJ1Y3Rvcjxhbnk+KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBJbmplY3QodG9rZW4pKHRhcmdldCwgcHJvcGVydHlLZXksIHBhcmFtZXRlckluZGV4KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uc3RydWN0b3IgcGFyYW1ldGVyIGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZWNhZiB7QGxpbmsgQ29yZVJlcG9zaXRvcnl9IGZvciBgbW9kZWxgLlxuICogQHN1bW1hcnkgVW5saWtlIHtAbGluayBTZXJ2aWNlfSwgYG1vZGVsYCBpcyBhbHdheXMgdHJlYXRlZCBhcyBhIE1vZGVsIGNsYXNzOiB0aGUgc2FtZSBjbGFzcyBwYXNzZWRcbiAqIHRvIGBAU2VydmljZShtb2RlbClgIGFuZCBgQFJlcG9zaXRvcnkobW9kZWwpYCByZXNvbHZlcyB0byB0d28gZGlmZmVyZW50IGluamVjdGVkIG9iamVjdHMgKGFcbiAqIGBNb2RlbFNlcnZpY2U8TT5gIHZzIGEgYFJlcG9zaXRvcnk8TT5gIHJlc3BlY3RpdmVseSksIHZpYSB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCBjbGFzcyB0byByZXNvbHZlIGEgcmVwb3NpdG9yeSBmb3IuXG4gKiBAcGFyYW0gZmxhdm91ciBvcHRpb25hbCBhZGFwdGVyIGZsYXZvdXIvYWxpYXMsIGZvcndhcmRlZCB0byB7QGxpbmsgQ29yZVJlcG9zaXRvcnkuZm9yTW9kZWx9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gUmVwb3NpdG9yeShcbiAgbW9kZWw6IENvbnN0cnVjdG9yPGFueT4sXG4gIGZsYXZvdXI/OiBzdHJpbmdcbik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBwYXJhbWV0ZXJJbmRleDogbnVtYmVyXG4gICk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRva2VuID0gbW9kZWxSZXBvc2l0b3J5VG9rZW4obW9kZWwsIGZsYXZvdXIpO1xuICAgIHJlZ2lzdGVyUHJvdmlkZXIodG9rZW4sICgpID0+IENvcmVSZXBvc2l0b3J5LmZvck1vZGVsKG1vZGVsLCBmbGF2b3VyKSk7XG4gICAgcmV0dXJuIEluamVjdCh0b2tlbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcGFyYW1ldGVySW5kZXgpO1xuICB9O1xufVxuIiwiaW1wb3J0IHtcbiAgRHluYW1pY01vZHVsZSxcbiAgR2xvYmFsLFxuICBJbmplY3QsXG4gIE1vZHVsZSxcbiAgT25BcHBsaWNhdGlvblNodXRkb3duLFxufSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEFQUF9JTlRFUkNFUFRPUiwgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVDQUZfQURBUFRFUl9JRCxcbiAgREVDQUZfSEFORExFUlMsXG4gIERFQ0FGX01PRFVMRV9PUFRJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIERlY2FmUmVxdWVzdEhhbmRsZXJJbnRlcmNlcHRvcixcbn0gZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5pbXBvcnQgeyBEZWNhZkhhbmRsZXJFeGVjdXRvciwgRGVjYWZSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCIuL3JlcXVlc3RcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBBZGFwdGVyLCBQZXJzaXN0ZW5jZVNlcnZpY2UsIFNlcnZpY2UgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldFJlZ2lzdGVyZWREZWNhZlByb3ZpZGVycyB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgUmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyLFxuICByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIsXG59IGZyb20gXCJAZGVjYWYtdHMvZm9yLWh0dHAvc2VydmVyXCI7XG5cbkBHbG9iYWwoKVxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZkNvcmVNb2R1bGU8Q09ORiwgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueT4+XG4gIGltcGxlbWVudHMgT25BcHBsaWNhdGlvblNodXRkb3duXG57XG4gIHByaXZhdGUgc3RhdGljIF9sb2dnZXI6IExvZ2dlcjtcblxuICBwcml2YXRlIHN0YXRpYyBfcGVyc2lzdGVuY2U/OiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PjtcblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBwZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVNlcnZpY2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnk+PiB7XG4gICAgaWYgKCF0aGlzLl9wZXJzaXN0ZW5jZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiUGVyc2lzdGVuY2Ugc2VydmljZSBub3QgaW5pdGlhbGl6ZWRcIik7XG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbmNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGZvclJvb3Qob3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgY29uc3QgZGVjYWZQcm92aWRlcnMgPSBnZXRSZWdpc3RlcmVkRGVjYWZQcm92aWRlcnMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZkNvcmVNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9NT0RVTEVfT1BUSU9OUywgdXNlVmFsdWU6IG9wdGlvbnMgfSxcbiAgICAgICAgeyBwcm92aWRlOiBERUNBRl9BREFQVEVSX0lELCB1c2VWYWx1ZTogdGhpcy5wZXJzaXN0ZW5jZT8uY2xpZW50IH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcm92aWRlOiBERUNBRl9IQU5ETEVSUyxcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PlxuICAgICAgICAgICAgb3B0aW9ucy5oYW5kbGVycz8ubWFwKChIKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5pbmZvKGBSZWdpc3RlcmVkIHJlcXVlc3QgaGFuZGxlcjogJHtILm5hbWV9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgSCgpO1xuICAgICAgICAgICAgfSkgPz8gW10sXG4gICAgICAgIH0sXG4gICAgICAgIERlY2FmUmVxdWVzdENvbnRleHQsXG4gICAgICAgIERlY2FmSGFuZGxlckV4ZWN1dG9yLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQVBQX0lOVEVSQ0VQVE9SLFxuICAgICAgICAgIHVzZUNsYXNzOiBEZWNhZlJlcXVlc3RIYW5kbGVySW50ZXJjZXB0b3IsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRlY2FmUHJvdmlkZXJzLFxuICAgICAgXSxcbiAgICAgIGV4cG9ydHM6IFtcbiAgICAgICAgREVDQUZfTU9EVUxFX09QVElPTlMsXG4gICAgICAgIERFQ0FGX0FEQVBURVJfSUQsXG4gICAgICAgIERFQ0FGX0hBTkRMRVJTLFxuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICBEZWNhZkhhbmRsZXJFeGVjdXRvcixcbiAgICAgICAgLi4uZGVjYWZQcm92aWRlcnMubWFwKChwcm92aWRlcikgPT4gcHJvdmlkZXIucHJvdmlkZSksXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgYm9vdFBlcnNpc3RlbmNlKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuYm9vdFBlcnNpc3RlbmNlKTtcblxuICAgIGlmICghdGhpcy5fcGVyc2lzdGVuY2UpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSBvcHRpb25zLmNvbmYubWFwKChbY29udHIsIGNmZywgLi4uYXJnc10pID0+IHtcbiAgICAgICAgY29uc3QgcG9zc2libGUgPSBhcmdzLnBvcCgpO1xuICAgICAgICBpZiAoIXBvc3NpYmxlKSByZXR1cm4gW2NvbnRyLCBjZmddO1xuICAgICAgICByZXR1cm4gW2NvbnRyLCBjZmcsIC4uLmFyZ3NdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9wZXJzaXN0ZW5jZSA9IG5ldyBQZXJzaXN0ZW5jZVNlcnZpY2UoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3BlcnNpc3RlbmNlLmJvb3QodHJpbW1lZCk7XG4gICAgICBjb25zdCBjbGllbnRzID0gdGhpcy5fcGVyc2lzdGVuY2UuY2xpZW50O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGMgPSBvcHRpb25zLmNvbmZbaV07XG4gICAgICAgIGNvbnN0IHBvc3NpYmxlVHJhbnNmID0gYy5zbGljZSgyLCBjLmxlbmd0aCk7XG4gICAgICAgIGxldCB0cmFuc2Zvcm1lciA9IHBvc3NpYmxlVHJhbnNmLnBvcCgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXRyYW5zZm9ybWVyIHx8XG4gICAgICAgICAgISh0cmFuc2Zvcm1lciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBjb250ciA9IEFkYXB0ZXIudHJhbnNmb3JtZXJGb3IoY2xpZW50c1tpXS5mbGF2b3VyKTtcbiAgICAgICAgICBpZiAoIWNvbnRyKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBObyB0cmFuc2Zvcm1lciBmb3VuZCBmb3IgZmxhdm91ciAke2NsaWVudHNbaV0uZmxhdm91cn0uIHlvdSBzaG91bGQgZWl0aGVyIEByZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXIgb3IgcHJvdmlkZSBhIHRyYW5zZm9ybWVyIGluIHRoZSBjb25maWdgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lciA9IChjb250ciBhcyBSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55PikuZnJvbVxuICAgICAgICAgICAgICA/IGNvbnRyXG4gICAgICAgICAgICAgIDogbmV3IChjb250ciBhcyBDb25zdHJ1Y3RvcjxSZXF1ZXN0VG9Db250ZXh0VHJhbnNmb3JtZXI8YW55Pj4pKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gYm9vdCB0cmFuc2Zvcm1lciBmb3IgJHtjbGllbnRzW2ldLmZsYXZvdXJ9OiAke2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyKGNsaWVudHNbaV0uZmxhdm91cikodHJhbnNmb3JtZXIpO1xuICAgICAgfVxuICAgICAgbG9nLmluZm8oXCJwZXJzaXN0ZW5jZSBsYXllciBjcmVhdGVkIHN1Y2Nlc3NmdWxseSFcIik7XG5cbiAgICAgIGlmIChvcHRpb25zLmluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0aWFsaXphdGlvbigpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGFwcGxpY2F0aW9uOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5jbGllbnQ7XG4gIH1cblxuICBhc3luYyBvbkFwcGxpY2F0aW9uU2h1dGRvd24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gRGVjYWZDb3JlTW9kdWxlLmxvZy5mb3IodGhpcy5vbkFwcGxpY2F0aW9uU2h1dGRvd24pO1xuICAgIGNvbnN0IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXSA9XG4gICAgICB0aGlzLm1vZHVsZVJlZi5nZXQ8YW55PihERUNBRl9BREFQVEVSX0lEKTtcbiAgICBmb3IgKGNvbnN0IGFkYXB0ZXIgb2YgYWRhcHRlcnMpXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICAgIGxvZy5pbmZvKGBTaHV0dGluZyBkb3duICR7YWRhcHRlci50b1N0cmluZygpfWApO1xuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2cuZXJyb3IoYEZhaWxlZCB0byBzaHV0ZG93biBhcHBsaWNhdGlvbmAsIGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBTZXJ2aWNlLnNodXRkb3duKCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gc2h1dGRvd24gc2VydmljZXNgLCBlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjb25zdCBMSVNURU5JTkdfQURBUFRFUlNfRkxBVk9VUlMgPSBTeW1ib2woXG4gIFwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTXCJcbik7XG4iLCJleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnRSZXNwb25zZShhcmdzOiBhbnlbXSk6IHVua25vd25bXSB7XG4gIGNvbnN0IFttb2RlbENvbnN0ciwgb3BlcmF0aW9uLCBpZCwgcGF5bG9hZF0gPSBhcmdzO1xuXG4gIGNvbnN0IG1vZGVsTmFtZSA9IG1vZGVsQ29uc3RyPy5uYW1lID8/IG1vZGVsQ29uc3RyO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWRQYXlsb2FkID0gQXJyYXkuaXNBcnJheShwYXlsb2FkKVxuICAgID8gcGF5bG9hZC5tYXAoKGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodHlwZW9mIGUuc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBlLnNlcmlhbGl6ZSgpO1xuXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBheWxvYWQgaXRlbSBmb3IgJHttb2RlbE5hbWV9IGRvZXMgbm90IGhhdmUgc2VyaWFsaXplIG1ldGhvZCBhbmQgaXMgYW4gJHt0eXBlb2YgZX0sIGF0dGVtcHRpbmcgdG8gc3RyaW5naWZ5IGRpcmVjdGx5LiBJdGVtOiAke2V9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBlID09PSBcInN0cmluZ1wiID8gZSA6IEpTT04uc3RyaW5naWZ5KGUpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBzZXJpYWxpemUgcGF5bG9hZCBmb3IgJHttb2RlbE5hbWV9OiAke2Vycn1gKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIDogcGF5bG9hZCAmJiB0eXBlb2YgcGF5bG9hZC5zZXJpYWxpemUgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBwYXlsb2FkLnNlcmlhbGl6ZSgpXG4gICAgICA6IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gcGF5bG9hZFxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXG4gIGNvbnNvbGUuZGVidWcoXG4gICAgYE5vcm1hbGl6ZWQgZXZlbnQgcmVzcG9uc2UgZm9yIG1vZGVsICR7bW9kZWxOYW1lfSwgb3BlcmF0aW9uICR7b3BlcmF0aW9ufSwgaWQgJHtpZH06YCxcbiAgICBzZXJpYWxpemVkUGF5bG9hZFxuICApO1xuXG4gIHJldHVybiBbbW9kZWxOYW1lLCBvcGVyYXRpb24sIGlkLCBzZXJpYWxpemVkUGF5bG9hZF07XG59XG4iLCJpbXBvcnQgeyBEZWNhZkNvbnRyb2xsZXIgfSBmcm9tIFwiLi4vY29udHJvbGxlcnNcIjtcbmltcG9ydCB7IERlY2FmUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiLi4vcmVxdWVzdFwiO1xuaW1wb3J0IHsgQWRhcHRlciwgT2JzZXJ2ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIEluamVjdCwgTWVzc2FnZUV2ZW50LCBRdWVyeSwgU3NlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBpbnRlcnZhbCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIH0gZnJvbSBcIi4vY29uc3RhbnRcIjtcbmltcG9ydCB7IERlY2FmU2VydmVyQ3R4IH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbm9ybWFsaXplRXZlbnRSZXNwb25zZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG5AQ29udHJvbGxlcigpXG5leHBvcnQgY2xhc3MgRXZlbnRzQ29udHJvbGxlciBleHRlbmRzIERlY2FmQ29udHJvbGxlcjxEZWNhZlNlcnZlckN0eD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFkYXB0ZXJzOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueT5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjbGllbnRDb250ZXh0OiBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgIEBJbmplY3QoTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTKSBmbGF2b3Vyczogc3RyaW5nW11cbiAgKSB7XG4gICAgc3VwZXIoY2xpZW50Q29udGV4dCwgRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcbiAgICB0aGlzLmFkYXB0ZXJzID0gZmxhdm91cnMubWFwKChmbGF2b3VyKSA9PiAoQWRhcHRlciBhcyBhbnkpLmdldChmbGF2b3VyKSk7IC8vIGNoYW5nZSB0byBBZGFwdGVyLmNhY2hlKFwiXCIpXG4gIH1cblxuICBAU3NlKClcbiAgbGlzdGVuKCk6IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IoRXZlbnRzQ29udHJvbGxlci5uYW1lKTtcblxuICAgIGNvbnN0IGV2ZW50cyQgPSBuZXcgT2JzZXJ2YWJsZTxNZXNzYWdlRXZlbnQ+KChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJJZCA9XG4gICAgICAgIGBCLSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCl9YC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYENyZWF0aW5nIFNTRSBvYnNlcnZlcjogJHtvYnNlcnZlcklkfSBmb3IgY2xpZW50ICR7dGhpcy5jbGllbnRDb250ZXh0LnV1aWR9YFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgb2JzZXJ2ZXJJZCA9IG9ic2VydmVySWQ7XG4gICAgICAgIHJlZnJlc2goLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICBgU1NFIG9ic2VydmVyICR7dGhpcy5vYnNlcnZlcklkfSByZWNlaXZlZCByZWZyZXNoIGV2ZW50YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZUV2ZW50UmVzcG9uc2UoYXJncyk7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgdHlwZTogXCJtZXNzYWdlXCIsIGRhdGEgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgIGBTU0Ugb2JzZXJ2ZXIgJHt0aGlzLm9ic2VydmVySWR9IGV2ZW50IHB1c2hlZCB0byBjbGllbnRgXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBsb2dnZXIudmVyYm9zZShcbiAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gYWNyb3NzICR7dGhpcy5hZGFwdGVycy5sZW5ndGh9IGFkYXB0ZXIocylgXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgYFJlZ2lzdGVyaW5nIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGFkYXB0ZXIub2JzZXJ2ZShjYik7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVnaXN0ZXIgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBpbiBhZGFwdGVyICR7YWRhcHRlck5hbWV9OiAke2U/Lm1lc3NhZ2UgfHwgZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBDbGVhbmluZyB1cCBTU0Ugb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfWApO1xuXG4gICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgY29uc3QgYWRhcHRlck5hbWUgPSBhZGFwdGVyPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBcIlVua25vd25BZGFwdGVyXCI7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgYFVucmVnaXN0ZXJpbmcgb2JzZXJ2ZXIgJHtvYnNlcnZlcklkfSBmcm9tIGFkYXB0ZXIgJHthZGFwdGVyTmFtZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYWRhcHRlci51bk9ic2VydmUoY2IpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICBgRmFpbGVkIGR1cmluZyBjbGVhbnVwIG9mIG9ic2VydmVyICR7b2JzZXJ2ZXJJZH0gaW4gYWRhcHRlciAke2FkYXB0ZXJOYW1lfTogJHtlPy5tZXNzYWdlIHx8IGV9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUxfTVMgPSAxNTAwMDtcbiAgICBjb25zdCBoZWFydGJlYXQkID0gaW50ZXJ2YWwoSEVBUlRCRUFUX0lOVEVSVkFMX01TKS5waXBlKFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiU2VuZGluZyBoZWFydGJlYXRcIik7XG4gICAgICB9KSxcbiAgICAgIG1hcChcbiAgICAgICAgKCk6IE1lc3NhZ2VFdmVudCA9PiAoe1xuICAgICAgICAgIHR5cGU6IFwiaGVhcnRiZWF0XCIsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gbWVyZ2UoZXZlbnRzJCwgaGVhcnRiZWF0JCk7XG4gIH1cblxuICBAU3NlKFwiLzptb2RlbFwiKVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGxpc3RlbkZvck1vZGVsKEBRdWVyeShcIm1vZGVsXCIpIG1vZGVsOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VFdmVudD4ge1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKEV2ZW50c0NvbnRyb2xsZXIubmFtZSk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TWVzc2FnZUV2ZW50Pigob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGNiID0gbmV3IChjbGFzcyBpbXBsZW1lbnRzIE9ic2VydmVyIHtcbiAgICAgICAgcmVmcmVzaCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBkYXRhOiBhcmdzIH0gYXMgYW55KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCBhZGFwdGVyIG9mIHRoaXMuYWRhcHRlcnMpIHtcbiAgICAgICAgICBhZGFwdGVyLm9ic2VydmUoY2IpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoYEZhaWxlZCB0byBvYnNlcnZlIGV2ZW50OiAke2UubWVzc2FnZSB8fCBlfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgYWRhcHRlciBvZiB0aGlzLmFkYXB0ZXJzKSB7XG4gICAgICAgICAgICBhZGFwdGVyLnVuT2JzZXJ2ZShjYik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIE1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXZlbnRzQ29udHJvbGxlciB9IGZyb20gXCIuL0V2ZW50c0NvbnRyb2xsZXJcIjtcbmltcG9ydCB7IFJvdXRlck1vZHVsZSB9IGZyb20gXCJAbmVzdGpzL2NvcmVcIjtcbmltcG9ydCB7IExJU1RFTklOR19BREFQVEVSU19GTEFWT1VSUyB9IGZyb20gXCIuL2NvbnN0YW50XCI7XG5pbXBvcnQgeyBEZWNhZlJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIi4uL3JlcXVlc3RcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZlN0cmVhbU1vZHVsZSB7XG4gIHN0YXRpYyBmb3JGbGF2b3VycyhcbiAgICBmbGF2b3Vyczogc3RyaW5nW10sXG4gICAgcGF0aDogc3RyaW5nID0gXCJldmVudHNcIlxuICApOiBEeW5hbWljTW9kdWxlIHtcbiAgICByZXR1cm4ge1xuICAgICAgbW9kdWxlOiBEZWNhZlN0cmVhbU1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzOiBbRXZlbnRzQ29udHJvbGxlcl0sXG4gICAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJvdXRlck1vZHVsZS5yZWdpc3RlcihbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGF0aDogcGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIiksXG4gICAgICAgICAgICBtb2R1bGU6IERlY2FmU3RyZWFtTW9kdWxlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgXSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBEZWNhZlJlcXVlc3RDb250ZXh0LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTLFxuICAgICAgICAgIHVzZVZhbHVlOiBmbGF2b3VycyA/PyBbXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRHluYW1pY01vZHVsZSwgRm9yd2FyZFJlZmVyZW5jZSwgTW9kdWxlLCBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjYWZDb3JlTW9kdWxlIH0gZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmltcG9ydCB7IEFkYXB0ZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGdldE1vZHVsZUZvciB9IGZyb20gXCIuL2RlY2FmLW1vZGVsL2luZGV4XCI7XG5pbXBvcnQgeyBEZWNhZlN0cmVhbU1vZHVsZSB9IGZyb20gXCIuL2V2ZW50cy1tb2R1bGVcIjtcblxuLyoqXG4gKiBAcHVibGljQXBpXG4gKi9cbkBNb2R1bGUoe30pXG5leHBvcnQgY2xhc3MgRGVjYWZNb2R1bGUge1xuICBzdGF0aWMgYXN5bmMgZm9yUm9vdEFzeW5jKFxuICAgIG9wdGlvbnM6IERlY2FmTW9kdWxlT3B0aW9uc1xuICApOiBQcm9taXNlPER5bmFtaWNNb2R1bGU+IHtcbiAgICBjb25zdCB7IGF1dG9Db250cm9sbGVycywgYXV0b1NlcnZpY2VzIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYWRhcHRlcnM6IEFkYXB0ZXI8YW55LCBhbnksIGFueSwgYW55PltdID1cbiAgICAgIGF3YWl0IERlY2FmQ29yZU1vZHVsZS5ib290UGVyc2lzdGVuY2Uob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91cnMgPSBhZGFwdGVycy5tYXAoKGFkYXB0ZXIpID0+IGFkYXB0ZXIuZmxhdm91cik7XG5cbiAgICBjb25zdCBpbXBvcnRzOlxuICAgICAgfCAoXG4gICAgICAgICAgfCBEeW5hbWljTW9kdWxlXG4gICAgICAgICAgfCBUeXBlPGFueT5cbiAgICAgICAgICB8IFByb21pc2U8RHluYW1pY01vZHVsZT5cbiAgICAgICAgICB8IEZvcndhcmRSZWZlcmVuY2U8YW55PlxuICAgICAgICApW11cbiAgICAgIHwgdW5kZWZpbmVkID0gW0RlY2FmQ29yZU1vZHVsZS5mb3JSb290KG9wdGlvbnMpXTtcblxuICAgIGlmIChhdXRvQ29udHJvbGxlcnMpIHtcbiAgICAgICAgZmxhdm91cnMuZm9yRWFjaCgoZmxhdm91cikgPT4ge1xuICAgICAgICAgIGltcG9ydHMucHVzaChcbiAgICAgICAgICAgIGdldE1vZHVsZUZvcihmbGF2b3VyKS5mb3JSb290KGZsYXZvdXIsIHtcbiAgICAgICAgICAgICAgYXV0b1NlcnZpY2VzLFxuICAgICAgICAgICAgICBjb250cm9sbGVyRXhwb3N1cmU6IG9wdGlvbnMuY29udHJvbGxlckV4cG9zdXJlLFxuICAgICAgICAgICAgICBjb250cm9sbGVyQ29uZmlnOiBvcHRpb25zLmNvbnRyb2xsZXJDb25maWcsXG4gICAgICAgICAgICAgIGFnZ3JlZ2F0aW9uczogb3B0aW9ucy5hZ2dyZWdhdGlvbnMsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZXJPcHRpb25zPy5lbmFibGVPYnNlcnZlckV2ZW50cykge1xuICAgICAgaW1wb3J0cy5wdXNoKFxuICAgICAgICBEZWNhZlN0cmVhbU1vZHVsZS5mb3JGbGF2b3VycyhcbiAgICAgICAgICBvcHRpb25zLm9ic2VydmVyT3B0aW9ucy5vYnNlcnZlckZsYXZvdXJzIHx8IGZsYXZvdXJzXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7fVxuIiwiaW1wb3J0IHtNb2RlbH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtJbnRlcm5hbEVycm9yfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7UmVwb3NpdG9yeX0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBvRm9yTW9kZWwobW9kZWw6IHN0cmluZykge1xuXHRjb25zdCBtID0gTW9kZWwuZ2V0KG1vZGVsKTtcblx0aWYgKCFtKVxuXHRcdHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApXG5cdGNvbnN0IHJlcG8gPSBSZXBvc2l0b3J5LmZvck1vZGVsKG0pO1xuXHRyZXR1cm4gcmVwbztcbn0iLCIvKipcbiAqIEBtb2R1bGUgZm9yLW5lc3RcbiAqIEBkZXNjcmlwdGlvbiBUaGlzIG1vZHVsZSBzZXJ2ZXMgYXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB0cy13b3Jrc3BhY2UgbGlicmFyeS4gSXQgYWdncmVnYXRlcyBhbmQgZXhwb3J0c1xuICogZnVuY3Rpb25hbGl0eSBmcm9tIHZhcmlvdXMgc3VibW9kdWxlcyBhbmQgdXRpbGl0aWVzIHdpdGhpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBUaGUgbW9kdWxlIGluY2x1ZGVzOlxuICogMS4gVXRpbGl0eSBmdW5jdGlvbnMgYW5kIHR5cGVzIGZyb20gdGhlIFwiLi91dGlsc1wiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhlc2UgbGlrZWx5IGNvbnRhaW4gaGVscGVyIGZ1bmN0aW9ucywgY29tbW9uIHR5cGVzLCBhbmQgc2hhcmVkIGZ1bmN0aW9uYWxpdHkgdXNlZCB0aHJvdWdob3V0IHRoZSBwcm9qZWN0LlxuICogICAgLSBNYXkgaW5jbHVkZSBvcGVyYXRpb25zIGZvciBkYXRhIG1hbmlwdWxhdGlvbiwgdHlwZSBjaGVja2luZywgb3Igb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdGllcy5cbiAqXG4gKiAyLiBBIG5hbWVzcGFjZSBhbmQgcmVsYXRlZCB0eXBlcyBmcm9tIHRoZSBcIi4vbmFtZXNwYWNlXCIgZGlyZWN0b3J5OlxuICogICAgLSBUaGlzIGNvdWxkIGNvbnRhaW4gZG9tYWluLXNwZWNpZmljIGNvZGUgb3IgYSBjb2xsZWN0aW9uIG9mIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eS5cbiAqICAgIC0gTWlnaHQgaW5jbHVkZSBpbnRlcmZhY2VzLCB0eXBlcywgb3IgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBjb3JlIGNvbmNlcHRzIGluIHRoZSBsaWJyYXJ5LlxuICpcbiAqIDMuIEEgVkVSU0lPTiBjb25zdGFudDpcbiAqICAgIC0gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiAgICAtIFVzZWZ1bCBmb3IgdmVyc2lvbiBjaGVja2luZyBhbmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcy5cbiAqXG4gKiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyBhIGNsZWFuIGFuZCBvcmdhbml6ZWQgZXhwb3J0IG9mIHRoZSBtb2R1bGUncyBmdW5jdGlvbmFsaXR5LCBhbGxvd2luZyBjb25zdW1lcnNcbiAqIHRvIGVhc2lseSBpbXBvcnQgYW5kIHVzZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUgbGlicmFyeSBhcyBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcbmltcG9ydCBcIi4vZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7IC8vIG9uIHRvcCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9kZWNhZi1tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vYXV0aFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZmFjdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdmVycmlkZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlcXVlc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29udHJvbGxlcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZHVsZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29yZS1tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLW1vZHVsZVwiO1xuLy8gZXhwb3J0ICogZnJvbSBcIi4vd2ViaG9va3NcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgY29tbWl0IGhhc2ggb2YgdGhlIG1vZHVsZSBidWlsZC5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBnaXQgY29tbWl0IGhhc2ggZm9yIHRoZSBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgY29tbWl0IGhhc2ggYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IENPTU1JVFxuICovXG5leHBvcnQgY29uc3QgQ09NTUlUID0gXCIjI0NPTU1JVCMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGZ1bGwgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgc2VtdmVyIHZlcnNpb24gYW5kIGNvbW1pdCBoYXNoIGZvciB0aGUgcGFja2FnZS5cbiAqIFRoZSBidWlsZCByZXBsYWNlcyB0aGUgcGxhY2Vob2xkZXIgd2l0aCB0aGUgYWN0dWFsIGA8dmVyc2lvbj4tPGNvbW1pdD5gIHZhbHVlIGF0IHB1Ymxpc2ggdGltZS5cbiAqIEBjb25zdCBGVUxMX1ZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKHRydWUpO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG5NZXRhZGF0YS5hbGxvd1JlcmVnaXN0cmF0aW9uKGZhbHNlKTtcbiJdLCJuYW1lcyI6WyJERUNPUkFUT1JTX1BSRUZJWCIsIkRFQ09SQVRPUlMiLCJBUElfT1BFUkFUSU9OIiwiQVBJX1JFU1BPTlNFIiwiQVBJX1BST0RVQ0VTIiwiQVBJX0NPTlNVTUVTIiwiQVBJX1RBR1MiLCJBUElfQ0FMTEJBQ0tTIiwiQVBJX1BBUkFNRVRFUlMiLCJBUElfSEVBREVSUyIsIkFQSV9NT0RFTF9QUk9QRVJUSUVTIiwiQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVkiLCJBUElfU0VDVVJJVFkiLCJBUElfRVhDTFVERV9FTkRQT0lOVCIsIkFQSV9FWENMVURFX0NPTlRST0xMRVIiLCJBUElfRVhUUkFfTU9ERUxTIiwiQVBJX0VYVEVOU0lPTiIsIkFQSV9TQ0hFTUEiLCJBUElfREVGQVVMVF9HRVRURVIiLCJBUElfTElOSyIsImlzQ29uc3RydWN0b3IiLCJ2YWwiLCJNRVRBREFUQV9GQUNUT1JZX05BTUUiLCJNRVRIT0RfTUVUQURBVEEiLCJjcmVhdGVNZXRob2REZWNvcmF0b3IiLCJtZXRha2V5IiwibWV0YWRhdGEiLCJvdmVycmlkZUV4aXN0aW5nIiwidGFyZ2V0Iiwia2V5IiwiZGVzY3JpcHRvciIsInByZXZWYWx1ZSIsIlJlZmxlY3QiLCJnZXRNZXRhZGF0YSIsInZhbHVlIiwiZGVmaW5lTWV0YWRhdGEiLCJjcmVhdGVDbGFzc0RlY29yYXRvciIsImNyZWF0ZVByb3BlcnR5RGVjb3JhdG9yIiwicHJvcGVydHlLZXkiLCJwcm9wZXJ0aWVzIiwiaW5jbHVkZXMiLCJleGlzdGluZ01ldGFkYXRhIiwibmV3TWV0YWRhdGEiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIm1ldGFkYXRhVG9TYXZlIiwidHlwZSIsImNvbnN0cnVjdG9yIiwiY3JlYXRlTWl4ZWREZWNvcmF0b3IiLCJtZXRhZGF0YXMiLCJBcnJheSIsImlzQXJyYXkiLCJwcmV2aW91c01ldGFkYXRhIiwiT2JqZWN0IiwiYXNzaWduIiwiY3JlYXRlUGFyYW1EZWNvcmF0b3IiLCJpbml0aWFsIiwicGFyYW1PcHRpb25zIiwicGFyYW1ldGVycyIsInByb3BlcnR5S2V5cyIsImdldE93blByb3BlcnR5TmFtZXMiLCJwcm90b3R5cGUiLCJtZXRob2REZXNjcmlwdG9yIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiaXNBcGlNZXRob2QiLCJoYXNNZXRhZGF0YSIsImdldFR5cGVJc0FycmF5VHVwbGUiLCJpbnB1dCIsImlzQXJyYXlGbGFnIiwiaXNJbnB1dEFycmF5Iiwib2JqIiwiZ2V0RW51bVZhbHVlcyIsImVudW1UeXBlIiwibnVtZXJpY1ZhbHVlcyIsInZhbHVlcyIsImZpbHRlciIsIm1hcCIsInRvU3RyaW5nIiwia2V5cyIsImdldEVudW1UeXBlIiwiaGFzU3RyaW5nIiwiaXNTdHJpbmciLCJsZW5ndGgiLCJyZXF1aXJlZCIsImlzRW51bUFycmF5Iiwib3B0cyIsImVudW0iLCJ1bmRlZmluZWQiLCJBcGlQcm9wZXJ0eSIsIm9wdGlvbnMiLCJjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvciIsImVudW1WYWx1ZXMiLCJpdGVtcyIsIkFwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIk1vZGVsQ29uc3RydWN0b3IiLCJ2ZXJiIiwicGF0aCIsImh0dHBUb0NydWQiLCJHRVQiLCJPcGVyYXRpb25LZXlzIiwiUkVBRCIsIkdldCIsIlBPU1QiLCJDUkVBVEUiLCJQb3N0IiwiUFVUIiwiVVBEQVRFIiwiUHV0IiwiUEFUQ0giLCJQYXRjaCIsIkRFTEVURSIsIkRlbGV0ZSIsImNydWRPcCIsIkh0dHBNZXRob2REZWNvcmF0b3IiLCJyZXNvbHZlQmxvY2tUYXJnZXQiLCJjb3JlSXNPcGVyYXRpb25CbG9ja2VkIiwia2luZCIsImFwcGx5IiwiQXBpRXhjbHVkZUVuZHBvaW50IiwiQnVsa0FwaU9wZXJhdGlvbkZyb21Nb2RlbCIsIkJ1bGtDcnVkT3BlcmF0aW9uS2V5cyIsIlJFQURfQUxMIiwiQ1JFQVRFX0FMTCIsIlVQREFURV9BTEwiLCJERUxFVEVfQUxMIiwibm9ybWFsaXplZCIsInJlcGxhY2UiLCJzdGF0ZW1lbnRUYXJnZXRzIiwiUHJlcGFyZWRTdGF0ZW1lbnRLZXlzIiwiTElTVF9CWSIsIlBBR0VfQlkiLCJGSU5EIiwiUEFHRSIsIkZJTkRfT05FX0JZIiwiRklORF9CWSIsIkNPVU5UX09GIiwiTUFYX09GIiwiTUlOX09GIiwiQVZHX09GIiwiU1VNX09GIiwiRElTVElOQ1RfT0YiLCJHUk9VUF9PRiIsInN0YXJ0c1dpdGgiLCJzdGF0ZW1lbnRWYWx1ZSIsIkFwaVBhcmFtc0Zyb21Nb2RlbCIsInByb3BzIiwiZGVjb3JhdG9ycyIsInAiLCJBcGlQYXJhbURlYyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlN0cmluZyIsImFwcGx5RGVjb3JhdG9ycyIsIkRlY2FmQm9keSIsImRhdGEiLCJjdHgiLCJyZXF1ZXN0Iiwic3dpdGNoVG9IdHRwIiwiZ2V0UmVxdWVzdCIsImJvZHkiLCJjb250cm9sbGVyIiwiZ2V0Q2xhc3MiLCJNb2RlbENvbnN0ciIsImNsYXNzIiwiSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIsIml0ZW0iLCJPcmRlcmVkUGFyYW1zIiwib3JkZXIiLCJyZXEiLCJvcmlnaW5hbCIsInBhcmFtcyIsIm9yZGVyTGlzdCIsIm9yZGVyZWQiLCJrIiwicmF3IiwidmFsdWVzSW5PcmRlciIsImtleXNJbk9yZGVyIiwiRGVjYWZQYXJhbXMiLCJEZWNhZlF1ZXJ5IiwiXyIsInF1ZXJ5IiwicGFyc2VkIiwibGltaXQiLCJuIiwiTnVtYmVyIiwiaXNOYU4iLCJvZmZzZXQiLCJib29rbWFyayIsIkRFQ0FGX01PRFVMRV9PUFRJT05TIiwiREVDQUZfQURBUFRFUl9JRCIsIkRFQ0FGX1RBU0tfU0VSVklDRV9JRCIsIkRFQ0FGX1JPVVRFIiwiREVDQUZfSEFORExFUlMiLCJTeW1ib2wiLCJERUNBRl9FWFBPU0UiLCJERUNBRl9DT05UUk9MTEVSX0NPTkZJRyIsIkRFQ0FGX0NPTlRFWFRfS0VZIiwiZXhwb3NlIiwiZmxhdm91cnMiLCJNZXRhZGF0YSIsInNldCIsImNvbnRyb2xsZXJDb25maWciLCJjb25maWciLCJjb250cm9sbGVyQ29uZmlnRGVjb3JhdG9yIiwiQVVUSF9IQU5ETEVSIiwiQVVUSF9NRVRBX0tFWSIsIklTX1BVQkxJQ19LRVkiLCJSRVFVSVJFRF9ST0xFU19LRVkiLCJTS0lQX01PREVMX1JPTEVTX0tFWSIsIkRlY2FmUmVxdWVzdENvbnRleHQiLCJSZXF1ZXN0Q29udGV4dCIsInN1cGVyIiwiaGVhZGVyc09mIiwiaGVhZGVycyIsInRoaXMiLCJ1dWlkIiwiVVVJRCIsImluc3RhbmNlIiwiZ2VuZXJhdGUiLCJnZXRPclVuZGVmaW5lZCIsInB1dCIsInJlY29yZCIsIm92ZXJyaWRlcyIsImdldCIsImUiLCJhY2N1bXVsYXRlIiwiX19kZWNvcmF0ZSIsIkluamVjdGFibGUiLCJzY29wZSIsIlNjb3BlIiwiUkVRVUVTVCIsIl9fcGFyYW0iLCJJbmplY3QiLCJBdXRoSW50ZXJjZXB0b3IiLCJyZWZsZWN0b3IiLCJyZXF1ZXN0Q29udGV4dCIsImF1dGhIYW5kbGVyIiwiaW50ZXJjZXB0IiwibmV4dCIsImxvZyIsIkxvZ2dpbmciLCJmb3IiLCJpc1B1YmxpYyIsImdldEFsbEFuZE92ZXJyaWRlIiwiZ2V0SGFuZGxlciIsIm1vZGVsTmFtZSIsInJlcXVpcmVkUm9sZXMiLCJza2lwTW9kZWxSb2xlcyIsImVmZmVjdGl2ZU1vZGVsIiwidmVyYm9zZSIsImRlYnVnIiwiYXV0aG9yaXplIiwiYXBwbHlUcmFuc2Zvcm1lcnMiLCJ1c2VyIiwib3JnYW5pemF0aW9uIiwiY3VycmVudExvZyIsImNoaWxkTG9nIiwibG9nZ2VyIiwiaGFuZGxlIiwiQWRhcHRlciIsImZsYXZvdXJzVG9UcmFuc2Zvcm0iLCJmbGF2b3VyIiwidHJhbnNmb3JtZXIiLCJ0cmFuc2Zvcm1lckZvciIsImZyb20iLCJPcHRpb25hbCIsIlJlZmxlY3RvciIsIkF1dGgiLCJtb2RlbCIsInJlc291cmNlIiwiZGVjcyIsIkFwaUJlYXJlckF1dGgiLCJVc2VJbnRlcmNlcHRvcnMiLCJwdXNoIiwiU2V0TWV0YWRhdGEiLCJQdWJsaWMiLCJSZXF1aXJlUm9sZXMiLCJyb2xlcyIsIkFwaVNlY3VyaXR5IiwiSHR0cFZlcmJUb0RlY29yYXRvciIsImRlY29yYXRvciIsIlVuc3VwcG9ydGVkRXJyb3IiLCJleHRyYWN0UGF0aFBhcmFtcyIsInJvdXRlUGF0aCIsInNwbGl0Iiwic2xpY2UiLCJhcGlQYXJhbVNwZWMiLCJ0b0RlY2FmRXJyb3IiLCJlcnJvciIsImZhbGxiYWNrTWVzc2FnZSIsIkJhc2VFcnJvciIsIkludGVybmFsRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJnZXRBcGlEZWNvcmF0b3JzIiwibWV0aG9kTmFtZSIsImh0dHBWZXJiIiwiaW5jbHVkZVF1ZXJ5UGFyYW1zIiwiTmVzdEh0dHBSb3V0ZURlYyIsImFwaVBhdGhQYXJhbXMiLCJzd2FnZ2VyUXVlcnlQYXJhbXMiLCJBcGlRdWVyeSIsIk9yZGVyRGlyZWN0aW9uIiwibWV0aG9kIiwiQXBpUGFyYW0iLCJBcGlPcGVyYXRpb24iLCJzdW1tYXJ5IiwiQXBpT2tSZXNwb25zZSIsIkFwaU5vQ29udGVudFJlc3BvbnNlIiwiUXVlcnkiLCJhcHBseUFwaURlY29yYXRvcnMiLCJwcm90byIsImZvckVhY2giLCJkIiwiaW5kZXgiLCJyZXNvbHZlUGVyc2lzdGVuY2VNZXRob2QiLCJwZXJzaXN0ZW5jZSIsImFyZ3MiLCJNb2RlbFNlcnZpY2UiLCJzdGF0ZW1lbnQiLCJjcmVhdGVSb3V0ZUhhbmRsZXIiLCJhc3luYyIsInBhdGhQYXJhbXMiLCJxdWVyeVBhcmFtcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaXJlY3Rpb24iLCJkZWZpbmVSb3V0ZU1ldGhvZCIsIkNvbnRyb2xsZXJDbGFzcyIsImhhbmRsZXIiLCJkZWZpbmVQcm9wZXJ0eSIsIndyaXRhYmxlIiwiRGVjYWZBdXRoSGFuZGxlciIsIkF1dGhIYW5kbGVyIiwicGFyc2VSZXF1ZXN0IiwidXNlclJvbGUiLCJhdXRob3JpemF0aW9uIiwiZXh0cmFjdEZyb21BdXRoIiwiQXV0aG9yaXphdGlvbkVycm9yIiwiRGVjYWZSb2xlQXV0aEhhbmRsZXIiLCJEZWNhZkF1dGhNb2R1bGUiLCJEZWNhZkF1dGhNb2R1bGVfMSIsImZvclJvb3QiLCJwcm92aWRlcnMiLCJwcm92aWRlIiwidXNlQ2xhc3MiLCJnbG9iYWwiLCJBUFBfSU5URVJDRVBUT1IiLCJ1c2VFeGlzdGluZyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2R1bGUiLCJEZWNhZkhhbmRsZXJFeGVjdXRvciIsIkRlY2FmSGFuZGxlckV4ZWN1dG9yXzEiLCJoYW5kbGVycyIsImNvbnRleHQiLCJleGVjIiwicmVzIiwidXJsIiwiRGVjYWZSZXNwb25zZUludGVyY2VwdG9yIiwicmVzcG9uc2UiLCJnZXRSZXNwb25zZSIsInBpcGUiLCJ0YXAiLCJ0b1Jlc3BvbnNlIiwiRGVjYWZDb250cm9sbGVyIiwiSHR0cERlY2FmQ29udHJvbGxlciIsImNsaWVudENvbnRleHQiLCJfbmFtZSIsIkRlY2FmTW9kZWxDb250cm9sbGVyIiwiX3BlcnNpc3RlbmNlIiwiU2VydmljZSIsImdldFNlcnZpY2UiLCJSZXBvc2l0b3J5IiwiZm9yTW9kZWwiLCJ0b092ZXJyaWRlcyIsIm92ZXJyaWRlIiwiZHRvQ2FjaGUiLCJNYXAiLCJEdG9Gb3IiLCJvcCIsInN0YWNrIiwiU2V0IiwiVHJhbnNhY3Rpb25PcGVyYXRpb25LZXlzIiwiY2FjaGUiLCJnZXREdG9DYWNoZSIsImNhY2hlZCIsImlzVXBkYXRlT3AiLCJEeW5hbWljRFRPIiwidG9QYXNjYWxDYXNlIiwicGtQcm9wIiwiTW9kZWwiLCJwayIsInBrUHJvcHNNZXRhZGF0YSIsInBrUHJvcHMiLCJwa0Rlc2lnblR5cGUiLCJwa1R5cGVJc051bWVyaWMiLCJCaWdJbnQiLCJwa0lzR2VuZXJhdGVkIiwiZ2VuZXJhdGVkIiwiZ2VuZXJhdGVkQnlTZXF1ZW5jZSIsImlzUHJvcGVydHlHZW5lcmF0ZWRBY3Jvc3NJbmhlcml0YW5jZSIsImFsbFByb3BzIiwicmVsYXRpb25zIiwic2NhbGFyUHJvcHMiLCJwcm9wIiwiaGFzIiwidmFsaWRhdGlvbiIsImdldFZhbGlkYXRpb25BY3Jvc3NJbmhlcml0YW5jZSIsImlzUmVxdWlyZWQiLCJWYWxpZGF0aW9uS2V5cyIsIlJFUVVJUkVEIiwidHlwZUhpbnQiLCJnZXRUeXBlQWNyb3NzSW5oZXJpdGFuY2UiLCJhcGlPcHRpb25zIiwiZGVzaWduVHlwZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJyZWxhdGlvbiIsInJlbGF0aW9uTWV0YSIsInJlbGF0aW9uVHlwZSIsIm1ldGEiLCJ2YWxpZGF0aW9uRm9yIiwiTElTVCIsImlzQ2lyY3VsYXIiLCJwa1R5cGVOYW1lIiwiZ2V0UGtPcGVuQXBpVHlwZSIsImFkZFJlbGF0aW9uUGtSZWYiLCJyZWxhdGlvbkR0byIsImFkZCIsImFkZFJlbGF0aW9uVXBkYXRlIiwiYWRkUmVsYXRpb24iLCJEdG9DbGFzcyIsImV4dHJhTW9kZWxzIiwiZHRvUmVmIiwib25lT2ZJdGVtcyIsIiRyZWYiLCJvbmVPZiIsInBrVHlwZSIsImN1cnJlbnQiLCJGdW5jdGlvbiIsImdldFByb3RvdHlwZU9mIiwiV2Vha01hcCIsInRvQ29udGV4dEZsYWdzIiwiYWRhcHRlciIsImFsaWFzIiwiYmluZCIsInJlcXVlc3RUcmFuc2Zvcm1lcnMiLCJDb250ZXh0IiwicGVuZGluZyIsImhlYWRlciIsIk1vZGVsQnVpbGRlciIsImRlY29yYXRlQ2xhc3MiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX19oYXNDbGFzc0RlY29yYXRvclN1cHBvcnQiLCJvcmlnaW5hbEJ1aWxkIiwiYnVpbGQiLCJyZXN1bHQiLCJjYWxsIiwiZGVjb3JhdGVkIiwiRnJvbU1vZGVsQ29udHJvbGxlciIsImdldFBlcnNpc3RlbmNlIiwiTW9kZWxDbGF6eiIsImUyIiwiY3JlYXRlUXVlcnlSb3V0ZXNGcm9tUmVwb3NpdG9yeSIsInByZWZpeCIsIlBlcnNpc3RlbmNlS2V5cyIsIlFVRVJZIiwicmVwbyIsInF1ZXJ5TWV0aG9kcyIsInJvdXRlTWV0aG9kcyIsIlF1ZXJ5Q29udHJvbGxlciIsImVudHJpZXMiLCJzZWdtZW50IiwidHJpbSIsImpvaW4iLCJjcmVhdGVDb21wbGV4UXVlcnlIYW5kbGVyIiwiZGVmaW5lTWV0aG9kIiwiaHR0cERlY29yYXRvciIsImh0dHBNZXRob2QiLCJnZXRRdWVyeURlY29yYXRvcnMiLCJvYmpWYWx1ZXMiLCJmaWVsZHMiLCJmIiwiY3JlYXRlIiwibW9kdWxlQ29uZmlnT3ZlcnJpZGVzIiwiZ2xvYmFsRGVmYXVsdHMiLCJ0YWJsZU5hbWUiLCJ0b0tlYmFiQ2FzZSIsIm1vZGVsQ2xhenpOYW1lIiwiZmFjdG9yeVBlcnNpc3RlbmNlIiwiZGVjb3JhdG9yQ29uZmlnIiwibW9kdWxlT3ZlcnJpZGUiLCJtZXJnZWRDb25maWciLCJGYWN0b3J5Q29udHJvbGxlciIsIk1vZGVsQ29udHJvbGxlckZhY3RvcnkiLCJmYWN0b3J5Um91dGVzIiwiX19yb3V0ZXNfXyIsImdldFBLIiwiYXBpUHJvcGVydGllcyIsInBrUGF0aCIsImdldFJvdXRlUGFyYW1ldGVyc0Zyb21Nb2RlbCIsImF1dGhDb25maWciLCJhdXRoIiwiYXBwbHlDbGFzc0F1dGgiLCJwdWJsaWMiLCJEeW5hbWljTW9kZWxDb250cm9sbGVyIiwiRHluYW1pY01vZGVsQ29udHJvbGxlcl8xIiwiaW5mbyIsIkNvbnRyb2xsZXIiLCJBcGlUYWdzIiwiQXBpRXh0cmFNb2RlbHMiLCJzb3J0ZWRSb3V0ZXMiLCJzb3J0IiwiYSIsImIiLCJhU2VnbWVudHMiLCJCb29sZWFuIiwiYlNlZ21lbnRzIiwiYVBhcmFtQ291bnQiLCJzIiwiYlBhcmFtQ291bnQiLCJhTGl0ZXJhbENvdW50IiwiYkxpdGVyYWxDb3VudCIsInJvdXRlIiwiaW1wbGVtZW50YXRpb24iLCJ0b0xvd2VyQ2FzZSIsInJlZ2lzdHJhdGlvbiIsIm1hdGNoUm91dGUiLCJyZWdpc3RlcmVkTWV0aG9kTmFtZSIsInBhcmFtRGVjb3JhdG9ycyIsImNvbXBvc2VkIiwiREJLZXlzIiwiQ09NUE9TRUQiLCJjb21wb3NlZEtleXMiLCJ1bmlxdWVLZXlzIiwic2VwYXJhdG9yIiwicm91dGVQYXJhbURlY29yYXRvcnMiLCJwYXJhbUluZGV4IiwiZmxhdE1hcCIsIlBhcmFtIiwibWV0aG9kRGVjb3JhdG9ycyIsIm5vcm1hbGl6ZWRQYXRoIiwiY3JlYXRlUmVnaXN0cmF0aW9uIiwiY3JlYXRlQ3JlYXRlRGVjb3JhdG9ycyIsIlJlc3BvbnNlIiwicGFzc3Rocm91Z2giLCJidWxrQ3JlYXRlRGVjb3JhdG9ycyIsImJ1bGtSZWFkRGVjb3JhdG9ycyIsImJ1bGtVcGRhdGVEZWNvcmF0b3JzIiwiYnVsa0RlbGV0ZURlY29yYXRvcnMiLCJyZWFkRGVjb3JhdG9ycyIsInJvdXRlUGFyYW1zIiwidXBkYXRlRGVjb3JhdG9ycyIsImRlbGV0ZURlY29yYXRvcnMiLCJmYWxsYmFja1NlZ21lbnRzIiwiaXNBbGxQYXJhbXMiLCJldmVyeSIsImZhbGxiYWNrQXBpUHJvcHMiLCJzdWZmaXgiLCJzdGF0ZW1lbnREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXREZWNvcmF0b3JzIiwic3RhdGVtZW50U2hvcnRjdXRQYXJhbXMiLCJzdGF0ZW1lbnRSb3V0ZXMiLCJzdGF0ZW1lbnRLZXkiLCJzdGF0ZW1lbnRNZXRob2ROYW1lIiwicXVlcnlNZXRob2QiLCJjb21wbGV4UXVlcnlQYXJhbXMiLCJwYXRoU2VnbWVudHMiLCJrbm93blByZWZpeGVzIiwiZmlyc3RTZWdtZW50Iiwic2VnbWVudHMiLCJzZWciLCJpIiwiY29tcGxleFF1ZXJ5IiwibG9nQ3R4Iiwic3ByZWFkQXJncyIsIm5vcm1hbGl6ZVF1ZXJ5QXJncyIsImV4dHJhY3RRdWVyeUFyZ3MiLCJsYXN0IiwicXVlcnlPYmoiLCJwb3AiLCJoYXNEaXJlY3Rpb24iLCJoYXNMaW1pdCIsImhhc09mZnNldCIsImV4dHJhcyIsImhhc1F1ZXJ5RmllbGRzIiwiQXBpQm9keSIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsInNjaGVtYSIsImdldFNjaGVtYVBhdGgiLCJBcGlCYWRSZXF1ZXN0UmVzcG9uc2UiLCJBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiYmFzZSIsImdldE1vZHVsZUZvciIsIkRlY2FmTW9kZWxNb2R1bGUiLCJEZWNhZk1vZGVsTW9kdWxlXzEiLCJjcmVhdGVNb2RlbFNlcnZpY2VzIiwibW9kZWxzIiwidXNlRmFjdG9yeSIsImlzRXhwb3NlZCIsImV4cG9zdXJlIiwidHJhY2tlZE1vZGVscyIsImNvbnRyb2xsZXJFeHBvc3VyZSIsIm1vZGVsU2VydmljZXMiLCJhdXRvU2VydmljZXMiLCJhZ2dyZWdhdGlvbnMiLCJhbGxvd0dyb3VwaW5nUXVlcmllcyIsImNvbnRyb2xsZXJzIiwiRGVjb3JhdGlvbiIsIkluamVjdGFibGVzS2V5cyIsIklOSkVDVEFCTEUiLCJleHRlbmQiLCJuZXN0SW5qZWN0YWJsZSIsImNhdGVnb3J5IiwiY2ZnIiwiRGVmYXVsdEluamVjdGFibGVzQ29uZmlnIiwic2luZ2xldG9uIiwiREVGQVVMVCIsImR1cmFibGUiLCJJTkpFQ1QiLCJuZXN0SW5qZWN0IiwiaW5uZXJOZXN0SW5qZWN0IiwiTUFYIiwibWF4RGVjIiwibWF4IiwibWF4aW11bSIsIk1JTiIsIm1pbkRlYyIsIm1pbiIsIm1pbmltdW0iLCJNQVhfTEVOR1RIIiwibWF4TGVuZ3RoRGVjIiwibWF4TGVuZ3RoIiwiTUlOX0xFTkdUSCIsIm1pbkxlbmd0aERlYyIsIm1pbkxlbmd0aCIsIlRZUEUiLCJ0eXBlRGVjIiwiREFURSIsImRhdGVEZWMiLCJmb3JtYXQiLCJFTlVNIiwib3B0aW9uRGVjIiwiUEFUVEVSTiIsInBhdHRlcm5EZWMiLCJwYXQiLCJwYXR0ZXJuIiwic291cmNlIiwiQ09MVU1OIiwiY29sdW1uRGVjIiwiRGVjb3JhdGlvbktleXMiLCJERVNDUklQVElPTiIsImRlc2NyaXB0aW9uRGVjIiwiQVVUSCIsIkNvcnNFcnJvciIsIkZvcmJpZGRlbkVycm9yIiwibXNnIiwiVG9NYW55UmVxdWVzdHNFcnJvciIsIkhUVFBfRVhDRVBUSU9OX1RPX0RFQ0FGX0VSUk9SIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiRm9yYmlkZGVuRXhjZXB0aW9uIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsIkJhZFJlcXVlc3RFcnJvciIsIkNvbmZsaWN0RXhjZXB0aW9uIiwiQ29uZmxpY3RFcnJvciIsIlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24iLCJWYWxpZGF0aW9uRXJyb3IiLCJEZWNhZkV4Y2VwdGlvbkZpbHRlciIsIm1vZHVsZVJlZiIsImV4Y2VwdGlvbiIsImhvc3QiLCJpc1Byb2R1Y3Rpb24iLCJMb2dnZWRFbnZpcm9ubWVudCIsImVudiIsInN0YXR1c0NvZGUiLCJOb3RGb3VuZEV4Y2VwdGlvbiIsIk5vdEFjY2VwdGFibGVFeGNlcHRpb24iLCJnZXRTdGF0dXMiLCJkZWNhZkVycm9yRm9yIiwic3RhdHVzIiwiSHR0cEV4Y2VwdGlvbiIsImxvZ0Vycm9yIiwiY29kZSIsImpzb24iLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJmYWN0b3J5IiwicmVzb2x2ZUxvZ2dlciIsImNvbnRleHRJZCIsIkNvbnRleHRJZEZhY3RvcnkiLCJnZXRCeVJlcXVlc3QiLCJyZXNvbHZlIiwic3RyaWN0IiwiQ2F0Y2giLCJNb2R1bGVSZWYiLCJVc2VEZWNhZkZpbHRlciIsIlVzZUZpbHRlcnMiLCJVc2VEZWNhZkhlYWRlcnMiLCJTV0FHR0VSX1VJX0NPTlNUQU5UUyIsInRpdGxlIiwidmVyc2lvbiIsImZhdmljb25GaWxlUGF0aCIsInRvcGJhckljb25GaWxlUGF0aCIsInNjaGVtZSIsImJlYXJlckZvcm1hdCIsImluIiwicGVyc2lzdEF1dGhvcml6YXRpb24iLCJ0b3BiYXJCZ0NvbG9yIiwiU3dhZ2dlckN1c3RvbVVJIiwiY3VzdG9tQ1NTIiwiY3NzIiwidG9wYmFySWNvblBhdGgiLCJpbWciLCJiNjQiLCJnZXRDdXN0b21PcHRpb25zIiwiZmF2aWNvbiIsImZhdmljb25QYXRoIiwiY3VzdG9tU2l0ZVRpdGxlIiwiY3VzdG9tQ3NzIiwic3dhZ2dlck9wdGlvbnMiLCJmaWxlIiwiZmlsZVBhdGgiLCJhc3NldHNQYXRoIiwicmVhZEZpbGVTeW5jIiwiZW5jb2RpbmciLCJTd2FnZ2VyQnVpbGRlciIsImFwcCIsImNyZWF0ZURvY3VtZW50Iiwib3BlbkFwaUpzb25QYXRoIiwib3BlbkFwaVlhbWxQYXRoIiwiRG9jdW1lbnRCdWlsZGVyIiwic2V0VGl0bGUiLCJzZXREZXNjcmlwdGlvbiIsInNldFZlcnNpb24iLCJhZGRCZWFyZXJBdXRoIiwiU3dhZ2dlck1vZHVsZSIsInJlZ2lzdGVyT3BlbkFwaVJvdXRlIiwiY29udGVudFR5cGUiLCJib2R5RmFjdG9yeSIsImh0dHBBZGFwdGVyIiwiZ2V0SHR0cEFkYXB0ZXIiLCJfcmVxIiwicmVwbHkiLCJzZXR1cFN3YWdnZXIiLCJkb2N1bWVudCIsInN3YWdnZXJVSSIsInNldHVwIiwianNvbkRvY3VtZW50VXJsIiwieWFtbERvY3VtZW50VXJsIiwiWUFNTCIsIk5lc3RCb290c3RyYXBlciIsIl9sb2dnZXIiLCJMb2dnZXIiLCJpbml0aWFsaXplIiwiZW5hYmxlTG9nZ2VyIiwiY3VzdG9tTG9nZ2VyIiwidXNlTG9nZ2VyIiwiZW5hYmxlQ29ycyIsIm9yaWdpbnMiLCJhbGxvd01ldGhvZHMiLCJhbGxvd2VkT3JpZ2lucyIsIm8iLCJjb3JzT3B0aW9ucyIsIm9yaWdpbiIsImNhbGxiYWNrIiwiY3JlZGVudGlhbHMiLCJtZXRob2RzIiwidXNlSGVsbWV0IiwiaGVsbWV0IiwicmVxdWlyZSIsInVzZSIsIndhcm4iLCJzd2FnZ2VyIiwidXNlR2xvYmFsUGlwZXMiLCJwaXBlcyIsInVzZUdsb2JhbEZpbHRlcnMiLCJmaWx0ZXJzIiwidXNlR2xvYmFsSW50ZXJjZXB0b3JzIiwiaW50ZXJjZXB0b3JzIiwic3RhcnQiLCJwb3J0IiwicHJvY2VzcyIsIlBPUlQiLCJsaXN0ZW4iLCJ0aGVuIiwiZ2V0VXJsIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yIiwiRGVjYWZSZXF1ZXN0SGFuZGxlckludGVyY2VwdG9yXzEiLCJleGVjdXRvciIsImNvbnRleHR1YWxpemUiLCJmbGFncyIsImlwIiwiZXh0cmFjdElwIiwiRGVmYXVsdEFkYXB0ZXJGbGFncyIsIm9wZXJhdGlvbiIsInBhcnNlSXBIZWFkZXIiLCJjYW5kaWRhdGUiLCJwZW5kaW5nUHJvdmlkZXJzIiwiZ2V0UmVnaXN0ZXJlZERlY2FmUHJvdmlkZXJzIiwicmVnaXN0ZXJQcm92aWRlciIsInRva2VuIiwiaXNNb2RlbENvbnN0cnVjdG9yIiwibW9kZWxTZXJ2aWNlVG9rZW4iLCJtb2RlbFJlcG9zaXRvcnlUb2tlbiIsInBhcmFtZXRlckluZGV4IiwicmVzb2x2ZWQiLCJwYXJhbVR5cGVzIiwiYXNNb2RlbCIsImluamVjdGFibGVTZXJ2aWNlS2V5IiwiQ29yZVNlcnZpY2UiLCJDb3JlUmVwb3NpdG9yeSIsIkRlY2FmQ29yZU1vZHVsZSIsIkRlY2FmQ29yZU1vZHVsZV8xIiwiZGVjYWZQcm92aWRlcnMiLCJ1c2VWYWx1ZSIsImNsaWVudCIsIkgiLCJwcm92aWRlciIsImJvb3RQZXJzaXN0ZW5jZSIsInRyaW1tZWQiLCJjb25mIiwiY29udHIiLCJwb3NzaWJsZSIsIlBlcnNpc3RlbmNlU2VydmljZSIsImJvb3QiLCJjbGllbnRzIiwiYyIsInBvc3NpYmxlVHJhbnNmIiwicmVxdWVzdFRvQ29udGV4dFRyYW5zZm9ybWVyIiwiaW5pdGlhbGl6YXRpb24iLCJvbkFwcGxpY2F0aW9uU2h1dGRvd24iLCJhZGFwdGVycyIsInNodXRkb3duIiwiR2xvYmFsIiwiTElTVEVOSU5HX0FEQVBURVJTX0ZMQVZPVVJTIiwibm9ybWFsaXplRXZlbnRSZXNwb25zZSIsIm1vZGVsQ29uc3RyIiwiaWQiLCJwYXlsb2FkIiwic2VyaWFsaXplZFBheWxvYWQiLCJzZXJpYWxpemUiLCJjb25zb2xlIiwiZXJyIiwiRXZlbnRzQ29udHJvbGxlciIsIkV2ZW50c0NvbnRyb2xsZXJfMSIsImV2ZW50cyQiLCJPYnNlcnZhYmxlIiwib2JzZXJ2ZXIiLCJvYnNlcnZlcklkIiwiTWF0aCIsInJhbmRvbSIsInRvVXBwZXJDYXNlIiwiY2IiLCJyZWZyZXNoIiwiUHJvbWlzZSIsImFkYXB0ZXJOYW1lIiwib2JzZXJ2ZSIsInVuT2JzZXJ2ZSIsIkhFQVJUQkVBVF9JTlRFUlZBTF9NUyIsImhlYXJ0YmVhdCQiLCJpbnRlcnZhbCIsInRzIiwibWVyZ2UiLCJsaXN0ZW5Gb3JNb2RlbCIsIlNzZSIsIkRlY2FmU3RyZWFtTW9kdWxlIiwiRGVjYWZTdHJlYW1Nb2R1bGVfMSIsImZvckZsYXZvdXJzIiwiaW1wb3J0cyIsIlJvdXRlck1vZHVsZSIsInJlZ2lzdGVyIiwiRGVjYWZNb2R1bGUiLCJEZWNhZk1vZHVsZV8xIiwiZm9yUm9vdEFzeW5jIiwiYXV0b0NvbnRyb2xsZXJzIiwib2JzZXJ2ZXJPcHRpb25zIiwiZW5hYmxlT2JzZXJ2ZXJFdmVudHMiLCJvYnNlcnZlckZsYXZvdXJzIiwicnVuTWlncmF0aW9ucyIsInJlcG9Gb3JNb2RlbCIsIm0iLCJWRVJTSU9OIiwiQ09NTUlUIiwiRlVMTF9WRVJTSU9OIiwiUEFDS0FHRV9OQU1FIiwiYWxsb3dSZXJlZ2lzdHJhdGlvbiIsInJlZ2lzdGVyTGlicmFyeSJdLCJtYXBw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
|