@lenne.tech/ng-base 15.0.0-beta-3 → 16.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/base-components/base-components.module.d.ts +1 -2
- package/base-components/components/checkbox/checkbox.component.d.ts +1 -1
- package/base-components/components/delete-account/delete-account.component.d.ts +1 -1
- package/base-components/components/fab-button/fab-button.component.d.ts +1 -1
- package/base-components/components/input/input.component.d.ts +1 -1
- package/base-components/components/loading-bar/loading-bar.component.d.ts +1 -1
- package/base-components/components/model-form/model-form-base.component.d.ts +1 -1
- package/base-components/components/model-form/model-form.component.d.ts +1 -1
- package/base-components/components/model-form-sub/model-form-sub.component.d.ts +1 -1
- package/base-components/components/model-table/model-table.component.d.ts +1 -1
- package/base-components/components/refence-input/refence-input.component.d.ts +1 -1
- package/base-components/components/select/select.component.d.ts +1 -1
- package/base-components/components/skeleton-loader/skeleton-loader.component.d.ts +1 -1
- package/base-components/components/tags/tags.component.d.ts +1 -1
- package/base-components/components/textarea/textarea.component.d.ts +1 -1
- package/base-components/components/toast/toast.component.d.ts +1 -1
- package/base-components/components/upload-image/upload-image.component.d.ts +1 -1
- package/base-components/directives/context-menu.directive.d.ts +1 -1
- package/base-components/directives/sort.directive.d.ts +1 -1
- package/base-prototype/pages/login/login.component.d.ts +1 -1
- package/base-prototype/pages/profile/profile.component.d.ts +1 -1
- package/base-prototype/pages/set-password/set-password.component.d.ts +1 -1
- package/esm2022/base-cms/base-cms-routing.module.mjs +33 -0
- package/esm2022/base-cms/base-cms.module.mjs +61 -0
- package/esm2022/base-cms/pages/base-cms/base-cms.component.mjs +233 -0
- package/esm2022/base-components/base-components.module.mjs +123 -0
- package/esm2022/base-components/components/breadcrumb/breadcrumb.component.mjs +21 -0
- package/esm2022/base-components/components/change-password/change-password.component.mjs +96 -0
- package/esm2022/base-components/components/checkbox/checkbox.component.mjs +35 -0
- package/esm2022/base-components/components/delete-account/delete-account.component.mjs +61 -0
- package/esm2022/base-components/components/fab-button/fab-button.component.mjs +21 -0
- package/esm2022/base-components/components/input/input.component.mjs +72 -0
- package/esm2022/base-components/components/loading-bar/loading-bar.component.mjs +39 -0
- package/esm2022/base-components/components/model-form/model-form-base.component.mjs +145 -0
- package/esm2022/base-components/components/model-form/model-form.component.mjs +585 -0
- package/esm2022/base-components/components/model-form-sub/model-form-sub.component.mjs +111 -0
- package/esm2022/base-components/components/model-table/model-table.component.mjs +470 -0
- package/esm2022/base-components/components/refence-input/refence-input.component.mjs +273 -0
- package/esm2022/base-components/components/select/select.component.mjs +59 -0
- package/esm2022/base-components/components/skeleton-loader/skeleton-loader.component.mjs +32 -0
- package/esm2022/base-components/components/tags/tags.component.mjs +224 -0
- package/esm2022/base-components/components/textarea/textarea.component.mjs +76 -0
- package/esm2022/base-components/components/toast/toast.component.mjs +70 -0
- package/esm2022/base-components/components/upload-image/upload-image.component.mjs +343 -0
- package/esm2022/base-components/directives/back-button.directive.mjs +25 -0
- package/esm2022/base-components/directives/context-menu.directive.mjs +112 -0
- package/esm2022/base-components/directives/sort.directive.mjs +61 -0
- package/esm2022/base-components/directives/stop-propagation.directive.mjs +24 -0
- package/esm2022/base-components/pipes/ellipses.pipe.mjs +23 -0
- package/esm2022/base-prototype/base-prototype.module.mjs +54 -0
- package/esm2022/base-prototype/pages/email-verification/email-verification.component.mjs +62 -0
- package/esm2022/base-prototype/pages/forgot-password/forgot-password.component.mjs +75 -0
- package/esm2022/base-prototype/pages/login/login.component.mjs +111 -0
- package/esm2022/base-prototype/pages/profile/profile.component.mjs +86 -0
- package/esm2022/base-prototype/pages/register/register.component.mjs +94 -0
- package/esm2022/base-prototype/pages/set-password/set-password.component.mjs +90 -0
- package/esm2022/shared/classes/auth.class.mjs +14 -0
- package/esm2022/shared/classes/basic-user.class.mjs +49 -0
- package/esm2022/shared/classes/graphql-enum.class.mjs +10 -0
- package/esm2022/shared/classes/graphql-meta.class.mjs +345 -0
- package/esm2022/shared/classes/graphql-type.class.mjs +14 -0
- package/esm2022/shared/classes/sort.class.mjs +38 -0
- package/esm2022/shared/services/auth.service.mjs +153 -0
- package/esm2022/shared/services/breadcrumb.service.mjs +70 -0
- package/{esm2020 → esm2022}/shared/services/cms.service.mjs +7 -5
- package/esm2022/shared/services/file.service.mjs +87 -0
- package/esm2022/shared/services/forms.service.mjs +62 -0
- package/esm2022/shared/services/graphql-meta.service.mjs +133 -0
- package/esm2022/shared/services/graphql-plus.service.mjs +94 -0
- package/esm2022/shared/services/graphql.service.mjs +511 -0
- package/esm2022/shared/services/image.service.mjs +103 -0
- package/esm2022/shared/services/loader.service.mjs +79 -0
- package/esm2022/shared/services/navigation.service.mjs +39 -0
- package/esm2022/shared/services/scroll.service.mjs +208 -0
- package/esm2022/shared/services/storage.service.mjs +142 -0
- package/esm2022/shared/services/toast.service.mjs +40 -0
- package/esm2022/shared/services/user.service.mjs +161 -0
- package/esm2022/shared/services/ws.service.mjs +18 -0
- package/esm2022/src/base.module.mjs +98 -0
- package/esm2022/src/directives/lazy-load.directive.mjs +48 -0
- package/esm2022/src/directives/match-height.directive.mjs +92 -0
- package/esm2022/src/directives/resizable.directive.mjs +92 -0
- package/esm2022/src/functions/extract-files.function.mjs +87 -0
- package/esm2022/src/guards/auth.guard.mjs +92 -0
- package/esm2022/src/guards/can-deactivate.guard.mjs +17 -0
- package/esm2022/src/guards/logout.guard.mjs +35 -0
- package/esm2022/src/pipes/date-ago.pipe.mjs +64 -0
- package/esm2022/src/pipes/safe-html.pipe.mjs +23 -0
- package/esm2022/src/services/fullscreen.service.mjs +52 -0
- package/esm2022/src/services/seo.service.mjs +100 -0
- package/esm2022/src/services/theme.service.mjs +45 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs +41 -30
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-cms.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-components.mjs +421 -300
- package/fesm2022/lenne.tech-ng-base-base-components.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-base-prototype.mjs +127 -88
- package/fesm2022/lenne.tech-ng-base-base-prototype.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs +164 -113
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base-shared.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/lenne.tech-ng-base.mjs +153 -126
- package/fesm2022/lenne.tech-ng-base.mjs.map +1 -0
- package/package.json +23 -38
- package/src/directives/lazy-load.directive.d.ts +1 -1
- package/src/directives/match-height.directive.d.ts +1 -1
- package/src/directives/resizable.directive.d.ts +1 -1
- package/src/guards/auth.guard.d.ts +4 -3
- package/src/guards/can-deactivate.guard.d.ts +1 -2
- package/src/guards/logout.guard.d.ts +2 -2
- package/esm2020/base-cms/base-cms-routing.module.mjs +0 -32
- package/esm2020/base-cms/base-cms.module.mjs +0 -59
- package/esm2020/base-cms/pages/base-cms/base-cms.component.mjs +0 -222
- package/esm2020/base-components/base-components.module.mjs +0 -123
- package/esm2020/base-components/components/breadcrumb/breadcrumb.component.mjs +0 -18
- package/esm2020/base-components/components/change-password/change-password.component.mjs +0 -90
- package/esm2020/base-components/components/checkbox/checkbox.component.mjs +0 -31
- package/esm2020/base-components/components/delete-account/delete-account.component.mjs +0 -56
- package/esm2020/base-components/components/fab-button/fab-button.component.mjs +0 -21
- package/esm2020/base-components/components/input/input.component.mjs +0 -67
- package/esm2020/base-components/components/loading-bar/loading-bar.component.mjs +0 -35
- package/esm2020/base-components/components/model-form/model-form-base.component.mjs +0 -136
- package/esm2020/base-components/components/model-form/model-form.component.mjs +0 -564
- package/esm2020/base-components/components/model-form-sub/model-form-sub.component.mjs +0 -102
- package/esm2020/base-components/components/model-table/model-table.component.mjs +0 -456
- package/esm2020/base-components/components/refence-input/refence-input.component.mjs +0 -261
- package/esm2020/base-components/components/select/select.component.mjs +0 -54
- package/esm2020/base-components/components/skeleton-loader/skeleton-loader.component.mjs +0 -32
- package/esm2020/base-components/components/tags/tags.component.mjs +0 -218
- package/esm2020/base-components/components/textarea/textarea.component.mjs +0 -72
- package/esm2020/base-components/components/toast/toast.component.mjs +0 -68
- package/esm2020/base-components/components/upload-image/upload-image.component.mjs +0 -324
- package/esm2020/base-components/directives/back-button.directive.mjs +0 -23
- package/esm2020/base-components/directives/context-menu.directive.mjs +0 -108
- package/esm2020/base-components/directives/sort.directive.mjs +0 -57
- package/esm2020/base-components/directives/stop-propagation.directive.mjs +0 -23
- package/esm2020/base-components/pipes/ellipses.pipe.mjs +0 -22
- package/esm2020/base-prototype/base-prototype.module.mjs +0 -53
- package/esm2020/base-prototype/pages/email-verification/email-verification.component.mjs +0 -55
- package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +0 -67
- package/esm2020/base-prototype/pages/login/login.component.mjs +0 -102
- package/esm2020/base-prototype/pages/profile/profile.component.mjs +0 -81
- package/esm2020/base-prototype/pages/register/register.component.mjs +0 -86
- package/esm2020/base-prototype/pages/set-password/set-password.component.mjs +0 -82
- package/esm2020/shared/classes/auth.class.mjs +0 -17
- package/esm2020/shared/classes/basic-user.class.mjs +0 -52
- package/esm2020/shared/classes/graphql-enum.class.mjs +0 -9
- package/esm2020/shared/classes/graphql-meta.class.mjs +0 -344
- package/esm2020/shared/classes/graphql-type.class.mjs +0 -17
- package/esm2020/shared/classes/sort.class.mjs +0 -40
- package/esm2020/shared/services/auth.service.mjs +0 -148
- package/esm2020/shared/services/breadcrumb.service.mjs +0 -68
- package/esm2020/shared/services/file.service.mjs +0 -84
- package/esm2020/shared/services/forms.service.mjs +0 -59
- package/esm2020/shared/services/graphql-meta.service.mjs +0 -123
- package/esm2020/shared/services/graphql-plus.service.mjs +0 -89
- package/esm2020/shared/services/graphql.service.mjs +0 -507
- package/esm2020/shared/services/image.service.mjs +0 -102
- package/esm2020/shared/services/loader.service.mjs +0 -79
- package/esm2020/shared/services/navigation.service.mjs +0 -36
- package/esm2020/shared/services/scroll.service.mjs +0 -179
- package/esm2020/shared/services/storage.service.mjs +0 -140
- package/esm2020/shared/services/toast.service.mjs +0 -41
- package/esm2020/shared/services/user.service.mjs +0 -155
- package/esm2020/shared/services/ws.service.mjs +0 -16
- package/esm2020/src/base.module.mjs +0 -97
- package/esm2020/src/directives/lazy-load.directive.mjs +0 -45
- package/esm2020/src/directives/match-height.directive.mjs +0 -84
- package/esm2020/src/directives/resizable.directive.mjs +0 -90
- package/esm2020/src/functions/extract-files.function.mjs +0 -84
- package/esm2020/src/guards/auth.guard.mjs +0 -80
- package/esm2020/src/guards/can-deactivate.guard.mjs +0 -16
- package/esm2020/src/guards/logout.guard.mjs +0 -32
- package/esm2020/src/pipes/date-ago.pipe.mjs +0 -65
- package/esm2020/src/pipes/safe-html.pipe.mjs +0 -21
- package/esm2020/src/services/fullscreen.service.mjs +0 -51
- package/esm2020/src/services/seo.service.mjs +0 -97
- package/esm2020/src/services/theme.service.mjs +0 -43
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs +0 -323
- package/fesm2015/lenne.tech-ng-base-base-cms.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-components.mjs +0 -2866
- package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +0 -496
- package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base-shared.mjs +0 -2750
- package/fesm2015/lenne.tech-ng-base-shared.mjs.map +0 -1
- package/fesm2015/lenne.tech-ng-base.mjs +0 -905
- package/fesm2015/lenne.tech-ng-base.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +0 -1
- package/fesm2020/lenne.tech-ng-base.mjs.map +0 -1
- /package/{esm2020 → esm2022}/base-cms/interfaces/base-cms-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/lenne.tech-ng-base-base-cms.mjs +0 -0
- /package/{esm2020 → esm2022}/base-cms/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/lenne.tech-ng-base-base-components.mjs +0 -0
- /package/{esm2020 → esm2022}/base-components/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/lenne.tech-ng-base-base-prototype.mjs +0 -0
- /package/{esm2020 → esm2022}/base-prototype/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/lenne.tech-ng-base.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/helper.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/classes/standard.class.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/decorators/debounce.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/comparison-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/graphql-request-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/logical-operator.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/skeleton-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/sort-order.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/enums/toast-type.enum.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/functions/ws-client.function.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/base-module-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/breadcrumb.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/can-component-deactivate.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-enum-values.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-field-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-model-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cms-table-field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/combined-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/compress-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/cropping-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/field.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/find-args.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-crud-type.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-fields-object.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-options.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-plus-options.interfacen.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/graphql-type-collection.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/login-config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/single-filter-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/sort-input.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/time-components.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/interfaces/toast.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/lenne.tech-ng-base-shared.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/graphql-fields.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/types/storage.type.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/email.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/match.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/shared/validators/secure-password.validator.mjs +0 -0
- /package/{esm2020 → esm2022}/src/decorators/auto-unsubscribe.decorator.mjs +0 -0
- /package/{esm2020 → esm2022}/src/factories/apollo-options.factory.mjs +0 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
import { gql } from 'apollo-angular';
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { GraphQLRequestType } from '../enums/graphql-request-type.enum';
|
|
4
|
+
import { Observable, throwError } from 'rxjs';
|
|
5
|
+
import { GraphQLEnum } from '../classes/graphql-enum.class';
|
|
6
|
+
import { sha256 } from 'js-sha256';
|
|
7
|
+
import { Helper } from '../classes/helper.class';
|
|
8
|
+
import { BASE_MODULE_CONFIG } from '../interfaces/base-module-config.interface';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "apollo-angular";
|
|
11
|
+
import * as i2 from "./graphql-meta.service";
|
|
12
|
+
/**
|
|
13
|
+
* GraphQL service
|
|
14
|
+
*/
|
|
15
|
+
class GraphQLService {
|
|
16
|
+
apollo;
|
|
17
|
+
graphQLMetaService;
|
|
18
|
+
moduleConfig;
|
|
19
|
+
/**
|
|
20
|
+
* Include services
|
|
21
|
+
*/
|
|
22
|
+
constructor(apollo, graphQLMetaService, moduleConfig) {
|
|
23
|
+
this.apollo = apollo;
|
|
24
|
+
this.graphQLMetaService = graphQLMetaService;
|
|
25
|
+
this.moduleConfig = moduleConfig;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* GraphQL request
|
|
29
|
+
*/
|
|
30
|
+
graphQl(graphqlMethodName, options = {}) {
|
|
31
|
+
// Check parameters
|
|
32
|
+
if (!graphqlMethodName) {
|
|
33
|
+
throwError(() => new Error('Missing graphql method name'));
|
|
34
|
+
}
|
|
35
|
+
// Get config
|
|
36
|
+
const config = {
|
|
37
|
+
arguments: null,
|
|
38
|
+
fields: null,
|
|
39
|
+
log: false,
|
|
40
|
+
model: null,
|
|
41
|
+
...options,
|
|
42
|
+
};
|
|
43
|
+
// Convert class to Object for arguments
|
|
44
|
+
if (typeof config.arguments === 'function') {
|
|
45
|
+
config.arguments = new config.arguments();
|
|
46
|
+
}
|
|
47
|
+
// Convert class to Object for fields
|
|
48
|
+
if (typeof config.fields === 'function') {
|
|
49
|
+
config.fields = new config.fields();
|
|
50
|
+
}
|
|
51
|
+
// Log
|
|
52
|
+
if (config.log) {
|
|
53
|
+
console.log({ config });
|
|
54
|
+
}
|
|
55
|
+
// Send request
|
|
56
|
+
return new Observable((subscriber) => {
|
|
57
|
+
// Get meta
|
|
58
|
+
this.graphQLMetaService.getMeta({ log: config.log }).subscribe((meta) => {
|
|
59
|
+
// Set GraphQLRequestType automatically
|
|
60
|
+
if (!config.type) {
|
|
61
|
+
const types = meta.getRequestTypesViaMethod(graphqlMethodName);
|
|
62
|
+
if (!types?.length) {
|
|
63
|
+
throwError(() => new Error('No GraphQLRequestType detected'));
|
|
64
|
+
}
|
|
65
|
+
config.type = types[0];
|
|
66
|
+
if (config.type) {
|
|
67
|
+
throwError(() => new Error('No GraphQLRequestType detected'));
|
|
68
|
+
}
|
|
69
|
+
if (types.length > 1) {
|
|
70
|
+
// eslint-disable-next-line no-console
|
|
71
|
+
console.debug('GraphQLRequestType ' + config.type + ' used for ' + graphqlMethodName, types);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Prepare fields
|
|
75
|
+
let fields;
|
|
76
|
+
let allowedFields;
|
|
77
|
+
// Log meta
|
|
78
|
+
if (config.log) {
|
|
79
|
+
console.log({ meta });
|
|
80
|
+
}
|
|
81
|
+
if (config.fields) {
|
|
82
|
+
allowedFields = meta.getFields(graphqlMethodName, { type: config.type });
|
|
83
|
+
// Log meta
|
|
84
|
+
if (config.log) {
|
|
85
|
+
console.log({ allowedFields });
|
|
86
|
+
}
|
|
87
|
+
const fieldsData = this.prepareFields(config.fields, {
|
|
88
|
+
allowed: allowedFields,
|
|
89
|
+
});
|
|
90
|
+
fields = fieldsData.fieldsString;
|
|
91
|
+
}
|
|
92
|
+
if (fields && !fields.startsWith('{')) {
|
|
93
|
+
fields = '{' + fields + '\n}';
|
|
94
|
+
}
|
|
95
|
+
// Log fields
|
|
96
|
+
if (config.log) {
|
|
97
|
+
console.log({ fields });
|
|
98
|
+
}
|
|
99
|
+
// Get allowed args
|
|
100
|
+
const allowedArgs = meta.getArgs(graphqlMethodName, { type: config.type });
|
|
101
|
+
// Log allowed args
|
|
102
|
+
if (config.log) {
|
|
103
|
+
console.log({ allowedArgs });
|
|
104
|
+
}
|
|
105
|
+
const argsData = this.prepareArguments(config.arguments, {
|
|
106
|
+
allowed: allowedArgs,
|
|
107
|
+
});
|
|
108
|
+
// Log args data
|
|
109
|
+
if (config.log) {
|
|
110
|
+
argsData.usedArgs.sort();
|
|
111
|
+
argsData.schemaArgs.sort();
|
|
112
|
+
const filtered = argsData.schemaArgs.filter((field) => !argsData.usedArgs.includes(field));
|
|
113
|
+
const unused = this.graphQLTypeToStringArray(allowedArgs)
|
|
114
|
+
.sort()
|
|
115
|
+
.filter((field) => !argsData.usedArgs.includes(field));
|
|
116
|
+
console.log({ argsData, filtered, unused });
|
|
117
|
+
}
|
|
118
|
+
let args = argsData?.argsString || '';
|
|
119
|
+
if (args === '{}') {
|
|
120
|
+
args = '';
|
|
121
|
+
}
|
|
122
|
+
// Log
|
|
123
|
+
if (config.log) {
|
|
124
|
+
console.log({ graphQL: graphqlMethodName, args, fields, type: config.type });
|
|
125
|
+
}
|
|
126
|
+
// Prepare request
|
|
127
|
+
const request = {};
|
|
128
|
+
// Prepare GraphQL
|
|
129
|
+
const gQlFuncBody = fields
|
|
130
|
+
? ' {\n' + graphqlMethodName + args + fields + '\n}'
|
|
131
|
+
: ' {\n' + graphqlMethodName + args + '\n}';
|
|
132
|
+
let gQlBody = config.type + gQlFuncBody;
|
|
133
|
+
// Handling for variables (e.g. for file uploads)
|
|
134
|
+
if (Object.keys(argsData.variables).length) {
|
|
135
|
+
// Preparations
|
|
136
|
+
request.variables = {};
|
|
137
|
+
let multipart = false;
|
|
138
|
+
// Add surrounding
|
|
139
|
+
gQlBody = config.type + ' Request(';
|
|
140
|
+
for (const [key, item] of Object.entries(argsData.variables)) {
|
|
141
|
+
gQlBody += '\n$' + key + ':' + item.type + ',';
|
|
142
|
+
request.variables[key] = item.value;
|
|
143
|
+
if (item.type.startsWith('Upload')) {
|
|
144
|
+
multipart = true;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
gQlBody = gQlBody.slice(0, -1) + '\n)' + gQlFuncBody;
|
|
148
|
+
// Set Multipart
|
|
149
|
+
if (multipart) {
|
|
150
|
+
request.context = {
|
|
151
|
+
useMultipart: true,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const documentNode = gql(gQlBody);
|
|
156
|
+
// Log
|
|
157
|
+
if (config.log) {
|
|
158
|
+
console.log({ documentNode });
|
|
159
|
+
}
|
|
160
|
+
// Set document node
|
|
161
|
+
request[config.type] = documentNode;
|
|
162
|
+
// Log
|
|
163
|
+
if (config.log) {
|
|
164
|
+
console.log({ request });
|
|
165
|
+
}
|
|
166
|
+
let func;
|
|
167
|
+
if (config.type === GraphQLRequestType.MUTATION) {
|
|
168
|
+
func = 'mutate';
|
|
169
|
+
request[config.type] = documentNode;
|
|
170
|
+
}
|
|
171
|
+
else if (config.type === GraphQLRequestType.SUBSCRIPTION) {
|
|
172
|
+
func = 'subscribe';
|
|
173
|
+
request.query = documentNode;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
func = config.type;
|
|
177
|
+
request[config.type] = documentNode;
|
|
178
|
+
}
|
|
179
|
+
this.apollo[func](request).subscribe((result) => {
|
|
180
|
+
const data = result?.data?.[graphqlMethodName] !== undefined ? result.data[graphqlMethodName] : result;
|
|
181
|
+
// Direct data
|
|
182
|
+
if (!config.model) {
|
|
183
|
+
subscriber.next(data);
|
|
184
|
+
}
|
|
185
|
+
// Map data as array
|
|
186
|
+
else if (Array.isArray(data)) {
|
|
187
|
+
subscriber.next(data.map((item) => {
|
|
188
|
+
return config.model.map(item);
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
// Map data
|
|
192
|
+
else {
|
|
193
|
+
subscriber.next(config.model.map(data));
|
|
194
|
+
}
|
|
195
|
+
if (config.type !== GraphQLRequestType.SUBSCRIPTION) {
|
|
196
|
+
// Done
|
|
197
|
+
subscriber.complete();
|
|
198
|
+
}
|
|
199
|
+
}, (error) => {
|
|
200
|
+
subscriber.error(error);
|
|
201
|
+
subscriber.complete();
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get fields / args from IGraphQLTypeCollection
|
|
208
|
+
*/
|
|
209
|
+
graphQLTypeToStringArray(graphQLType, current = '', result = [], cacheNode = []) {
|
|
210
|
+
if (!graphQLType) {
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
if (current?.includes('.')) {
|
|
214
|
+
cacheNode.push(current.split('.')[1]);
|
|
215
|
+
}
|
|
216
|
+
else if (current) {
|
|
217
|
+
cacheNode.push(current);
|
|
218
|
+
}
|
|
219
|
+
for (const key of Object.keys(graphQLType.fields)) {
|
|
220
|
+
if (current === key || cacheNode.includes(key)) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
this.graphQLTypeToStringArray(graphQLType.fields[key], current ? current + '.' + key : key, result, cacheNode);
|
|
224
|
+
}
|
|
225
|
+
return result;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Prepare arguments for GraphQL request
|
|
229
|
+
*/
|
|
230
|
+
prepareArguments(args, options = {}) {
|
|
231
|
+
// Init config variables
|
|
232
|
+
const { allowed, levelKey, level, parent, schemaArgs, usedArgs, variables } = {
|
|
233
|
+
allowed: null,
|
|
234
|
+
levelKey: '',
|
|
235
|
+
level: 1,
|
|
236
|
+
parent: '',
|
|
237
|
+
schemaArgs: [],
|
|
238
|
+
usedArgs: [],
|
|
239
|
+
variables: {},
|
|
240
|
+
...options,
|
|
241
|
+
};
|
|
242
|
+
// Check args
|
|
243
|
+
if (args === undefined || args === null) {
|
|
244
|
+
return { argsString: '', schemaArgs, usedArgs, variables };
|
|
245
|
+
}
|
|
246
|
+
// Init args
|
|
247
|
+
const result = [];
|
|
248
|
+
// Process array
|
|
249
|
+
if (Array.isArray(args)) {
|
|
250
|
+
const allowedKeys = allowed ? Object.keys(allowed.fields) : null;
|
|
251
|
+
for (const item of args) {
|
|
252
|
+
let key = null;
|
|
253
|
+
if (allowed) {
|
|
254
|
+
if (!allowedKeys || allowedKeys.length < 1) {
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
key = allowedKeys.shift();
|
|
258
|
+
}
|
|
259
|
+
// Process value
|
|
260
|
+
result.push(this.prepareArguments(item, {
|
|
261
|
+
allowed: key ? allowed.fields[key] : null,
|
|
262
|
+
levelKey: key,
|
|
263
|
+
level: level + 1,
|
|
264
|
+
parent: parent + key + '.',
|
|
265
|
+
schemaArgs,
|
|
266
|
+
usedArgs,
|
|
267
|
+
variables,
|
|
268
|
+
}).argsString);
|
|
269
|
+
}
|
|
270
|
+
// Encapsulation of the array result
|
|
271
|
+
if (result.length) {
|
|
272
|
+
// Complete result, encapsulated via round brackets
|
|
273
|
+
if (level === 1) {
|
|
274
|
+
return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs, variables };
|
|
275
|
+
}
|
|
276
|
+
// Deeper result part, encapsulated via square brackets
|
|
277
|
+
else {
|
|
278
|
+
return { argsString: '[' + result.join(', ') + ']', schemaArgs, usedArgs, variables };
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Process object
|
|
283
|
+
else if (typeof args === 'object') {
|
|
284
|
+
// Check for Upload type for variable handling
|
|
285
|
+
if (allowed?.type === 'Upload') {
|
|
286
|
+
const name = levelKey + '_' + Helper.getUID(6);
|
|
287
|
+
variables[name] = { type: allowed.type + (allowed.isRequired ? '!' : ''), value: args };
|
|
288
|
+
return { argsString: '$' + name, schemaArgs, usedArgs, variables };
|
|
289
|
+
}
|
|
290
|
+
// Check object is empty
|
|
291
|
+
if (args && Object.keys(args).length === 0 && Object.getPrototypeOf(args) === Object.prototype) {
|
|
292
|
+
return { argsString: '{}', schemaArgs, usedArgs, variables };
|
|
293
|
+
}
|
|
294
|
+
// Process all object entries
|
|
295
|
+
for (const [key, value] of Object.entries(args)) {
|
|
296
|
+
// Init data for current entry
|
|
297
|
+
const currentKey = parent + key;
|
|
298
|
+
schemaArgs.push(currentKey);
|
|
299
|
+
// If the allowed key handling is enabled and the current key is not included in the list of allowed keys,
|
|
300
|
+
// the current key will be skipped
|
|
301
|
+
if (allowed && !allowed.fields[key]) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
// Skip value if not exists
|
|
305
|
+
if (value === undefined) {
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
// Set null e.g. for resetting
|
|
309
|
+
if (value === null) {
|
|
310
|
+
result.push(key + ':' + null);
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
// Add current key to metadata
|
|
314
|
+
usedArgs.push(currentKey);
|
|
315
|
+
// Process GraphQLEnum
|
|
316
|
+
if (value instanceof GraphQLEnum) {
|
|
317
|
+
result.push(key + ':' + value.value);
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (this.moduleConfig.securePasswordTransfer && key === 'password') {
|
|
321
|
+
result.push(key + ':' + `"${sha256(value)}"`);
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
// Process array
|
|
325
|
+
else if (Array.isArray(value)) {
|
|
326
|
+
result.push(key +
|
|
327
|
+
': [' +
|
|
328
|
+
value.map((item) => this.prepareArguments(item, {
|
|
329
|
+
allowed: allowed.fields[key],
|
|
330
|
+
levelKey: key,
|
|
331
|
+
level: level + 1,
|
|
332
|
+
parent: currentKey + '.',
|
|
333
|
+
schemaArgs,
|
|
334
|
+
usedArgs,
|
|
335
|
+
variables,
|
|
336
|
+
}).argsString) +
|
|
337
|
+
']');
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
// Prepare additional result string
|
|
341
|
+
let additionalResult = key + ': ';
|
|
342
|
+
// Value is a date object
|
|
343
|
+
if (typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]') {
|
|
344
|
+
additionalResult += `"""${value.toString()}"""`;
|
|
345
|
+
}
|
|
346
|
+
// Value is a string
|
|
347
|
+
else if (typeof value === 'string') {
|
|
348
|
+
// Enum (doesn't need quotation marks)
|
|
349
|
+
if (allowed.fields[key].isEnum) {
|
|
350
|
+
additionalResult += value;
|
|
351
|
+
}
|
|
352
|
+
// String
|
|
353
|
+
else {
|
|
354
|
+
additionalResult += `"${value.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// Value is a simple boolean or a number
|
|
358
|
+
else if (typeof value === 'boolean' || typeof value === 'number') {
|
|
359
|
+
additionalResult += value;
|
|
360
|
+
}
|
|
361
|
+
// Others
|
|
362
|
+
else {
|
|
363
|
+
const prepareOptions = {
|
|
364
|
+
allowed: allowed.fields[key],
|
|
365
|
+
levelKey: key,
|
|
366
|
+
level: level + 1,
|
|
367
|
+
parent: currentKey + '.',
|
|
368
|
+
schemaArgs,
|
|
369
|
+
usedArgs,
|
|
370
|
+
variables,
|
|
371
|
+
};
|
|
372
|
+
try {
|
|
373
|
+
additionalResult += this.prepareArguments(value, prepareOptions).argsString;
|
|
374
|
+
}
|
|
375
|
+
catch (e) {
|
|
376
|
+
console.error('Error during preparing arguments', value, prepareOptions);
|
|
377
|
+
throw e;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
// Push deeper part into result array
|
|
381
|
+
result.push(additionalResult);
|
|
382
|
+
}
|
|
383
|
+
// Encapsulation of the object result
|
|
384
|
+
if (result.length) {
|
|
385
|
+
// Complete result, encapsulated via round brackets
|
|
386
|
+
if (level === 1) {
|
|
387
|
+
return { argsString: '(' + result.join(', ') + ')', schemaArgs, usedArgs, variables };
|
|
388
|
+
}
|
|
389
|
+
// Deeper result part, encapsulated via curly brackets
|
|
390
|
+
else {
|
|
391
|
+
return { argsString: '{' + result.join(', ') + '}', schemaArgs, usedArgs, variables };
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Prepare and process other / unknown values as JSON
|
|
396
|
+
else {
|
|
397
|
+
return { argsString: JSON.stringify(args), schemaArgs, usedArgs, variables };
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Prepare fields for GraphQL request
|
|
402
|
+
*/
|
|
403
|
+
prepareFields(fields, options = {}) {
|
|
404
|
+
// Config
|
|
405
|
+
const { allowed, parent, schemaFields, spaces, tab, usedFields } = {
|
|
406
|
+
allowed: null,
|
|
407
|
+
parent: '',
|
|
408
|
+
schemaFields: [],
|
|
409
|
+
spaces: 2,
|
|
410
|
+
tab: 1,
|
|
411
|
+
usedFields: [],
|
|
412
|
+
...options,
|
|
413
|
+
};
|
|
414
|
+
// Init fields string
|
|
415
|
+
let fieldsString = '';
|
|
416
|
+
// Check fields
|
|
417
|
+
if (!fields) {
|
|
418
|
+
return { fieldsString, schemaFields, usedFields };
|
|
419
|
+
}
|
|
420
|
+
// Process string
|
|
421
|
+
if (typeof fields === 'string') {
|
|
422
|
+
if (allowed && !allowed.fields[fields]) {
|
|
423
|
+
return { fieldsString, schemaFields, usedFields };
|
|
424
|
+
}
|
|
425
|
+
return { fieldsString: '\n' + ' '.repeat(spaces).repeat(tab) + fields, schemaFields, usedFields };
|
|
426
|
+
}
|
|
427
|
+
// Process array
|
|
428
|
+
else if (Array.isArray(fields)) {
|
|
429
|
+
for (const item of fields) {
|
|
430
|
+
if (typeof item === 'object') {
|
|
431
|
+
fieldsString =
|
|
432
|
+
fieldsString +
|
|
433
|
+
this.prepareFields(item, {
|
|
434
|
+
allowed,
|
|
435
|
+
parent,
|
|
436
|
+
spaces,
|
|
437
|
+
schemaFields,
|
|
438
|
+
tab: tab + 1,
|
|
439
|
+
usedFields,
|
|
440
|
+
}).fieldsString;
|
|
441
|
+
continue;
|
|
442
|
+
}
|
|
443
|
+
const currentPath = parent + item;
|
|
444
|
+
schemaFields.push(currentPath);
|
|
445
|
+
if (allowed && !allowed.fields[item]) {
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
usedFields.push(currentPath);
|
|
449
|
+
fieldsString =
|
|
450
|
+
fieldsString +
|
|
451
|
+
this.prepareFields(item, {
|
|
452
|
+
allowed: null,
|
|
453
|
+
parent: currentPath + '.',
|
|
454
|
+
spaces,
|
|
455
|
+
schemaFields,
|
|
456
|
+
tab: tab + 1,
|
|
457
|
+
usedFields,
|
|
458
|
+
}).fieldsString;
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
// Process object
|
|
462
|
+
else if (typeof fields === 'object') {
|
|
463
|
+
for (const [key, val] of Object.entries(fields)) {
|
|
464
|
+
const currentPath = parent + key;
|
|
465
|
+
schemaFields.push(currentPath);
|
|
466
|
+
if (allowed && !allowed.fields[key]) {
|
|
467
|
+
continue;
|
|
468
|
+
}
|
|
469
|
+
usedFields.push(currentPath);
|
|
470
|
+
if (typeof val !== 'object' || !Object.keys(val).length) {
|
|
471
|
+
fieldsString = fieldsString + '\n' + ' '.repeat(spaces).repeat(tab) + key;
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
fieldsString =
|
|
475
|
+
fieldsString +
|
|
476
|
+
'\n' +
|
|
477
|
+
' '.repeat(spaces).repeat(tab) +
|
|
478
|
+
key +
|
|
479
|
+
' ' +
|
|
480
|
+
'{' +
|
|
481
|
+
this.prepareFields(val, {
|
|
482
|
+
allowed: allowed.fields[key],
|
|
483
|
+
parent: currentPath + '.',
|
|
484
|
+
spaces,
|
|
485
|
+
schemaFields,
|
|
486
|
+
tab: tab + 1,
|
|
487
|
+
usedFields,
|
|
488
|
+
}).fieldsString +
|
|
489
|
+
'\n' +
|
|
490
|
+
' '.repeat(spaces).repeat(tab) +
|
|
491
|
+
'}';
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// Return result
|
|
496
|
+
return { fieldsString, schemaFields, usedFields };
|
|
497
|
+
}
|
|
498
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: GraphQLService, deps: [{ token: i1.Apollo }, { token: i2.GraphQLMetaService }, { token: BASE_MODULE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
499
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: GraphQLService, providedIn: 'root' });
|
|
500
|
+
}
|
|
501
|
+
export { GraphQLService };
|
|
502
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: GraphQLService, decorators: [{
|
|
503
|
+
type: Injectable,
|
|
504
|
+
args: [{
|
|
505
|
+
providedIn: 'root',
|
|
506
|
+
}]
|
|
507
|
+
}], ctorParameters: function () { return [{ type: i1.Apollo }, { type: i2.GraphQLMetaService }, { type: undefined, decorators: [{
|
|
508
|
+
type: Inject,
|
|
509
|
+
args: [BASE_MODULE_CONFIG]
|
|
510
|
+
}] }]; } });
|
|
511
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctYmFzZS9zaGFyZWQvc2VydmljZXMvZ3JhcGhxbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFvQixNQUFNLDRDQUE0QyxDQUFDOzs7O0FBRWxHOztHQUVHO0FBQ0gsTUFHYSxjQUFjO0lBS2I7SUFDQTtJQUM0QjtJQU54Qzs7T0FFRztJQUNILFlBQ1ksTUFBYyxFQUNkLGtCQUFzQyxFQUNWLFlBQThCO1FBRjFELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ1YsaUJBQVksR0FBWixZQUFZLENBQWtCO0lBQ25FLENBQUM7SUFFSjs7T0FFRztJQUNJLE9BQU8sQ0FBQyxpQkFBeUIsRUFBRSxVQUEyQixFQUFFO1FBQ3JFLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDdEIsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztTQUM1RDtRQUVELGFBQWE7UUFDYixNQUFNLE1B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QUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7NEJBQzlCLEdBQUc7NEJBQ0gsR0FBRzs0QkFDSCxHQUFHOzRCQUNILElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFO2dDQUN0QixPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7Z0NBQzVCLE1BQU0sRUFBRSxXQUFXLEdBQUcsR0FBRztnQ0FDekIsTUFBTTtnQ0FDTixZQUFZO2dDQUNaLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQztnQ0FDWixVQUFVOzZCQUNYLENBQUMsQ0FBQyxZQUFZOzRCQUNmLElBQUk7NEJBQ0osR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDOzRCQUM5QixHQUFHLENBQUM7aUJBQ1A7YUFDRjtTQUNGO1FBRUQsZ0JBQWdCO1FBQ2hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQ3BELENBQUM7dUdBcmtCVSxjQUFjLDBFQU9mLGtCQUFrQjsyR0FQakIsY0FBYyxjQUZiLE1BQU07O1NBRVAsY0FBYzsyRkFBZCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUUksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcG9sbG8sIGdxbCB9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUdyYXBoUUxPcHRpb25zIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmFwaHFsLW9wdGlvbnMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEdyYXBoUUxSZXF1ZXN0VHlwZSB9IGZyb20gJy4uL2VudW1zL2dyYXBocWwtcmVxdWVzdC10eXBlLmVudW0nO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3JhcGhRTE1ldGFTZXJ2aWNlIH0gZnJvbSAnLi9ncmFwaHFsLW1ldGEuc2VydmljZSc7XG5pbXBvcnQgeyBHcmFwaFFMRW51bSB9IGZyb20gJy4uL2NsYXNzZXMvZ3JhcGhxbC1lbnVtLmNsYXNzJztcbmltcG9ydCB7IEdyYXBoUUxUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy9ncmFwaHFsLXR5cGUuY2xhc3MnO1xuaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnanMtc2hhMjU2JztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL2NsYXNzZXMvaGVscGVyLmNsYXNzJztcbmltcG9ydCB7IEJBU0VfTU9EVUxFX0NPTkZJRywgQmFzZU1vZHVsZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvYmFzZS1tb2R1bGUtY29uZmlnLmludGVyZmFjZSc7XG5cbi8qKlxuICogR3JhcGhRTCBzZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBHcmFwaFFMU2VydmljZSB7XG4gIC8qKlxuICAgKiBJbmNsdWRlIHNlcnZpY2VzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgYXBvbGxvOiBBcG9sbG8sXG4gICAgcHJvdGVjdGVkIGdyYXBoUUxNZXRhU2VydmljZTogR3JhcGhRTE1ldGFTZXJ2aWNlLFxuICAgIEBJbmplY3QoQkFTRV9NT0RVTEVfQ09ORklHKSBwcm90ZWN0ZWQgbW9kdWxlQ29uZmlnOiBCYXNlTW9kdWxlQ29uZmlnXG4gICkge31cblxuICAvKipcbiAgICogR3JhcGhRTCByZXF1ZXN0XG4gICAqL1xuICBwdWJsaWMgZ3JhcGhRbChncmFwaHFsTWV0aG9kTmFtZTogc3RyaW5nLCBvcHRpb25zOiBJR3JhcGhRTE9wdGlvbnMgPSB7fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgLy8gQ2hlY2sgcGFyYW1ldGVyc1xuICAgIGlmICghZ3JhcGhxbE1ldGhvZE5hbWUpIHtcbiAgICAgIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdNaXNzaW5nIGdyYXBocWwgbWV0aG9kIG5hbWUnKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGNvbmZpZ1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGFyZ3VtZW50czogbnVsbCxcbiAgICAgIGZpZWxkczogbnVsbCxcbiAgICAgIGxvZzogZmFsc2UsXG4gICAgICBtb2RlbDogbnVsbCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcblxuICAgIC8vIENvbnZlcnQgY2xhc3MgdG8gT2JqZWN0IGZvciBhcmd1bWVudHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5hcmd1bWVudHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbmZpZy5hcmd1bWVudHMgPSBuZXcgY29uZmlnLmFyZ3VtZW50cygpO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgY2xhc3MgdG8gT2JqZWN0IGZvciBmaWVsZHNcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5maWVsZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbmZpZy5maWVsZHMgPSBuZXcgY29uZmlnLmZpZWxkcygpO1xuICAgIH1cblxuICAgIC8vIExvZ1xuICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZyh7IGNvbmZpZyB9KTtcbiAgICB9XG5cbiAgICAvLyBTZW5kIHJlcXVlc3RcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIC8vIEdldCBtZXRhXG4gICAgICB0aGlzLmdyYXBoUUxNZXRhU2VydmljZS5nZXRNZXRhKHsgbG9nOiBjb25maWcubG9nIH0pLnN1YnNjcmliZSgobWV0YSkgPT4ge1xuICAgICAgICAvLyBTZXQgR3JhcGhRTFJlcXVlc3RUeXBlIGF1dG9tYXRpY2FsbHlcbiAgICAgICAgaWYgKCFjb25maWcudHlwZSkge1xuICAgICAgICAgIGNvbnN0IHR5cGVzID0gbWV0YS5nZXRSZXF1ZXN0VHlwZXNWaWFNZXRob2QoZ3JhcGhxbE1ldGhvZE5hbWUpO1xuICAgICAgICAgIGlmICghdHlwZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ05vIEdyYXBoUUxSZXF1ZXN0VHlwZSBkZXRlY3RlZCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uZmlnLnR5cGUgPSB0eXBlc1swXSBhcyBHcmFwaFFMUmVxdWVzdFR5cGU7XG4gICAgICAgICAgaWYgKGNvbmZpZy50eXBlKSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTm8gR3JhcGhRTFJlcXVlc3RUeXBlIGRldGVjdGVkJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0dyYXBoUUxSZXF1ZXN0VHlwZSAnICsgY29uZmlnLnR5cGUgKyAnIHVzZWQgZm9yICcgKyBncmFwaHFsTWV0aG9kTmFtZSwgdHlwZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgZmllbGRzXG4gICAgICAgIGxldCBmaWVsZHM7XG4gICAgICAgIGxldCBhbGxvd2VkRmllbGRzO1xuXG4gICAgICAgIC8vIExvZyBtZXRhXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBtZXRhIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5maWVsZHMpIHtcbiAgICAgICAgICBhbGxvd2VkRmllbGRzID0gbWV0YS5nZXRGaWVsZHMoZ3JhcGhxbE1ldGhvZE5hbWUsIHsgdHlwZTogY29uZmlnLnR5cGUgfSk7XG5cbiAgICAgICAgICAvLyBMb2cgbWV0YVxuICAgICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyh7IGFsbG93ZWRGaWVsZHMgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZmllbGRzRGF0YSA9IHRoaXMucHJlcGFyZUZpZWxkcyhjb25maWcuZmllbGRzLCB7XG4gICAgICAgICAgICBhbGxvd2VkOiBhbGxvd2VkRmllbGRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZmllbGRzID0gZmllbGRzRGF0YS5maWVsZHNTdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmllbGRzICYmICFmaWVsZHMuc3RhcnRzV2l0aCgneycpKSB7XG4gICAgICAgICAgZmllbGRzID0gJ3snICsgZmllbGRzICsgJ1xcbn0nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nIGZpZWxkc1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgZmllbGRzIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFsbG93ZWQgYXJnc1xuICAgICAgICBjb25zdCBhbGxvd2VkQXJncyA9IG1ldGEuZ2V0QXJncyhncmFwaHFsTWV0aG9kTmFtZSwgeyB0eXBlOiBjb25maWcudHlwZSB9KTtcblxuICAgICAgICAvLyBMb2cgYWxsb3dlZCBhcmdzXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBhbGxvd2VkQXJncyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3NEYXRhID0gdGhpcy5wcmVwYXJlQXJndW1lbnRzKGNvbmZpZy5hcmd1bWVudHMsIHtcbiAgICAgICAgICBhbGxvd2VkOiBhbGxvd2VkQXJncyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTG9nIGFyZ3MgZGF0YVxuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGFyZ3NEYXRhLnVzZWRBcmdzLnNvcnQoKTtcbiAgICAgICAgICBhcmdzRGF0YS5zY2hlbWFBcmdzLnNvcnQoKTtcbiAgICAgICAgICBjb25zdCBmaWx0ZXJlZCA9IGFyZ3NEYXRhLnNjaGVtYUFyZ3MuZmlsdGVyKChmaWVsZCkgPT4gIWFyZ3NEYXRhLnVzZWRBcmdzLmluY2x1ZGVzKGZpZWxkKSk7XG4gICAgICAgICAgY29uc3QgdW51c2VkID0gdGhpcy5ncmFwaFFMVHlwZVRvU3RyaW5nQXJyYXkoYWxsb3dlZEFyZ3MpXG4gICAgICAgICAgICAuc29ydCgpXG4gICAgICAgICAgICAuZmlsdGVyKChmaWVsZCkgPT4gIWFyZ3NEYXRhLnVzZWRBcmdzLmluY2x1ZGVzKGZpZWxkKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBhcmdzRGF0YSwgZmlsdGVyZWQsIHVudXNlZCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBhcmdzID0gYXJnc0RhdGE/LmFyZ3NTdHJpbmcgfHwgJyc7XG4gICAgICAgIGlmIChhcmdzID09PSAne30nKSB7XG4gICAgICAgICAgYXJncyA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9nXG4gICAgICAgIGlmIChjb25maWcubG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coeyBncmFwaFFMOiBncmFwaHFsTWV0aG9kTmFtZSwgYXJncywgZmllbGRzLCB0eXBlOiBjb25maWcudHlwZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByZXBhcmUgcmVxdWVzdFxuICAgICAgICBjb25zdCByZXF1ZXN0OiBhbnkgPSB7fTtcblxuICAgICAgICAvLyBQcmVwYXJlIEdyYXBoUUxcbiAgICAgICAgY29uc3QgZ1FsRnVuY0JvZHkgPSBmaWVsZHNcbiAgICAgICAgICA/ICcge1xcbicgKyBncmFwaHFsTWV0aG9kTmFtZSArIGFyZ3MgKyBmaWVsZHMgKyAnXFxufSdcbiAgICAgICAgICA6ICcge1xcbicgKyBncmFwaHFsTWV0aG9kTmFtZSArIGFyZ3MgKyAnXFxufSc7XG4gICAgICAgIGxldCBnUWxCb2R5ID0gY29uZmlnLnR5cGUgKyBnUWxGdW5jQm9keTtcblxuICAgICAgICAvLyBIYW5kbGluZyBmb3IgdmFyaWFibGVzIChlLmcuIGZvciBmaWxlIHVwbG9hZHMpXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhhcmdzRGF0YS52YXJpYWJsZXMpLmxlbmd0aCkge1xuICAgICAgICAgIC8vIFByZXBhcmF0aW9uc1xuICAgICAgICAgIHJlcXVlc3QudmFyaWFibGVzID0ge307XG4gICAgICAgICAgbGV0IG11bHRpcGFydCA9IGZhbHNlO1xuXG4gICAgICAgICAgLy8gQWRkIHN1cnJvdW5kaW5nXG4gICAgICAgICAgZ1FsQm9keSA9IGNvbmZpZy50eXBlICsgJyBSZXF1ZXN0KCc7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCBpdGVtXSBvZiBPYmplY3QuZW50cmllcyhhcmdzRGF0YS52YXJpYWJsZXMpKSB7XG4gICAgICAgICAgICBnUWxCb2R5ICs9ICdcXG4kJyArIGtleSArICc6JyArIGl0ZW0udHlwZSArICcsJztcbiAgICAgICAgICAgIHJlcXVlc3QudmFyaWFibGVzW2tleV0gPSBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZS5zdGFydHNXaXRoKCdVcGxvYWQnKSkge1xuICAgICAgICAgICAgICBtdWx0aXBhcnQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBnUWxCb2R5ID0gZ1FsQm9keS5zbGljZSgwLCAtMSkgKyAnXFxuKScgKyBnUWxGdW5jQm9keTtcblxuICAgICAgICAgIC8vIFNldCBNdWx0aXBhcnRcbiAgICAgICAgICBpZiAobXVsdGlwYXJ0KSB7XG4gICAgICAgICAgICByZXF1ZXN0LmNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIHVzZU11bHRpcGFydDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvY3VtZW50Tm9kZSA9IGdxbChnUWxCb2R5KTtcblxuICAgICAgICAvLyBMb2dcbiAgICAgICAgaWYgKGNvbmZpZy5sb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyh7IGRvY3VtZW50Tm9kZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBkb2N1bWVudCBub2RlXG4gICAgICAgIHJlcXVlc3RbY29uZmlnLnR5cGVdID0gZG9jdW1lbnROb2RlO1xuXG4gICAgICAgIC8vIExvZ1xuICAgICAgICBpZiAoY29uZmlnLmxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHsgcmVxdWVzdCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmdW5jO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IEdyYXBoUUxSZXF1ZXN0VHlwZS5NVVRBVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnbXV0YXRlJztcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcudHlwZSA9PT0gR3JhcGhRTFJlcXVlc3RUeXBlLlNVQlNDUklQVElPTikge1xuICAgICAgICAgIGZ1bmMgPSAnc3Vic2NyaWJlJztcbiAgICAgICAgICByZXF1ZXN0LnF1ZXJ5ID0gZG9jdW1lbnROb2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZ1bmMgPSBjb25maWcudHlwZTtcbiAgICAgICAgICByZXF1ZXN0W2NvbmZpZy50eXBlXSA9IGRvY3VtZW50Tm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgICh0aGlzLmFwb2xsbyBhcyBhbnkpW2Z1bmNdKHJlcXVlc3QpLnN1YnNjcmliZShcbiAgICAgICAgICAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQ/LmRhdGE/LltncmFwaHFsTWV0aG9kTmFtZV0gIT09IHVuZGVmaW5lZCA/IHJlc3VsdC5kYXRhW2dyYXBocWxNZXRob2ROYW1lXSA6IHJlc3VsdDtcblxuICAgICAgICAgICAgLy8gRGlyZWN0IGRhdGFcbiAgICAgICAgICAgIGlmICghY29uZmlnLm1vZGVsKSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFwIGRhdGEgYXMgYXJyYXlcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KFxuICAgICAgICAgICAgICAgIGRhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLm1vZGVsLm1hcChpdGVtKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYXAgZGF0YVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChjb25maWcubW9kZWwubWFwKGRhdGEpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZy50eXBlICE9PSBHcmFwaFFMUmVxdWVzdFR5cGUuU1VCU0NSSVBUSU9OKSB7XG4gICAgICAgICAgICAgIC8vIERvbmVcbiAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmaWVsZHMgLyBhcmdzIGZyb20gSUdyYXBoUUxUeXBlQ29sbGVjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGdyYXBoUUxUeXBlVG9TdHJpbmdBcnJheShncmFwaFFMVHlwZTogR3JhcGhRTFR5cGUsIGN1cnJlbnQgPSAnJywgcmVzdWx0ID0gW10sIGNhY2hlTm9kZSA9IFtdKSB7XG4gICAgaWYgKCFncmFwaFFMVHlwZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgaWYgKGN1cnJlbnQ/LmluY2x1ZGVzKCcuJykpIHtcbiAgICAgIGNhY2hlTm9kZS5wdXNoKGN1cnJlbnQuc3BsaXQoJy4nKVsxXSk7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50KSB7XG4gICAgICBjYWNoZU5vZGUucHVzaChjdXJyZW50KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZ3JhcGhRTFR5cGUuZmllbGRzKSkge1xuICAgICAgaWYgKGN1cnJlbnQgPT09IGtleSB8fCBjYWNoZU5vZGUuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ3JhcGhRTFR5cGVUb1N0cmluZ0FycmF5KGdyYXBoUUxUeXBlLmZpZWxkc1trZXldLCBjdXJyZW50ID8gY3VycmVudCArICcuJyArIGtleSA6IGtleSwgcmVzdWx0LCBjYWNoZU5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgYXJndW1lbnRzIGZvciBHcmFwaFFMIHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlQXJndW1lbnRzKFxuICAgIGFyZ3M6IGFueSxcbiAgICBvcHRpb25zOiB7XG4gICAgICBhbGxvd2VkPzogR3JhcGhRTFR5cGU7XG4gICAgICBsZXZlbD86IG51bWJlcjtcbiAgICAgIGxldmVsS2V5Pzogc3RyaW5nO1xuICAgICAgcGFyZW50Pzogc3RyaW5nO1xuICAgICAgc2NoZW1hQXJncz86IHN0cmluZ1tdO1xuICAgICAgdXNlZEFyZ3M/OiBzdHJpbmdbXTtcbiAgICAgIHZhcmlhYmxlcz86IHsgW2tleTogc3RyaW5nXTogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9O1xuICAgIH0gPSB7fVxuICApOiB7XG4gICAgYXJnc1N0cmluZzogc3RyaW5nO1xuICAgIHNjaGVtYUFyZ3M6IHN0cmluZ1tdO1xuICAgIHVzZWRBcmdzOiBzdHJpbmdbXTtcbiAgICB2YXJpYWJsZXM6IHsgW2tleTogc3RyaW5nXTogeyB0eXBlOiBzdHJpbmc7IHZhbHVlOiBhbnkgfSB9O1xuICB9IHtcbiAgICAvLyBJbml0IGNvbmZpZyB2YXJpYWJsZXNcbiAgICBjb25zdCB7IGFsbG93ZWQsIGxldmVsS2V5LCBsZXZlbCwgcGFyZW50LCBzY2hlbWFBcmdzLCB1c2VkQXJncywgdmFyaWFibGVzIH0gPSB7XG4gICAgICBhbGxvd2VkOiBudWxsLFxuICAgICAgbGV2ZWxLZXk6ICcnLFxuICAgICAgbGV2ZWw6IDEsXG4gICAgICBwYXJlbnQ6ICcnLFxuICAgICAgc2NoZW1hQXJnczogW10sXG4gICAgICB1c2VkQXJnczogW10sXG4gICAgICB2YXJpYWJsZXM6IHt9LFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8gQ2hlY2sgYXJnc1xuICAgIGlmIChhcmdzID09PSB1bmRlZmluZWQgfHwgYXJncyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgYXJnc1N0cmluZzogJycsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzLCB2YXJpYWJsZXMgfTtcbiAgICB9XG5cbiAgICAvLyBJbml0IGFyZ3NcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcblxuICAgIC8vIFByb2Nlc3MgYXJyYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSkge1xuICAgICAgY29uc3QgYWxsb3dlZEtleXMgPSBhbGxvd2VkID8gT2JqZWN0LmtleXMoYWxsb3dlZC5maWVsZHMpIDogbnVsbDtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcmdzKSB7XG4gICAgICAgIGxldCBrZXkgPSBudWxsO1xuICAgICAgICBpZiAoYWxsb3dlZCkge1xuICAgICAgICAgIGlmICghYWxsb3dlZEtleXMgfHwgYWxsb3dlZEtleXMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtleSA9IGFsbG93ZWRLZXlzLnNoaWZ0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIHZhbHVlXG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgIHRoaXMucHJlcGFyZUFyZ3VtZW50cyhpdGVtLCB7XG4gICAgICAgICAgICBhbGxvd2VkOiBrZXkgPyBhbGxvd2VkLmZpZWxkc1trZXldIDogbnVsbCxcbiAgICAgICAgICAgIGxldmVsS2V5OiBrZXksXG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwgKyAxLFxuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnQgKyBrZXkgKyAnLicsXG4gICAgICAgICAgICBzY2hlbWFBcmdzLFxuICAgICAgICAgICAgdXNlZEFyZ3MsXG4gICAgICAgICAgICB2YXJpYWJsZXMsXG4gICAgICAgICAgfSkuYXJnc1N0cmluZ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmNhcHN1bGF0aW9uIG9mIHRoZSBhcnJheSByZXN1bHRcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgIC8vIENvbXBsZXRlIHJlc3VsdCwgZW5jYXBzdWxhdGVkIHZpYSByb3VuZCBicmFja2V0c1xuICAgICAgICBpZiAobGV2ZWwgPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnKCcgKyByZXN1bHQuam9pbignLCAnKSArICcpJywgc2NoZW1hQXJncywgdXNlZEFyZ3MsIHZhcmlhYmxlcyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVlcGVyIHJlc3VsdCBwYXJ0LCBlbmNhcHN1bGF0ZWQgdmlhIHNxdWFyZSBicmFja2V0c1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAnWycgKyByZXN1bHQuam9pbignLCAnKSArICddJywgc2NoZW1hQXJncywgdXNlZEFyZ3MsIHZhcmlhYmxlcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBvYmplY3RcbiAgICBlbHNlIGlmICh0eXBlb2YgYXJncyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIENoZWNrIGZvciBVcGxvYWQgdHlwZSBmb3IgdmFyaWFibGUgaGFuZGxpbmdcbiAgICAgIGlmIChhbGxvd2VkPy50eXBlID09PSAnVXBsb2FkJykge1xuICAgICAgICBjb25zdCBuYW1lID0gbGV2ZWxLZXkgKyAnXycgKyBIZWxwZXIuZ2V0VUlEKDYpO1xuICAgICAgICB2YXJpYWJsZXNbbmFtZV0gPSB7IHR5cGU6IGFsbG93ZWQudHlwZSArIChhbGxvd2VkLmlzUmVxdWlyZWQgPyAnIScgOiAnJyksIHZhbHVlOiBhcmdzIH07XG4gICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICckJyArIG5hbWUsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzLCB2YXJpYWJsZXMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgb2JqZWN0IGlzIGVtcHR5XG4gICAgICBpZiAoYXJncyAmJiBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggPT09IDAgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGFyZ3MpID09PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6ICd7fScsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzLCB2YXJpYWJsZXMgfTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2VzcyBhbGwgb2JqZWN0IGVudHJpZXNcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGFyZ3MpKSB7XG4gICAgICAgIC8vIEluaXQgZGF0YSBmb3IgY3VycmVudCBlbnRyeVxuICAgICAgICBjb25zdCBjdXJyZW50S2V5ID0gcGFyZW50ICsga2V5O1xuICAgICAgICBzY2hlbWFBcmdzLnB1c2goY3VycmVudEtleSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGFsbG93ZWQga2V5IGhhbmRsaW5nIGlzIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IGtleSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgYWxsb3dlZCBrZXlzLFxuICAgICAgICAvLyB0aGUgY3VycmVudCBrZXkgd2lsbCBiZSBza2lwcGVkXG4gICAgICAgIGlmIChhbGxvd2VkICYmICFhbGxvd2VkLmZpZWxkc1trZXldKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIHZhbHVlIGlmIG5vdCBleGlzdHNcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCBudWxsIGUuZy4gZm9yIHJlc2V0dGluZ1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkgKyAnOicgKyBudWxsKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCBjdXJyZW50IGtleSB0byBtZXRhZGF0YVxuICAgICAgICB1c2VkQXJncy5wdXNoKGN1cnJlbnRLZXkpO1xuXG4gICAgICAgIC8vIFByb2Nlc3MgR3JhcGhRTEVudW1cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgR3JhcGhRTEVudW0pIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkgKyAnOicgKyB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5tb2R1bGVDb25maWcuc2VjdXJlUGFzc3dvcmRUcmFuc2ZlciAmJiBrZXkgPT09ICdwYXNzd29yZCcpIHtcbiAgICAgICAgICByZXN1bHQucHVzaChrZXkgKyAnOicgKyBgXCIke3NoYTI1Nih2YWx1ZSBhcyBzdHJpbmcpfVwiYCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm9jZXNzIGFycmF5XG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goXG4gICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgICAnOiBbJyArXG4gICAgICAgICAgICAgIHZhbHVlLm1hcChcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT5cbiAgICAgICAgICAgICAgICAgIHRoaXMucHJlcGFyZUFyZ3VtZW50cyhpdGVtLCB7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWQuZmllbGRzW2tleV0sXG4gICAgICAgICAgICAgICAgICAgIGxldmVsS2V5OiBrZXksXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBsZXZlbCArIDEsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3VycmVudEtleSArICcuJyxcbiAgICAgICAgICAgICAgICAgICAgc2NoZW1hQXJncyxcbiAgICAgICAgICAgICAgICAgICAgdXNlZEFyZ3MsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAgIH0pLmFyZ3NTdHJpbmdcbiAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICddJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVwYXJlIGFkZGl0aW9uYWwgcmVzdWx0IHN0cmluZ1xuICAgICAgICBsZXQgYWRkaXRpb25hbFJlc3VsdCA9IGtleSArICc6ICc7XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBkYXRlIG9iamVjdFxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IGBcIlwiXCIkeyh2YWx1ZSBhcyBEYXRlKS50b1N0cmluZygpfVwiXCJcImA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWx1ZSBpcyBhIHN0cmluZ1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgLy8gRW51bSAoZG9lc24ndCBuZWVkIHF1b3RhdGlvbiBtYXJrcylcbiAgICAgICAgICBpZiAoYWxsb3dlZC5maWVsZHNba2V5XS5pc0VudW0pIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXN1bHQgKz0gdmFsdWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU3RyaW5nXG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IGBcIiR7dmFsdWUucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKX1cImA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsdWUgaXMgYSBzaW1wbGUgYm9vbGVhbiBvciBhIG51bWJlclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgYWRkaXRpb25hbFJlc3VsdCArPSB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE90aGVyc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBwcmVwYXJlT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFsbG93ZWQ6IGFsbG93ZWQuZmllbGRzW2tleV0sXG4gICAgICAgICAgICBsZXZlbEtleToga2V5LFxuICAgICAgICAgICAgbGV2ZWw6IGxldmVsICsgMSxcbiAgICAgICAgICAgIHBhcmVudDogY3VycmVudEtleSArICcuJyxcbiAgICAgICAgICAgIHNjaGVtYUFyZ3MsXG4gICAgICAgICAgICB1c2VkQXJncyxcbiAgICAgICAgICAgIHZhcmlhYmxlcyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVzdWx0ICs9IHRoaXMucHJlcGFyZUFyZ3VtZW50cyh2YWx1ZSwgcHJlcGFyZU9wdGlvbnMpLmFyZ3NTdHJpbmc7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHByZXBhcmluZyBhcmd1bWVudHMnLCB2YWx1ZSwgcHJlcGFyZU9wdGlvbnMpO1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQdXNoIGRlZXBlciBwYXJ0IGludG8gcmVzdWx0IGFycmF5XG4gICAgICAgIHJlc3VsdC5wdXNoKGFkZGl0aW9uYWxSZXN1bHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbmNhcHN1bGF0aW9uIG9mIHRoZSBvYmplY3QgcmVzdWx0XG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAvLyBDb21wbGV0ZSByZXN1bHQsIGVuY2Fwc3VsYXRlZCB2aWEgcm91bmQgYnJhY2tldHNcbiAgICAgICAgaWYgKGxldmVsID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHsgYXJnc1N0cmluZzogJygnICsgcmVzdWx0LmpvaW4oJywgJykgKyAnKScsIHNjaGVtYUFyZ3MsIHVzZWRBcmdzLCB2YXJpYWJsZXMgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZXBlciByZXN1bHQgcGFydCwgZW5jYXBzdWxhdGVkIHZpYSBjdXJseSBicmFja2V0c1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4geyBhcmdzU3RyaW5nOiAneycgKyByZXN1bHQuam9pbignLCAnKSArICd9Jywgc2NoZW1hQXJncywgdXNlZEFyZ3MsIHZhcmlhYmxlcyB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBhbmQgcHJvY2VzcyBvdGhlciAvIHVua25vd24gdmFsdWVzIGFzIEpTT05cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiB7IGFyZ3NTdHJpbmc6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLCBzY2hlbWFBcmdzLCB1c2VkQXJncywgdmFyaWFibGVzIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBhcmUgZmllbGRzIGZvciBHcmFwaFFMIHJlcXVlc3RcbiAgICovXG4gIHByb3RlY3RlZCBwcmVwYXJlRmllbGRzKFxuICAgIGZpZWxkczogYW55LFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIGFsbG93ZWQ/OiBHcmFwaFFMVHlwZTtcbiAgICAgIHNjaGVtYUZpZWxkcz86IHN0cmluZ1tdO1xuICAgICAgdXNlZEZpZWxkcz86IHN0cmluZ1tdO1xuICAgICAgcGFyZW50Pzogc3RyaW5nO1xuICAgICAgc3BhY2VzPzogbnVtYmVyO1xuICAgICAgdGFiPzogbnVtYmVyO1xuICAgIH0gPSB7fVxuICApOiB7IHNjaGVtYUZpZWxkczogc3RyaW5nW107IGZpZWxkc1N0cmluZzogc3RyaW5nOyB1c2VkRmllbGRzOiBzdHJpbmdbXSB9IHtcbiAgICAvLyBDb25maWdcbiAgICBjb25zdCB7IGFsbG93ZWQsIHBhcmVudCwgc2NoZW1hRmllbGRzLCBzcGFjZXMsIHRhYiwgdXNlZEZpZWxkcyB9ID0ge1xuICAgICAgYWxsb3dlZDogbnVsbCxcbiAgICAgIHBhcmVudDogJycsXG4gICAgICBzY2hlbWFGaWVsZHM6IFtdLFxuICAgICAgc3BhY2VzOiAyLFxuICAgICAgdGFiOiAxLFxuICAgICAgdXNlZEZpZWxkczogW10sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH07XG5cbiAgICAvLyBJbml0IGZpZWxkcyBzdHJpbmdcbiAgICBsZXQgZmllbGRzU3RyaW5nID0gJyc7XG5cbiAgICAvLyBDaGVjayBmaWVsZHNcbiAgICBpZiAoIWZpZWxkcykge1xuICAgICAgcmV0dXJuIHsgZmllbGRzU3RyaW5nLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIHN0cmluZ1xuICAgIGlmICh0eXBlb2YgZmllbGRzID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKGFsbG93ZWQgJiYgIWFsbG93ZWQuZmllbGRzW2ZpZWxkc10pIHtcbiAgICAgICAgcmV0dXJuIHsgZmllbGRzU3RyaW5nLCBzY2hlbWFGaWVsZHMsIHVzZWRGaWVsZHMgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZpZWxkc1N0cmluZzogJ1xcbicgKyAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgKyBmaWVsZHMsIHNjaGVtYUZpZWxkcywgdXNlZEZpZWxkcyB9O1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpZWxkcykpIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBmaWVsZHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGZpZWxkc1N0cmluZyA9XG4gICAgICAgICAgICBmaWVsZHNTdHJpbmcgK1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlRmllbGRzKGl0ZW0sIHtcbiAgICAgICAgICAgICAgYWxsb3dlZCwgLy8gaXRlbSBpcyBvYmplY3Qgb3IgYXJyYXlcbiAgICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgICBzcGFjZXMsXG4gICAgICAgICAgICAgIHNjaGVtYUZpZWxkcyxcbiAgICAgICAgICAgICAgdGFiOiB0YWIgKyAxLFxuICAgICAgICAgICAgICB1c2VkRmllbGRzLFxuICAgICAgICAgICAgfSkuZmllbGRzU3RyaW5nO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gcGFyZW50ICsgaXRlbTtcbiAgICAgICAgc2NoZW1hRmllbGRzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgICBpZiAoYWxsb3dlZCAmJiAhYWxsb3dlZC5maWVsZHNbaXRlbV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB1c2VkRmllbGRzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgICBmaWVsZHNTdHJpbmcgPVxuICAgICAgICAgIGZpZWxkc1N0cmluZyArXG4gICAgICAgICAgdGhpcy5wcmVwYXJlRmllbGRzKGl0ZW0sIHtcbiAgICAgICAgICAgIGFsbG93ZWQ6IG51bGwsIC8vIGl0ZW0gaXMgc3RyaW5nXG4gICAgICAgICAgICBwYXJlbnQ6IGN1cnJlbnRQYXRoICsgJy4nLFxuICAgICAgICAgICAgc3BhY2VzLFxuICAgICAgICAgICAgc2NoZW1hRmllbGRzLFxuICAgICAgICAgICAgdGFiOiB0YWIgKyAxLFxuICAgICAgICAgICAgdXNlZEZpZWxkcyxcbiAgICAgICAgICB9KS5maWVsZHNTdHJpbmc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzcyBvYmplY3RcbiAgICBlbHNlIGlmICh0eXBlb2YgZmllbGRzID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKGZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSBwYXJlbnQgKyBrZXk7XG4gICAgICAgIHNjaGVtYUZpZWxkcy5wdXNoKGN1cnJlbnRQYXRoKTtcbiAgICAgICAgaWYgKGFsbG93ZWQgJiYgIWFsbG93ZWQuZmllbGRzW2tleV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB1c2VkRmllbGRzLnB1c2goY3VycmVudFBhdGgpO1xuICAgICAgICBpZiAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgfHwgIU9iamVjdC5rZXlzKHZhbCkubGVuZ3RoKSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID0gZmllbGRzU3RyaW5nICsgJ1xcbicgKyAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgKyBrZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmllbGRzU3RyaW5nID1cbiAgICAgICAgICAgIGZpZWxkc1N0cmluZyArXG4gICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAnICcucmVwZWF0KHNwYWNlcykucmVwZWF0KHRhYikgK1xuICAgICAgICAgICAga2V5ICtcbiAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAneycgK1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlRmllbGRzKHZhbCwge1xuICAgICAgICAgICAgICBhbGxvd2VkOiBhbGxvd2VkLmZpZWxkc1trZXldLCAvLyB2YWwgaXMgb2JqZWN0IG9yIGFycmF5XG4gICAgICAgICAgICAgIHBhcmVudDogY3VycmVudFBhdGggKyAnLicsXG4gICAgICAgICAgICAgIHNwYWNlcyxcbiAgICAgICAgICAgICAgc2NoZW1hRmllbGRzLFxuICAgICAgICAgICAgICB0YWI6IHRhYiArIDEsXG4gICAgICAgICAgICAgIHVzZWRGaWVsZHMsXG4gICAgICAgICAgICB9KS5maWVsZHNTdHJpbmcgK1xuICAgICAgICAgICAgJ1xcbicgK1xuICAgICAgICAgICAgJyAnLnJlcGVhdChzcGFjZXMpLnJlcGVhdCh0YWIpICtcbiAgICAgICAgICAgICd9JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiByZXN1bHRcbiAgICByZXR1cm4geyBmaWVsZHNTdHJpbmcsIHNjaGVtYUZpZWxkcywgdXNlZEZpZWxkcyB9O1xuICB9XG59XG4iXX0=
|