@decaf-ts/for-nest 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/for-nest.cjs +2 -646
- package/dist/for-nest.cjs.map +1 -0
- package/dist/for-nest.js +2 -0
- package/dist/for-nest.js.map +1 -0
- package/lib/RepoFactory.cjs +1 -1
- package/lib/RepoFactory.js.map +1 -0
- package/lib/cli-module.cjs +1 -1
- package/lib/cli-module.d.ts +1 -29
- package/lib/cli-module.js.map +1 -0
- package/lib/constants.cjs +1 -1
- package/lib/constants.js.map +1 -0
- package/lib/core-module.cjs +1 -1
- package/lib/core-module.js.map +1 -0
- package/lib/decoration.cjs +1 -1
- package/lib/decoration.js.map +1 -0
- package/lib/decorators/ApiProperty.cjs +1 -1
- package/lib/decorators/ApiProperty.js.map +1 -0
- package/lib/decorators/helpers.cjs +1 -1
- package/lib/decorators/helpers.js.map +1 -0
- package/lib/decorators/index.cjs +1 -1
- package/lib/decorators/index.js.map +1 -0
- package/lib/decorators.cjs +32 -0
- package/lib/decorators.d.ts +8 -0
- package/lib/decorators.js.map +1 -0
- package/lib/esm/RepoFactory.js +1 -1
- package/lib/esm/RepoFactory.js.map +1 -0
- package/lib/esm/cli-module.d.ts +1 -29
- package/lib/esm/cli-module.js +1 -1
- package/lib/esm/cli-module.js.map +1 -0
- package/lib/esm/constants.js +1 -1
- package/lib/esm/constants.js.map +1 -0
- package/lib/esm/core-module.js +1 -1
- package/lib/esm/core-module.js.map +1 -0
- package/lib/esm/decoration.js +1 -1
- package/lib/esm/decoration.js.map +1 -0
- package/lib/esm/decorators/ApiProperty.js +1 -1
- package/lib/esm/decorators/ApiProperty.js.map +1 -0
- package/lib/esm/decorators/helpers.js +1 -1
- package/lib/esm/decorators/helpers.js.map +1 -0
- package/lib/esm/decorators/index.js +1 -1
- package/lib/esm/decorators/index.js.map +1 -0
- package/lib/esm/decorators.d.ts +8 -0
- package/lib/esm/decorators.js +29 -0
- package/lib/esm/decorators.js.map +1 -0
- package/lib/esm/factory/NestBootstraper.d.ts +213 -0
- package/lib/esm/factory/NestBootstraper.js +269 -0
- package/lib/esm/factory/NestBootstraper.js.map +1 -0
- package/lib/esm/factory/errors/cors.d.ts +4 -0
- package/lib/esm/factory/errors/cors.js +7 -0
- package/lib/esm/factory/errors/cors.js.map +1 -0
- package/lib/esm/factory/errors/index.d.ts +1 -0
- package/lib/esm/factory/errors/index.js +2 -0
- package/lib/esm/factory/errors/index.js.map +1 -0
- package/lib/esm/factory/exceptions/AuthorizationExceptionFilter.d.ts +9 -0
- package/lib/esm/factory/exceptions/AuthorizationExceptionFilter.js +35 -0
- package/lib/esm/factory/exceptions/AuthorizationExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/ConflictExceptionFilter.d.ts +9 -0
- package/lib/esm/factory/exceptions/ConflictExceptionFilter.js +35 -0
- package/lib/esm/factory/exceptions/ConflictExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/GlobalExceptionFilter.d.ts +4 -0
- package/lib/esm/factory/exceptions/GlobalExceptionFilter.js +39 -0
- package/lib/esm/factory/exceptions/GlobalExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/HttpExceptionFilter.d.ts +4 -0
- package/lib/esm/factory/exceptions/HttpExceptionFilter.js +27 -0
- package/lib/esm/factory/exceptions/HttpExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/HttpResponseError.d.ts +13 -0
- package/lib/esm/factory/exceptions/HttpResponseError.js +21 -0
- package/lib/esm/factory/exceptions/HttpResponseError.js.map +1 -0
- package/lib/esm/factory/exceptions/NotFoundExceptionFilter.d.ts +9 -0
- package/lib/esm/factory/exceptions/NotFoundExceptionFilter.js +35 -0
- package/lib/esm/factory/exceptions/NotFoundExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/ValidationExceptionFilter.d.ts +9 -0
- package/lib/esm/factory/exceptions/ValidationExceptionFilter.js +35 -0
- package/lib/esm/factory/exceptions/ValidationExceptionFilter.js.map +1 -0
- package/lib/esm/factory/exceptions/index.d.ts +7 -0
- package/lib/esm/factory/exceptions/index.js +8 -0
- package/lib/esm/factory/exceptions/index.js.map +1 -0
- package/lib/esm/factory/index.d.ts +4 -0
- package/lib/esm/factory/index.js +5 -0
- package/lib/esm/factory/index.js.map +1 -0
- package/lib/esm/factory/openapi/SwaggerBuilder.d.ts +9 -0
- package/lib/esm/factory/openapi/SwaggerBuilder.js +42 -0
- package/lib/esm/factory/openapi/SwaggerBuilder.js.map +1 -0
- package/lib/esm/factory/openapi/SwaggerCustomUI.d.ts +24 -0
- package/lib/esm/factory/openapi/SwaggerCustomUI.js +55 -0
- package/lib/esm/factory/openapi/SwaggerCustomUI.js.map +1 -0
- package/lib/esm/factory/openapi/constants.d.ts +16 -0
- package/lib/esm/factory/openapi/constants.js +19 -0
- package/lib/esm/factory/openapi/constants.js.map +1 -0
- package/lib/esm/factory/openapi/index.d.ts +1 -0
- package/lib/esm/factory/openapi/index.js +2 -0
- package/lib/esm/factory/openapi/index.js.map +1 -0
- package/lib/esm/index.d.ts +2 -1
- package/lib/esm/index.js +4 -3
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/model-module.js +37 -6
- package/lib/esm/model-module.js.map +1 -0
- package/lib/esm/module.js +1 -1
- package/lib/esm/module.js.map +1 -0
- package/lib/esm/types.js +1 -1
- package/lib/esm/types.js.map +1 -0
- package/lib/esm/utils.js +1 -1
- package/lib/esm/utils.js.map +1 -0
- package/lib/factory/NestBootstraper.cjs +273 -0
- package/lib/factory/NestBootstraper.d.ts +213 -0
- package/lib/factory/NestBootstraper.js.map +1 -0
- package/lib/factory/errors/cors.cjs +11 -0
- package/lib/factory/errors/cors.d.ts +4 -0
- package/lib/factory/errors/cors.js.map +1 -0
- package/lib/factory/errors/index.cjs +18 -0
- package/lib/factory/errors/index.d.ts +1 -0
- package/lib/factory/errors/index.js.map +1 -0
- package/lib/factory/exceptions/AuthorizationExceptionFilter.cjs +39 -0
- package/lib/factory/exceptions/AuthorizationExceptionFilter.d.ts +9 -0
- package/lib/factory/exceptions/AuthorizationExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/ConflictExceptionFilter.cjs +39 -0
- package/lib/factory/exceptions/ConflictExceptionFilter.d.ts +9 -0
- package/lib/factory/exceptions/ConflictExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/GlobalExceptionFilter.cjs +42 -0
- package/lib/factory/exceptions/GlobalExceptionFilter.d.ts +4 -0
- package/lib/factory/exceptions/GlobalExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/HttpExceptionFilter.cjs +30 -0
- package/lib/factory/exceptions/HttpExceptionFilter.d.ts +4 -0
- package/lib/factory/exceptions/HttpExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/HttpResponseError.cjs +25 -0
- package/lib/factory/exceptions/HttpResponseError.d.ts +13 -0
- package/lib/factory/exceptions/HttpResponseError.js.map +1 -0
- package/lib/factory/exceptions/NotFoundExceptionFilter.cjs +39 -0
- package/lib/factory/exceptions/NotFoundExceptionFilter.d.ts +9 -0
- package/lib/factory/exceptions/NotFoundExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/ValidationExceptionFilter.cjs +39 -0
- package/lib/factory/exceptions/ValidationExceptionFilter.d.ts +9 -0
- package/lib/factory/exceptions/ValidationExceptionFilter.js.map +1 -0
- package/lib/factory/exceptions/index.cjs +24 -0
- package/lib/factory/exceptions/index.d.ts +7 -0
- package/lib/factory/exceptions/index.js.map +1 -0
- package/lib/factory/index.cjs +21 -0
- package/lib/factory/index.d.ts +4 -0
- package/lib/factory/index.js.map +1 -0
- package/lib/factory/openapi/SwaggerBuilder.cjs +46 -0
- package/lib/factory/openapi/SwaggerBuilder.d.ts +9 -0
- package/lib/factory/openapi/SwaggerBuilder.js.map +1 -0
- package/lib/factory/openapi/SwaggerCustomUI.cjs +92 -0
- package/lib/factory/openapi/SwaggerCustomUI.d.ts +24 -0
- package/lib/factory/openapi/SwaggerCustomUI.js.map +1 -0
- package/lib/factory/openapi/constants.cjs +22 -0
- package/lib/factory/openapi/constants.d.ts +16 -0
- package/lib/factory/openapi/constants.js.map +1 -0
- package/lib/factory/openapi/index.cjs +18 -0
- package/lib/factory/openapi/index.d.ts +1 -0
- package/lib/factory/openapi/index.js.map +1 -0
- package/lib/index.cjs +4 -3
- package/lib/index.d.ts +2 -1
- package/lib/index.js.map +1 -0
- package/lib/model-module.cjs +36 -5
- package/lib/model-module.js.map +1 -0
- package/lib/module.cjs +1 -1
- package/lib/module.js.map +1 -0
- package/lib/types.cjs +1 -1
- package/lib/types.js.map +1 -0
- package/lib/utils.cjs +1 -1
- package/lib/utils.js.map +1 -0
- package/package.json +8 -49
- package/dist/for-nest.esm.cjs +0 -642
package/dist/for-nest.cjs
CHANGED
|
@@ -1,646 +1,2 @@
|
|
|
1
|
-
(function (global, factory) {
|
|
2
|
-
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/decoration', '@decaf-ts/injectable-decorators', '@nestjs/common', '@decaf-ts/decorator-validation', '@nestjs/swagger/dist/decorators/helpers', '@nestjs/swagger/dist/utils/enum.utils', '@nestjs/swagger/dist/constants', '@nestjs/common/constants', '@nestjs/common/utils/shared.utils', 'lodash', '@nestjs/swagger/dist/plugin/plugin-constants', '@decaf-ts/core', 'tslib', '@nestjs/core', '@decaf-ts/logging', '@nestjs/swagger', '@decaf-ts/db-decorators'], factory) :
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-nest"] = {}, global.decoration, global.injectableDecorators, global.common, global.decoratorValidation, global.helpers, global.enum_utils, global.constants, global.constants$1, global.shared_utils, global.lodash, global.pluginConstants, global.core, global.tslib, global.core$1, global.logging, global.swagger, global.dbDecorators));
|
|
5
|
-
})(this, (function (exports, decoration, injectableDecorators, common, decoratorValidation, helpers, enum_utils, constants, constants$1, shared_utils, lodash, pluginConstants, core, tslib, core$1, logging, swagger, dbDecorators) { 'use strict';
|
|
6
|
-
|
|
7
|
-
/* eslint-disable @typescript-eslint/no-unsafe-function-type */
|
|
8
|
-
function createMethodDecorator(metakey, metadata, { overrideExisting } = { overrideExisting: true }) {
|
|
9
|
-
return (target, key, descriptor) => {
|
|
10
|
-
if (typeof metadata === "object") {
|
|
11
|
-
const prevValue = Reflect.getMetadata(metakey, descriptor.value);
|
|
12
|
-
if (prevValue && !overrideExisting) {
|
|
13
|
-
return descriptor;
|
|
14
|
-
}
|
|
15
|
-
Reflect.defineMetadata(metakey, { ...prevValue, ...metadata }, descriptor.value);
|
|
16
|
-
return descriptor;
|
|
17
|
-
}
|
|
18
|
-
Reflect.defineMetadata(metakey, metadata, descriptor.value);
|
|
19
|
-
return descriptor;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function createClassDecorator(metakey, metadata = []) {
|
|
23
|
-
return (target) => {
|
|
24
|
-
const prevValue = Reflect.getMetadata(metakey, target) || [];
|
|
25
|
-
Reflect.defineMetadata(metakey, [...prevValue, ...metadata], target);
|
|
26
|
-
return target;
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function createPropertyDecorator(metakey, metadata, overrideExisting = true) {
|
|
30
|
-
return (target, propertyKey) => {
|
|
31
|
-
const properties = Reflect.getMetadata(constants.DECORATORS.API_MODEL_PROPERTIES_ARRAY, target) || [];
|
|
32
|
-
const key = `:${propertyKey}`;
|
|
33
|
-
if (!properties.includes(key)) {
|
|
34
|
-
Reflect.defineMetadata(constants.DECORATORS.API_MODEL_PROPERTIES_ARRAY, [...properties, `:${propertyKey}`], target);
|
|
35
|
-
}
|
|
36
|
-
const existingMetadata = Reflect.getMetadata(metakey, target, propertyKey);
|
|
37
|
-
if (existingMetadata) {
|
|
38
|
-
const newMetadata = lodash.pickBy(metadata, lodash.negate(lodash.isUndefined));
|
|
39
|
-
const metadataToSave = overrideExisting
|
|
40
|
-
? {
|
|
41
|
-
...existingMetadata,
|
|
42
|
-
...newMetadata,
|
|
43
|
-
}
|
|
44
|
-
: {
|
|
45
|
-
...newMetadata,
|
|
46
|
-
...existingMetadata,
|
|
47
|
-
};
|
|
48
|
-
Reflect.defineMetadata(metakey, metadataToSave, target, propertyKey);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
const type =
|
|
52
|
-
// @ts-expect-error nest js override
|
|
53
|
-
target?.constructor?.[pluginConstants.METADATA_FACTORY_NAME]?.()[propertyKey]?.type ??
|
|
54
|
-
Reflect.getMetadata("design:type", target, propertyKey);
|
|
55
|
-
Reflect.defineMetadata(metakey, {
|
|
56
|
-
type,
|
|
57
|
-
...lodash.pickBy(metadata, lodash.negate(lodash.isUndefined)),
|
|
58
|
-
}, target, propertyKey);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function createMixedDecorator(metakey, metadata) {
|
|
63
|
-
return (target, key, descriptor) => {
|
|
64
|
-
if (descriptor) {
|
|
65
|
-
let metadatas;
|
|
66
|
-
if (Array.isArray(metadata)) {
|
|
67
|
-
const previousMetadata = Reflect.getMetadata(metakey, descriptor.value) || [];
|
|
68
|
-
metadatas = [...previousMetadata, ...metadata];
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
const previousMetadata = Reflect.getMetadata(metakey, descriptor.value) || {};
|
|
72
|
-
metadatas = { ...previousMetadata, ...metadata };
|
|
73
|
-
}
|
|
74
|
-
Reflect.defineMetadata(metakey, metadatas, descriptor.value);
|
|
75
|
-
return descriptor;
|
|
76
|
-
}
|
|
77
|
-
let metadatas;
|
|
78
|
-
if (Array.isArray(metadata)) {
|
|
79
|
-
const previousMetadata = Reflect.getMetadata(metakey, target) || [];
|
|
80
|
-
metadatas = [...previousMetadata, ...metadata];
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
const previousMetadata = Reflect.getMetadata(metakey, target) || {};
|
|
84
|
-
metadatas = Object.assign(Object.assign({}, previousMetadata), metadata);
|
|
85
|
-
}
|
|
86
|
-
Reflect.defineMetadata(metakey, metadatas, target);
|
|
87
|
-
return target;
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
function createParamDecorator(metadata, initial) {
|
|
91
|
-
return (target, key, descriptor) => {
|
|
92
|
-
const paramOptions = {
|
|
93
|
-
...initial,
|
|
94
|
-
...lodash.pickBy(metadata, lodash.negate(lodash.isUndefined)),
|
|
95
|
-
};
|
|
96
|
-
if (descriptor) {
|
|
97
|
-
const parameters = Reflect.getMetadata(constants.DECORATORS.API_PARAMETERS, descriptor.value) || [];
|
|
98
|
-
Reflect.defineMetadata(constants.DECORATORS.API_PARAMETERS, [...parameters, paramOptions], descriptor.value);
|
|
99
|
-
return descriptor;
|
|
100
|
-
}
|
|
101
|
-
if (typeof target === "object") {
|
|
102
|
-
return target;
|
|
103
|
-
}
|
|
104
|
-
const propertyKeys = Object.getOwnPropertyNames(target.prototype);
|
|
105
|
-
for (const propertyKey of propertyKeys) {
|
|
106
|
-
if (shared_utils.isConstructor(propertyKey)) {
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
const methodDescriptor = Object.getOwnPropertyDescriptor(target.prototype, propertyKey);
|
|
110
|
-
if (!methodDescriptor) {
|
|
111
|
-
continue;
|
|
112
|
-
}
|
|
113
|
-
const isApiMethod = Reflect.hasMetadata(constants$1.METHOD_METADATA, methodDescriptor.value);
|
|
114
|
-
if (!isApiMethod) {
|
|
115
|
-
continue;
|
|
116
|
-
}
|
|
117
|
-
const parameters = Reflect.getMetadata(constants.DECORATORS.API_PARAMETERS, methodDescriptor.value) || [];
|
|
118
|
-
Reflect.defineMetadata(constants.DECORATORS.API_PARAMETERS, [...parameters, paramOptions], methodDescriptor.value);
|
|
119
|
-
}
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
function getTypeIsArrayTuple(input, isArrayFlag) {
|
|
123
|
-
if (!input) {
|
|
124
|
-
return [input, isArrayFlag];
|
|
125
|
-
}
|
|
126
|
-
if (isArrayFlag) {
|
|
127
|
-
return [input, isArrayFlag];
|
|
128
|
-
}
|
|
129
|
-
const isInputArray = lodash.isArray(input);
|
|
130
|
-
const type = isInputArray ? input[0] : input;
|
|
131
|
-
return [type, isInputArray];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const isEnumArray = (opts) => (opts.isArray && "enum" in opts && opts.enum !== undefined);
|
|
135
|
-
/**
|
|
136
|
-
* @publicApi
|
|
137
|
-
*/
|
|
138
|
-
function ApiProperty(options = {}) {
|
|
139
|
-
return createApiPropertyDecorator(options);
|
|
140
|
-
}
|
|
141
|
-
function createApiPropertyDecorator(options = {}, overrideExisting = true) {
|
|
142
|
-
const [type, isArray] = helpers.getTypeIsArrayTuple(options.type, options.isArray);
|
|
143
|
-
options = {
|
|
144
|
-
...options,
|
|
145
|
-
type,
|
|
146
|
-
isArray,
|
|
147
|
-
};
|
|
148
|
-
if (isEnumArray(options)) {
|
|
149
|
-
options.type = "array";
|
|
150
|
-
const enumValues = enum_utils.getEnumValues(options.enum);
|
|
151
|
-
options.items = {
|
|
152
|
-
type: enum_utils.getEnumType(enumValues),
|
|
153
|
-
enum: enumValues,
|
|
154
|
-
};
|
|
155
|
-
// @ts-expect-error nest swagger override
|
|
156
|
-
delete options.enum;
|
|
157
|
-
}
|
|
158
|
-
else if ("enum" in options && options.enum !== undefined) {
|
|
159
|
-
const enumValues = enum_utils.getEnumValues(options.enum);
|
|
160
|
-
options.enum = enumValues;
|
|
161
|
-
options.type = enum_utils.getEnumType(enumValues);
|
|
162
|
-
}
|
|
163
|
-
if (Array.isArray(options.type)) {
|
|
164
|
-
options.type = "array";
|
|
165
|
-
options.items = {
|
|
166
|
-
type: "array",
|
|
167
|
-
items: {
|
|
168
|
-
type: options.type[0],
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
return createPropertyDecorator(constants.DECORATORS.API_MODEL_PROPERTIES, options, overrideExisting);
|
|
173
|
-
}
|
|
174
|
-
function ApiPropertyOptional(options = {}) {
|
|
175
|
-
return ApiProperty({
|
|
176
|
-
...options,
|
|
177
|
-
required: false,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
function ApiResponseProperty(options = {}) {
|
|
181
|
-
return ApiProperty({
|
|
182
|
-
readOnly: true,
|
|
183
|
-
...options,
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
decoration.Decoration.for(injectableDecorators.InjectablesKeys.INJECTABLE)
|
|
188
|
-
.extend({
|
|
189
|
-
decorator: function nestInjectable(category, cfg) {
|
|
190
|
-
return common.Injectable({
|
|
191
|
-
scope: cfg.singleton ? common.Scope.DEFAULT : common.Scope.REQUEST,
|
|
192
|
-
durable: cfg.singleton ? undefined : true,
|
|
193
|
-
});
|
|
194
|
-
},
|
|
195
|
-
})
|
|
196
|
-
.apply();
|
|
197
|
-
decoration.Decoration.for(injectableDecorators.InjectablesKeys.INJECT)
|
|
198
|
-
.extend({
|
|
199
|
-
decorator: function nestInject(category,
|
|
200
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
201
|
-
cfg) {
|
|
202
|
-
return function innerNestInject(target, propertyKey, descriptor) {
|
|
203
|
-
return common.Inject(category || target)(target, propertyKey, descriptor);
|
|
204
|
-
};
|
|
205
|
-
},
|
|
206
|
-
})
|
|
207
|
-
.apply();
|
|
208
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.REQUIRED)
|
|
209
|
-
.extend(ApiProperty({
|
|
210
|
-
required: true,
|
|
211
|
-
}))
|
|
212
|
-
.apply();
|
|
213
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.MAX)
|
|
214
|
-
.extend({
|
|
215
|
-
decorator: function maxDec(max) {
|
|
216
|
-
return ApiProperty({ maximum: max });
|
|
217
|
-
},
|
|
218
|
-
})
|
|
219
|
-
.apply();
|
|
220
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.MIN)
|
|
221
|
-
.extend({
|
|
222
|
-
decorator: function minDec(min) {
|
|
223
|
-
return ApiProperty({ minimum: min });
|
|
224
|
-
},
|
|
225
|
-
})
|
|
226
|
-
.apply();
|
|
227
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.MAX_LENGTH)
|
|
228
|
-
.extend({
|
|
229
|
-
decorator: function maxLengthDec(max) {
|
|
230
|
-
return ApiProperty({ maxLength: max });
|
|
231
|
-
},
|
|
232
|
-
})
|
|
233
|
-
.apply();
|
|
234
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.MIN_LENGTH)
|
|
235
|
-
.extend({
|
|
236
|
-
decorator: function minLengthDec(min) {
|
|
237
|
-
return ApiProperty({ minLength: min });
|
|
238
|
-
},
|
|
239
|
-
})
|
|
240
|
-
.apply();
|
|
241
|
-
//
|
|
242
|
-
// Decoration.for(ValidationKeys.TYPE)
|
|
243
|
-
// .extend({
|
|
244
|
-
// decorator: function typeDec(type: (string | (() => string))[] | string | (() => string)) {
|
|
245
|
-
// return ApiProperty({ type: type as any });
|
|
246
|
-
// },
|
|
247
|
-
// })
|
|
248
|
-
// .apply();
|
|
249
|
-
//
|
|
250
|
-
// Decoration.for(ValidationKeys.DATE)
|
|
251
|
-
// .extend({
|
|
252
|
-
// decorator: function dateDec() {
|
|
253
|
-
// return ApiProperty({ type: Date });
|
|
254
|
-
// },
|
|
255
|
-
// })
|
|
256
|
-
// .apply();
|
|
257
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.LIST)
|
|
258
|
-
.extend({
|
|
259
|
-
decorator: function listDec(clazz) {
|
|
260
|
-
const c = Array.isArray(clazz) ? clazz[0] : clazz;
|
|
261
|
-
return ApiProperty({ type: [c] });
|
|
262
|
-
},
|
|
263
|
-
})
|
|
264
|
-
.apply();
|
|
265
|
-
//
|
|
266
|
-
// Decoration.for(ValidationKeys.OPTION)
|
|
267
|
-
// .extend({
|
|
268
|
-
// decorator: function optionDec(options: string[] | Record<string, any>) {
|
|
269
|
-
// const opts = Array.isArray(options) ? options : Object.values(options);
|
|
270
|
-
// return ApiProperty({ enum: opts });
|
|
271
|
-
// },
|
|
272
|
-
// })
|
|
273
|
-
// .apply();
|
|
274
|
-
decoration.Decoration.for(decoratorValidation.ValidationKeys.PATTERN)
|
|
275
|
-
.extend({
|
|
276
|
-
decorator: function patternDec(pat) {
|
|
277
|
-
return ApiProperty({
|
|
278
|
-
pattern: typeof pat === "string" ? pat : pat.source,
|
|
279
|
-
});
|
|
280
|
-
},
|
|
281
|
-
})
|
|
282
|
-
.apply();
|
|
283
|
-
decoration.Decoration.for(core.PersistenceKeys.COLUMN)
|
|
284
|
-
.extend({
|
|
285
|
-
decorator: function columnDec(name) {
|
|
286
|
-
return ApiProperty({
|
|
287
|
-
name: name,
|
|
288
|
-
});
|
|
289
|
-
},
|
|
290
|
-
})
|
|
291
|
-
.apply();
|
|
292
|
-
decoration.Decoration.for(decoration.DecorationKeys.DESCRIPTION)
|
|
293
|
-
.extend({
|
|
294
|
-
decorator: function descriptionDec(description) {
|
|
295
|
-
return ApiProperty({
|
|
296
|
-
description: description,
|
|
297
|
-
});
|
|
298
|
-
},
|
|
299
|
-
})
|
|
300
|
-
.apply();
|
|
301
|
-
|
|
302
|
-
const DECAF_MODULE_OPTIONS = "DecafModuleOptions";
|
|
303
|
-
const DECAF_ADAPTER_ID = "DecafAdapter";
|
|
304
|
-
|
|
305
|
-
var DecafCoreModule_1;
|
|
306
|
-
let DecafCoreModule = class DecafCoreModule {
|
|
307
|
-
static { DecafCoreModule_1 = this; }
|
|
308
|
-
static { this._adapterInstance = null; }
|
|
309
|
-
static get log() {
|
|
310
|
-
if (!this._logger)
|
|
311
|
-
this._logger = logging.Logging.for(DecafCoreModule_1);
|
|
312
|
-
return this._logger;
|
|
313
|
-
}
|
|
314
|
-
constructor(options, moduleRef) {
|
|
315
|
-
this.options = options;
|
|
316
|
-
this.moduleRef = moduleRef;
|
|
317
|
-
}
|
|
318
|
-
static async createAdapter(options) {
|
|
319
|
-
if (!this._adapterInstance) {
|
|
320
|
-
const log = this.log.for(this.createAdapter);
|
|
321
|
-
log.info("Creating adapter instance...");
|
|
322
|
-
this._adapterInstance = new options.adapter(options.conf, options.alias);
|
|
323
|
-
log.info("Adapter instance created successfully!");
|
|
324
|
-
}
|
|
325
|
-
return this._adapterInstance;
|
|
326
|
-
}
|
|
327
|
-
static getAdapterInstance() {
|
|
328
|
-
return this._adapterInstance;
|
|
329
|
-
}
|
|
330
|
-
static forRoot(options) {
|
|
331
|
-
const typeOrmModuleOptions = {
|
|
332
|
-
provide: DECAF_MODULE_OPTIONS,
|
|
333
|
-
useValue: options,
|
|
334
|
-
};
|
|
335
|
-
const adapter = {
|
|
336
|
-
useFactory: async (opts) => {
|
|
337
|
-
return DecafCoreModule_1.createAdapter(opts);
|
|
338
|
-
},
|
|
339
|
-
provide: DECAF_ADAPTER_ID,
|
|
340
|
-
durable: true,
|
|
341
|
-
scope: common.Scope.DEFAULT,
|
|
342
|
-
inject: [DECAF_MODULE_OPTIONS],
|
|
343
|
-
};
|
|
344
|
-
const providers = [adapter, typeOrmModuleOptions];
|
|
345
|
-
const exports = [adapter];
|
|
346
|
-
return {
|
|
347
|
-
module: DecafCoreModule_1,
|
|
348
|
-
providers,
|
|
349
|
-
exports,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
async onApplicationShutdown() {
|
|
353
|
-
const log = DecafCoreModule_1.log.for(this.onApplicationShutdown);
|
|
354
|
-
const adapter = this.moduleRef.get(DECAF_ADAPTER_ID);
|
|
355
|
-
try {
|
|
356
|
-
if (adapter) {
|
|
357
|
-
log.info("Shutting down");
|
|
358
|
-
await adapter.shutdown();
|
|
359
|
-
DecafCoreModule_1._adapterInstance = null;
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
catch (e) {
|
|
363
|
-
log.error(`Failed to shutdown application`, e);
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
};
|
|
367
|
-
DecafCoreModule = DecafCoreModule_1 = tslib.__decorate([
|
|
368
|
-
common.Global(),
|
|
369
|
-
common.Module({}),
|
|
370
|
-
tslib.__param(0, common.Inject(DECAF_MODULE_OPTIONS)),
|
|
371
|
-
tslib.__metadata("design:paramtypes", [Object, core$1.ModuleRef])
|
|
372
|
-
], DecafCoreModule);
|
|
373
|
-
|
|
374
|
-
exports.RepoFactory = class RepoFactory {
|
|
375
|
-
for(model) {
|
|
376
|
-
model = typeof model === "string" ? decoratorValidation.Model.get(model) : model;
|
|
377
|
-
if (!model) {
|
|
378
|
-
throw new dbDecorators.InternalError(`Failed to find repository for ${model}`);
|
|
379
|
-
}
|
|
380
|
-
return core.Repository.forModel(model);
|
|
381
|
-
}
|
|
382
|
-
};
|
|
383
|
-
exports.RepoFactory = tslib.__decorate([
|
|
384
|
-
common.Injectable()
|
|
385
|
-
], exports.RepoFactory);
|
|
386
|
-
|
|
387
|
-
var DecafModelModule_1;
|
|
388
|
-
let DecafModelModule = class DecafModelModule {
|
|
389
|
-
static { DecafModelModule_1 = this; }
|
|
390
|
-
static get log() {
|
|
391
|
-
if (!this._logger)
|
|
392
|
-
this._logger = logging.Logging.for(DecafModelModule_1);
|
|
393
|
-
return this._logger;
|
|
394
|
-
}
|
|
395
|
-
static toModelController(ModelClazz) {
|
|
396
|
-
const log = this.log.for(this.toModelController);
|
|
397
|
-
const tableName = core.Repository.table(ModelClazz);
|
|
398
|
-
const routePath = logging.toKebabCase(tableName);
|
|
399
|
-
const modelClazzName = ModelClazz.name;
|
|
400
|
-
log.debug(`Creating controller for model: ${modelClazzName}`);
|
|
401
|
-
let DynamicModelController = class DynamicModelController extends logging.LoggedClass {
|
|
402
|
-
constructor(repoFactory) {
|
|
403
|
-
super();
|
|
404
|
-
this.repoFactory = repoFactory;
|
|
405
|
-
log.info(`Registering dynamic controller for model: ${modelClazzName} route: /${routePath}`);
|
|
406
|
-
try {
|
|
407
|
-
this.repo = this.repoFactory.for(ModelClazz.name);
|
|
408
|
-
this.pk = this.repo.pk;
|
|
409
|
-
}
|
|
410
|
-
catch (e) {
|
|
411
|
-
this.log.error(`Failed to initialize repository for model "${ModelClazz.name}".`, e);
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
async create(data) {
|
|
415
|
-
const log = this.log.for(this.create);
|
|
416
|
-
log.verbose(`creating new ${modelClazzName}`);
|
|
417
|
-
let created;
|
|
418
|
-
try {
|
|
419
|
-
created = await this.repo.create(data);
|
|
420
|
-
}
|
|
421
|
-
catch (e) {
|
|
422
|
-
log.error(`Failed to create new ${modelClazzName}`, e);
|
|
423
|
-
throw e;
|
|
424
|
-
}
|
|
425
|
-
log.info(`created new ${modelClazzName} with id ${created[this.pk]}`);
|
|
426
|
-
return created;
|
|
427
|
-
}
|
|
428
|
-
async read(id) {
|
|
429
|
-
const log = this.log.for(this.read);
|
|
430
|
-
let read;
|
|
431
|
-
try {
|
|
432
|
-
log.debug(`reading ${modelClazzName} with ${this.pk} ${id}`);
|
|
433
|
-
read = await this.repo.read(id);
|
|
434
|
-
}
|
|
435
|
-
catch (e) {
|
|
436
|
-
log.error(`Failed to read ${modelClazzName} with id ${id}`, e);
|
|
437
|
-
throw e;
|
|
438
|
-
}
|
|
439
|
-
log.info(`read ${modelClazzName} with id ${read[this.pk]}`);
|
|
440
|
-
return read;
|
|
441
|
-
}
|
|
442
|
-
async update(data) {
|
|
443
|
-
const log = this.log.for(this.update);
|
|
444
|
-
let updated;
|
|
445
|
-
try {
|
|
446
|
-
log.info(`updating ${modelClazzName} with ${this.pk} ${data[this.pk]}`);
|
|
447
|
-
updated = await this.repo.create(data);
|
|
448
|
-
}
|
|
449
|
-
catch (e) {
|
|
450
|
-
throw e;
|
|
451
|
-
}
|
|
452
|
-
return updated;
|
|
453
|
-
}
|
|
454
|
-
async delete(id) {
|
|
455
|
-
const log = this.log.for(this.delete);
|
|
456
|
-
let read;
|
|
457
|
-
try {
|
|
458
|
-
log.debug(`deleting ${modelClazzName} with ${this.pk} ${id}`);
|
|
459
|
-
read = await this.repo.read(id);
|
|
460
|
-
}
|
|
461
|
-
catch (e) {
|
|
462
|
-
log.error(`Failed to delete ${modelClazzName} with id ${id}`, e);
|
|
463
|
-
throw e;
|
|
464
|
-
}
|
|
465
|
-
log.info(`deleted ${modelClazzName} with id ${read[this.pk]}`);
|
|
466
|
-
return read;
|
|
467
|
-
}
|
|
468
|
-
};
|
|
469
|
-
tslib.__decorate([
|
|
470
|
-
common.Post(),
|
|
471
|
-
swagger.ApiOperation({ summary: `Create a new ${modelClazzName}.` }),
|
|
472
|
-
swagger.ApiBody({
|
|
473
|
-
description: `Payload for ${modelClazzName}`,
|
|
474
|
-
schema: { $ref: swagger.getSchemaPath(ModelClazz) },
|
|
475
|
-
}),
|
|
476
|
-
swagger.ApiCreatedResponse({
|
|
477
|
-
description: `${modelClazzName} created successfully.`,
|
|
478
|
-
}),
|
|
479
|
-
swagger.ApiBadRequestResponse({ description: "Payload validation failed." }),
|
|
480
|
-
swagger.ApiUnprocessableEntityResponse({
|
|
481
|
-
description: "Repository rejected the provided payload.",
|
|
482
|
-
}),
|
|
483
|
-
tslib.__param(0, common.Body()),
|
|
484
|
-
tslib.__metadata("design:type", Function),
|
|
485
|
-
tslib.__metadata("design:paramtypes", [Object]),
|
|
486
|
-
tslib.__metadata("design:returntype", Promise)
|
|
487
|
-
], DynamicModelController.prototype, "create", null);
|
|
488
|
-
tslib.__decorate([
|
|
489
|
-
common.Get(":id"),
|
|
490
|
-
swagger.ApiOperation({ summary: `Retrieve a ${modelClazzName} record by id.` }),
|
|
491
|
-
swagger.ApiParam({ name: "id", description: "Primary key" }),
|
|
492
|
-
swagger.ApiOkResponse({
|
|
493
|
-
description: `${modelClazzName} retrieved successfully.`,
|
|
494
|
-
}),
|
|
495
|
-
swagger.ApiNotFoundResponse({
|
|
496
|
-
description: `No ${modelClazzName} record matches the provided identifier.`,
|
|
497
|
-
}),
|
|
498
|
-
tslib.__param(0, common.Param("id")),
|
|
499
|
-
tslib.__metadata("design:type", Function),
|
|
500
|
-
tslib.__metadata("design:paramtypes", [String]),
|
|
501
|
-
tslib.__metadata("design:returntype", Promise)
|
|
502
|
-
], DynamicModelController.prototype, "read", null);
|
|
503
|
-
tslib.__decorate([
|
|
504
|
-
common.Put(":id"),
|
|
505
|
-
swagger.ApiOperation({
|
|
506
|
-
summary: `Replace an existing ${modelClazzName} record with a new payload.`,
|
|
507
|
-
}),
|
|
508
|
-
swagger.ApiBody({
|
|
509
|
-
description: `Payload for replace a existing record of ${modelClazzName}`,
|
|
510
|
-
schema: { $ref: swagger.getSchemaPath(ModelClazz) },
|
|
511
|
-
}),
|
|
512
|
-
swagger.ApiOkResponse({
|
|
513
|
-
description: `${ModelClazz} record replaced successfully.`,
|
|
514
|
-
}),
|
|
515
|
-
swagger.ApiNotFoundResponse({
|
|
516
|
-
description: `No ${modelClazzName} record matches the provided identifier.`,
|
|
517
|
-
}),
|
|
518
|
-
swagger.ApiBadRequestResponse({ description: "Payload validation failed." }),
|
|
519
|
-
tslib.__param(0, common.Body()),
|
|
520
|
-
tslib.__metadata("design:type", Function),
|
|
521
|
-
tslib.__metadata("design:paramtypes", [decoratorValidation.Model]),
|
|
522
|
-
tslib.__metadata("design:returntype", Promise)
|
|
523
|
-
], DynamicModelController.prototype, "update", null);
|
|
524
|
-
tslib.__decorate([
|
|
525
|
-
common.Delete(":id"),
|
|
526
|
-
swagger.ApiOperation({ summary: `Delete a ${modelClazzName} record by id.` }),
|
|
527
|
-
swagger.ApiParam({
|
|
528
|
-
name: "id",
|
|
529
|
-
description: `Primary key value of the ${modelClazzName} record to delete.`,
|
|
530
|
-
}),
|
|
531
|
-
swagger.ApiOkResponse({
|
|
532
|
-
description: `${modelClazzName} record deleted successfully.`,
|
|
533
|
-
}),
|
|
534
|
-
swagger.ApiNotFoundResponse({
|
|
535
|
-
description: `No ${modelClazzName} record matches the provided identifier.`,
|
|
536
|
-
}),
|
|
537
|
-
tslib.__param(0, common.Param("id")),
|
|
538
|
-
tslib.__metadata("design:type", Function),
|
|
539
|
-
tslib.__metadata("design:paramtypes", [String]),
|
|
540
|
-
tslib.__metadata("design:returntype", Promise)
|
|
541
|
-
], DynamicModelController.prototype, "delete", null);
|
|
542
|
-
DynamicModelController = tslib.__decorate([
|
|
543
|
-
common.Controller(routePath),
|
|
544
|
-
swagger.ApiTags(modelClazzName),
|
|
545
|
-
swagger.ApiExtraModels(ModelClazz),
|
|
546
|
-
tslib.__metadata("design:paramtypes", [exports.RepoFactory])
|
|
547
|
-
], DynamicModelController);
|
|
548
|
-
return DynamicModelController;
|
|
549
|
-
}
|
|
550
|
-
static forRoot(flavour) {
|
|
551
|
-
const log = this.log.for(this.forRoot);
|
|
552
|
-
log.info(`Generating controllers for flavour...`);
|
|
553
|
-
const trackedModels = core.Adapter.models(flavour);
|
|
554
|
-
const controllers = trackedModels.map(this.toModelController.bind(this));
|
|
555
|
-
log.info(`Generated ${controllers.length} controllers`);
|
|
556
|
-
return {
|
|
557
|
-
module: DecafModelModule_1,
|
|
558
|
-
controllers,
|
|
559
|
-
providers: [exports.RepoFactory],
|
|
560
|
-
};
|
|
561
|
-
}
|
|
562
|
-
};
|
|
563
|
-
DecafModelModule = DecafModelModule_1 = tslib.__decorate([
|
|
564
|
-
common.Module({})
|
|
565
|
-
], DecafModelModule);
|
|
566
|
-
|
|
567
|
-
var DecafModule_1;
|
|
568
|
-
/**
|
|
569
|
-
* @publicApi
|
|
570
|
-
*/
|
|
571
|
-
exports.DecafModule = DecafModule_1 = class DecafModule {
|
|
572
|
-
static async forRootAsync(options) {
|
|
573
|
-
const { autoControllers } = options;
|
|
574
|
-
const adapter = await DecafCoreModule.createAdapter(options);
|
|
575
|
-
const flavour = adapter.flavour;
|
|
576
|
-
const imports = [DecafCoreModule.forRoot(options)];
|
|
577
|
-
if (autoControllers) {
|
|
578
|
-
imports.push(DecafModelModule.forRoot(flavour));
|
|
579
|
-
}
|
|
580
|
-
return {
|
|
581
|
-
module: DecafModule_1,
|
|
582
|
-
imports: imports,
|
|
583
|
-
};
|
|
584
|
-
}
|
|
585
|
-
};
|
|
586
|
-
exports.DecafModule = DecafModule_1 = tslib.__decorate([
|
|
587
|
-
common.Module({})
|
|
588
|
-
], exports.DecafModule);
|
|
589
|
-
|
|
590
|
-
function repoForModel(model) {
|
|
591
|
-
const m = decoratorValidation.Model.get(model);
|
|
592
|
-
if (!m)
|
|
593
|
-
throw new dbDecorators.InternalError(`Failed to find repository for ${model}`);
|
|
594
|
-
const repo = core.Repository.forModel(m);
|
|
595
|
-
return repo;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
/**
|
|
599
|
-
* @module for-nest
|
|
600
|
-
* @description This module serves as the main entry point for the ts-workspace library. It aggregates and exports
|
|
601
|
-
* functionality from various submodules and utilities within the project.
|
|
602
|
-
*
|
|
603
|
-
* The module includes:
|
|
604
|
-
* 1. Utility functions and types from the "./utils" directory:
|
|
605
|
-
* - These likely contain helper functions, common types, and shared functionality used throughout the project.
|
|
606
|
-
* - May include operations for data manipulation, type checking, or other general-purpose utilities.
|
|
607
|
-
*
|
|
608
|
-
* 2. A namespace and related types from the "./namespace" directory:
|
|
609
|
-
* - This could contain domain-specific code or a collection of related functionality.
|
|
610
|
-
* - Might include interfaces, types, or classes that represent core concepts in the library.
|
|
611
|
-
*
|
|
612
|
-
* 3. A VERSION constant:
|
|
613
|
-
* - Represents the current version of the module.
|
|
614
|
-
* - Useful for version checking and compatibility purposes.
|
|
615
|
-
*
|
|
616
|
-
* This structure provides a clean and organized export of the module's functionality, allowing consumers
|
|
617
|
-
* to easily import and use specific parts of the library as needed.
|
|
618
|
-
*/
|
|
619
|
-
/**
|
|
620
|
-
* Represents the current version of the ts-workspace module.
|
|
621
|
-
* The actual version number is replaced during the build process.
|
|
622
|
-
* @constant
|
|
623
|
-
* @type {string}
|
|
624
|
-
*/
|
|
625
|
-
const VERSION = "0.0.4";
|
|
626
|
-
const PACKAGE_NAME = "##PACKAGE_NAME##";
|
|
627
|
-
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
628
|
-
|
|
629
|
-
exports.ApiProperty = ApiProperty;
|
|
630
|
-
exports.ApiPropertyOptional = ApiPropertyOptional;
|
|
631
|
-
exports.ApiResponseProperty = ApiResponseProperty;
|
|
632
|
-
exports.DECAF_ADAPTER_ID = DECAF_ADAPTER_ID;
|
|
633
|
-
exports.DECAF_MODULE_OPTIONS = DECAF_MODULE_OPTIONS;
|
|
634
|
-
exports.PACKAGE_NAME = PACKAGE_NAME;
|
|
635
|
-
exports.VERSION = VERSION;
|
|
636
|
-
exports.createApiPropertyDecorator = createApiPropertyDecorator;
|
|
637
|
-
exports.createClassDecorator = createClassDecorator;
|
|
638
|
-
exports.createMethodDecorator = createMethodDecorator;
|
|
639
|
-
exports.createMixedDecorator = createMixedDecorator;
|
|
640
|
-
exports.createParamDecorator = createParamDecorator;
|
|
641
|
-
exports.createPropertyDecorator = createPropertyDecorator;
|
|
642
|
-
exports.getTypeIsArrayTuple = getTypeIsArrayTuple;
|
|
643
|
-
exports.repoForModel = repoForModel;
|
|
644
|
-
|
|
645
|
-
}));
|
|
646
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5lc3QuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvZGVjb3JhdG9ycy9oZWxwZXJzLnRzIiwiLi4vc3JjL2RlY29yYXRvcnMvQXBpUHJvcGVydHkudHMiLCIuLi9zcmMvZGVjb3JhdGlvbi50cyIsIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvY29yZS1tb2R1bGUudHMiLCIuLi9zcmMvUmVwb0ZhY3RvcnkudHMiLCIuLi9zcmMvbW9kZWwtbW9kdWxlLnRzIiwiLi4vc3JjL21vZHVsZS50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWZ1bmN0aW9uLXR5cGUgKi9cblxuaW1wb3J0IHsgTUVUSE9EX01FVEFEQVRBIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNDb25zdHJ1Y3RvciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi91dGlscy9zaGFyZWQudXRpbHNcIjtcbmltcG9ydCB7IGlzQXJyYXksIGlzVW5kZWZpbmVkLCBuZWdhdGUsIHBpY2tCeSB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCB7IE1FVEFEQVRBX0ZBQ1RPUllfTkFNRSB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9wbHVnaW4vcGx1Z2luLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgREVDT1JBVE9SUyB9IGZyb20gXCJAbmVzdGpzL3N3YWdnZXIvZGlzdC9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZERlY29yYXRvcjxUID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCxcbiAgeyBvdmVycmlkZUV4aXN0aW5nIH0gPSB7IG92ZXJyaWRlRXhpc3Rpbmc6IHRydWUgfVxuKTogTWV0aG9kRGVjb3JhdG9yIHtcbiAgcmV0dXJuIChcbiAgICB0YXJnZXQ6IG9iamVjdCxcbiAgICBrZXk6IHN0cmluZyB8IHN5bWJvbCxcbiAgICBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBtZXRhZGF0YSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgY29uc3QgcHJldlZhbHVlID0gUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIGlmIChwcmV2VmFsdWUgJiYgIW92ZXJyaWRlRXhpc3RpbmcpIHtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgICB9XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7IC4uLnByZXZWYWx1ZSwgLi4ubWV0YWRhdGEgfSxcbiAgICAgICAgZGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIG1ldGFkYXRhLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsYXNzRGVjb3JhdG9yPFQgZXh0ZW5kcyBBcnJheTxhbnk+ID0gYW55PihcbiAgbWV0YWtleTogc3RyaW5nLFxuICBtZXRhZGF0YTogVCA9IFtdIGFzIHVua25vd24gYXMgVFxuKTogQ2xhc3NEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHByZXZWYWx1ZSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKG1ldGFrZXksIFsuLi5wcmV2VmFsdWUsIC4uLm1ldGFkYXRhXSwgdGFyZ2V0KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlEZWNvcmF0b3I8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBULFxuICBvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPVxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTX0FSUkFZLCB0YXJnZXQpIHx8IFtdO1xuXG4gICAgY29uc3Qga2V5ID0gYDoke3Byb3BlcnR5S2V5fWA7XG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICAgIERFQ09SQVRPUlMuQVBJX01PREVMX1BST1BFUlRJRVNfQVJSQVksXG4gICAgICAgIFsuLi5wcm9wZXJ0aWVzLCBgOiR7cHJvcGVydHlLZXl9YF0sXG4gICAgICAgIHRhcmdldFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKGV4aXN0aW5nTWV0YWRhdGEpIHtcbiAgICAgIGNvbnN0IG5ld01ldGFkYXRhID0gcGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhVG9TYXZlID0gb3ZlcnJpZGVFeGlzdGluZ1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmV4aXN0aW5nTWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5uZXdNZXRhZGF0YSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4ubmV3TWV0YWRhdGEsXG4gICAgICAgICAgICAuLi5leGlzdGluZ01ldGFkYXRhLFxuICAgICAgICAgIH07XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFUb1NhdmUsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID1cbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IGpzIG92ZXJyaWRlXG4gICAgICAgIHRhcmdldD8uY29uc3RydWN0b3I/LltNRVRBREFUQV9GQUNUT1JZX05BTUVdPy4oKVtwcm9wZXJ0eUtleV0/LnR5cGUgPz9cbiAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIHRhcmdldCwgcHJvcGVydHlLZXkpO1xuXG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBtZXRha2V5LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICAuLi5waWNrQnkobWV0YWRhdGEsIG5lZ2F0ZShpc1VuZGVmaW5lZCkpLFxuICAgICAgICB9LFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHByb3BlcnR5S2V5XG4gICAgICApO1xuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1peGVkRGVjb3JhdG9yPFQgPSBhbnk+KFxuICBtZXRha2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBUXG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QsXG4gICAga2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICk6IGFueSA9PiB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGxldCBtZXRhZGF0YXM6IGFueTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgICBjb25zdCBwcmV2aW91c01ldGFkYXRhID1cbiAgICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgICBtZXRhZGF0YXMgPSBbLi4ucHJldmlvdXNNZXRhZGF0YSwgLi4ubWV0YWRhdGFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9XG4gICAgICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShtZXRha2V5LCBkZXNjcmlwdG9yLnZhbHVlKSB8fCB7fTtcbiAgICAgICAgbWV0YWRhdGFzID0geyAuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YSB9O1xuICAgICAgfVxuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShtZXRha2V5LCBtZXRhZGF0YXMsIGRlc2NyaXB0b3IudmFsdWUpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgbGV0IG1ldGFkYXRhczogYW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1ldGFkYXRhKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNNZXRhZGF0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEobWV0YWtleSwgdGFyZ2V0KSB8fCBbXTtcbiAgICAgIG1ldGFkYXRhcyA9IFsuLi5wcmV2aW91c01ldGFkYXRhLCAuLi5tZXRhZGF0YV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKG1ldGFrZXksIHRhcmdldCkgfHwge307XG4gICAgICBtZXRhZGF0YXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXZpb3VzTWV0YWRhdGEpLCBtZXRhZGF0YSk7XG4gICAgfVxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEobWV0YWtleSwgbWV0YWRhdGFzLCB0YXJnZXQpO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYXJhbURlY29yYXRvcjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IGFueT4oXG4gIG1ldGFkYXRhOiBULFxuICBpbml0aWFsOiBQYXJ0aWFsPFQ+XG4pOiBNZXRob2REZWNvcmF0b3IgJiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiAoXG4gICAgdGFyZ2V0OiBvYmplY3QgfCBGdW5jdGlvbixcbiAgICBrZXk/OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcj86IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPGFueT5cbiAgKTogYW55ID0+IHtcbiAgICBjb25zdCBwYXJhbU9wdGlvbnMgPSB7XG4gICAgICAuLi5pbml0aWFsLFxuICAgICAgLi4ucGlja0J5KG1ldGFkYXRhLCBuZWdhdGUoaXNVbmRlZmluZWQpKSxcbiAgICB9O1xuXG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPVxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKERFQ09SQVRPUlMuQVBJX1BBUkFNRVRFUlMsIGRlc2NyaXB0b3IudmFsdWUpIHx8IFtdO1xuICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgWy4uLnBhcmFtZXRlcnMsIHBhcmFtT3B0aW9uc10sXG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWVcbiAgICAgICk7XG4gICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQucHJvdG90eXBlKTtcblxuICAgIGZvciAoY29uc3QgcHJvcGVydHlLZXkgb2YgcHJvcGVydHlLZXlzKSB7XG4gICAgICBpZiAoaXNDb25zdHJ1Y3Rvcihwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1ldGhvZERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICB0YXJnZXQucHJvdG90eXBlLFxuICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgKTtcblxuICAgICAgaWYgKCFtZXRob2REZXNjcmlwdG9yKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0FwaU1ldGhvZCA9IFJlZmxlY3QuaGFzTWV0YWRhdGEoXG4gICAgICAgIE1FVEhPRF9NRVRBREFUQSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcblxuICAgICAgaWYgKCFpc0FwaU1ldGhvZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyYW1ldGVycyA9XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgREVDT1JBVE9SUy5BUElfUEFSQU1FVEVSUyxcbiAgICAgICAgICBtZXRob2REZXNjcmlwdG9yLnZhbHVlXG4gICAgICAgICkgfHwgW107XG4gICAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgICBERUNPUkFUT1JTLkFQSV9QQVJBTUVURVJTLFxuICAgICAgICBbLi4ucGFyYW1ldGVycywgcGFyYW1PcHRpb25zXSxcbiAgICAgICAgbWV0aG9kRGVzY3JpcHRvci52YWx1ZVxuICAgICAgKTtcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlSXNBcnJheVR1cGxlKFxuICBpbnB1dDogRnVuY3Rpb24gfCBbRnVuY3Rpb25dIHwgdW5kZWZpbmVkIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgaXNBcnJheUZsYWc6IGJvb2xlYW5cbik6IFtGdW5jdGlvbiB8IHVuZGVmaW5lZCwgYm9vbGVhbl0ge1xuICBpZiAoIWlucHV0KSB7XG4gICAgcmV0dXJuIFtpbnB1dCBhcyB1bmRlZmluZWQsIGlzQXJyYXlGbGFnXTtcbiAgfVxuICBpZiAoaXNBcnJheUZsYWcpIHtcbiAgICByZXR1cm4gW2lucHV0IGFzIEZ1bmN0aW9uLCBpc0FycmF5RmxhZ107XG4gIH1cbiAgY29uc3QgaXNJbnB1dEFycmF5ID0gaXNBcnJheShpbnB1dCk7XG4gIGNvbnN0IHR5cGUgPSBpc0lucHV0QXJyYXkgPyBpbnB1dFswXSA6IGlucHV0O1xuICByZXR1cm4gW3R5cGUgYXMgRnVuY3Rpb24sIGlzSW5wdXRBcnJheV07XG59XG4iLCJpbXBvcnQgeyBUeXBlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5pbXBvcnQge1xuICBFbnVtQWxsb3dlZFR5cGVzLFxuICBTY2hlbWFPYmplY3RNZXRhZGF0YSxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvc2NoZW1hLW9iamVjdC1tZXRhZGF0YS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEVudW1TY2hlbWFBdHRyaWJ1dGVzIH0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L2ludGVyZmFjZXMvZW51bS1zY2hlbWEtYXR0cmlidXRlcy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGdldFR5cGVJc0FycmF5VHVwbGUgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvZGVjb3JhdG9ycy9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICBnZXRFbnVtVHlwZSxcbiAgZ2V0RW51bVZhbHVlcyxcbn0gZnJvbSBcIkBuZXN0anMvc3dhZ2dlci9kaXN0L3V0aWxzL2VudW0udXRpbHNcIjtcbmltcG9ydCB7IERFQ09SQVRPUlMgfSBmcm9tIFwiQG5lc3Rqcy9zd2FnZ2VyL2Rpc3QvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVQcm9wZXJ0eURlY29yYXRvciB9IGZyb20gXCIuL2hlbHBlcnNcIjtcblxuZXhwb3J0IHR5cGUgQXBpUHJvcGVydHlDb21tb25PcHRpb25zID0gU2NoZW1hT2JqZWN0TWV0YWRhdGEgJiB7XG4gIFwieC1lbnVtTmFtZXNcIj86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTGF6eSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAgICogY2FuIGJlIHVzZWQgYXMgYW4gaWRcbiAgICpcbiAgICogVXNlIHRvZ2V0aGVyIHdpdGggQEFwaURlZmF1bHRHZXR0ZXIgb24gdGhlIGdldHRlciByb3V0ZSBvZiB0aGUgdHlwZVxuICAgKiB0byBnZW5lcmF0ZSBPcGVuQVBJIGxpbmsgb2JqZWN0c1xuICAgKlxuICAgKiBAc2VlIFtTd2FnZ2VyIGxpbmsgb2JqZWN0c10oaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9saW5rcy8pXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlXG4gIGxpbms/OiAoKSA9PiBUeXBlPHVua25vd24+IHwgRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBBcGlQcm9wZXJ0eU9wdGlvbnMgPVxuICB8IEFwaVByb3BlcnR5Q29tbW9uT3B0aW9uc1xuICB8IChBcGlQcm9wZXJ0eUNvbW1vbk9wdGlvbnMgJiB7XG4gICAgICBlbnVtTmFtZTogc3RyaW5nO1xuICAgICAgZW51bVNjaGVtYT86IEVudW1TY2hlbWFBdHRyaWJ1dGVzO1xuICAgIH0pO1xuXG5jb25zdCBpc0VudW1BcnJheSA9IChcbiAgb3B0czogQXBpUHJvcGVydHlPcHRpb25zXG4pOiBvcHRzIGlzIHtcbiAgaXNBcnJheTogdHJ1ZTtcbiAgZW51bTogRW51bUFsbG93ZWRUeXBlcztcbiAgdHlwZTogYW55O1xuICBpdGVtczogYW55O1xufSA9PiAob3B0cy5pc0FycmF5ICYmIFwiZW51bVwiIGluIG9wdHMgJiYgb3B0cy5lbnVtICE9PSB1bmRlZmluZWQpIGFzIGJvb2xlYW47XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHkoXG4gIG9wdGlvbnM6IEFwaVByb3BlcnR5T3B0aW9ucyA9IHt9XG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiBjcmVhdGVBcGlQcm9wZXJ0eURlY29yYXRvcihvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaVByb3BlcnR5RGVjb3JhdG9yKFxuICBvcHRpb25zOiBBcGlQcm9wZXJ0eU9wdGlvbnMgPSB7fSxcbiAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgY29uc3QgW3R5cGUsIGlzQXJyYXldID0gZ2V0VHlwZUlzQXJyYXlUdXBsZShcbiAgICBvcHRpb25zLnR5cGUsXG4gICAgb3B0aW9ucy5pc0FycmF5IGFzIGJvb2xlYW5cbiAgKTtcbiAgb3B0aW9ucyA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHR5cGUsXG4gICAgaXNBcnJheSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnM7XG5cbiAgaWYgKGlzRW51bUFycmF5KG9wdGlvbnMpKSB7XG4gICAgb3B0aW9ucy50eXBlID0gXCJhcnJheVwiO1xuXG4gICAgY29uc3QgZW51bVZhbHVlcyA9IGdldEVudW1WYWx1ZXMob3B0aW9ucy5lbnVtKTtcbiAgICBvcHRpb25zLml0ZW1zID0ge1xuICAgICAgdHlwZTogZ2V0RW51bVR5cGUoZW51bVZhbHVlcyksXG4gICAgICBlbnVtOiBlbnVtVmFsdWVzLFxuICAgIH07XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBuZXN0IHN3YWdnZXIgb3ZlcnJpZGVcbiAgICBkZWxldGUgb3B0aW9ucy5lbnVtO1xuICB9IGVsc2UgaWYgKFwiZW51bVwiIGluIG9wdGlvbnMgJiYgb3B0aW9ucy5lbnVtICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBlbnVtVmFsdWVzID0gZ2V0RW51bVZhbHVlcyhvcHRpb25zLmVudW0pO1xuXG4gICAgb3B0aW9ucy5lbnVtID0gZW51bVZhbHVlcztcbiAgICBvcHRpb25zLnR5cGUgPSBnZXRFbnVtVHlwZShlbnVtVmFsdWVzKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMudHlwZSkpIHtcbiAgICBvcHRpb25zLnR5cGUgPSBcImFycmF5XCI7XG4gICAgb3B0aW9ucy5pdGVtcyA9IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7XG4gICAgICAgIHR5cGU6IG9wdGlvbnMudHlwZVswXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVQcm9wZXJ0eURlY29yYXRvcihcbiAgICBERUNPUkFUT1JTLkFQSV9NT0RFTF9QUk9QRVJUSUVTLFxuICAgIG9wdGlvbnMsXG4gICAgb3ZlcnJpZGVFeGlzdGluZ1xuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUHJvcGVydHlPcHRpb25hbChcbiAgb3B0aW9uczogQXBpUHJvcGVydHlPcHRpb25zID0ge31cbik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAuLi5vcHRpb25zLFxuICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgfSBhcyBBcGlQcm9wZXJ0eU9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQXBpUmVzcG9uc2VQcm9wZXJ0eShcbiAgb3B0aW9uczogUGljazxcbiAgICBBcGlQcm9wZXJ0eU9wdGlvbnMsXG4gICAgXCJ0eXBlXCIgfCBcImV4YW1wbGVcIiB8IFwiZm9ybWF0XCIgfCBcImRlcHJlY2F0ZWRcIiB8IFwiZW51bVwiXG4gID4gPSB7fVxuKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH0gYXMgQXBpUHJvcGVydHlPcHRpb25zKTtcbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGVDb25maWcsXG4gIEluamVjdGFibGVzS2V5cyxcbiAgSW5qZWN0T3B0aW9ucyxcbn0gZnJvbSBcIkBkZWNhZi10cy9pbmplY3RhYmxlLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgU2NvcGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBEZWNvcmF0aW9uLCBEZWNvcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBBcGlQcm9wZXJ0eSB9IGZyb20gXCIuL2RlY29yYXRvcnMvQXBpUHJvcGVydHlcIjtcbmltcG9ydCB7IFBlcnNpc3RlbmNlS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBuZXN0SW5qZWN0YWJsZShcbiAgICAgIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgICAgIGNmZzogSW5qZWN0YWJsZUNvbmZpZ1xuICAgICkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGUoe1xuICAgICAgICBzY29wZTogY2ZnLnNpbmdsZXRvbiA/IFNjb3BlLkRFRkFVTFQgOiBTY29wZS5SRVFVRVNULFxuICAgICAgICBkdXJhYmxlOiBjZmcuc2luZ2xldG9uID8gdW5kZWZpbmVkIDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG5lc3RJbmplY3QoXG4gICAgICBjYXRlZ29yeTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBjZmc6IEluamVjdE9wdGlvbnNcbiAgICApIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbm5lck5lc3RJbmplY3QoXG4gICAgICAgIHRhcmdldDogb2JqZWN0LFxuICAgICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgICAgZGVzY3JpcHRvcj86IGFueVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBJbmplY3QoY2F0ZWdvcnkgfHwgKHRhcmdldCBhcyBDb25zdHJ1Y3RvcikpKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICk7XG4gICAgICB9O1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5SRVFVSVJFRClcbiAgLmV4dGVuZChcbiAgICBBcGlQcm9wZXJ0eSh7XG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KVxuICApXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NQVgpXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gbWF4RGVjKG1heDogbnVtYmVyKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyBtYXhpbXVtOiBtYXggfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLk1JTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtaW5EZWMobWluOiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1pbmltdW06IG1pbiB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSClcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBtYXhMZW5ndGhEZWMobWF4OiBudW1iZXIpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IG1heExlbmd0aDogbWF4IH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RIKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIG1pbkxlbmd0aERlYyhtaW46IG51bWJlcikge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHsgbWluTGVuZ3RoOiBtaW4gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG4vL1xuLy8gRGVjb3JhdGlvbi5mb3IoVmFsaWRhdGlvbktleXMuVFlQRSlcbi8vICAgLmV4dGVuZCh7XG4vLyAgICAgZGVjb3JhdG9yOiBmdW5jdGlvbiB0eXBlRGVjKHR5cGU6IChzdHJpbmcgfCAoKCkgPT4gc3RyaW5nKSlbXSB8IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiB0eXBlIGFzIGFueSB9KTtcbi8vICAgICB9LFxuLy8gICB9KVxuLy8gICAuYXBwbHkoKTtcbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5EQVRFKVxuLy8gICAuZXh0ZW5kKHtcbi8vICAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRhdGVEZWMoKSB7XG4vLyAgICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBEYXRlIH0pO1xuLy8gICAgIH0sXG4vLyAgIH0pXG4vLyAgIC5hcHBseSgpO1xuXG5EZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5MSVNUKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGxpc3REZWMoXG4gICAgICBjbGF6ejpcbiAgICAgICAgfCBDb25zdHJ1Y3Rvcjxhbnk+XG4gICAgICAgIHwgKCgpID0+IENvbnN0cnVjdG9yPGFueT4pXG4gICAgICAgIHwgKENvbnN0cnVjdG9yPGFueT4gfCAoKCkgPT4gQ29uc3RydWN0b3I8YW55PikpW11cbiAgICApIHtcbiAgICAgIGNvbnN0IGMgPSBBcnJheS5pc0FycmF5KGNsYXp6KSA/IGNsYXp6WzBdIDogY2xheno7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoeyB0eXBlOiBbY10gfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbi8vXG4vLyBEZWNvcmF0aW9uLmZvcihWYWxpZGF0aW9uS2V5cy5PUFRJT04pXG4vLyAgIC5leHRlbmQoe1xuLy8gICAgIGRlY29yYXRvcjogZnVuY3Rpb24gb3B0aW9uRGVjKG9wdGlvbnM6IHN0cmluZ1tdIHwgUmVjb3JkPHN0cmluZywgYW55Pikge1xuLy8gICAgICAgY29uc3Qgb3B0cyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucykgPyBvcHRpb25zIDogT2JqZWN0LnZhbHVlcyhvcHRpb25zKTtcbi8vICAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7IGVudW06IG9wdHMgfSk7XG4vLyAgICAgfSxcbi8vICAgfSlcbi8vICAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKFZhbGlkYXRpb25LZXlzLlBBVFRFUk4pXG4gIC5leHRlbmQoe1xuICAgIGRlY29yYXRvcjogZnVuY3Rpb24gcGF0dGVybkRlYyhwYXQ6IFJlZ0V4cCB8IHN0cmluZykge1xuICAgICAgcmV0dXJuIEFwaVByb3BlcnR5KHtcbiAgICAgICAgcGF0dGVybjogdHlwZW9mIHBhdCA9PT0gXCJzdHJpbmdcIiA/IHBhdCA6IHBhdC5zb3VyY2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KVxuICAuYXBwbHkoKTtcblxuRGVjb3JhdGlvbi5mb3IoUGVyc2lzdGVuY2VLZXlzLkNPTFVNTilcbiAgLmV4dGVuZCh7XG4gICAgZGVjb3JhdG9yOiBmdW5jdGlvbiBjb2x1bW5EZWMobmFtZTogc3RyaW5nKSB7XG4gICAgICByZXR1cm4gQXBpUHJvcGVydHkoe1xuICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSlcbiAgLmFwcGx5KCk7XG5cbkRlY29yYXRpb24uZm9yKERlY29yYXRpb25LZXlzLkRFU0NSSVBUSU9OKVxuICAuZXh0ZW5kKHtcbiAgICBkZWNvcmF0b3I6IGZ1bmN0aW9uIGRlc2NyaXB0aW9uRGVjKGRlc2NyaXB0aW9uOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBBcGlQcm9wZXJ0eSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pXG4gIC5hcHBseSgpO1xuIiwiZXhwb3J0IGNvbnN0IERFQ0FGX01PRFVMRV9PUFRJT05TID0gXCJEZWNhZk1vZHVsZU9wdGlvbnNcIjtcbmV4cG9ydCBjb25zdCBERUNBRl9BREFQVEVSX0lEID0gXCJEZWNhZkFkYXB0ZXJcIjtcbiIsImltcG9ydCB7XG4gIER5bmFtaWNNb2R1bGUsXG4gIEdsb2JhbCxcbiAgSW5qZWN0LFxuICBNb2R1bGUsXG4gIE9uQXBwbGljYXRpb25TaHV0ZG93bixcbiAgU2NvcGUsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgTW9kdWxlUmVmIH0gZnJvbSBcIkBuZXN0anMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBEZWNhZk1vZHVsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgREVDQUZfQURBUFRFUl9JRCwgREVDQUZfTU9EVUxFX09QVElPTlMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZhY3RvcnlQcm92aWRlciB9IGZyb20gXCJAbmVzdGpzL2NvbW1vbi9pbnRlcmZhY2VzL21vZHVsZXMvcHJvdmlkZXIuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBBZGFwdGVyIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuQEdsb2JhbCgpXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmQ29yZU1vZHVsZTxcbiAgQ09ORixcbiAgQURBUFRFUiBleHRlbmRzIEFkYXB0ZXI8Q09ORiwgYW55LCBhbnksIGFueSwgYW55Pixcbj4gaW1wbGVtZW50cyBPbkFwcGxpY2F0aW9uU2h1dGRvd25cbntcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuICBwcml2YXRlIHN0YXRpYyBfYWRhcHRlckluc3RhbmNlOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwgPVxuICAgIG51bGw7XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyBnZXQgbG9nKCk6IExvZ2dlciB7XG4gICAgaWYgKCF0aGlzLl9sb2dnZXIpIHRoaXMuX2xvZ2dlciA9IExvZ2dpbmcuZm9yKERlY2FmQ29yZU1vZHVsZSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ2dlcjtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoREVDQUZfTU9EVUxFX09QVElPTlMpXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnM8Q09ORiwgQURBUFRFUj4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVSZWY6IE1vZHVsZVJlZlxuICApIHt9XG5cbiAgc3RhdGljIGFzeW5jIGNyZWF0ZUFkYXB0ZXIoXG4gICAgb3B0aW9uczogRGVjYWZNb2R1bGVPcHRpb25zXG4gICk6IFByb21pc2U8QWRhcHRlcjxhbnksIGFueSwgYW55LCBhbnksIGFueT4+IHtcbiAgICBpZiAoIXRoaXMuX2FkYXB0ZXJJbnN0YW5jZSkge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlQWRhcHRlcik7XG4gICAgICBsb2cuaW5mbyhcIkNyZWF0aW5nIGFkYXB0ZXIgaW5zdGFuY2UuLi5cIik7XG4gICAgICB0aGlzLl9hZGFwdGVySW5zdGFuY2UgPSBuZXcgb3B0aW9ucy5hZGFwdGVyKG9wdGlvbnMuY29uZiwgb3B0aW9ucy5hbGlhcyk7XG4gICAgICBsb2cuaW5mbyhcIkFkYXB0ZXIgaW5zdGFuY2UgY3JlYXRlZCBzdWNjZXNzZnVsbHkhXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlckluc3RhbmNlO1xuICB9XG5cbiAgc3RhdGljIGdldEFkYXB0ZXJJbnN0YW5jZSgpOiBBZGFwdGVyPGFueSwgYW55LCBhbnksIGFueSwgYW55PiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVySW5zdGFuY2U7XG4gIH1cblxuICBzdGF0aWMgZm9yUm9vdChvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnMpOiBEeW5hbWljTW9kdWxlIHtcbiAgICBjb25zdCB0eXBlT3JtTW9kdWxlT3B0aW9ucyA9IHtcbiAgICAgIHByb3ZpZGU6IERFQ0FGX01PRFVMRV9PUFRJT05TLFxuICAgICAgdXNlVmFsdWU6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IGFkYXB0ZXI6IEZhY3RvcnlQcm92aWRlcjxhbnk+ID0ge1xuICAgICAgdXNlRmFjdG9yeTogYXN5bmMgKG9wdHM6IERlY2FmTW9kdWxlT3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gRGVjYWZDb3JlTW9kdWxlLmNyZWF0ZUFkYXB0ZXIob3B0cyk7XG4gICAgICB9LFxuICAgICAgcHJvdmlkZTogREVDQUZfQURBUFRFUl9JRCxcbiAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICBzY29wZTogU2NvcGUuREVGQVVMVCxcbiAgICAgIGluamVjdDogW0RFQ0FGX01PRFVMRV9PUFRJT05TXSxcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvdmlkZXJzID0gW2FkYXB0ZXIsIHR5cGVPcm1Nb2R1bGVPcHRpb25zXTtcbiAgICBjb25zdCBleHBvcnRzID0gW2FkYXB0ZXJdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZDb3JlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgICAgZXhwb3J0cyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgb25BcHBsaWNhdGlvblNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IERlY2FmQ29yZU1vZHVsZS5sb2cuZm9yKHRoaXMub25BcHBsaWNhdGlvblNodXRkb3duKTtcbiAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5tb2R1bGVSZWYuZ2V0PEFEQVBURVI+KERFQ0FGX0FEQVBURVJfSUQpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWRhcHRlcikge1xuICAgICAgICBsb2cuaW5mbyhcIlNodXR0aW5nIGRvd25cIik7XG4gICAgICAgIGF3YWl0IGFkYXB0ZXIuc2h1dGRvd24oKTtcbiAgICAgICAgRGVjYWZDb3JlTW9kdWxlLl9hZGFwdGVySW5zdGFuY2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIHNodXRkb3duIGFwcGxpY2F0aW9uYCwgZSBhcyBFcnJvcik7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBuZXN0anMvY29tbW9uXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvRmFjdG9yeSB7XG4gIGZvcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPik6IFJlcG88TT4ge1xuICAgIG1vZGVsID0gdHlwZW9mIG1vZGVsID09PSBcInN0cmluZ1wiID8gKE1vZGVsLmdldChtb2RlbCkgYXMgYW55KSA6IG1vZGVsO1xuICAgIGlmICghbW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gZmluZCByZXBvc2l0b3J5IGZvciAke21vZGVsfWApO1xuICAgIH1cbiAgICByZXR1cm4gUmVwb3NpdG9yeS5mb3JNb2RlbChtb2RlbCBhcyBDb25zdHJ1Y3RvcjxNPik7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEJvZHksXG4gIENvbnRyb2xsZXIsXG4gIERlbGV0ZSxcbiAgRHluYW1pY01vZHVsZSxcbiAgR2V0LFxuICBNb2R1bGUsXG4gIFBhcmFtLFxuICBQb3N0LFxuICBQdXQsXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHtcbiAgQXBpQmFkUmVxdWVzdFJlc3BvbnNlLFxuICBBcGlCb2R5LFxuICBBcGlDcmVhdGVkUmVzcG9uc2UsXG4gIEFwaUV4dHJhTW9kZWxzLFxuICBBcGlOb3RGb3VuZFJlc3BvbnNlLFxuICBBcGlPa1Jlc3BvbnNlLFxuICBBcGlPcGVyYXRpb24sXG4gIEFwaVBhcmFtLFxuICBBcGlUYWdzLFxuICBBcGlVbnByb2Nlc3NhYmxlRW50aXR5UmVzcG9uc2UsXG4gIGdldFNjaGVtYVBhdGgsXG59IGZyb20gXCJAbmVzdGpzL3N3YWdnZXJcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFJlcG8sIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsLCBNb2RlbENvbnN0cnVjdG9yIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTG9nZ2VkQ2xhc3MsIExvZ2dlciwgTG9nZ2luZywgdG9LZWJhYkNhc2UgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcbmltcG9ydCB7IFJlcG9GYWN0b3J5IH0gZnJvbSBcIi4vUmVwb0ZhY3RvcnlcIjtcblxuQE1vZHVsZSh7fSlcbmV4cG9ydCBjbGFzcyBEZWNhZk1vZGVsTW9kdWxlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIHByb3RlY3RlZCBzdGF0aWMgZ2V0IGxvZygpOiBMb2dnZXIge1xuICAgIGlmICghdGhpcy5fbG9nZ2VyKSB0aGlzLl9sb2dnZXIgPSBMb2dnaW5nLmZvcihEZWNhZk1vZGVsTW9kdWxlKTtcbiAgICByZXR1cm4gdGhpcy5fbG9nZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdG9Nb2RlbENvbnRyb2xsZXI8VCBleHRlbmRzIE1vZGVsPGFueT4+KFxuICAgIE1vZGVsQ2xheno6IE1vZGVsQ29uc3RydWN0b3I8YW55PlxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50b01vZGVsQ29udHJvbGxlcik7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShNb2RlbENsYXp6KTtcbiAgICBjb25zdCByb3V0ZVBhdGggPSB0b0tlYmFiQ2FzZSh0YWJsZU5hbWUpO1xuICAgIGNvbnN0IG1vZGVsQ2xhenpOYW1lID0gTW9kZWxDbGF6ei5uYW1lO1xuXG4gICAgbG9nLmRlYnVnKGBDcmVhdGluZyBjb250cm9sbGVyIGZvciBtb2RlbDogJHttb2RlbENsYXp6TmFtZX1gKTtcblxuICAgIEBDb250cm9sbGVyKHJvdXRlUGF0aClcbiAgICBAQXBpVGFncyhtb2RlbENsYXp6TmFtZSlcbiAgICBAQXBpRXh0cmFNb2RlbHMoTW9kZWxDbGF6eilcbiAgICBjbGFzcyBEeW5hbWljTW9kZWxDb250cm9sbGVyIGV4dGVuZHMgTG9nZ2VkQ2xhc3Mge1xuICAgICAgLy8gcHJpdmF0ZSByZWFkb25seSByZXBvID0gdGhpcy5yZXBvRmFjdG9yeS5mb3IoTW9kZWxDbGF6eik7XG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHBrITogc3RyaW5nO1xuICAgICAgcHJpdmF0ZSByZWFkb25seSByZXBvITogUmVwbzxUPjsgLy9SZXBvc2l0b3J5PE1vZGVsPGFueT4sIGFueSwgYW55LCBhbnksIGFueT47XG5cbiAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVwb0ZhY3Rvcnk6IFJlcG9GYWN0b3J5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIGxvZy5pbmZvKFxuICAgICAgICAgIGBSZWdpc3RlcmluZyBkeW5hbWljIGNvbnRyb2xsZXIgZm9yIG1vZGVsOiAke21vZGVsQ2xhenpOYW1lfSByb3V0ZTogLyR7cm91dGVQYXRofWBcbiAgICAgICAgKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVwbyA9IHRoaXMucmVwb0ZhY3RvcnkuZm9yKE1vZGVsQ2xhenoubmFtZSk7XG4gICAgICAgICAgdGhpcy5wayA9IHRoaXMucmVwby5wayBhcyBzdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBpbml0aWFsaXplIHJlcG9zaXRvcnkgZm9yIG1vZGVsIFwiJHtNb2RlbENsYXp6Lm5hbWV9XCIuYCxcbiAgICAgICAgICAgIGVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIEBQb3N0KClcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgQ3JlYXRlIGEgbmV3ICR7bW9kZWxDbGF6ek5hbWV9LmAgfSlcbiAgICAgIEBBcGlCb2R5KHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBQYXlsb2FkIGZvciAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaUNyZWF0ZWRSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gY3JlYXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQmFkUmVxdWVzdFJlc3BvbnNlKHsgZGVzY3JpcHRpb246IFwiUGF5bG9hZCB2YWxpZGF0aW9uIGZhaWxlZC5cIiB9KVxuICAgICAgQEFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlJlcG9zaXRvcnkgcmVqZWN0ZWQgdGhlIHByb3ZpZGVkIHBheWxvYWQuXCIsXG4gICAgICB9KVxuICAgICAgYXN5bmMgY3JlYXRlKEBCb2R5KCkgZGF0YTogVCk6IFByb21pc2U8TW9kZWw8YW55Pj4ge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGUpO1xuICAgICAgICBsb2cudmVyYm9zZShgY3JlYXRpbmcgbmV3ICR7bW9kZWxDbGF6ek5hbWV9YCk7XG4gICAgICAgIGxldCBjcmVhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjcmVhdGVkID0gYXdhaXQgdGhpcy5yZXBvLmNyZWF0ZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5lcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBuZXcgJHttb2RlbENsYXp6TmFtZX1gLCBlIGFzIEVycm9yKTtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGxvZy5pbmZvKGBjcmVhdGVkIG5ldyAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7Y3JlYXRlZFt0aGlzLnBrXX1gKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgICB9XG5cbiAgICAgIEBHZXQoXCI6aWRcIilcbiAgICAgIEBBcGlPcGVyYXRpb24oeyBzdW1tYXJ5OiBgUmV0cmlldmUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHsgbmFtZTogXCJpZFwiLCBkZXNjcmlwdGlvbjogXCJQcmltYXJ5IGtleVwiIH0pXG4gICAgICBAQXBpT2tSZXNwb25zZSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHttb2RlbENsYXp6TmFtZX0gcmV0cmlldmVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIHJlYWQoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5yZWFkKTtcbiAgICAgICAgbGV0IHJlYWQ6IE1vZGVsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgcmVhZGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtpZH1gKTtcbiAgICAgICAgICByZWFkID0gYXdhaXQgdGhpcy5yZXBvLnJlYWQoaWQpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtpZH1gLFxuICAgICAgICAgICAgZSBhcyBFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZy5pbmZvKGByZWFkICR7bW9kZWxDbGF6ek5hbWV9IHdpdGggaWQgJHtyZWFkW3RoaXMucGtdfWApO1xuICAgICAgICByZXR1cm4gcmVhZDtcbiAgICAgIH1cblxuICAgICAgQFB1dChcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7XG4gICAgICAgIHN1bW1hcnk6IGBSZXBsYWNlIGFuIGV4aXN0aW5nICR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCB3aXRoIGEgbmV3IHBheWxvYWQuYCxcbiAgICAgIH0pXG4gICAgICBAQXBpQm9keSh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBgUGF5bG9hZCBmb3IgcmVwbGFjZSBhIGV4aXN0aW5nIHJlY29yZCBvZiAke21vZGVsQ2xhenpOYW1lfWAsXG4gICAgICAgIHNjaGVtYTogeyAkcmVmOiBnZXRTY2hlbWFQYXRoKE1vZGVsQ2xhenopIH0sXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7TW9kZWxDbGF6en0gcmVjb3JkIHJlcGxhY2VkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlCYWRSZXF1ZXN0UmVzcG9uc2UoeyBkZXNjcmlwdGlvbjogXCJQYXlsb2FkIHZhbGlkYXRpb24gZmFpbGVkLlwiIH0pXG4gICAgICBhc3luYyB1cGRhdGUoQEJvZHkoKSBkYXRhOiBNb2RlbDxhbnk+KSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnVwZGF0ZSk7XG4gICAgICAgIGxldCB1cGRhdGVkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICAgIGB1cGRhdGluZyAke21vZGVsQ2xhenpOYW1lfSB3aXRoICR7dGhpcy5wa30gJHtkYXRhW3RoaXMucGtdfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnJlcG8uY3JlYXRlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH1cblxuICAgICAgQERlbGV0ZShcIjppZFwiKVxuICAgICAgQEFwaU9wZXJhdGlvbih7IHN1bW1hcnk6IGBEZWxldGUgYSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgYnkgaWQuYCB9KVxuICAgICAgQEFwaVBhcmFtKHtcbiAgICAgICAgbmFtZTogXCJpZFwiLFxuICAgICAgICBkZXNjcmlwdGlvbjogYFByaW1hcnkga2V5IHZhbHVlIG9mIHRoZSAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgdG8gZGVsZXRlLmAsXG4gICAgICB9KVxuICAgICAgQEFwaU9rUmVzcG9uc2Uoe1xuICAgICAgICBkZXNjcmlwdGlvbjogYCR7bW9kZWxDbGF6ek5hbWV9IHJlY29yZCBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgfSlcbiAgICAgIEBBcGlOb3RGb3VuZFJlc3BvbnNlKHtcbiAgICAgICAgZGVzY3JpcHRpb246IGBObyAke21vZGVsQ2xhenpOYW1lfSByZWNvcmQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci5gLFxuICAgICAgfSlcbiAgICAgIGFzeW5jIGRlbGV0ZShAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmRlbGV0ZSk7XG4gICAgICAgIGxldCByZWFkOiBNb2RlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuZGVidWcoXG4gICAgICAgICAgICBgZGVsZXRpbmcgJHttb2RlbENsYXp6TmFtZX0gd2l0aCAke3RoaXMucGsgYXMgc3RyaW5nfSAke2lkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlYWQgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCk7XG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIGRlbGV0ZSAke21vZGVsQ2xhenpOYW1lfSB3aXRoIGlkICR7aWR9YCxcbiAgICAgICAgICAgIGUgYXMgRXJyb3JcbiAgICAgICAgICApO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oYGRlbGV0ZWQgJHttb2RlbENsYXp6TmFtZX0gd2l0aCBpZCAke3JlYWRbdGhpcy5wa119YCk7XG4gICAgICAgIHJldHVybiByZWFkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBEeW5hbWljTW9kZWxDb250cm9sbGVyO1xuICB9XG5cbiAgc3RhdGljIGZvclJvb3QoZmxhdm91cjogc3RyaW5nKTogRHluYW1pY01vZHVsZSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuZm9yUm9vdCk7XG4gICAgbG9nLmluZm8oYEdlbmVyYXRpbmcgY29udHJvbGxlcnMgZm9yIGZsYXZvdXIuLi5gKTtcblxuICAgIGNvbnN0IHRyYWNrZWRNb2RlbHMgPSBBZGFwdGVyLm1vZGVscyhmbGF2b3VyKTtcbiAgICBjb25zdCBjb250cm9sbGVycyA9IHRyYWNrZWRNb2RlbHMubWFwKHRoaXMudG9Nb2RlbENvbnRyb2xsZXIuYmluZCh0aGlzKSk7XG5cbiAgICBsb2cuaW5mbyhgR2VuZXJhdGVkICR7Y29udHJvbGxlcnMubGVuZ3RofSBjb250cm9sbGVyc2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2RlbE1vZHVsZSxcbiAgICAgIGNvbnRyb2xsZXJzLFxuICAgICAgcHJvdmlkZXJzOiBbUmVwb0ZhY3RvcnldLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IER5bmFtaWNNb2R1bGUsIEZvcndhcmRSZWZlcmVuY2UsIE1vZHVsZSwgVHlwZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRGVjYWZNb2R1bGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY2FmQ29yZU1vZHVsZSB9IGZyb20gXCIuL2NvcmUtbW9kdWxlXCI7XG5pbXBvcnQgeyBEZWNhZk1vZGVsTW9kdWxlIH0gZnJvbSBcIi4vbW9kZWwtbW9kdWxlXCI7XG5cbi8qKlxuICogQHB1YmxpY0FwaVxuICovXG5ATW9kdWxlKHt9KVxuZXhwb3J0IGNsYXNzIERlY2FmTW9kdWxlIHtcbiAgc3RhdGljIGFzeW5jIGZvclJvb3RBc3luYyhcbiAgICBvcHRpb25zOiBEZWNhZk1vZHVsZU9wdGlvbnNcbiAgKTogUHJvbWlzZTxEeW5hbWljTW9kdWxlPiB7XG4gICAgY29uc3QgeyBhdXRvQ29udHJvbGxlcnMgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCBhZGFwdGVyID0gYXdhaXQgRGVjYWZDb3JlTW9kdWxlLmNyZWF0ZUFkYXB0ZXIob3B0aW9ucyk7XG4gICAgY29uc3QgZmxhdm91ciA9IGFkYXB0ZXIuZmxhdm91cjtcblxuICAgIGNvbnN0IGltcG9ydHM6XG4gICAgICB8IChcbiAgICAgICAgICB8IER5bmFtaWNNb2R1bGVcbiAgICAgICAgICB8IFR5cGU8YW55PlxuICAgICAgICAgIHwgUHJvbWlzZTxEeW5hbWljTW9kdWxlPlxuICAgICAgICAgIHwgRm9yd2FyZFJlZmVyZW5jZTxhbnk+XG4gICAgICAgIClbXVxuICAgICAgfCB1bmRlZmluZWQgPSBbRGVjYWZDb3JlTW9kdWxlLmZvclJvb3Qob3B0aW9ucyldO1xuXG4gICAgaWYgKGF1dG9Db250cm9sbGVycykge1xuICAgICAgaW1wb3J0cy5wdXNoKERlY2FmTW9kZWxNb2R1bGUuZm9yUm9vdChmbGF2b3VyKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZHVsZTogRGVjYWZNb2R1bGUsXG4gICAgICBpbXBvcnRzOiBpbXBvcnRzLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7TW9kZWx9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7SW50ZXJuYWxFcnJvcn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1JlcG9zaXRvcnl9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVwb0Zvck1vZGVsKG1vZGVsOiBzdHJpbmcpIHtcblx0Y29uc3QgbSA9IE1vZGVsLmdldChtb2RlbCk7XG5cdGlmICghbSlcblx0XHR0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGZpbmQgcmVwb3NpdG9yeSBmb3IgJHttb2RlbH1gKVxuXHRjb25zdCByZXBvID0gUmVwb3NpdG9yeS5mb3JNb2RlbChtKTtcblx0cmV0dXJuIHJlcG87XG59IiwiLyoqXG4gKiBAbW9kdWxlIGZvci1uZXN0XG4gKiBAZGVzY3JpcHRpb24gVGhpcyBtb2R1bGUgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgdHMtd29ya3NwYWNlIGxpYnJhcnkuIEl0IGFnZ3JlZ2F0ZXMgYW5kIGV4cG9ydHNcbiAqIGZ1bmN0aW9uYWxpdHkgZnJvbSB2YXJpb3VzIHN1Ym1vZHVsZXMgYW5kIHV0aWxpdGllcyB3aXRoaW4gdGhlIHByb2plY3QuXG4gKlxuICogVGhlIG1vZHVsZSBpbmNsdWRlczpcbiAqIDEuIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCB0eXBlcyBmcm9tIHRoZSBcIi4vdXRpbHNcIiBkaXJlY3Rvcnk6XG4gKiAgICAtIFRoZXNlIGxpa2VseSBjb250YWluIGhlbHBlciBmdW5jdGlvbnMsIGNvbW1vbiB0eXBlcywgYW5kIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHVzZWQgdGhyb3VnaG91dCB0aGUgcHJvamVjdC5cbiAqICAgIC0gTWF5IGluY2x1ZGUgb3BlcmF0aW9ucyBmb3IgZGF0YSBtYW5pcHVsYXRpb24sIHR5cGUgY2hlY2tpbmcsIG9yIG90aGVyIGdlbmVyYWwtcHVycG9zZSB1dGlsaXRpZXMuXG4gKlxuICogMi4gQSBuYW1lc3BhY2UgYW5kIHJlbGF0ZWQgdHlwZXMgZnJvbSB0aGUgXCIuL25hbWVzcGFjZVwiIGRpcmVjdG9yeTpcbiAqICAgIC0gVGhpcyBjb3VsZCBjb250YWluIGRvbWFpbi1zcGVjaWZpYyBjb2RlIG9yIGEgY29sbGVjdGlvbiBvZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkuXG4gKiAgICAtIE1pZ2h0IGluY2x1ZGUgaW50ZXJmYWNlcywgdHlwZXMsIG9yIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgY29yZSBjb25jZXB0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiAzLiBBIFZFUlNJT04gY29uc3RhbnQ6XG4gKiAgICAtIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogICAgLSBVc2VmdWwgZm9yIHZlcnNpb24gY2hlY2tpbmcgYW5kIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuXG4gKlxuICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBjbGVhbiBhbmQgb3JnYW5pemVkIGV4cG9ydCBvZiB0aGUgbW9kdWxlJ3MgZnVuY3Rpb25hbGl0eSwgYWxsb3dpbmcgY29uc3VtZXJzXG4gKiB0byBlYXNpbHkgaW1wb3J0IGFuZCB1c2Ugc3BlY2lmaWMgcGFydHMgb2YgdGhlIGxpYnJhcnkgYXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQgXCIuL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tb2R1bGVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1JlcG9GYWN0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHRzLXdvcmtzcGFjZSBtb2R1bGUuXG4gKiBUaGUgYWN0dWFsIHZlcnNpb24gbnVtYmVyIGlzIHJlcGxhY2VkIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy5cbiAqIEBjb25zdGFudFxuICogQHR5cGUge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0VfTkFNRSMjXCI7XG5cbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkRFQ09SQVRPUlMiLCJwaWNrQnkiLCJuZWdhdGUiLCJpc1VuZGVmaW5lZCIsIk1FVEFEQVRBX0ZBQ1RPUllfTkFNRSIsImlzQ29uc3RydWN0b3IiLCJNRVRIT0RfTUVUQURBVEEiLCJpc0FycmF5IiwiZ2V0VHlwZUlzQXJyYXlUdXBsZSIsImdldEVudW1WYWx1ZXMiLCJnZXRFbnVtVHlwZSIsIkRlY29yYXRpb24iLCJJbmplY3RhYmxlc0tleXMiLCJJbmplY3RhYmxlIiwiU2NvcGUiLCJJbmplY3QiLCJWYWxpZGF0aW9uS2V5cyIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb25LZXlzIiwiTG9nZ2luZyIsIl9fZGVjb3JhdGUiLCJHbG9iYWwiLCJNb2R1bGUiLCJfX3BhcmFtIiwiTW9kdWxlUmVmIiwiUmVwb0ZhY3RvcnkiLCJNb2RlbCIsIkludGVybmFsRXJyb3IiLCJSZXBvc2l0b3J5IiwidG9LZWJhYkNhc2UiLCJMb2dnZWRDbGFzcyIsIlBvc3QiLCJBcGlPcGVyYXRpb24iLCJBcGlCb2R5IiwiZ2V0U2NoZW1hUGF0aCIsIkFwaUNyZWF0ZWRSZXNwb25zZSIsIkFwaUJhZFJlcXVlc3RSZXNwb25zZSIsIkFwaVVucHJvY2Vzc2FibGVFbnRpdHlSZXNwb25zZSIsIkJvZHkiLCJHZXQiLCJBcGlQYXJhbSIsIkFwaU9rUmVzcG9uc2UiLCJBcGlOb3RGb3VuZFJlc3BvbnNlIiwiUGFyYW0iLCJQdXQiLCJEZWxldGUiLCJDb250cm9sbGVyIiwiQXBpVGFncyIsIkFwaUV4dHJhTW9kZWxzIiwiQWRhcHRlciIsIkRlY2FmTW9kdWxlIiwiTWV0YWRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBO0lBUWdCLFNBQUEscUJBQXFCLENBQ25DLE9BQWUsRUFD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
|
|
1
|
+
var t,e;t=this,e=function(t,e,o,s,r,a,i,n,c,p,d,l,u,h,g,m,y,f,E,_,A){"use strict";function R(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach(o=>{if("default"!==o){var s=Object.getOwnPropertyDescriptor(t,o);Object.defineProperty(e,o,s.get?s:{enumerable:!0,get:()=>t[o]})}}),e.default=t,Object.freeze(e)}var b=R(A);function w(t={}){return((t={},e=!0)=>{const[o,s]=a.getTypeIsArrayTuple(t.type,t.isArray);if((r=t={...t,type:o,isArray:s}).isArray&&"enum"in r&&void 0!==r.enum){t.type="array";const e=i.getEnumValues(t.enum);t.items={type:i.getEnumType(e),enum:e},delete t.enum}else if("enum"in t&&void 0!==t.enum){const e=i.getEnumValues(t.enum);t.enum=e,t.type=i.getEnumType(e)}var r;return Array.isArray(t.type)&&(t.type="array",t.items={type:"array",items:{type:t.type[0]}}),((t,e,o=!0)=>(s,r)=>{const a=Reflect.getMetadata(n.DECORATORS.API_MODEL_PROPERTIES_ARRAY,s)||[],i=":"+r;a.includes(i)||Reflect.defineMetadata(n.DECORATORS.API_MODEL_PROPERTIES_ARRAY,[...a,":"+r],s);const c=Reflect.getMetadata(t,s,r);if(c){const a=d.pickBy(e,d.negate(d.isUndefined)),i=o?{...c,...a}:{...a,...c};Reflect.defineMetadata(t,i,s,r)}else{const o=s?.constructor?.[l.METADATA_FACTORY_NAME]?.()[r]?.type??Reflect.getMetadata("design:type",s,r);Reflect.defineMetadata(t,{type:o,...d.pickBy(e,d.negate(d.isUndefined))},s,r)}})(n.DECORATORS.API_MODEL_PROPERTIES,t,e)})(t)}function O(t,o,r){const a={GET:[m.OperationKeys.READ,s.Get],POST:[m.OperationKeys.CREATE,s.Post],PUT:[m.OperationKeys.UPDATE,s.Put],PATCH:[m.OperationKeys.UPDATE,s.Patch],DELETE:[m.OperationKeys.DELETE,s.Delete]},[i,n]=a[o];return((t,o)=>{const{handler:s,args:r}=e.Metadata.get(t,m.OperationKeys.REFLECT+m.OperationKeys.BLOCK)||{};return!!s&&(s(...r,o)??!1)})(t,i)?g.apply(h.ApiExcludeEndpoint()):g.apply(n(r))}e.Decoration.for(o.InjectablesKeys.INJECTABLE).extend({decorator:(t,e)=>s.Injectable({scope:e.singleton?s.Scope.DEFAULT:s.Scope.REQUEST,durable:!e.singleton||void 0})}).apply(),e.Decoration.for(o.InjectablesKeys.INJECT).extend({decorator:(t,e)=>(e,o,r)=>s.Inject(t||e)(e,o,r)}).apply(),e.Decoration.for(r.ValidationKeys.REQUIRED).extend(w({required:!0})).apply(),e.Decoration.for(r.ValidationKeys.MAX).extend({decorator:t=>w({maximum:t})}).apply(),e.Decoration.for(r.ValidationKeys.MIN).extend({decorator:t=>w({minimum:t})}).apply(),e.Decoration.for(r.ValidationKeys.MAX_LENGTH).extend({decorator:t=>w({maxLength:t})}).apply(),e.Decoration.for(r.ValidationKeys.MIN_LENGTH).extend({decorator:t=>w({minLength:t})}).apply(),e.Decoration.for(r.ValidationKeys.LIST).extend({decorator:t=>w({type:[Array.isArray(t)?t[0]:t]})}).apply(),e.Decoration.for(r.ValidationKeys.PATTERN).extend({decorator:t=>w({pattern:"string"==typeof t?t:t.source})}).apply(),e.Decoration.for(u.PersistenceKeys.COLUMN).extend({decorator:t=>w({name:t})}).apply(),e.Decoration.for(e.DecorationKeys.DESCRIPTION).extend({decorator:t=>w({description:t})}).apply();const T="DecafModuleOptions",P="DecafAdapter";var F;let C=class{static{F=this}static{this._adapterInstance=null}static get log(){return this._logger||(this._logger=E.Logging.for(F)),this._logger}constructor(t,e){this.options=t,this.moduleRef=e}static async createAdapter(t){if(!this._adapterInstance){const e=this.log.for(this.createAdapter);e.info("Creating adapter instance..."),this._adapterInstance=new t.adapter(t.conf,t.alias),e.info("Adapter instance created successfully!")}return this._adapterInstance}static getAdapterInstance(){return this._adapterInstance}static forRoot(t){const e={provide:T,useValue:t},o={useFactory:async t=>F.createAdapter(t),provide:P,durable:!0,scope:s.Scope.DEFAULT,inject:[T]};return{module:F,providers:[o,e],exports:[o]}}async onApplicationShutdown(){const t=F.log.for(this.onApplicationShutdown),e=this.moduleRef.get(P);try{e&&(t.info("Shutting down"),await e.shutdown(),F._adapterInstance=null)}catch(e){t.error("Failed to shutdown application",e)}}};var S;C=F=y.__decorate([s.Global(),s.Module({}),y.__param(0,s.Inject(T)),y.__metadata("design:paramtypes",[Object,f.ModuleRef])],C),t.RepoFactory=class{for(t){if(!(t="string"==typeof t?r.Model.get(t):t))throw new m.InternalError("Failed to find repository for "+t);return u.Repository.forModel(t)}},t.RepoFactory=y.__decorate([s.Injectable()],t.RepoFactory);let I=class{static{S=this}static get log(){return this._logger||(this._logger=E.Logging.for(S)),this._logger}static toModelController(e){const o=this.log.for(this.toModelController),a=u.Repository.table(e),i=E.toKebabCase(a),n=e.name;o.debug("Creating controller for model: "+n);let c=class extends E.LoggedClass{constructor(t){super(),this.repoFactory=t,o.info(`Registering dynamic controller for model: ${n} route: /${i}`);try{this.repo=this.repoFactory.for(e.name),this.pk=this.repo.pk}catch(t){this.log.error(`Failed to initialize repository for model "${e.name}".`,t)}}async create(t){const e=this.log.for(this.create);let o;e.verbose("creating new "+n);try{o=await this.repo.create(t)}catch(t){throw e.error("Failed to create new "+n,t),t}return e.info(`created new ${n} with id ${o[this.pk]}`),o}async read(t){const e=this.log.for(this.read);let o;try{e.debug(`reading ${n} with ${this.pk} ${t}`),o=await this.repo.read(t)}catch(o){throw e.error(`Failed to read ${n} with id ${t}`,o),o}return e.info(`read ${n} with id ${o[this.pk]}`),o}async query(t){const e=this.log.for(this.read);let o;try{e.debug(`Querying ${n} using method "${t}"`),o=await this.repo[t]()}catch(o){throw e.error(`Failed to query ${n} using method "${t}"`,o),o}return e.info(`Successfully queried ${n} using method "${t}"`),o}async update(t){const e=this.log.for(this.update);let o;try{e.info(`updating ${n} with ${this.pk} ${t[this.pk]}`),o=await this.repo.create(t)}catch(t){throw e.error(t),t}return o}async delete(t){const e=this.log.for(this.delete);let o;try{e.debug(`deleting ${n} with ${this.pk} ${t}`),o=await this.repo.read(t)}catch(o){throw e.error(`Failed to delete ${n} with id ${t}`,o),o}return e.info(`deleted ${n} with id ${o[this.pk]}`),o}};return y.__decorate([O(e,"POST"),h.ApiOperation({summary:`Create a new ${n}.`}),h.ApiBody({description:"Payload for "+n,schema:{$ref:h.getSchemaPath(e)}}),h.ApiCreatedResponse({description:n+" created successfully."}),h.ApiBadRequestResponse({description:"Payload validation failed."}),h.ApiUnprocessableEntityResponse({description:"Repository rejected the provided payload."}),y.__param(0,s.Body()),y.__metadata("design:type",Function),y.__metadata("design:paramtypes",[Object]),y.__metadata("design:returntype",Promise)],c.prototype,"create",null),y.__decorate([O(e,"GET",":id"),h.ApiOperation({summary:`Retrieve a ${n} record by id.`}),h.ApiParam({name:"id",description:"Primary key"}),h.ApiOkResponse({description:n+" retrieved successfully."}),h.ApiNotFoundResponse({description:`No ${n} record matches the provided identifier.`}),y.__param(0,s.Param("id")),y.__metadata("design:type",Function),y.__metadata("design:paramtypes",[String]),y.__metadata("design:returntype",Promise)],c.prototype,"read",null),y.__decorate([O(e,"GET","query/:method"),h.ApiOperation({summary:`Retrieve ${n} records by query.`}),h.ApiParam({name:"method",description:"Query method to be called"}),h.ApiOkResponse({description:n+" retrieved successfully."}),h.ApiNotFoundResponse({description:`No ${n} records matches the query.`}),y.__param(0,s.Param("method")),y.__metadata("design:type",Function),y.__metadata("design:paramtypes",[String]),y.__metadata("design:returntype",Promise)],c.prototype,"query",null),y.__decorate([O(e,"PUT",":id"),h.ApiOperation({summary:`Replace an existing ${n} record with a new payload.`}),h.ApiBody({description:"Payload for replace a existing record of "+n,schema:{$ref:h.getSchemaPath(e)}}),h.ApiOkResponse({description:e+" record replaced successfully."}),h.ApiNotFoundResponse({description:`No ${n} record matches the provided identifier.`}),h.ApiBadRequestResponse({description:"Payload validation failed."}),y.__param(0,s.Body()),y.__metadata("design:type",Function),y.__metadata("design:paramtypes",[r.Model]),y.__metadata("design:returntype",Promise)],c.prototype,"update",null),y.__decorate([O(e,"DELETE",":id"),h.ApiOperation({summary:`Delete a ${n} record by id.`}),h.ApiParam({name:"id",description:`Primary key value of the ${n} record to delete.`}),h.ApiOkResponse({description:n+" record deleted successfully."}),h.ApiNotFoundResponse({description:`No ${n} record matches the provided identifier.`}),y.__param(0,s.Param("id")),y.__metadata("design:type",Function),y.__metadata("design:paramtypes",[String]),y.__metadata("design:returntype",Promise)],c.prototype,"delete",null),c=y.__decorate([s.Controller(i),h.ApiTags(n),h.ApiExtraModels(e),y.__metadata("design:paramtypes",[t.RepoFactory])],c),c}static forRoot(e){const o=this.log.for(this.forRoot);o.info("Generating controllers for flavour...");const s=u.Adapter.models(e).map(this.toModelController.bind(this));return o.info(`Generated ${s.length} controllers`),{module:S,controllers:s,providers:[t.RepoFactory]}}};var D;I=S=y.__decorate([s.Module({})],I),t.DecafModule=D=class{static async forRootAsync(t){const{autoControllers:e}=t,o=(await C.createAdapter(t)).flavour,s=[C.forRoot(t)];return e&&s.push(I.forRoot(o)),{module:D,imports:s}}},t.DecafModule=D=y.__decorate([s.Module({})],t.DecafModule);class j extends u.ForbiddenError{constructor(t){super(t,j.name)}}class x{constructor(t,e){const o=e?.status??s.HttpStatus.INTERNAL_SERVER_ERROR,r=e?.message??"Internal Server Error",a=(e?.error??s.HttpStatus[o]??"HTTP_EXCEPTION").toString().toUpperCase();Object.assign(this,{status:o,message:r,error:a,timestamp:(new Date).toISOString(),path:t.url,method:t.method})}}class N extends Error{constructor(t="Unauthorized"){super(t),this.name="AuthorizationError",this.status=401,this.code="UNAUTHORIZED",Object.setPrototypeOf(this,N.prototype)}}t.AuthorizationExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),r=o.getRequest(),a=o.getResponse(),i=new x(r,{error:"UNAUTHORIZED",status:s.HttpStatus.UNAUTHORIZED,message:t.message});a.status(s.HttpStatus.UNAUTHORIZED).json(i)}},t.AuthorizationExceptionFilter=y.__decorate([s.Catch(N)],t.AuthorizationExceptionFilter);class v extends Error{constructor(t="Conflict"){super(t),this.name="ConflictError",this.status=409,this.code="CONFLICT",Object.setPrototypeOf(this,v.prototype)}}t.ConflictExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),r=o.getResponse(),a=o.getRequest(),i=new x(a,{status:s.HttpStatus.CONFLICT,message:t.message,error:"CONFLICT"});r.status(i.status).json(i)}},t.ConflictExceptionFilter=y.__decorate([s.Catch(v)],t.ConflictExceptionFilter),t.GlobalExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),r=o.getRequest(),a=o.getResponse();let i,n=s.HttpStatus.INTERNAL_SERVER_ERROR,c="Internal Server Error";if(t instanceof s.HttpException){const e=t.getResponse();n=t.getStatus(),c=(e?.message||t.message)??c,i=e?.error??t.name}else t instanceof Error&&(c=t.message,i=t.name);const p=new x(r,{status:n,message:c,error:i});a.status(p.status).json(p)}},t.GlobalExceptionFilter=y.__decorate([s.Catch()],t.GlobalExceptionFilter),t.HttpExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),s=o.getResponse(),r=o.getRequest(),a=t.getStatus(),i=new x(r,{status:a,message:t.message,error:t.name});s.status(i.status).json(i)}},t.HttpExceptionFilter=y.__decorate([s.Catch(s.HttpException)],t.HttpExceptionFilter);class M extends Error{constructor(t="Resource not found"){super(t),this.name="NotFoundError",this.status=404,this.code="NOT_FOUND",Object.setPrototypeOf(this,M.prototype)}}t.NotFoundExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),r=o.getResponse(),a=o.getRequest(),i=new x(a,{status:s.HttpStatus.NOT_FOUND,message:t.message,error:"NOT_FOUND"});r.status(i.status).json(i)}},t.NotFoundExceptionFilter=y.__decorate([s.Catch(M)],t.NotFoundExceptionFilter);class $ extends Error{constructor(t="Validation failed"){super(t),this.name="ValidationError",this.status=422,this.code="VALIDATION_ERROR",Object.setPrototypeOf(this,$.prototype)}}t.ValidationExceptionFilter=class{catch(t,e){const o=e.switchToHttp(),r=o.getResponse(),a=o.getRequest(),i=new x(a,{status:s.HttpStatus.UNPROCESSABLE_ENTITY,message:t.message,error:"VALIDATION_ERROR"});r.status(i.status).json(i)}},t.ValidationExceptionFilter=y.__decorate([s.Catch($)],t.ValidationExceptionFilter);const L={title:"Swagger | OpenAPI Specification (OAS)",description:"Standardized format for describing RESTful APIs",version:"0.0.1",path:"docs",faviconFilePath:"",topbarIconFilePath:"",auth:{type:"http",scheme:"bearer",bearerFormat:"JWT",name:"Authorization",description:"Enter JWT token",in:"header"},persistAuthorization:!0,topbarBgColor:"#000000"};class q{constructor(t){this.options={...t}}customCSS(){let t="";return this.options.topbarIconPath&&(t+=`.topbar-wrapper { content: url('data:image/png;base64,${this.b64(this.options.topbarIconPath)}'); width: 200px; height: auto; }\n`),t+`\n .topbar-wrapper svg { visibility: hidden; }\n .swagger-ui .topbar { background-color: ${this.options.topbarBgColor||L.topbarBgColor}; }\n `}getCustomOptions(){const t={};return this.options.faviconPath&&(t.customfavIcon=this.b64(this.options.faviconPath,!0)),{customSiteTitle:this.options.title,...t,customCss:this.customCSS(),swaggerOptions:{persistAuthorization:this.options.persistAuthorization},jsonDocumentUrl:this.options.path?this.options.path+"/spec.json":void 0,yamlDocumentUrl:this.options.path?this.options.path+"/spec.yaml":void 0}}b64(t,e=!1){const o=b.join(this.options.assetsPath||"",t),s=_.readFileSync(o,{encoding:"base64"});return e?"data:image/png;base64,"+s:s}}class H{constructor(t,e){this.app=t,this.options=e}createDocument(){const t=this.options.path?this.options.description+""+`<br><br><a href="${this.options.path}/spec.json">OpenAPI JSON Spec</a> | `+`<a href="${this.options.path}/spec.yaml">OpenAPI YAML Spec</a>`:this.options.description,e=(new h.DocumentBuilder).setTitle(this.options.title).setDescription(t).setVersion(this.options.version||"0.0.1").addBearerAuth(this.options.auth||L.auth).build();return h.SwaggerModule.createDocument(this.app,e,{extraModels:this.options.extraModels||[]})}setupSwagger(){const t=this.createDocument(),e=new q({title:this.options.title,path:this.options.path||L.path,persistAuthorization:this.options.persistAuthorization??!0,assetsPath:this.options.assetsPath,faviconPath:this.options.faviconFilePath,topbarIconPath:this.options.topbarIconFilePath,topbarBgColor:this.options.topbarBgColor});h.SwaggerModule.setup(this.options.path||L.path,this.app,t,{...e.getCustomOptions()})}}const U="##VERSION##",V="##PACKAGE_NAME##";e.Metadata.registerLibrary(V,U),t.ApiOperationFromModel=O,t.AuthorizationError=N,t.ConflictError=v,t.CorsError=j,t.DECAF_ADAPTER_ID=P,t.DECAF_MODULE_OPTIONS=T,t.HttpResponseError=x,t.NestBootstraper=class{static get logger(){return this._logger||(this._logger=new s.Logger("NestBootstrap")),this._logger}static initialize(t){return this.app=t,this}static enableLogger(t){return this._logger=t||new s.Logger("NestBootstrap"),this.app.useLogger(this._logger),this}static enableCors(t=[],e=["GET","POST","PUT","DELETE"]){const o="*"===t?"*":t.map(t=>t.trim().toLowerCase()),s={origin:(t,e)=>t?"*"===o||Array.isArray(o)&&o.includes(t.toLowerCase())?e(null,!0):void e(new j(`Origin ${t} not allowed`)):e(null,!0),credentials:!0,methods:e.join(",")};return this.app.enableCors(s),this}static useHelmet(t){try{const e=require("helmet");this.app.use(e(t)),this.logger.log("Helmet middleware enabled successfully.")}catch(t){this.logger.warn("Helmet not installed. Skipping middleware.")}return this}static setupSwagger(t){return new H(this.app,{title:t.title,description:t.description,version:t.version,path:t.path||"api",persistAuthorization:t.persistAuthorization??!0,assetsPath:t.assetsPath,faviconFilePath:t.faviconPath,topbarIconFilePath:t.topbarIconPath,topbarBgColor:t.topbarBgColor}).setupSwagger(),this}static useGlobalPipes(...t){return t.length>0&&this.app.useGlobalPipes(...t),this}static useGlobalFilters(...e){const o=[new t.HttpExceptionFilter,new t.ValidationExceptionFilter,new t.NotFoundExceptionFilter,new t.ConflictExceptionFilter,new t.AuthorizationExceptionFilter,new t.GlobalExceptionFilter];return this.app.useGlobalFilters(...e.length>0?e:o),this}static useGlobalInterceptors(...t){return t.length>0&&this.app.useGlobalInterceptors(...t),this}static async start(t=Number(process.env.PORT)||3e3,e=void 0,o=!0){this.app.listen(t,e).then(async()=>{if(o){const t=await this.app.getUrl();this.logger.log("\ud83d\ude80 Application is running at: "+t)}})}},t.NotFoundError=M,t.PACKAGE_NAME=V,t.SwaggerBuilder=H,t.VERSION=U,t.ValidationError=$,t.repoForModel=t=>{const e=r.Model.get(t);if(!e)throw new m.InternalError("Failed to find repository for "+t);return u.Repository.forModel(e)}},"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@decaf-ts/decoration"),require("@decaf-ts/injectable-decorators"),require("@nestjs/common"),require("@decaf-ts/decorator-validation"),require("@nestjs/swagger/dist/decorators/helpers"),require("@nestjs/swagger/dist/utils/enum.utils"),require("@nestjs/swagger/dist/constants"),require("@nestjs/common/constants"),require("@nestjs/common/utils/shared.utils"),require("lodash"),require("@nestjs/swagger/dist/plugin/plugin-constants"),require("@decaf-ts/core"),require("@nestjs/swagger"),require("@decaf-ts/reflection"),require("@decaf-ts/db-decorators"),require("tslib"),require("@nestjs/core"),require("@decaf-ts/logging"),require("fs"),require("path")):"function"==typeof define&&define.amd?define(["exports","@decaf-ts/decoration","@decaf-ts/injectable-decorators","@nestjs/common","@decaf-ts/decorator-validation","@nestjs/swagger/dist/decorators/helpers","@nestjs/swagger/dist/utils/enum.utils","@nestjs/swagger/dist/constants","@nestjs/common/constants","@nestjs/common/utils/shared.utils","lodash","@nestjs/swagger/dist/plugin/plugin-constants","@decaf-ts/core","@nestjs/swagger","@decaf-ts/reflection","@decaf-ts/db-decorators","tslib","@nestjs/core","@decaf-ts/logging","fs","path"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self)["for-nest"]={},t.decafTsDecoration,t.decafTsInjectableDecorators,t.nestjsCommon,t.decafTsDecoratorValidation,t.helpers,t.enum_utils,t.constants,0,0,t.lodash,t.pluginConstants,t.decafTsCore,t.nestjsSwagger,t.decafTsReflection,t.decafTsDbDecorators,t.tslib,t.nestjsCore,t.decafTsLogging,t.fs,t.path);
|
|
2
|
+
//# sourceMappingURL=for-nest.cjs.map
|