@nlabs/lex 1.59.5 → 2.0.1
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/.storybook/main.ts +3 -47
- package/README.md +13 -19
- package/__mocks__/build.js +3 -3
- package/config.json +3 -1
- package/examples/lex.config.js +3 -7
- package/lib/LexConfig.d.ts +2 -6
- package/lib/LexConfig.js +2 -2
- package/lib/commands/ai/ai.js +3 -3
- package/lib/commands/build/build.d.ts +5 -3
- package/lib/commands/build/build.js +66 -156
- package/lib/commands/config/config.js +9 -7
- package/lib/commands/dev/dev.d.ts +0 -2
- package/lib/commands/dev/dev.js +24 -115
- package/lib/commands/migrate/migrate.js +2 -2
- package/lib/commands/serverless-dev/serverless-dev.js +2 -2
- package/lib/commands/versions/versions.d.ts +1 -1
- package/lib/commands/versions/versions.js +4 -4
- package/lib/lex.js +10 -11
- package/lib/types.d.ts +1 -1
- package/lib/types.js +1 -1
- package/lib/utils/app.d.ts +0 -2
- package/lib/utils/app.js +2 -29
- package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
- package/lib/utils/assets/LexSvgSpritemap.js +219 -0
- package/lib/utils/file.d.ts +0 -4
- package/lib/utils/file.js +4 -100
- package/lib/utils/staticSite.d.ts +15 -0
- package/lib/utils/staticSite.js +80 -0
- package/lib/utils/vite/assets.d.ts +19 -0
- package/lib/utils/vite/assets.js +249 -0
- package/lib/utils/vite/config.d.ts +12 -0
- package/lib/utils/vite/config.js +272 -0
- package/package.json +14 -66
- package/postcss.config.js +1 -2
- package/tsconfig.lint.json +0 -1
- package/tsconfig.test.json +0 -1
- package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
- package/scripts/test-webpack.js +0 -453
- package/webpack.config.d.ts +0 -2
- package/webpack.config.js +0 -960
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { gzipSync } from 'zlib';
|
|
5
|
+
import favicons from 'favicons';
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from 'fs';
|
|
7
|
+
import { sync as globSync } from 'glob';
|
|
8
|
+
import { extname, join, relative, resolve } from 'path';
|
|
9
|
+
import sharp from 'sharp';
|
|
10
|
+
import { optimize } from 'svgo';
|
|
11
|
+
import { LexSvgSpritemap } from '../assets/LexSvgSpritemap.js';
|
|
12
|
+
const COMPRESSIBLE_FILE = /\.(css|html|js|json|svg|txt|xml)$/i;
|
|
13
|
+
const IMAGE_FILE = /\.(gif|jpe?g|png|svg|webp)$/i;
|
|
14
|
+
const MINIMUM_GZIP_SIZE = 8192;
|
|
15
|
+
const faviconCache = new Map();
|
|
16
|
+
const copyDirectory = (source, destination, exclude)=>{
|
|
17
|
+
if (!existsSync(source)) return;
|
|
18
|
+
for (const entry of readdirSync(source, {
|
|
19
|
+
withFileTypes: true
|
|
20
|
+
})){
|
|
21
|
+
const sourcePath = join(source, entry.name);
|
|
22
|
+
const destinationPath = join(destination, entry.name);
|
|
23
|
+
if (exclude?.test(sourcePath)) continue;
|
|
24
|
+
if (entry.isDirectory()) {
|
|
25
|
+
copyDirectory(sourcePath, destinationPath, exclude);
|
|
26
|
+
} else {
|
|
27
|
+
mkdirSync(resolve(destinationPath, '..'), {
|
|
28
|
+
recursive: true
|
|
29
|
+
});
|
|
30
|
+
writeFileSync(destinationPath, readFileSync(sourcePath));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const getAssetDirectories = (config)=>{
|
|
35
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
36
|
+
const staticPath = config.vite?.staticPath || './src/static';
|
|
37
|
+
return [
|
|
38
|
+
{
|
|
39
|
+
destination: '',
|
|
40
|
+
source: resolve(process.cwd(), staticPath)
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
destination: 'images',
|
|
44
|
+
source: resolve(sourcePath, 'images')
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
destination: 'fonts',
|
|
48
|
+
source: resolve(sourcePath, 'fonts')
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
destination: 'docs',
|
|
52
|
+
source: resolve(sourcePath, 'docs')
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
destination: 'icons',
|
|
56
|
+
exclude: /\.svg$/i,
|
|
57
|
+
source: resolve(sourcePath, 'icons')
|
|
58
|
+
}
|
|
59
|
+
];
|
|
60
|
+
};
|
|
61
|
+
export const generateLexFavicons = async (config)=>{
|
|
62
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
63
|
+
const logoPath = resolve(sourcePath, 'images/logo.png');
|
|
64
|
+
if (!existsSync(logoPath)) return null;
|
|
65
|
+
const modifiedAt = statSync(logoPath).mtimeMs;
|
|
66
|
+
const cached = faviconCache.get(logoPath);
|
|
67
|
+
if (cached?.modifiedAt === modifiedAt) return cached.response;
|
|
68
|
+
const generated = await favicons(logoPath, {
|
|
69
|
+
icons: {
|
|
70
|
+
android: true,
|
|
71
|
+
appleIcon: true,
|
|
72
|
+
appleStartup: false,
|
|
73
|
+
favicons: true,
|
|
74
|
+
windows: false,
|
|
75
|
+
yandex: false
|
|
76
|
+
},
|
|
77
|
+
path: '/'
|
|
78
|
+
});
|
|
79
|
+
const [openGraphImage, twitterImage] = await Promise.all([
|
|
80
|
+
sharp(logoPath).resize(1200, 630, {
|
|
81
|
+
fit: 'contain'
|
|
82
|
+
}).png().toBuffer(),
|
|
83
|
+
sharp(logoPath).resize(1200, 675, {
|
|
84
|
+
fit: 'contain'
|
|
85
|
+
}).png().toBuffer()
|
|
86
|
+
]);
|
|
87
|
+
const response = {
|
|
88
|
+
...generated,
|
|
89
|
+
html: [
|
|
90
|
+
...generated.html,
|
|
91
|
+
'<meta property="og:image" content="/open-graph.png">',
|
|
92
|
+
'<meta name="twitter:image" content="/twitter.png">'
|
|
93
|
+
],
|
|
94
|
+
images: [
|
|
95
|
+
...generated.images,
|
|
96
|
+
{
|
|
97
|
+
contents: openGraphImage,
|
|
98
|
+
name: 'open-graph.png'
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
contents: twitterImage,
|
|
102
|
+
name: 'twitter.png'
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
};
|
|
106
|
+
faviconCache.set(logoPath, {
|
|
107
|
+
modifiedAt,
|
|
108
|
+
response
|
|
109
|
+
});
|
|
110
|
+
return response;
|
|
111
|
+
};
|
|
112
|
+
export const copyLexWebAssets = async (config)=>{
|
|
113
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
114
|
+
for (const assetDirectory of getAssetDirectories(config)){
|
|
115
|
+
copyDirectory(assetDirectory.source, resolve(outputPath, assetDirectory.destination), assetDirectory.exclude);
|
|
116
|
+
}
|
|
117
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
118
|
+
const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
|
|
119
|
+
filename: 'icons/icons.svg',
|
|
120
|
+
prefix: false
|
|
121
|
+
}).buildSpritemap();
|
|
122
|
+
for (const warning of spritemap.warnings)console.warn(warning.message);
|
|
123
|
+
if (spritemap.content) {
|
|
124
|
+
const spritePath = resolve(outputPath, 'icons/icons.svg');
|
|
125
|
+
mkdirSync(resolve(spritePath, '..'), {
|
|
126
|
+
recursive: true
|
|
127
|
+
});
|
|
128
|
+
writeFileSync(spritePath, spritemap.content);
|
|
129
|
+
}
|
|
130
|
+
const generatedFavicons = await generateLexFavicons(config);
|
|
131
|
+
if (generatedFavicons) {
|
|
132
|
+
for (const image of generatedFavicons.images){
|
|
133
|
+
const imagePath = resolve(outputPath, image.name);
|
|
134
|
+
mkdirSync(resolve(imagePath, '..'), {
|
|
135
|
+
recursive: true
|
|
136
|
+
});
|
|
137
|
+
writeFileSync(imagePath, image.contents);
|
|
138
|
+
}
|
|
139
|
+
for (const file of generatedFavicons.files){
|
|
140
|
+
const filePath = resolve(outputPath, file.name);
|
|
141
|
+
mkdirSync(resolve(filePath, '..'), {
|
|
142
|
+
recursive: true
|
|
143
|
+
});
|
|
144
|
+
writeFileSync(filePath, file.contents);
|
|
145
|
+
}
|
|
146
|
+
const indexPath = resolve(outputPath, 'index.html');
|
|
147
|
+
if (existsSync(indexPath)) {
|
|
148
|
+
const html = readFileSync(indexPath, 'utf8');
|
|
149
|
+
const faviconHtml = generatedFavicons.html.join('\n ');
|
|
150
|
+
writeFileSync(indexPath, html.replace('</head>', ` ${faviconHtml}\n </head>`));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const optimizeImage = async (filePath)=>{
|
|
155
|
+
const extension = extname(filePath).toLowerCase();
|
|
156
|
+
const source = readFileSync(filePath);
|
|
157
|
+
if (extension === '.svg') {
|
|
158
|
+
const isSpritemap = filePath.endsWith('/icons/icons.svg');
|
|
159
|
+
const result = optimize(source.toString(), {
|
|
160
|
+
multipass: true,
|
|
161
|
+
path: filePath,
|
|
162
|
+
plugins: isSpritemap ? [
|
|
163
|
+
{
|
|
164
|
+
name: 'preset-default',
|
|
165
|
+
params: {
|
|
166
|
+
overrides: {
|
|
167
|
+
cleanupIds: false,
|
|
168
|
+
removeHiddenElems: false
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
] : [
|
|
173
|
+
'preset-default'
|
|
174
|
+
]
|
|
175
|
+
});
|
|
176
|
+
writeFileSync(filePath, result.data);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
let image = sharp(source);
|
|
180
|
+
if (extension === '.jpg' || extension === '.jpeg') image = image.jpeg({
|
|
181
|
+
progressive: true,
|
|
182
|
+
quality: 65
|
|
183
|
+
});
|
|
184
|
+
if (extension === '.png') image = image.png({
|
|
185
|
+
quality: 90
|
|
186
|
+
});
|
|
187
|
+
if (extension === '.webp') image = image.webp({
|
|
188
|
+
quality: 75
|
|
189
|
+
});
|
|
190
|
+
if (extension === '.gif') image = image.gif();
|
|
191
|
+
const optimized = await image.toBuffer();
|
|
192
|
+
if (optimized.length < source.length) writeFileSync(filePath, optimized);
|
|
193
|
+
};
|
|
194
|
+
export const optimizeLexWebAssets = async (config)=>{
|
|
195
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
196
|
+
if (!existsSync(outputPath)) return;
|
|
197
|
+
const imageFiles = globSync('**/*.{gif,jpg,jpeg,png,svg,webp}', {
|
|
198
|
+
absolute: true,
|
|
199
|
+
cwd: outputPath,
|
|
200
|
+
nodir: true
|
|
201
|
+
});
|
|
202
|
+
await Promise.all(imageFiles.filter((filePath)=>IMAGE_FILE.test(filePath)).map(optimizeImage));
|
|
203
|
+
};
|
|
204
|
+
export const compressLexWebAssets = (config)=>{
|
|
205
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
206
|
+
if (!existsSync(outputPath)) return;
|
|
207
|
+
const files = globSync('**/*', {
|
|
208
|
+
absolute: true,
|
|
209
|
+
cwd: outputPath,
|
|
210
|
+
nodir: true
|
|
211
|
+
});
|
|
212
|
+
for (const filePath of files){
|
|
213
|
+
if (!COMPRESSIBLE_FILE.test(filePath) || statSync(filePath).size < MINIMUM_GZIP_SIZE) continue;
|
|
214
|
+
writeFileSync(`${filePath}.gz`, gzipSync(readFileSync(filePath)));
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
export const getDevAsset = async (config, requestPath)=>{
|
|
218
|
+
const normalizedPath = requestPath.split('?')[0].replace(/^\/+/, '');
|
|
219
|
+
if (normalizedPath.includes('..')) return null;
|
|
220
|
+
if (normalizedPath === 'icons/icons.svg') {
|
|
221
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
222
|
+
const spritemap = new LexSvgSpritemap(resolve(sourcePath, 'icons/**/*.svg'), {
|
|
223
|
+
prefix: false
|
|
224
|
+
}).buildSpritemap();
|
|
225
|
+
return spritemap.content ? Buffer.from(spritemap.content) : null;
|
|
226
|
+
}
|
|
227
|
+
const generatedFavicons = await generateLexFavicons(config);
|
|
228
|
+
const generatedImage = generatedFavicons?.images.find(({ name })=>name === normalizedPath);
|
|
229
|
+
if (generatedImage) return generatedImage.contents;
|
|
230
|
+
const generatedFile = generatedFavicons?.files.find(({ name })=>name === normalizedPath);
|
|
231
|
+
if (generatedFile) return Buffer.from(generatedFile.contents);
|
|
232
|
+
for (const assetDirectory of getAssetDirectories(config)){
|
|
233
|
+
const prefix = assetDirectory.destination ? `${assetDirectory.destination}/` : '';
|
|
234
|
+
if (!normalizedPath.startsWith(prefix)) continue;
|
|
235
|
+
const relativePath = normalizedPath.slice(prefix.length);
|
|
236
|
+
const filePath = resolve(assetDirectory.source, relativePath);
|
|
237
|
+
if (filePath.startsWith(resolve(assetDirectory.source)) && existsSync(filePath) && statSync(filePath).isFile()) {
|
|
238
|
+
if (assetDirectory.exclude?.test(filePath)) continue;
|
|
239
|
+
return readFileSync(filePath);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
};
|
|
244
|
+
export const getAssetRelativePath = (config, filePath)=>{
|
|
245
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
246
|
+
return relative(outputPath, filePath);
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2Fzc2V0cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtnemlwU3luY30gZnJvbSAnemxpYic7XG5pbXBvcnQgZmF2aWNvbnMgZnJvbSAnZmF2aWNvbnMnO1xuaW1wb3J0IHtleGlzdHNTeW5jLCBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgcmVhZGRpclN5bmMsIHN0YXRTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQgc2hhcnAgZnJvbSAnc2hhcnAnO1xuaW1wb3J0IHtvcHRpbWl6ZX0gZnJvbSAnc3Znbyc7XG5cbmltcG9ydCB0eXBlIHtMZXhDb25maWdUeXBlfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtMZXhTdmdTcHJpdGVtYXB9IGZyb20gJy4uL2Fzc2V0cy9MZXhTdmdTcHJpdGVtYXAuanMnO1xuXG5jb25zdCBDT01QUkVTU0lCTEVfRklMRSA9IC9cXC4oY3NzfGh0bWx8anN8anNvbnxzdmd8dHh0fHhtbCkkL2k7XG5jb25zdCBJTUFHRV9GSUxFID0gL1xcLihnaWZ8anBlP2d8cG5nfHN2Z3x3ZWJwKSQvaTtcbmNvbnN0IE1JTklNVU1fR1pJUF9TSVpFID0gODE5MjtcblxuaW50ZXJmYWNlIEdlbmVyYXRlZEZhdmljb25zIHtcbiAgcmVhZG9ubHkgZmlsZXM6IFJlYWRvbmx5QXJyYXk8e2NvbnRlbnRzOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30+O1xuICByZWFkb25seSBodG1sOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgaW1hZ2VzOiBSZWFkb25seUFycmF5PHtjb250ZW50czogQnVmZmVyOyBuYW1lOiBzdHJpbmd9Pjtcbn1cblxuY29uc3QgZmF2aWNvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHttb2RpZmllZEF0OiBudW1iZXI7IHJlc3BvbnNlOiBHZW5lcmF0ZWRGYXZpY29uc30+KCk7XG5cbmNvbnN0IGNvcHlEaXJlY3RvcnkgPSAoc291cmNlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcsIGV4Y2x1ZGU/OiBSZWdFeHApOiB2b2lkID0+IHtcbiAgaWYoIWV4aXN0c1N5bmMoc291cmNlKSkgcmV0dXJuO1xuXG4gIGZvcihjb25zdCBlbnRyeSBvZiByZWFkZGlyU3luYyhzb3VyY2UsIHt3aXRoRmlsZVR5cGVzOiB0cnVlfSkpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gam9pbihzb3VyY2UsIGVudHJ5Lm5hbWUpO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uUGF0aCA9IGpvaW4oZGVzdGluYXRpb24sIGVudHJ5Lm5hbWUpO1xuXG4gICAgaWYoZXhjbHVkZT8udGVzdChzb3VyY2VQYXRoKSkgY29udGludWU7XG5cbiAgICBpZihlbnRyeS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBjb3B5RGlyZWN0b3J5KHNvdXJjZVBhdGgsIGRlc3RpbmF0aW9uUGF0aCwgZXhjbHVkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1rZGlyU3luYyhyZXNvbHZlKGRlc3RpbmF0aW9uUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZGVzdGluYXRpb25QYXRoLCByZWFkRmlsZVN5bmMoc291cmNlUGF0aCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgZ2V0QXNzZXREaXJlY3RvcmllcyA9IChjb25maWc6IExleENvbmZpZ1R5cGUpOiBBcnJheTx7ZGVzdGluYXRpb246IHN0cmluZzsgZXhjbHVkZT86IFJlZ0V4cDsgc291cmNlOiBzdHJpbmd9PiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3Qgc3RhdGljUGF0aCA9IGNvbmZpZy52aXRlPy5zdGF0aWNQYXRoIHx8ICcuL3NyYy9zdGF0aWMnO1xuXG4gIHJldHVybiBbXG4gICAge2Rlc3RpbmF0aW9uOiAnJywgc291cmNlOiByZXNvbHZlKHByb2Nlc3MuY3dkKCksIHN0YXRpY1BhdGgpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpbWFnZXMnLCBzb3VyY2U6IHJlc29sdmUoc291cmNlUGF0aCwgJ2ltYWdlcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdmb250cycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZm9udHMnKX0sXG4gICAge2Rlc3RpbmF0aW9uOiAnZG9jcycsIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnZG9jcycpfSxcbiAgICB7ZGVzdGluYXRpb246ICdpY29ucycsIGV4Y2x1ZGU6IC9cXC5zdmckL2ksIHNvdXJjZTogcmVzb2x2ZShzb3VyY2VQYXRoLCAnaWNvbnMnKX1cbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUxleEZhdmljb25zID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSk6IFByb21pc2U8R2VuZXJhdGVkRmF2aWNvbnMgfCBudWxsPiA9PiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBjb25maWcuc291cmNlRnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcuc291cmNlUGF0aCB8fCAnLi9zcmMnKTtcbiAgY29uc3QgbG9nb1BhdGggPSByZXNvbHZlKHNvdXJjZVBhdGgsICdpbWFnZXMvbG9nby5wbmcnKTtcblxuICBpZighZXhpc3RzU3luYyhsb2dvUGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IG1vZGlmaWVkQXQgPSBzdGF0U3luYyhsb2dvUGF0aCkubXRpbWVNcztcbiAgY29uc3QgY2FjaGVkID0gZmF2aWNvbkNhY2hlLmdldChsb2dvUGF0aCk7XG4gIGlmKGNhY2hlZD8ubW9kaWZpZWRBdCA9PT0gbW9kaWZpZWRBdCkgcmV0dXJuIGNhY2hlZC5yZXNwb25zZTtcblxuICBjb25zdCBnZW5lcmF0ZWQgPSBhd2FpdCBmYXZpY29ucyhsb2dvUGF0aCwge1xuICAgIGljb25zOiB7XG4gICAgICBhbmRyb2lkOiB0cnVlLFxuICAgICAgYXBwbGVJY29uOiB0cnVlLFxuICAgICAgYXBwbGVTdGFydHVwOiBmYWxzZSxcbiAgICAgIGZhdmljb25zOiB0cnVlLFxuICAgICAgd2luZG93czogZmFsc2UsXG4gICAgICB5YW5kZXg6IGZhbHNlXG4gICAgfSxcbiAgICBwYXRoOiAnLydcbiAgfSk7XG4gIGNvbnN0IFtvcGVuR3JhcGhJbWFnZSwgdHdpdHRlckltYWdlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDYzMCwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKSxcbiAgICBzaGFycChsb2dvUGF0aCkucmVzaXplKDEyMDAsIDY3NSwge2ZpdDogJ2NvbnRhaW4nfSkucG5nKCkudG9CdWZmZXIoKVxuICBdKTtcbiAgY29uc3QgcmVzcG9uc2U6IEdlbmVyYXRlZEZhdmljb25zID0ge1xuICAgIC4uLmdlbmVyYXRlZCxcbiAgICBodG1sOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaHRtbCxcbiAgICAgICc8bWV0YSBwcm9wZXJ0eT1cIm9nOmltYWdlXCIgY29udGVudD1cIi9vcGVuLWdyYXBoLnBuZ1wiPicsXG4gICAgICAnPG1ldGEgbmFtZT1cInR3aXR0ZXI6aW1hZ2VcIiBjb250ZW50PVwiL3R3aXR0ZXIucG5nXCI+J1xuICAgIF0sXG4gICAgaW1hZ2VzOiBbXG4gICAgICAuLi5nZW5lcmF0ZWQuaW1hZ2VzLFxuICAgICAge2NvbnRlbnRzOiBvcGVuR3JhcGhJbWFnZSwgbmFtZTogJ29wZW4tZ3JhcGgucG5nJ30sXG4gICAgICB7Y29udGVudHM6IHR3aXR0ZXJJbWFnZSwgbmFtZTogJ3R3aXR0ZXIucG5nJ31cbiAgICBdXG4gIH07XG4gIGZhdmljb25DYWNoZS5zZXQobG9nb1BhdGgsIHttb2RpZmllZEF0LCByZXNwb25zZX0pO1xuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY29weUxleFdlYkFzc2V0cyA9IGFzeW5jIChjb25maWc6IExleENvbmZpZ1R5cGUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IGNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5vdXRwdXRQYXRoIHx8ICcuL2xpYicpO1xuXG4gIGZvcihjb25zdCBhc3NldERpcmVjdG9yeSBvZiBnZXRBc3NldERpcmVjdG9yaWVzKGNvbmZpZykpIHtcbiAgICBjb3B5RGlyZWN0b3J5KGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVzb2x2ZShvdXRwdXRQYXRoLCBhc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbiksIGFzc2V0RGlyZWN0b3J5LmV4Y2x1ZGUpO1xuICB9XG5cbiAgY29uc3Qgc291cmNlUGF0aCA9IGNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCByZXNvbHZlKHByb2Nlc3MuY3dkKCksIGNvbmZpZy5zb3VyY2VQYXRoIHx8ICcuL3NyYycpO1xuICBjb25zdCBzcHJpdGVtYXAgPSBuZXcgTGV4U3ZnU3ByaXRlbWFwKHJlc29sdmUoc291cmNlUGF0aCwgJ2ljb25zLyoqLyouc3ZnJyksIHtcbiAgICBmaWxlbmFtZTogJ2ljb25zL2ljb25zLnN2ZycsXG4gICAgcHJlZml4OiBmYWxzZVxuICB9KS5idWlsZFNwcml0ZW1hcCgpO1xuXG4gIGZvcihjb25zdCB3YXJuaW5nIG9mIHNwcml0ZW1hcC53YXJuaW5ncykgY29uc29sZS53YXJuKHdhcm5pbmcubWVzc2FnZSk7XG5cbiAgaWYoc3ByaXRlbWFwLmNvbnRlbnQpIHtcbiAgICBjb25zdCBzcHJpdGVQYXRoID0gcmVzb2x2ZShvdXRwdXRQYXRoLCAnaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgbWtkaXJTeW5jKHJlc29sdmUoc3ByaXRlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICB3cml0ZUZpbGVTeW5jKHNwcml0ZVBhdGgsIHNwcml0ZW1hcC5jb250ZW50KTtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBpZihnZW5lcmF0ZWRGYXZpY29ucykge1xuICAgIGZvcihjb25zdCBpbWFnZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5pbWFnZXMpIHtcbiAgICAgIGNvbnN0IGltYWdlUGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgaW1hZ2UubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShpbWFnZVBhdGgsICcuLicpLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGltYWdlUGF0aCwgaW1hZ2UuY29udGVudHMpO1xuICAgIH1cbiAgICBmb3IoY29uc3QgZmlsZSBvZiBnZW5lcmF0ZWRGYXZpY29ucy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKG91dHB1dFBhdGgsIGZpbGUubmFtZSk7XG4gICAgICBta2RpclN5bmMocmVzb2x2ZShmaWxlUGF0aCwgJy4uJyksIHtyZWN1cnNpdmU6IHRydWV9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIGZpbGUuY29udGVudHMpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGV4UGF0aCA9IHJlc29sdmUob3V0cHV0UGF0aCwgJ2luZGV4Lmh0bWwnKTtcbiAgICBpZihleGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICAgIGNvbnN0IGh0bWwgPSByZWFkRmlsZVN5bmMoaW5kZXhQYXRoLCAndXRmOCcpO1xuICAgICAgY29uc3QgZmF2aWNvbkh0bWwgPSBnZW5lcmF0ZWRGYXZpY29ucy5odG1sLmpvaW4oJ1xcbiAgICAnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoaW5kZXhQYXRoLCBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWx9XFxuICA8L2hlYWQ+YCkpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3Qgb3B0aW1pemVJbWFnZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG5cbiAgaWYoZXh0ZW5zaW9uID09PSAnLnN2ZycpIHtcbiAgICBjb25zdCBpc1Nwcml0ZW1hcCA9IGZpbGVQYXRoLmVuZHNXaXRoKCcvaWNvbnMvaWNvbnMuc3ZnJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gb3B0aW1pemUoc291cmNlLnRvU3RyaW5nKCksIHtcbiAgICAgIG11bHRpcGFzczogdHJ1ZSxcbiAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgcGx1Z2luczogaXNTcHJpdGVtYXBcbiAgICAgICAgPyBbe25hbWU6ICdwcmVzZXQtZGVmYXVsdCcsIHBhcmFtczoge292ZXJyaWRlczoge2NsZWFudXBJZHM6IGZhbHNlLCByZW1vdmVIaWRkZW5FbGVtczogZmFsc2V9fX1dXG4gICAgICAgIDogWydwcmVzZXQtZGVmYXVsdCddXG4gICAgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgcmVzdWx0LmRhdGEpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpbWFnZSA9IHNoYXJwKHNvdXJjZSk7XG4gIGlmKGV4dGVuc2lvbiA9PT0gJy5qcGcnIHx8IGV4dGVuc2lvbiA9PT0gJy5qcGVnJykgaW1hZ2UgPSBpbWFnZS5qcGVnKHtwcm9ncmVzc2l2ZTogdHJ1ZSwgcXVhbGl0eTogNjV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLnBuZycpIGltYWdlID0gaW1hZ2UucG5nKHtxdWFsaXR5OiA5MH0pO1xuICBpZihleHRlbnNpb24gPT09ICcud2VicCcpIGltYWdlID0gaW1hZ2Uud2VicCh7cXVhbGl0eTogNzV9KTtcbiAgaWYoZXh0ZW5zaW9uID09PSAnLmdpZicpIGltYWdlID0gaW1hZ2UuZ2lmKCk7XG5cbiAgY29uc3Qgb3B0aW1pemVkID0gYXdhaXQgaW1hZ2UudG9CdWZmZXIoKTtcbiAgaWYob3B0aW1pemVkLmxlbmd0aCA8IHNvdXJjZS5sZW5ndGgpIHdyaXRlRmlsZVN5bmMoZmlsZVBhdGgsIG9wdGltaXplZCk7XG59O1xuXG5leHBvcnQgY29uc3Qgb3B0aW1pemVMZXhXZWJBc3NldHMgPSBhc3luYyAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBpbWFnZUZpbGVzID0gZ2xvYlN5bmMoJyoqLyoue2dpZixqcGcsanBlZyxwbmcsc3ZnLHdlYnB9Jywge1xuICAgIGFic29sdXRlOiB0cnVlLFxuICAgIGN3ZDogb3V0cHV0UGF0aCxcbiAgICBub2RpcjogdHJ1ZVxuICB9KTtcblxuICBhd2FpdCBQcm9taXNlLmFsbChpbWFnZUZpbGVzLmZpbHRlcigoZmlsZVBhdGgpID0+IElNQUdFX0ZJTEUudGVzdChmaWxlUGF0aCkpLm1hcChvcHRpbWl6ZUltYWdlKSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29tcHJlc3NMZXhXZWJBc3NldHMgPSAoY29uZmlnOiBMZXhDb25maWdUeXBlKTogdm9pZCA9PiB7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgaWYoIWV4aXN0c1N5bmMob3V0cHV0UGF0aCkpIHJldHVybjtcblxuICBjb25zdCBmaWxlcyA9IGdsb2JTeW5jKCcqKi8qJywge2Fic29sdXRlOiB0cnVlLCBjd2Q6IG91dHB1dFBhdGgsIG5vZGlyOiB0cnVlfSk7XG4gIGZvcihjb25zdCBmaWxlUGF0aCBvZiBmaWxlcykge1xuICAgIGlmKCFDT01QUkVTU0lCTEVfRklMRS50ZXN0KGZpbGVQYXRoKSB8fCBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA8IE1JTklNVU1fR1pJUF9TSVpFKSBjb250aW51ZTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke2ZpbGVQYXRofS5nemAsIGd6aXBTeW5jKHJlYWRGaWxlU3luYyhmaWxlUGF0aCkpKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldERldkFzc2V0ID0gYXN5bmMgKGNvbmZpZzogTGV4Q29uZmlnVHlwZSwgcmVxdWVzdFBhdGg6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4gPT4ge1xuICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcXVlc3RQYXRoLnNwbGl0KCc/JylbMF0ucmVwbGFjZSgvXlxcLysvLCAnJyk7XG4gIGlmKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcuLicpKSByZXR1cm4gbnVsbDtcblxuICBpZihub3JtYWxpemVkUGF0aCA9PT0gJ2ljb25zL2ljb25zLnN2ZycpIHtcbiAgICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gICAgY29uc3Qgc3ByaXRlbWFwID0gbmV3IExleFN2Z1Nwcml0ZW1hcChyZXNvbHZlKHNvdXJjZVBhdGgsICdpY29ucy8qKi8qLnN2ZycpLCB7cHJlZml4OiBmYWxzZX0pLmJ1aWxkU3ByaXRlbWFwKCk7XG4gICAgcmV0dXJuIHNwcml0ZW1hcC5jb250ZW50ID8gQnVmZmVyLmZyb20oc3ByaXRlbWFwLmNvbnRlbnQpIDogbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGdlbmVyYXRlZEZhdmljb25zID0gYXdhaXQgZ2VuZXJhdGVMZXhGYXZpY29ucyhjb25maWcpO1xuICBjb25zdCBnZW5lcmF0ZWRJbWFnZSA9IGdlbmVyYXRlZEZhdmljb25zPy5pbWFnZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEltYWdlKSByZXR1cm4gZ2VuZXJhdGVkSW1hZ2UuY29udGVudHM7XG4gIGNvbnN0IGdlbmVyYXRlZEZpbGUgPSBnZW5lcmF0ZWRGYXZpY29ucz8uZmlsZXMuZmluZCgoe25hbWV9KSA9PiBuYW1lID09PSBub3JtYWxpemVkUGF0aCk7XG4gIGlmKGdlbmVyYXRlZEZpbGUpIHJldHVybiBCdWZmZXIuZnJvbShnZW5lcmF0ZWRGaWxlLmNvbnRlbnRzKTtcblxuICBmb3IoY29uc3QgYXNzZXREaXJlY3Rvcnkgb2YgZ2V0QXNzZXREaXJlY3Rvcmllcyhjb25maWcpKSB7XG4gICAgY29uc3QgcHJlZml4ID0gYXNzZXREaXJlY3RvcnkuZGVzdGluYXRpb24gPyBgJHthc3NldERpcmVjdG9yeS5kZXN0aW5hdGlvbn0vYCA6ICcnO1xuICAgIGlmKCFub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKHByZWZpeCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gbm9ybWFsaXplZFBhdGguc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgY29uc3QgZmlsZVBhdGggPSByZXNvbHZlKGFzc2V0RGlyZWN0b3J5LnNvdXJjZSwgcmVsYXRpdmVQYXRoKTtcbiAgICBpZihmaWxlUGF0aC5zdGFydHNXaXRoKHJlc29sdmUoYXNzZXREaXJlY3Rvcnkuc291cmNlKSkgJiYgZXhpc3RzU3luYyhmaWxlUGF0aCkgJiYgc3RhdFN5bmMoZmlsZVBhdGgpLmlzRmlsZSgpKSB7XG4gICAgICBpZihhc3NldERpcmVjdG9yeS5leGNsdWRlPy50ZXN0KGZpbGVQYXRoKSkgY29udGludWU7XG4gICAgICByZXR1cm4gcmVhZEZpbGVTeW5jKGZpbGVQYXRoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBc3NldFJlbGF0aXZlUGF0aCA9IChjb25maWc6IExleENvbmZpZ1R5cGUsIGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBvdXRwdXRQYXRoID0gY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLm91dHB1dFBhdGggfHwgJy4vbGliJyk7XG4gIHJldHVybiByZWxhdGl2ZShvdXRwdXRQYXRoLCBmaWxlUGF0aCk7XG59O1xuIl0sIm5hbWVzIjpbImd6aXBTeW5jIiwiZmF2aWNvbnMiLCJleGlzdHNTeW5jIiwibWtkaXJTeW5jIiwicmVhZEZpbGVTeW5jIiwicmVhZGRpclN5bmMiLCJzdGF0U3luYyIsIndyaXRlRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJleHRuYW1lIiwiam9pbiIsInJlbGF0aXZlIiwicmVzb2x2ZSIsInNoYXJwIiwib3B0aW1pemUiLCJMZXhTdmdTcHJpdGVtYXAiLCJDT01QUkVTU0lCTEVfRklMRSIsIklNQUdFX0ZJTEUiLCJNSU5JTVVNX0daSVBfU0laRSIsImZhdmljb25DYWNoZSIsIk1hcCIsImNvcHlEaXJlY3RvcnkiLCJzb3VyY2UiLCJkZXN0aW5hdGlvbiIsImV4Y2x1ZGUiLCJlbnRyeSIsIndpdGhGaWxlVHlwZXMiLCJzb3VyY2VQYXRoIiwibmFtZSIsImRlc3RpbmF0aW9uUGF0aCIsInRlc3QiLCJpc0RpcmVjdG9yeSIsInJlY3Vyc2l2ZSIsImdldEFzc2V0RGlyZWN0b3JpZXMiLCJjb25maWciLCJzb3VyY2VGdWxsUGF0aCIsInByb2Nlc3MiLCJjd2QiLCJzdGF0aWNQYXRoIiwidml0ZSIsImdlbmVyYXRlTGV4RmF2aWNvbnMiLCJsb2dvUGF0aCIsIm1vZGlmaWVkQXQiLCJtdGltZU1zIiwiY2FjaGVkIiwiZ2V0IiwicmVzcG9uc2UiLCJnZW5lcmF0ZWQiLCJpY29ucyIsImFuZHJvaWQiLCJhcHBsZUljb24iLCJhcHBsZVN0YXJ0dXAiLCJ3aW5kb3dzIiwieWFuZGV4IiwicGF0aCIsIm9wZW5HcmFwaEltYWdlIiwidHdpdHRlckltYWdlIiwiUHJvbWlzZSIsImFsbCIsInJlc2l6ZSIsImZpdCIsInBuZyIsInRvQnVmZmVyIiwiaHRtbCIsImltYWdlcyIsImNvbnRlbnRzIiwic2V0IiwiY29weUxleFdlYkFzc2V0cyIsIm91dHB1dFBhdGgiLCJvdXRwdXRGdWxsUGF0aCIsImFzc2V0RGlyZWN0b3J5Iiwic3ByaXRlbWFwIiwiZmlsZW5hbWUiLCJwcmVmaXgiLCJidWlsZFNwcml0ZW1hcCIsIndhcm5pbmciLCJ3YXJuaW5ncyIsImNvbnNvbGUiLCJ3YXJuIiwibWVzc2FnZSIsImNvbnRlbnQiLCJzcHJpdGVQYXRoIiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJpbWFnZSIsImltYWdlUGF0aCIsImZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiaW5kZXhQYXRoIiwiZmF2aWNvbkh0bWwiLCJyZXBsYWNlIiwib3B0aW1pemVJbWFnZSIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwiaXNTcHJpdGVtYXAiLCJlbmRzV2l0aCIsInJlc3VsdCIsInRvU3RyaW5nIiwibXVsdGlwYXNzIiwicGx1Z2lucyIsInBhcmFtcyIsIm92ZXJyaWRlcyIsImNsZWFudXBJZHMiLCJyZW1vdmVIaWRkZW5FbGVtcyIsImRhdGEiLCJqcGVnIiwicHJvZ3Jlc3NpdmUiLCJxdWFsaXR5Iiwid2VicCIsImdpZiIsIm9wdGltaXplZCIsImxlbmd0aCIsIm9wdGltaXplTGV4V2ViQXNzZXRzIiwiaW1hZ2VGaWxlcyIsImFic29sdXRlIiwibm9kaXIiLCJmaWx0ZXIiLCJtYXAiLCJjb21wcmVzc0xleFdlYkFzc2V0cyIsInNpemUiLCJnZXREZXZBc3NldCIsInJlcXVlc3RQYXRoIiwibm9ybWFsaXplZFBhdGgiLCJzcGxpdCIsImluY2x1ZGVzIiwiQnVmZmVyIiwiZnJvbSIsImdlbmVyYXRlZEltYWdlIiwiZmluZCIsImdlbmVyYXRlZEZpbGUiLCJzdGFydHNXaXRoIiwicmVsYXRpdmVQYXRoIiwic2xpY2UiLCJpc0ZpbGUiLCJnZXRBc3NldFJlbGF0aXZlUGF0aCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsUUFBUSxRQUFPLE9BQU87QUFDOUIsT0FBT0MsY0FBYyxXQUFXO0FBQ2hDLFNBQVFDLFVBQVUsRUFBRUMsU0FBUyxFQUFFQyxZQUFZLEVBQUVDLFdBQVcsRUFBRUMsUUFBUSxFQUFFQyxhQUFhLFFBQU8sS0FBSztBQUM3RixTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxPQUFPLEVBQUVDLElBQUksRUFBRUMsUUFBUSxFQUFFQyxPQUFPLFFBQU8sT0FBTztBQUN0RCxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBUUMsUUFBUSxRQUFPLE9BQU87QUFHOUIsU0FBUUMsZUFBZSxRQUFPLCtCQUErQjtBQUU3RCxNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsYUFBYTtBQUNuQixNQUFNQyxvQkFBb0I7QUFRMUIsTUFBTUMsZUFBZSxJQUFJQztBQUV6QixNQUFNQyxnQkFBZ0IsQ0FBQ0MsUUFBZ0JDLGFBQXFCQztJQUMxRCxJQUFHLENBQUN2QixXQUFXcUIsU0FBUztJQUV4QixLQUFJLE1BQU1HLFNBQVNyQixZQUFZa0IsUUFBUTtRQUFDSSxlQUFlO0lBQUksR0FBSTtRQUM3RCxNQUFNQyxhQUFhakIsS0FBS1ksUUFBUUcsTUFBTUcsSUFBSTtRQUMxQyxNQUFNQyxrQkFBa0JuQixLQUFLYSxhQUFhRSxNQUFNRyxJQUFJO1FBRXBELElBQUdKLFNBQVNNLEtBQUtILGFBQWE7UUFFOUIsSUFBR0YsTUFBTU0sV0FBVyxJQUFJO1lBQ3RCVixjQUFjTSxZQUFZRSxpQkFB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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { InlineConfig } from 'vite';
|
|
2
|
+
export interface LexViteOptions {
|
|
3
|
+
readonly analyze?: boolean;
|
|
4
|
+
readonly command: 'build' | 'serve';
|
|
5
|
+
readonly entry?: string;
|
|
6
|
+
readonly mode?: string;
|
|
7
|
+
readonly open?: boolean;
|
|
8
|
+
readonly port?: number;
|
|
9
|
+
readonly quiet?: boolean;
|
|
10
|
+
readonly ssr?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare const createLexViteConfig: (options: LexViteOptions) => InlineConfig;
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-Present, Nitrogen Labs, Inc.
|
|
3
|
+
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
+
*/ import { transform } from '@swc/core';
|
|
5
|
+
import inject from '@rollup/plugin-inject';
|
|
6
|
+
import { existsSync, readFileSync } from 'fs';
|
|
7
|
+
import { extname, resolve } from 'path';
|
|
8
|
+
import { mergeConfig } from 'vite';
|
|
9
|
+
import { LexConfig } from '../../LexConfig.js';
|
|
10
|
+
import { generateLexFavicons, getDevAsset } from './assets.js';
|
|
11
|
+
const createInjectPlugin = inject;
|
|
12
|
+
const contentTypes = {
|
|
13
|
+
'.css': 'text/css',
|
|
14
|
+
'.gif': 'image/gif',
|
|
15
|
+
'.html': 'text/html',
|
|
16
|
+
'.ico': 'image/x-icon',
|
|
17
|
+
'.jpeg': 'image/jpeg',
|
|
18
|
+
'.jpg': 'image/jpeg',
|
|
19
|
+
'.json': 'application/json',
|
|
20
|
+
'.png': 'image/png',
|
|
21
|
+
'.svg': 'image/svg+xml',
|
|
22
|
+
'.ttf': 'font/ttf',
|
|
23
|
+
'.txt': 'text/plain',
|
|
24
|
+
'.woff': 'font/woff',
|
|
25
|
+
'.woff2': 'font/woff2'
|
|
26
|
+
};
|
|
27
|
+
const emptyCryptoPlugin = ()=>({
|
|
28
|
+
load (id) {
|
|
29
|
+
return id === '\0lex-empty-crypto' ? 'export default {}; export const webcrypto = undefined;' : null;
|
|
30
|
+
},
|
|
31
|
+
name: 'lex-empty-crypto',
|
|
32
|
+
resolveId (id) {
|
|
33
|
+
return id === 'crypto' || id === 'node:crypto' ? '\0lex-empty-crypto' : null;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const nodePolyfillModules = {
|
|
37
|
+
assert: 'assert/build/assert.js',
|
|
38
|
+
buffer: 'buffer/index.js',
|
|
39
|
+
http: 'stream-http/index.js',
|
|
40
|
+
https: 'https-browserify/index.js',
|
|
41
|
+
os: 'os-browserify/browser.js',
|
|
42
|
+
path: 'path-browserify/index.js',
|
|
43
|
+
process: 'process/browser.js',
|
|
44
|
+
stream: 'stream-browserify/index.js',
|
|
45
|
+
util: 'util/util.js',
|
|
46
|
+
vm: 'vm-browserify/index.js'
|
|
47
|
+
};
|
|
48
|
+
const nodePolyfillsPlugin = ()=>({
|
|
49
|
+
name: 'lex-node-polyfills',
|
|
50
|
+
resolveId (id) {
|
|
51
|
+
const moduleName = id.startsWith('node:') ? id.slice(5) : id;
|
|
52
|
+
const replacement = nodePolyfillModules[moduleName];
|
|
53
|
+
return replacement ? resolveProjectPackage(replacement) : null;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
const graphqlPlugin = ()=>({
|
|
57
|
+
load (id) {
|
|
58
|
+
if (!/\.(gql|graphql)$/.test(id)) return null;
|
|
59
|
+
const source = JSON.stringify(readFileSync(id, 'utf8'));
|
|
60
|
+
return `import gql from 'graphql-tag'; export default gql(${source});`;
|
|
61
|
+
},
|
|
62
|
+
name: 'lex-graphql'
|
|
63
|
+
});
|
|
64
|
+
const swcPlugin = (sourcePath)=>({
|
|
65
|
+
enforce: 'pre',
|
|
66
|
+
async transform (source, id) {
|
|
67
|
+
const cleanId = id.split('?')[0];
|
|
68
|
+
if (!cleanId.startsWith(sourcePath) || !/\.[jt]sx?$/.test(cleanId) || /\.(test|spec|integration|e2e)\.[jt]sx?$/.test(cleanId)) return null;
|
|
69
|
+
const swcConfig = LexConfig.getSWCConfigWithReactCompiler();
|
|
70
|
+
const result = await transform(source, {
|
|
71
|
+
...swcConfig,
|
|
72
|
+
filename: cleanId,
|
|
73
|
+
module: {
|
|
74
|
+
...swcConfig?.module,
|
|
75
|
+
type: 'es6'
|
|
76
|
+
},
|
|
77
|
+
sourceMaps: true
|
|
78
|
+
});
|
|
79
|
+
const needsReact = /\bReact\s*\./.test(result.code) && !/from\s+['"]react['"]/.test(result.code);
|
|
80
|
+
return {
|
|
81
|
+
code: needsReact ? `import React from 'react';\n${result.code}` : result.code,
|
|
82
|
+
map: result.map || null
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
name: 'lex-swc'
|
|
86
|
+
});
|
|
87
|
+
const importMetaCompatibilityPlugin = (sourcePath)=>({
|
|
88
|
+
enforce: 'post',
|
|
89
|
+
name: 'lex-import-meta-compatibility',
|
|
90
|
+
transform (source, id) {
|
|
91
|
+
const cleanId = id.split('?')[0];
|
|
92
|
+
if (!cleanId.startsWith(sourcePath) || !source.includes('import.meta.url')) return null;
|
|
93
|
+
const replacement = '(typeof document !== "undefined" && document.currentScript && document.currentScript.src ? new URL(document.currentScript.src, window.location.href).href : (typeof window !== "undefined" ? new URL("", window.location.href).href : ""))';
|
|
94
|
+
return source.replaceAll('import.meta.url', replacement);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const assetsDevPlugin = ()=>{
|
|
98
|
+
let faviconHtml = [];
|
|
99
|
+
return {
|
|
100
|
+
async buildStart () {
|
|
101
|
+
const generatedFavicons = await generateLexFavicons(LexConfig.config);
|
|
102
|
+
faviconHtml = generatedFavicons?.html || [];
|
|
103
|
+
},
|
|
104
|
+
configureServer (server) {
|
|
105
|
+
server.middlewares.use(async (request, response, next)=>{
|
|
106
|
+
if (!request.url) return next();
|
|
107
|
+
const asset = await getDevAsset(LexConfig.config, request.url);
|
|
108
|
+
if (!asset) return next();
|
|
109
|
+
response.statusCode = 200;
|
|
110
|
+
response.setHeader('Content-Type', contentTypes[extname(request.url.split('?')[0])] || 'application/octet-stream');
|
|
111
|
+
response.end(asset);
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
name: 'lex-assets-dev',
|
|
115
|
+
transformIndexHtml (html) {
|
|
116
|
+
if (faviconHtml.length === 0) return html;
|
|
117
|
+
return html.replace('</head>', ` ${faviconHtml.join('\n ')}\n </head>`);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
const analyzerPlugin = (enabled)=>({
|
|
122
|
+
generateBundle (_options, bundle) {
|
|
123
|
+
if (!enabled) return;
|
|
124
|
+
const report = Object.entries(bundle).map(([fileName, output])=>({
|
|
125
|
+
fileName,
|
|
126
|
+
size: output.type === 'asset' ? Buffer.byteLength(typeof output.source === 'string' ? output.source : output.source) : Buffer.byteLength(output.code),
|
|
127
|
+
type: output.type
|
|
128
|
+
}));
|
|
129
|
+
this.emitFile({
|
|
130
|
+
fileName: 'bundle-report.json',
|
|
131
|
+
source: JSON.stringify(report, null, 2),
|
|
132
|
+
type: 'asset'
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
name: 'lex-bundle-analyzer'
|
|
136
|
+
});
|
|
137
|
+
const getLibraryFormats = (libraryTarget)=>{
|
|
138
|
+
if (libraryTarget === 'commonjs' || libraryTarget === 'commonjs2') return [
|
|
139
|
+
'cjs'
|
|
140
|
+
];
|
|
141
|
+
if (libraryTarget === 'var' || libraryTarget === 'window') return [
|
|
142
|
+
'iife'
|
|
143
|
+
];
|
|
144
|
+
if (libraryTarget === 'umd') return [
|
|
145
|
+
'umd'
|
|
146
|
+
];
|
|
147
|
+
return [
|
|
148
|
+
'es'
|
|
149
|
+
];
|
|
150
|
+
};
|
|
151
|
+
const resolveProjectPackage = (packageName)=>{
|
|
152
|
+
const projectPackage = resolve(process.cwd(), 'node_modules', packageName);
|
|
153
|
+
return existsSync(projectPackage) ? projectPackage : resolve(LexConfig.getLexDir(), 'node_modules', packageName);
|
|
154
|
+
};
|
|
155
|
+
export const createLexViteConfig = (options)=>{
|
|
156
|
+
const config = LexConfig.config;
|
|
157
|
+
const sourcePath = config.sourceFullPath || resolve(process.cwd(), config.sourcePath || './src');
|
|
158
|
+
const outputPath = config.outputFullPath || resolve(process.cwd(), config.outputPath || './lib');
|
|
159
|
+
const entryPath = resolve(sourcePath, options.entry || config.entryJs || 'index.js');
|
|
160
|
+
const htmlPath = resolve(sourcePath, config.entryHTML || 'index.html');
|
|
161
|
+
const hasHtmlEntry = existsSync(htmlPath) && !options.ssr;
|
|
162
|
+
const outputHash = config.outputHash || options.mode === 'production';
|
|
163
|
+
const fileName = config.outputFile || (outputHash ? '[name].[hash].js' : '[name].js');
|
|
164
|
+
const viteConfig = {
|
|
165
|
+
appType: hasHtmlEntry ? 'spa' : 'custom',
|
|
166
|
+
base: '/',
|
|
167
|
+
build: {
|
|
168
|
+
cssCodeSplit: true,
|
|
169
|
+
emptyOutDir: false,
|
|
170
|
+
minify: options.mode === 'production',
|
|
171
|
+
outDir: outputPath,
|
|
172
|
+
rolldownOptions: {
|
|
173
|
+
input: hasHtmlEntry ? htmlPath : entryPath,
|
|
174
|
+
output: {
|
|
175
|
+
assetFileNames: outputHash ? 'assets/[name].[hash][extname]' : 'assets/[name][extname]',
|
|
176
|
+
chunkFileNames: outputHash ? '[name].[hash].chunk.js' : '[name].chunk.js',
|
|
177
|
+
entryFileNames: fileName,
|
|
178
|
+
manualChunks (id) {
|
|
179
|
+
return id.includes('/node_modules/') ? 'vendors' : undefined;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
sourcemap: config.swc?.sourceMaps ? true : false,
|
|
184
|
+
ssr: options.ssr ? entryPath : false,
|
|
185
|
+
target: config.swc?.jsc?.target?.toString() || 'es2020'
|
|
186
|
+
},
|
|
187
|
+
clearScreen: false,
|
|
188
|
+
configFile: false,
|
|
189
|
+
css: {
|
|
190
|
+
postcss: resolve(LexConfig.getLexDir(), 'postcss.config.js')
|
|
191
|
+
},
|
|
192
|
+
define: {
|
|
193
|
+
'process.env.NODE_ENV': JSON.stringify(options.mode || (options.command === 'build' ? 'production' : 'development'))
|
|
194
|
+
},
|
|
195
|
+
envDir: process.cwd(),
|
|
196
|
+
logLevel: options.quiet ? 'silent' : 'info',
|
|
197
|
+
mode: options.mode || (options.command === 'build' ? 'production' : 'development'),
|
|
198
|
+
plugins: [
|
|
199
|
+
...options.ssr ? [] : [
|
|
200
|
+
emptyCryptoPlugin(),
|
|
201
|
+
nodePolyfillsPlugin(),
|
|
202
|
+
createInjectPlugin({
|
|
203
|
+
Buffer: [
|
|
204
|
+
resolveProjectPackage('buffer/index.js'),
|
|
205
|
+
'Buffer'
|
|
206
|
+
],
|
|
207
|
+
global: [
|
|
208
|
+
resolveProjectPackage('global/window.js'),
|
|
209
|
+
'default'
|
|
210
|
+
],
|
|
211
|
+
process: [
|
|
212
|
+
resolveProjectPackage('process/browser.js'),
|
|
213
|
+
'default'
|
|
214
|
+
]
|
|
215
|
+
})
|
|
216
|
+
],
|
|
217
|
+
swcPlugin(sourcePath),
|
|
218
|
+
graphqlPlugin(),
|
|
219
|
+
...options.ssr ? [] : [
|
|
220
|
+
importMetaCompatibilityPlugin(sourcePath),
|
|
221
|
+
assetsDevPlugin(),
|
|
222
|
+
analyzerPlugin(Boolean(options.analyze))
|
|
223
|
+
]
|
|
224
|
+
],
|
|
225
|
+
publicDir: false,
|
|
226
|
+
resolve: {
|
|
227
|
+
alias: {
|
|
228
|
+
Buffer: resolveProjectPackage('buffer'),
|
|
229
|
+
'core-js': resolveProjectPackage('core-js'),
|
|
230
|
+
global: resolveProjectPackage('global'),
|
|
231
|
+
'graphql-tag': resolveProjectPackage('graphql-tag'),
|
|
232
|
+
randombytes: resolve(LexConfig.getLexDir(), 'node_modules/randombytes'),
|
|
233
|
+
react: resolveProjectPackage('react'),
|
|
234
|
+
'react-dom': resolveProjectPackage('react-dom'),
|
|
235
|
+
'regenerator-runtime': resolveProjectPackage('regenerator-runtime')
|
|
236
|
+
},
|
|
237
|
+
extensions: [
|
|
238
|
+
'.mjs',
|
|
239
|
+
'.js',
|
|
240
|
+
'.ts',
|
|
241
|
+
'.tsx',
|
|
242
|
+
'.jsx',
|
|
243
|
+
'.json',
|
|
244
|
+
'.gql',
|
|
245
|
+
'.graphql'
|
|
246
|
+
],
|
|
247
|
+
preserveSymlinks: false,
|
|
248
|
+
tsconfigPaths: true
|
|
249
|
+
},
|
|
250
|
+
root: sourcePath,
|
|
251
|
+
server: {
|
|
252
|
+
hmr: false,
|
|
253
|
+
open: options.open,
|
|
254
|
+
port: options.port,
|
|
255
|
+
strictPort: true
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
if (!hasHtmlEntry && config.libraryName && !options.ssr) {
|
|
259
|
+
viteConfig.build = {
|
|
260
|
+
...viteConfig.build,
|
|
261
|
+
lib: {
|
|
262
|
+
entry: entryPath,
|
|
263
|
+
fileName: ()=>config.outputFile || 'index.js',
|
|
264
|
+
formats: getLibraryFormats(config.libraryTarget),
|
|
265
|
+
name: config.libraryName
|
|
266
|
+
}
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
return mergeConfig(viteConfig, config.vite || {});
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy92aXRlL2NvbmZpZy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgaW5qZWN0IGZyb20gJ0Byb2xsdXAvcGx1Z2luLWluamVjdCc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtleHRuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCB7bWVyZ2VDb25maWd9IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQge0xleENvbmZpZ30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Z2VuZXJhdGVMZXhGYXZpY29ucywgZ2V0RGV2QXNzZXR9IGZyb20gJy4vYXNzZXRzLmpzJztcblxuaW1wb3J0IHR5cGUge0lubGluZUNvbmZpZywgUGx1Z2lufSBmcm9tICd2aXRlJztcblxuY29uc3QgY3JlYXRlSW5qZWN0UGx1Z2luID0gaW5qZWN0IGFzIHVua25vd24gYXMgKG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBQbHVnaW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGV4Vml0ZU9wdGlvbnMge1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY29tbWFuZDogJ2J1aWxkJyB8ICdzZXJ2ZSc7XG4gIHJlYWRvbmx5IGVudHJ5Pzogc3RyaW5nO1xuICByZWFkb25seSBtb2RlPzogc3RyaW5nO1xuICByZWFkb25seSBvcGVuPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBzc3I/OiBib29sZWFuO1xufVxuXG5jb25zdCBjb250ZW50VHlwZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuY3NzJzogJ3RleHQvY3NzJyxcbiAgJy5naWYnOiAnaW1hZ2UvZ2lmJyxcbiAgJy5odG1sJzogJ3RleHQvaHRtbCcsXG4gICcuaWNvJzogJ2ltYWdlL3gtaWNvbicsXG4gICcuanBlZyc6ICdpbWFnZS9qcGVnJyxcbiAgJy5qcGcnOiAnaW1hZ2UvanBlZycsXG4gICcuanNvbic6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy5wbmcnOiAnaW1hZ2UvcG5nJyxcbiAgJy5zdmcnOiAnaW1hZ2Uvc3ZnK3htbCcsXG4gICcudHRmJzogJ2ZvbnQvdHRmJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud29mZic6ICdmb250L3dvZmYnLFxuICAnLndvZmYyJzogJ2ZvbnQvd29mZjInXG59O1xuXG5jb25zdCBlbXB0eUNyeXB0b1BsdWdpbiA9ICgpOiBQbHVnaW4gPT4gKHtcbiAgbG9hZChpZCkge1xuICAgIHJldHVybiBpZCA9PT0gJ1xcMGxleC1lbXB0eS1jcnlwdG8nID8gJ2V4cG9ydCBkZWZhdWx0IHt9OyBleHBvcnQgY29uc3Qgd2ViY3J5cHRvID0gdW5kZWZpbmVkOycgOiBudWxsO1xuICB9LFxuICBuYW1lOiAnbGV4LWVtcHR5LWNyeXB0bycsXG4gIHJlc29sdmVJZChpZCkge1xuICAgIHJldHVybiBpZCA9PT0gJ2NyeXB0bycgfHwgaWQgPT09ICdub2RlOmNyeXB0bycgPyAnXFwwbGV4LWVtcHR5LWNyeXB0bycgOiBudWxsO1xuICB9XG59KTtcblxuY29uc3Qgbm9kZVBvbHlmaWxsTW9kdWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgYXNzZXJ0OiAnYXNzZXJ0L2J1aWxkL2Fzc2VydC5qcycsXG4gIGJ1ZmZlcjogJ2J1ZmZlci9pbmRleC5qcycsXG4gIGh0dHA6ICdzdHJlYW0taHR0cC9pbmRleC5qcycsXG4gIGh0dHBzOiAnaHR0cHMtYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIG9zOiAnb3MtYnJvd3NlcmlmeS9icm93c2VyLmpzJyxcbiAgcGF0aDogJ3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIHByb2Nlc3M6ICdwcm9jZXNzL2Jyb3dzZXIuanMnLFxuICBzdHJlYW06ICdzdHJlYW0tYnJvd3NlcmlmeS9pbmRleC5qcycsXG4gIHV0aWw6ICd1dGlsL3V0aWwuanMnLFxuICB2bTogJ3ZtLWJyb3dzZXJpZnkvaW5kZXguanMnXG59O1xuXG5jb25zdCBub2RlUG9seWZpbGxzUGx1Z2luID0gKCk6IFBsdWdpbiA9PiAoe1xuICBuYW1lOiAnbGV4LW5vZGUtcG9seWZpbGxzJyxcbiAgcmVzb2x2ZUlkKGlkKSB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IGlkLnN0YXJ0c1dpdGgoJ25vZGU6JykgPyBpZC5zbGljZSg1KSA6IGlkO1xuICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gbm9kZVBvbHlmaWxsTW9kdWxlc1ttb2R1bGVOYW1lXTtcbiAgICByZXR1cm4gcmVwbGFjZW1lbnQgPyByZXNvbHZlUHJvamVjdFBhY2thZ2UocmVwbGFjZW1lbnQpIDogbnVsbDtcbiAgfVxufSk7XG5cbmNvbnN0IGdyYXBocWxQbHVnaW4gPSAoKTogUGx1Z2luID0+ICh7XG4gIGxvYWQoaWQpIHtcbiAgICBpZighL1xcLihncWx8Z3JhcGhxbCkkLy50ZXN0KGlkKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgc291cmNlID0gSlNPTi5zdHJpbmdpZnkocmVhZEZpbGVTeW5jKGlkLCAndXRmOCcpKTtcbiAgICByZXR1cm4gYGltcG9ydCBncWwgZnJvbSAnZ3JhcGhxbC10YWcnOyBleHBvcnQgZGVmYXVsdCBncWwoJHtzb3VyY2V9KTtgO1xuICB9LFxuICBuYW1lOiAnbGV4LWdyYXBocWwnXG59KTtcblxuY29uc3Qgc3djUGx1Z2luID0gKHNvdXJjZVBhdGg6IHN0cmluZyk6IFBsdWdpbiA9PiAoe1xuICBlbmZvcmNlOiAncHJlJyxcbiAgYXN5bmMgdHJhbnNmb3JtKHNvdXJjZSwgaWQpIHtcbiAgICBjb25zdCBjbGVhbklkID0gaWQuc3BsaXQoJz8nKVswXTtcbiAgICBpZighY2xlYW5JZC5zdGFydHNXaXRoKHNvdXJjZVBhdGgpIHx8ICEvXFwuW2p0XXN4PyQvLnRlc3QoY2xlYW5JZCkgfHwgL1xcLih0ZXN0fHNwZWN8aW50ZWdyYXRpb258ZTJlKVxcLltqdF1zeD8kLy50ZXN0KGNsZWFuSWQpKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHN3Y0NvbmZpZyA9IExleENvbmZpZy5nZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlcigpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRyYW5zZm9ybShzb3VyY2UsIHtcbiAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgIGZpbGVuYW1lOiBjbGVhbklkLFxuICAgICAgbW9kdWxlOiB7Li4uc3djQ29uZmlnPy5tb2R1bGUsIHR5cGU6ICdlczYnfSxcbiAgICAgIHNvdXJjZU1hcHM6IHRydWVcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lZWRzUmVhY3QgPSAvXFxiUmVhY3RcXHMqXFwuLy50ZXN0KHJlc3VsdC5jb2RlKSAmJiAhL2Zyb21cXHMrWydcIl1yZWFjdFsnXCJdLy50ZXN0KHJlc3VsdC5jb2RlKTtcbiAgICByZXR1cm4ge1xuICAgICAgY29kZTogbmVlZHNSZWFjdCA/IGBpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xcbiR7cmVzdWx0LmNvZGV9YCA6IHJlc3VsdC5jb2RlLFxuICAgICAgbWFwOiByZXN1bHQubWFwIHx8IG51bGxcbiAgICB9O1xuICB9LFxuICBuYW1lOiAnbGV4LXN3Yydcbn0pO1xuXG5jb25zdCBpbXBvcnRNZXRhQ29tcGF0aWJpbGl0eVBsdWdpbiA9IChzb3VyY2VQYXRoOiBzdHJpbmcpOiBQbHVnaW4gPT4gKHtcbiAgZW5mb3JjZTogJ3Bvc3QnLFxuICBuYW1lOiAnbGV4LWltcG9ydC1tZXRhLWNvbXBhdGliaWxpdHknLFxuICB0cmFuc2Zvcm0oc291cmNlLCBpZCkge1xuICAgIGNvbnN0IGNsZWFuSWQgPSBpZC5zcGxpdCgnPycpWzBdO1xuICAgIGlmKCFjbGVhbklkLnN0YXJ0c1dpdGgoc291cmNlUGF0aCkgfHwgIXNvdXJjZS5pbmNsdWRlcygnaW1wb3J0Lm1ldGEudXJsJykpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgcmVwbGFjZW1lbnQgPSAnKHR5cGVvZiBkb2N1bWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjID8gbmV3IFVSTChkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYywgd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWYgOiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IG5ldyBVUkwoXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWYgOiBcIlwiKSknO1xuICAgIHJldHVybiBzb3VyY2UucmVwbGFjZUFsbCgnaW1wb3J0Lm1ldGEudXJsJywgcmVwbGFjZW1lbnQpO1xuICB9XG59KTtcblxuY29uc3QgYXNzZXRzRGV2UGx1Z2luID0gKCk6IFBsdWdpbiA9PiB7XG4gIGxldCBmYXZpY29uSHRtbDogc3RyaW5nW10gPSBbXTtcblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGJ1aWxkU3RhcnQoKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRGYXZpY29ucyA9IGF3YWl0IGdlbmVyYXRlTGV4RmF2aWNvbnMoTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgICBmYXZpY29uSHRtbCA9IGdlbmVyYXRlZEZhdmljb25zPy5odG1sIHx8IFtdO1xuICAgIH0sXG4gICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgc2VydmVyLm1pZGRsZXdhcmVzLnVzZShhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIG5leHQpID0+IHtcbiAgICAgICAgaWYoIXJlcXVlc3QudXJsKSByZXR1cm4gbmV4dCgpO1xuICAgICAgICBjb25zdCBhc3NldCA9IGF3YWl0IGdldERldkFzc2V0KExleENvbmZpZy5jb25maWcsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgaWYoIWFzc2V0KSByZXR1cm4gbmV4dCgpO1xuXG4gICAgICAgIHJlc3BvbnNlLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgY29udGVudFR5cGVzW2V4dG5hbWUocmVxdWVzdC51cmwuc3BsaXQoJz8nKVswXSldIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICAgICAgcmVzcG9uc2UuZW5kKGFzc2V0KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgbmFtZTogJ2xleC1hc3NldHMtZGV2JyxcbiAgICB0cmFuc2Zvcm1JbmRleEh0bWwoaHRtbCkge1xuICAgICAgaWYoZmF2aWNvbkh0bWwubGVuZ3RoID09PSAwKSByZXR1cm4gaHRtbDtcbiAgICAgIHJldHVybiBodG1sLnJlcGxhY2UoJzwvaGVhZD4nLCBgICAgICR7ZmF2aWNvbkh0bWwuam9pbignXFxuICAgICcpfVxcbiAgPC9oZWFkPmApO1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IGFuYWx5emVyUGx1Z2luID0gKGVuYWJsZWQ6IGJvb2xlYW4pOiBQbHVnaW4gPT4gKHtcbiAgZ2VuZXJhdGVCdW5kbGUoX29wdGlvbnMsIGJ1bmRsZSkge1xuICAgIGlmKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICBjb25zdCByZXBvcnQgPSBPYmplY3QuZW50cmllcyhidW5kbGUpLm1hcCgoW2ZpbGVOYW1lLCBvdXRwdXRdKSA9PiAoe1xuICAgICAgZmlsZU5hbWUsXG4gICAgICBzaXplOiBvdXRwdXQudHlwZSA9PT0gJ2Fzc2V0J1xuICAgICAgICA/IEJ1ZmZlci5ieXRlTGVuZ3RoKHR5cGVvZiBvdXRwdXQuc291cmNlID09PSAnc3RyaW5nJyA/IG91dHB1dC5zb3VyY2UgOiBvdXRwdXQuc291cmNlKVxuICAgICAgICA6IEJ1ZmZlci5ieXRlTGVuZ3RoKG91dHB1dC5jb2RlKSxcbiAgICAgIHR5cGU6IG91dHB1dC50eXBlXG4gICAgfSkpO1xuXG4gICAgdGhpcy5lbWl0RmlsZSh7ZmlsZU5hbWU6ICdidW5kbGUtcmVwb3J0Lmpzb24nLCBzb3VyY2U6IEpTT04uc3RyaW5naWZ5KHJlcG9ydCwgbnVsbCwgMiksIHR5cGU6ICdhc3NldCd9KTtcbiAgfSxcbiAgbmFtZTogJ2xleC1idW5kbGUtYW5hbHl6ZXInXG59KTtcblxuY29uc3QgZ2V0TGlicmFyeUZvcm1hdHMgPSAobGlicmFyeVRhcmdldD86IHN0cmluZyk6IEFycmF5PCdjanMnIHwgJ2VzJyB8ICdpaWZlJyB8ICd1bWQnPiA9PiB7XG4gIGlmKGxpYnJhcnlUYXJnZXQgPT09ICdjb21tb25qcycgfHwgbGlicmFyeVRhcmdldCA9PT0gJ2NvbW1vbmpzMicpIHJldHVybiBbJ2NqcyddO1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndmFyJyB8fCBsaWJyYXJ5VGFyZ2V0ID09PSAnd2luZG93JykgcmV0dXJuIFsnaWlmZSddO1xuICBpZihsaWJyYXJ5VGFyZ2V0ID09PSAndW1kJykgcmV0dXJuIFsndW1kJ107XG4gIHJldHVybiBbJ2VzJ107XG59O1xuXG5jb25zdCByZXNvbHZlUHJvamVjdFBhY2thZ2UgPSAocGFja2FnZU5hbWU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHByb2plY3RQYWNrYWdlID0gcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuICByZXR1cm4gZXhpc3RzU3luYyhwcm9qZWN0UGFja2FnZSkgPyBwcm9qZWN0UGFja2FnZSA6IHJlc29sdmUoTGV4Q29uZmlnLmdldExleERpcigpLCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUxleFZpdGVDb25maWcgPSAob3B0aW9uczogTGV4Vml0ZU9wdGlvbnMpOiBJbmxpbmVDb25maWcgPT4ge1xuICBjb25zdCBjb25maWcgPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBzb3VyY2VQYXRoID0gY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgY29uZmlnLnNvdXJjZVBhdGggfHwgJy4vc3JjJyk7XG4gIGNvbnN0IG91dHB1dFBhdGggPSBjb25maWcub3V0cHV0RnVsbFBhdGggfHwgcmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcub3V0cHV0UGF0aCB8fCAnLi9saWInKTtcbiAgY29uc3QgZW50cnlQYXRoID0gcmVzb2x2ZShzb3VyY2VQYXRoLCBvcHRpb25zLmVudHJ5IHx8IGNvbmZpZy5lbnRyeUpzIHx8ICdpbmRleC5qcycpO1xuICBjb25zdCBodG1sUGF0aCA9IHJlc29sdmUoc291cmNlUGF0aCwgY29uZmlnLmVudHJ5SFRNTCB8fCAnaW5kZXguaHRtbCcpO1xuICBjb25zdCBoYXNIdG1sRW50cnkgPSBleGlzdHNTeW5jKGh0bWxQYXRoKSAmJiAhb3B0aW9ucy5zc3I7XG4gIGNvbnN0IG91dHB1dEhhc2ggPSBjb25maWcub3V0cHV0SGFzaCB8fCBvcHRpb25zLm1vZGUgPT09ICdwcm9kdWN0aW9uJztcbiAgY29uc3QgZmlsZU5hbWUgPSBjb25maWcub3V0cHV0RmlsZSB8fCAob3V0cHV0SGFzaCA/ICdbbmFtZV0uW2hhc2hdLmpzJyA6ICdbbmFtZV0uanMnKTtcblxuICBjb25zdCB2aXRlQ29uZmlnOiBJbmxpbmVDb25maWcgPSB7XG4gICAgYXBwVHlwZTogaGFzSHRtbEVudHJ5ID8gJ3NwYScgOiAnY3VzdG9tJyxcbiAgICBiYXNlOiAnLycsXG4gICAgYnVpbGQ6IHtcbiAgICAgIGNzc0NvZGVTcGxpdDogdHJ1ZSxcbiAgICAgIGVtcHR5T3V0RGlyOiBmYWxzZSxcbiAgICAgIG1pbmlmeTogb3B0aW9ucy5tb2RlID09PSAncHJvZHVjdGlvbicsXG4gICAgICBvdXREaXI6IG91dHB1dFBhdGgsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgaW5wdXQ6IGhhc0h0bWxFbnRyeSA/IGh0bWxQYXRoIDogZW50cnlQYXRoLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICBhc3NldEZpbGVOYW1lczogb3V0cHV0SGFzaCA/ICdhc3NldHMvW25hbWVdLltoYXNoXVtleHRuYW1lXScgOiAnYXNzZXRzL1tuYW1lXVtleHRuYW1lXScsXG4gICAgICAgICAgY2h1bmtGaWxlTmFtZXM6IG91dHB1dEhhc2ggPyAnW25hbWVdLltoYXNoXS5jaHVuay5qcycgOiAnW25hbWVdLmNodW5rLmpzJyxcbiAgICAgICAgICBlbnRyeUZpbGVOYW1lczogZmlsZU5hbWUsXG4gICAgICAgICAgbWFudWFsQ2h1bmtzKGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQuaW5jbHVkZXMoJy9ub2RlX21vZHVsZXMvJykgPyAndmVuZG9ycycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc291cmNlbWFwOiBjb25maWcuc3djPy5zb3VyY2VNYXBzID8gdHJ1ZSA6IGZhbHNlLFxuICAgICAgc3NyOiBvcHRpb25zLnNzciA/IGVudHJ5UGF0aCA6IGZhbHNlLFxuICAgICAgdGFyZ2V0OiBjb25maWcuc3djPy5qc2M/LnRhcmdldD8udG9TdHJpbmcoKSB8fCAnZXMyMDIwJ1xuICAgIH0sXG4gICAgY2xlYXJTY3JlZW46IGZhbHNlLFxuICAgIGNvbmZpZ0ZpbGU6IGZhbHNlLFxuICAgIGNzczoge1xuICAgICAgcG9zdGNzczogcmVzb2x2ZShMZXhDb25maWcuZ2V0TGV4RGlyKCksICdwb3N0Y3NzLmNvbmZpZy5qcycpXG4gICAgfSxcbiAgICBkZWZpbmU6IHtcbiAgICAgICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMubW9kZSB8fCAob3B0aW9ucy5jb21tYW5kID09PSAnYnVpbGQnID8gJ3Byb2R1Y3Rpb24nIDogJ2RldmVsb3BtZW50JykpXG4gICAgfSxcbiAgICBlbnZEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgbG9nTGV2ZWw6IG9wdGlvbnMucXVpZXQgPyAnc2lsZW50JyA6ICdpbmZvJyxcbiAgICBtb2RlOiBvcHRpb25zLm1vZGUgfHwgKG9wdGlvbnMuY29tbWFuZCA9PT0gJ2J1aWxkJyA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCcpLFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW1xuICAgICAgICBlbXB0eUNyeXB0b1BsdWdpbigpLFxuICAgICAgICBub2RlUG9seWZpbGxzUGx1Z2luKCksXG4gICAgICAgIGNyZWF0ZUluamVjdFBsdWdpbih7XG4gICAgICAgICAgQnVmZmVyOiBbcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXIvaW5kZXguanMnKSwgJ0J1ZmZlciddLFxuICAgICAgICAgIGdsb2JhbDogW3Jlc29sdmVQcm9qZWN0UGFja2FnZSgnZ2xvYmFsL3dpbmRvdy5qcycpLCAnZGVmYXVsdCddLFxuICAgICAgICAgIHByb2Nlc3M6IFtyZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3Byb2Nlc3MvYnJvd3Nlci5qcycpLCAnZGVmYXVsdCddXG4gICAgICAgIH0pXG4gICAgICBdKSxcbiAgICAgIHN3Y1BsdWdpbihzb3VyY2VQYXRoKSxcbiAgICAgIGdyYXBocWxQbHVnaW4oKSxcbiAgICAgIC4uLihvcHRpb25zLnNzciA/IFtdIDogW2ltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luKHNvdXJjZVBhdGgpLCBhc3NldHNEZXZQbHVnaW4oKSwgYW5hbHl6ZXJQbHVnaW4oQm9vbGVhbihvcHRpb25zLmFuYWx5emUpKV0pXG4gICAgXSxcbiAgICBwdWJsaWNEaXI6IGZhbHNlLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIEJ1ZmZlcjogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdidWZmZXInKSxcbiAgICAgICAgJ2NvcmUtanMnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2NvcmUtanMnKSxcbiAgICAgICAgZ2xvYmFsOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dsb2JhbCcpLFxuICAgICAgICAnZ3JhcGhxbC10YWcnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ2dyYXBocWwtdGFnJyksXG4gICAgICAgIHJhbmRvbWJ5dGVzOiByZXNvbHZlKExleENvbmZpZy5nZXRMZXhEaXIoKSwgJ25vZGVfbW9kdWxlcy9yYW5kb21ieXRlcycpLFxuICAgICAgICByZWFjdDogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdCcpLFxuICAgICAgICAncmVhY3QtZG9tJzogcmVzb2x2ZVByb2plY3RQYWNrYWdlKCdyZWFjdC1kb20nKSxcbiAgICAgICAgJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnOiByZXNvbHZlUHJvamVjdFBhY2thZ2UoJ3JlZ2VuZXJhdG9yLXJ1bnRpbWUnKVxuICAgICAgfSxcbiAgICAgIGV4dGVuc2lvbnM6IFsnLm1qcycsICcuanMnLCAnLnRzJywgJy50c3gnLCAnLmpzeCcsICcuanNvbicsICcuZ3FsJywgJy5ncmFwaHFsJ10sXG4gICAgICBwcmVzZXJ2ZVN5bWxpbmtzOiBmYWxzZSxcbiAgICAgIHRzY29uZmlnUGF0aHM6IHRydWVcbiAgICB9LFxuICAgIHJvb3Q6IHNvdXJjZVBhdGgsXG4gICAgc2VydmVyOiB7XG4gICAgICBobXI6IGZhbHNlLFxuICAgICAgb3Blbjogb3B0aW9ucy5vcGVuLFxuICAgICAgcG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgc3RyaWN0UG9ydDogdHJ1ZVxuICAgIH1cbiAgfTtcblxuICBpZighaGFzSHRtbEVudHJ5ICYmIGNvbmZpZy5saWJyYXJ5TmFtZSAmJiAhb3B0aW9ucy5zc3IpIHtcbiAgICB2aXRlQ29uZmlnLmJ1aWxkID0ge1xuICAgICAgLi4udml0ZUNvbmZpZy5idWlsZCxcbiAgICAgIGxpYjoge1xuICAgICAgICBlbnRyeTogZW50cnlQYXRoLFxuICAgICAgICBmaWxlTmFtZTogKCkgPT4gY29uZmlnLm91dHB1dEZpbGUgfHwgJ2luZGV4LmpzJyxcbiAgICAgICAgZm9ybWF0czogZ2V0TGlicmFyeUZvcm1hdHMoY29uZmlnLmxpYnJhcnlUYXJnZXQpLFxuICAgICAgICBuYW1lOiBjb25maWcubGlicmFyeU5hbWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG1lcmdlQ29uZmlnKHZpdGVDb25maWcsIGNvbmZpZy52aXRlIHx8IHt9KSBhcyBJbmxpbmVDb25maWc7XG59O1xuIl0sIm5hbWVzIjpbInRyYW5zZm9ybSIsImluamVjdCIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJleHRuYW1lIiwicmVzb2x2ZSIsIm1lcmdlQ29uZmlnIiwiTGV4Q29uZmlnIiwiZ2VuZXJhdGVMZXhGYXZpY29ucyIsImdldERldkFzc2V0IiwiY3JlYXRlSW5qZWN0UGx1Z2luIiwiY29udGVudFR5cGVzIiwiZW1wdHlDcnlwdG9QbHVnaW4iLCJsb2FkIiwiaWQiLCJuYW1lIiwicmVzb2x2ZUlkIiwibm9kZVBvbHlmaWxsTW9kdWxlcyIsImFzc2VydCIsImJ1ZmZlciIsImh0dHAiLCJodHRwcyIsIm9zIiwicGF0aCIsInByb2Nlc3MiLCJzdHJlYW0iLCJ1dGlsIiwidm0iLCJub2RlUG9seWZpbGxzUGx1Z2luIiwibW9kdWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJzbGljZSIsInJlcGxhY2VtZW50IiwicmVzb2x2ZVByb2plY3RQYWNrYWdlIiwiZ3JhcGhxbFBsdWdpbiIsInRlc3QiLCJzb3VyY2UiLCJKU09OIiwic3RyaW5naWZ5Iiwic3djUGx1Z2luIiwic291cmNlUGF0aCIsImVuZm9yY2UiLCJjbGVhbklkIiwic3BsaXQiLCJzd2NDb25maWciLCJnZXRTV0NDb25maWdXaXRoUmVhY3RDb21waWxlciIsInJlc3VsdCIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInNvdXJjZU1hcHMiLCJuZWVkc1JlYWN0IiwiY29kZSIsIm1hcCIsImltcG9ydE1ldGFDb21wYXRpYmlsaXR5UGx1Z2luIiwiaW5jbHVkZXMiLCJyZXBsYWNlQWxsIiwiYXNzZXRzRGV2UGx1Z2luIiwiZmF2aWNvbkh0bWwiLCJidWlsZFN0YXJ0IiwiZ2VuZXJhdGVkRmF2aWNvbnMiLCJjb25maWciLCJodG1sIiwiY29uZmlndXJlU2VydmVyIiwic2VydmVyIiwibWlkZGxld2FyZXMiLCJ1c2UiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJuZXh0IiwidXJsIiwiYXNzZXQiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwiZW5kIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwibGVuZ3RoIiwicmVwbGFjZSIsImpvaW4iLCJhbmFseXplclBsdWdpbiIsImVuYWJsZWQiLCJnZW5lcmF0ZUJ1bmRsZSIsIl9vcHRpb25zIiwiYnVuZGxlIiwicmVwb3J0IiwiT2JqZWN0IiwiZW50cmllcyIsImZpbGVOYW1lIiwib3V0cHV0Iiwic2l6ZSIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJlbWl0RmlsZSIsImdldExpYnJhcnlGb3JtYXRzIiwibGlicmFyeVRhcmdldCIsInBhY2thZ2VOYW1lIiwicHJvamVjdFBhY2thZ2UiLCJjd2QiLCJnZXRMZXhEaXIiLCJjcmVhdGVMZXhWaXRlQ29uZmlnIiwib3B0aW9ucyIsInNvdXJjZUZ1bGxQYXRoIiwib3V0cHV0UGF0aCIsIm91dHB1dEZ1bGxQYXRoIiwiZW50cnlQYXRoIiwiZW50cnkiLCJlbnRyeUpzIiwiaHRtbFBhdGgiLCJlbnRyeUhUTUwiLCJoYXNIdG1sRW50cnkiLCJzc3IiLCJvdXRwdXRIYXNoIiwibW9kZSIsIm91dHB1dEZpbGUiLCJ2aXRlQ29uZmlnIiwiYXBwVHlwZSIsImJhc2UiLCJidWlsZCIsImNzc0NvZGVTcGxpdCIsImVtcHR5T3V0RGlyIiwibWluaWZ5Iiwib3V0RGlyIiwicm9sbGRvd25PcHRpb25zIiwiaW5wdXQiLCJhc3NldEZpbGVOYW1lcyIsImNodW5rRmlsZU5hbWVzIiwiZW50cnlGaWxlTmFtZXMiLCJtYW51YWxDaHVua3MiLCJ1bmRlZmluZWQiLCJzb3VyY2VtYXAiLCJzd2MiLCJ0YXJnZXQiLCJqc2MiLCJ0b1N0cmluZyIsImNsZWFyU2NyZWVuIiwiY29uZmlnRmlsZSIsImNzcyIsInBvc3Rjc3MiLCJkZWZpbmUiLCJjb21tYW5kIiwiZW52RGlyIiwibG9nTGV2ZWwiLCJxdWlldCIsInBsdWdpbnMiLCJnbG9iYWwiLCJCb29sZWFuIiwiYW5hbHl6ZSIsInB1YmxpY0RpciIsImFsaWFzIiwicmFuZG9tYnl0ZXMiLCJyZWFjdCIsImV4dGVuc2lvbnMiLCJwcmVzZXJ2ZVN5bWxpbmtzIiwidHNjb25maWdQYXRocyIsInJvb3QiLCJobXIiLCJvcGVuIiwicG9ydCIsInN0cmljdFBvcnQiLCJsaWJyYXJ5TmFtZSIsImxpYiIsImZvcm1hdHMiLCJ2aXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxTQUFTLFFBQU8sWUFBWTtBQUNwQyxPQUFPQyxZQUFZLHdCQUF3QjtBQUMzQyxTQUFRQyxVQUFVLEVBQUVDLFlBQVksUUFBTyxLQUFLO0FBQzVDLFNBQVFDLE9BQU8sRUFBRUMsT0FBTyxRQUFPLE9BQU87QUFDdEMsU0FBUUMsV0FBVyxRQUFPLE9BQU87QUFFakMsU0FBUUMsU0FBUyxRQUFPLHFCQUFxQjtBQUM3QyxTQUFRQyxtQkFBbUIsRUFBRUMsV0FBVyxRQUFPLGNBQWM7QUFJN0QsTUFBTUMscUJBQXFCVDtBQWEzQixNQUFNVSxlQUF1QztJQUMzQyxRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxVQUFVO0FBQ1o7QUFFQSxNQUFNQyxvQkFBb0IsSUFBZSxDQUFBO1FBQ3ZDQyxNQUFLQyxFQUFFO1lBQ0wsT0FBT0EsT0FBTyx1QkFBdUIsMkRBQTJEO1FBQ2xHO1FBQ0FDLE1BQU07UUFDTkMsV0FBVUYsRUFBRTtZQUNWLE9BQU9BLE9BQU8sWUFBWUEsT0FBTyxnQkFBZ0IsdUJBQXVCO1FBQzFFO0lB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
|