@yqg/permission 1.3.0-alpha.0 → 1.3.0-alpha.10
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/{apply-modal-CpmDDWWV.js → apply-modal-Ct9rKeUf.js} +3180 -3163
- package/dist/{category-selector-BQ0-kg3o.js → category-selector-BnUMBDty.js} +156 -156
- package/dist/{index-D_0ZQip-.js → index-CAVNFmBo.js} +3 -3
- package/dist/{index-wLkVeDMW.js → index-XvlOgi6s.js} +10 -12
- package/dist/index.js +2 -2
- package/dist/permission-item-2JurQrn-.js +1250 -0
- package/dist/{yqg-permission-BjVCs5lN.js → yqg-permission-BrOMv4sA.js} +43 -47
- package/dist/yqg-permission.umd.js +58 -58
- package/package.json +1 -1
- package/src/App.vue +11 -22
- package/src/components/apply-modal.vue +34 -14
- package/src/components/category-selector.vue +2 -2
- package/src/components/permission-item.vue +6 -40
- package/src/components/success-modal.vue +3 -3
- package/src/components/yqg-permission.vue +9 -14
- package/src/hooks/useAttributesCache.ts +4 -4
- package/src/hooks/useCategory.ts +0 -1
- package/src/hooks/useDefaultTime.ts +20 -0
- package/src/hooks/useFormat.ts +26 -20
- package/src/i18n/zh-CH.ts +2 -2
- package/src/utils/index.ts +2 -2
- package/src/yqg-permission/index.ts +0 -1
- package/tsconfig.app.json +3 -2
- package/vite.config.ts.timestamp-1742445090907-a3605e27049cc.mjs +292 -0
- package/dist/permission-item-Df_aagL1.js +0 -1266
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// vite.config.ts
|
|
2
|
+
import vue from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@vitejs+plugin-vue@5.2.1_vite@5.4.14_@types+node@22.9.1__vue@3.5.13_typescript@5.5.4_/node_modules/@vitejs/plugin-vue/dist/index.mjs";
|
|
3
|
+
import { defineConfig } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/vite@5.4.14_@types+node@22.9.1/node_modules/vite/dist/node/index.js";
|
|
4
|
+
import cssInjectedByJsPlugin from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/vite-plugin-css-injected-by-js@3.5.2_vite@5.4.14_@types+node@22.9.1_/node_modules/vite-plugin-css-injected-by-js/dist/esm/index.js";
|
|
5
|
+
|
|
6
|
+
// plugins/alioss.ts
|
|
7
|
+
import CdnClient, {
|
|
8
|
+
PushObjectCacheRequest,
|
|
9
|
+
RefreshObjectCachesRequest
|
|
10
|
+
} from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@alicloud+cdn20180510@3.1.2/node_modules/@alicloud/cdn20180510/dist/client.js";
|
|
11
|
+
import { Config } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@alicloud+openapi-client@0.4.12/node_modules/@alicloud/openapi-client/dist/client.js";
|
|
12
|
+
import OSS from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/ali-oss@6.17.1/node_modules/ali-oss/lib/client.js";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { URL } from "url";
|
|
15
|
+
import { lodash as _, logger, ora } from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/@yqg+max-utils@1.0.2/node_modules/@yqg/max-utils/dist/index.js";
|
|
16
|
+
import chalk from "file:///Users/lww/Downloads/work/code/yqg-permission/node_modules/.pnpm/chalk@5.3.0/node_modules/chalk/source/index.js";
|
|
17
|
+
function viteAliossPlugin(options) {
|
|
18
|
+
let viteConfig;
|
|
19
|
+
let filterFields = [];
|
|
20
|
+
const aliyunBucketMap = Object.fromEntries(
|
|
21
|
+
Object.entries({
|
|
22
|
+
feat: [
|
|
23
|
+
"fintopia-web",
|
|
24
|
+
"https://static-ali.yangqianguan.com",
|
|
25
|
+
"oss-cn-beijing"
|
|
26
|
+
],
|
|
27
|
+
prod: [
|
|
28
|
+
"fintopia-web",
|
|
29
|
+
"https://static-ali.yangqianguan.com",
|
|
30
|
+
"oss-cn-beijing"
|
|
31
|
+
],
|
|
32
|
+
test: [
|
|
33
|
+
"fintopia-web-test",
|
|
34
|
+
"https://static-ali-test.yangqianguan.com",
|
|
35
|
+
"oss-cn-beijing"
|
|
36
|
+
]
|
|
37
|
+
}).map(([stage, [name, origin, region, endpoint]]) => [
|
|
38
|
+
stage,
|
|
39
|
+
{ name, origin, region, endpoint }
|
|
40
|
+
])
|
|
41
|
+
);
|
|
42
|
+
return {
|
|
43
|
+
name: "vite-plugin-alioss",
|
|
44
|
+
enforce: "post",
|
|
45
|
+
apply: "build",
|
|
46
|
+
// 配置解析钩子
|
|
47
|
+
config() {
|
|
48
|
+
const STAGE = process.env.STAGE;
|
|
49
|
+
if (!STAGE) {
|
|
50
|
+
console.warn(chalk.yellow("\u7F3A\u5C11\u73AF\u5883\u53D8\u91CF STAGE\uFF0C\u5C06\u8DF3\u8FC7\u963F\u91CC\u4E91 CDN \u4E0A\u4F20"));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const bucket = aliyunBucketMap[STAGE];
|
|
54
|
+
if (bucket && options?.cdnDir) {
|
|
55
|
+
return {
|
|
56
|
+
base: `${bucket.origin}/${options.cdnDir}`
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
// 获取解析后的 Vite 配置
|
|
61
|
+
configResolved(config) {
|
|
62
|
+
viteConfig = config;
|
|
63
|
+
},
|
|
64
|
+
generateBundle(_2, bundle) {
|
|
65
|
+
if (_2.format === "umd") {
|
|
66
|
+
filterFields = Object.keys(bundle);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
// 构建完成钩子
|
|
70
|
+
async closeBundle() {
|
|
71
|
+
const STAGE = process.env.STAGE;
|
|
72
|
+
if (!STAGE || options?.cdnRetry) {
|
|
73
|
+
console.log(chalk.yellow("\u8DF3\u8FC7\u963F\u91CC\u4E91 CDN \u4E0A\u4F20"));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const { cdnDir } = options || {
|
|
77
|
+
cdnDir: ""
|
|
78
|
+
};
|
|
79
|
+
if (cdnDir) {
|
|
80
|
+
if (cdnDir.startsWith("/")) {
|
|
81
|
+
console.log(chalk.yellow("cdnDir\u7981\u6B62\u4EE5/\u5F00\u5934"));
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
if (!cdnDir.endsWith("/")) {
|
|
85
|
+
console.log(chalk.yellow("cdnDir\u5FC5\u987B\u4EE5/\u7ED3\u5C3E"));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const aliyunAccessKeyId = process.env.aliyunAccessKeyId || "LTAI5tLcBNEBRLkfak9nRA1M";
|
|
90
|
+
const aliyunAccessKeySecret = process.env.aliyunAccessKeySecret || "wxIkk2dd56IsibD6bBCeEma7QFqdi1";
|
|
91
|
+
const aliyunBucket = aliyunBucketMap[STAGE];
|
|
92
|
+
if (!aliyunBucket) {
|
|
93
|
+
console.log(chalk.yellow(
|
|
94
|
+
`\u963F\u91CC\u4E91Bucket\u914D\u7F6E\u4E0D\u5B58\u5728, \u5F53\u524D\u73AF\u5883\u662F${STAGE} \u76EE\u524D\u652F\u6301\u7684stage\u6709: ${Object.keys(
|
|
95
|
+
aliyunBucketMap
|
|
96
|
+
).join(", ")}`
|
|
97
|
+
));
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
const { region, origin: cdnOrigin, endpoint } = aliyunBucket;
|
|
101
|
+
const aliossConfig = {
|
|
102
|
+
region,
|
|
103
|
+
accessKeyId: aliyunAccessKeyId,
|
|
104
|
+
accessKeySecret: aliyunAccessKeySecret,
|
|
105
|
+
bucket: aliyunBucket.name,
|
|
106
|
+
secure: true,
|
|
107
|
+
timeout: 18e5,
|
|
108
|
+
endpoint
|
|
109
|
+
};
|
|
110
|
+
const outDir = viteConfig.build.outDir;
|
|
111
|
+
console.log(outDir, "OutDir");
|
|
112
|
+
const outputPath = join(process.cwd(), outDir);
|
|
113
|
+
const maxRetries = 3;
|
|
114
|
+
logger.info("alioss", "\u5F00\u59CB\u4E0A\u4F20cdn\u8D44\u6E90", "\u{1F680}");
|
|
115
|
+
const putBatchSize = 50;
|
|
116
|
+
const fileChunks = _.chunk(filterFields, putBatchSize);
|
|
117
|
+
logger.info(`\u4E0A\u4F20\u914D\u7F6E\u4FE1\u606F: ${JSON.stringify(aliossConfig, null, 2)}`);
|
|
118
|
+
logger.info(`\u4E0A\u4F20\u6587\u4EF6\u6570\u91CF: ${filterFields.length}`);
|
|
119
|
+
logger.info(`\u4E0A\u4F20\u6587\u4EF6\u5206\u6279\u6570\u91CF: ${fileChunks.length}`);
|
|
120
|
+
logger.info(`\u4E0A\u4F20\u6587\u4EF6\u5206\u6279\u5927\u5C0F: ${putBatchSize}`);
|
|
121
|
+
logger.info(`\u4E0A\u4F20\u6587\u4EF6\u6700\u5927\u91CD\u8BD5\u6B21\u6570: ${maxRetries}`);
|
|
122
|
+
const spinner = ora({
|
|
123
|
+
prefixText: "alioss.upload",
|
|
124
|
+
spinner: "aesthetic"
|
|
125
|
+
}).start("\u5F00\u59CB\u4E0A\u4F20cdn\u8D44\u6E90");
|
|
126
|
+
async function uploadFileWithRetry(client, filename, retries = maxRetries) {
|
|
127
|
+
const key = join(cdnDir, filename);
|
|
128
|
+
const localFile = join(outputPath, filename);
|
|
129
|
+
console.log(localFile, "localFile");
|
|
130
|
+
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
131
|
+
const attemptText = attempt === 1 ? "" : ` (\u91CD\u8BD5 ${attempt})`;
|
|
132
|
+
try {
|
|
133
|
+
logger.info(`\u4E0A\u4F20\u4E2D ${filename} ${attemptText}...`);
|
|
134
|
+
await client.put(key, localFile);
|
|
135
|
+
logger.info(`\u4E0A\u4F20\u5B8C\u6210 ${filename} ${attemptText}`);
|
|
136
|
+
return;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
logger.info(`\u4E0A\u4F20\u5931\u8D25 ${filename} ${attemptText}`);
|
|
139
|
+
if (attempt === retries) {
|
|
140
|
+
logger.error(`\u6700\u5927\u91CD\u8BD5\u6B21\u6570\u540E\u963F\u91CC\u4E91\u4E0A\u4F20\u5931\u8D25 ${filename}`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
logger.info(`\u91CD\u8BD5\u4E0A\u4F20 ${filename} ${attemptText}...`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const key in fileChunks) {
|
|
148
|
+
if (Object.prototype.hasOwnProperty.call(fileChunks, key)) {
|
|
149
|
+
const chunk = fileChunks[key];
|
|
150
|
+
spinner.info(
|
|
151
|
+
`\u7B2C${+key + 1}/${fileChunks.length}\u6279\u4E0A\u4F20 - ${chunk.length} \u4E2A\u6587\u4EF6`
|
|
152
|
+
);
|
|
153
|
+
const client = new OSS(aliossConfig);
|
|
154
|
+
await Promise.all(
|
|
155
|
+
chunk.map((filename) => uploadFileWithRetry(client, filename))
|
|
156
|
+
);
|
|
157
|
+
spinner.info(`\u7B2C${+key + 1}/${fileChunks.length}\u6279\u4E0A\u4F20\u5B8C\u6210`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
spinner.succeed("\u4E0A\u4F20cdn\u8D44\u6E90\u5B8C\u6210");
|
|
161
|
+
const cdnClient = new CdnClient.default(new Config({
|
|
162
|
+
accessKeyId: aliyunAccessKeyId,
|
|
163
|
+
accessKeySecret: aliyunAccessKeySecret,
|
|
164
|
+
regionId: region
|
|
165
|
+
}));
|
|
166
|
+
const validAssetUrls = filterFields.map(
|
|
167
|
+
(filename) => `${cdnOrigin}/${cdnDir}${filename}`
|
|
168
|
+
);
|
|
169
|
+
const cdnHostname = new URL(cdnOrigin).hostname;
|
|
170
|
+
const batchSize = 100;
|
|
171
|
+
let start = 0;
|
|
172
|
+
while (start < validAssetUrls.length) {
|
|
173
|
+
const cdnUrls = validAssetUrls.slice(start, start + batchSize);
|
|
174
|
+
const cdnUrlPaths = cdnUrls.map(
|
|
175
|
+
(assetPath) => join(cdnHostname, cdnDir, assetPath)
|
|
176
|
+
);
|
|
177
|
+
const objectPath = cdnUrlPaths.join("\n");
|
|
178
|
+
const refreshReq = new RefreshObjectCachesRequest({ objectPath });
|
|
179
|
+
logger.info("\u5F00\u59CB\u5237\u65B0cdn\u7F13\u5B58");
|
|
180
|
+
try {
|
|
181
|
+
await cdnClient.refreshObjectCaches(refreshReq);
|
|
182
|
+
logger.info("\u5237\u65B0cdn\u7F13\u5B58\u6210\u529F");
|
|
183
|
+
} catch (err) {
|
|
184
|
+
logger.error("\u5237\u65B0cdn\u7F13\u5B58\u5931\u8D25", err);
|
|
185
|
+
throw err;
|
|
186
|
+
}
|
|
187
|
+
const request = new PushObjectCacheRequest({ objectPath });
|
|
188
|
+
logger.info("\u5F00\u59CB\u63A8\u9001cdn\u7F13\u5B58");
|
|
189
|
+
try {
|
|
190
|
+
await cdnClient.pushObjectCache(request);
|
|
191
|
+
logger.info("\u63A8\u9001cdn\u7F13\u5B58\u6210\u529F");
|
|
192
|
+
} catch (err) {
|
|
193
|
+
logger.error("\u63A8\u9001cdn\u7F13\u5B58\u5931\u8D25", err);
|
|
194
|
+
}
|
|
195
|
+
start += batchSize;
|
|
196
|
+
logger.info("\u5237\u65B0\u540Ecdn\u5730\u5740", cdnUrls);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// package.json
|
|
203
|
+
var package_default = {
|
|
204
|
+
name: "@yqg/permission",
|
|
205
|
+
version: "1.3.0-alpha.10",
|
|
206
|
+
main: "dist/index.js",
|
|
207
|
+
module: "dist/index.js",
|
|
208
|
+
type: "module",
|
|
209
|
+
publishConfig: {
|
|
210
|
+
access: "public",
|
|
211
|
+
registry: "https://registry.npmjs.org/"
|
|
212
|
+
},
|
|
213
|
+
scripts: {
|
|
214
|
+
build: "vue-tsc -b && vite build",
|
|
215
|
+
dev: "vite",
|
|
216
|
+
preview: "vite preview",
|
|
217
|
+
"demo:build": "vue-tsc -b && STAGE=test vite build",
|
|
218
|
+
"prod:build": "vue-tsc -b && STAGE=prod vite build"
|
|
219
|
+
},
|
|
220
|
+
devDependencies: {
|
|
221
|
+
"@ant-design/icons-vue": "^7.0.1",
|
|
222
|
+
"@commitlint/cli": "^19.5.0",
|
|
223
|
+
"@commitlint/config-conventional": "^19.5.0",
|
|
224
|
+
"@types/vue": "^2.0.0",
|
|
225
|
+
"@typescript-eslint/parser": "^8.13.0",
|
|
226
|
+
"@vitejs/plugin-vue": "^5.1.4",
|
|
227
|
+
"ant-design-vue": "4.x",
|
|
228
|
+
axios: "^1.7.7",
|
|
229
|
+
eslint: "^9.14.0",
|
|
230
|
+
husky: "^9",
|
|
231
|
+
"lint-staged": "^13.2.0",
|
|
232
|
+
typescript: "~5.5.4",
|
|
233
|
+
vite: "^5.4.9",
|
|
234
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
235
|
+
vue: "^3.5.12",
|
|
236
|
+
"vue-tsc": "^2.1.8",
|
|
237
|
+
"@alicloud/cdn20180510": "3.1.2",
|
|
238
|
+
"@alicloud/openapi-client": "0.4.12",
|
|
239
|
+
"@originjs/vite-plugin-commonjs": "1.0.3",
|
|
240
|
+
"@yqg/max-utils": "^1.0.2",
|
|
241
|
+
"ali-oss": "6.17.1",
|
|
242
|
+
chalk: "5.3.0",
|
|
243
|
+
ora: "5.4.1"
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
// vite.config.ts
|
|
248
|
+
var vite_config_default = defineConfig({
|
|
249
|
+
plugins: [
|
|
250
|
+
vue(),
|
|
251
|
+
cssInjectedByJsPlugin(),
|
|
252
|
+
viteAliossPlugin({
|
|
253
|
+
cdnDir: `cdn/yqg-permission/${package_default.version}/`
|
|
254
|
+
})
|
|
255
|
+
],
|
|
256
|
+
resolve: {
|
|
257
|
+
alias: {
|
|
258
|
+
"@": "/src"
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
server: {
|
|
262
|
+
proxy: {
|
|
263
|
+
"/crane": {
|
|
264
|
+
target: "https://crane-test.yangqianguan.com",
|
|
265
|
+
changeOrigin: true
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
build: {
|
|
270
|
+
// 把style.css 内联到js文件中
|
|
271
|
+
cssCodeSplit: false,
|
|
272
|
+
lib: {
|
|
273
|
+
entry: "src/yqg-permission/index.ts",
|
|
274
|
+
name: "yqg-permission",
|
|
275
|
+
fileName: (format) => {
|
|
276
|
+
if (format === "umd") {
|
|
277
|
+
return "yqg-permission.umd.js";
|
|
278
|
+
}
|
|
279
|
+
return "index.js";
|
|
280
|
+
},
|
|
281
|
+
formats: ["es", "umd"]
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
define: {
|
|
285
|
+
"process.env.NODE_ENV": JSON.stringify("production")
|
|
286
|
+
// 手动替换
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
export {
|
|
290
|
+
vite_config_default as default
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiLCAicGx1Z2lucy9hbGlvc3MudHMiLCAicGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZGlybmFtZSA9IFwiL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvVXNlcnMvbHd3L0Rvd25sb2Fkcy93b3JrL2NvZGUveXFnLXBlcm1pc3Npb24vdml0ZS5jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHZ1ZSBmcm9tICdAdml0ZWpzL3BsdWdpbi12dWUnO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZSc7XG5cbmltcG9ydCBjc3NJbmplY3RlZEJ5SnNQbHVnaW4gZnJvbSAndml0ZS1wbHVnaW4tY3NzLWluamVjdGVkLWJ5LWpzJ1xuaW1wb3J0IGFsaW9zcyBmcm9tIFwiLi9wbHVnaW5zL2FsaW9zc1wiO1xuaW1wb3J0IHBrZyBmcm9tIFwiLi9wYWNrYWdlLmpzb25cIjtcblxuLy8gaHR0cHM6Ly92aXRlLmRldi9jb25maWcvXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICAgIHBsdWdpbnM6IFtcbiAgICAgICAgdnVlKCksXG4gICAgICAgIGNzc0luamVjdGVkQnlKc1BsdWdpbigpLFxuICAgICAgICBhbGlvc3Moe1xuICAgICAgICAgICAgY2RuRGlyOiBgY2RuL3lxZy1wZXJtaXNzaW9uLyR7cGtnLnZlcnNpb259L2BcbiAgICAgICAgfSksXG4gICAgXSxcbiAgICByZXNvbHZlOiB7XG4gICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgICAnQCc6ICcvc3JjJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIHNlcnZlcjoge1xuICAgICAgICBwcm94eToge1xuICAgICAgICAgICAgJy9jcmFuZSc6IHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICdodHRwczovL2NyYW5lLXRlc3QueWFuZ3FpYW5ndWFuLmNvbScsXG5cdFx0XHRcdGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBidWlsZDoge1xuXHRcdC8vIFx1NjI4QXN0eWxlLmNzcyBcdTUxODVcdTgwNTRcdTUyMzBqc1x1NjU4N1x1NEVGNlx1NEUyRFxuXHRcdGNzc0NvZGVTcGxpdDogZmFsc2UsXG4gICAgICAgIGxpYjoge1xuICAgICAgICAgICAgZW50cnk6ICdzcmMveXFnLXBlcm1pc3Npb24vaW5kZXgudHMnLFxuICAgICAgICAgICAgbmFtZTogJ3lxZy1wZXJtaXNzaW9uJyxcbiAgICAgICAgICAgIGZpbGVOYW1lOiAoZm9ybWF0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ3VtZCcpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiAneXFnLXBlcm1pc3Npb24udW1kLmpzJzsgLy8gVU1EIFx1NjgzQ1x1NUYwRlx1NzY4NFx1OEY5M1x1NTFGQVx1NjU4N1x1NEVGNlx1NTQwRFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gJ2luZGV4LmpzJzsgLy8gRVNNIFx1NjgzQ1x1NUYwRlx1NzY4NFx1OEY5M1x1NTFGQVx1NjU4N1x1NEVGNlx1NTQwRFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZvcm1hdHM6IFsnZXMnLCAndW1kJ10sXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZpbmU6IHtcbiAgICAgICAgJ3Byb2Nlc3MuZW52Lk5PREVfRU5WJzogSlNPTi5zdHJpbmdpZnkoJ3Byb2R1Y3Rpb24nKSwgLy8gXHU2MjRCXHU1MkE4XHU2NkZGXHU2MzYyXG4gICAgfSxcbn0pO1xuIiwgImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvbHd3L0Rvd25sb2Fkcy93b3JrL2NvZGUveXFnLXBlcm1pc3Npb24vcGx1Z2luc1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiL1VzZXJzL2x3dy9Eb3dubG9hZHMvd29yay9jb2RlL3lxZy1wZXJtaXNzaW9uL3BsdWdpbnMvYWxpb3NzLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9Vc2Vycy9sd3cvRG93bmxvYWRzL3dvcmsvY29kZS95cWctcGVybWlzc2lvbi9wbHVnaW5zL2FsaW9zcy50c1wiOy8vIHZpdGUtcGx1Z2luLWFsaW9zcy50c1xuaW1wb3J0IHsgUGx1Z2luT3B0aW9uLCBVc2VyQ29uZmlnLCBSZXNvbHZlZENvbmZpZyB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IENkbkNsaWVudCwge1xuICBQdXNoT2JqZWN0Q2FjaGVSZXF1ZXN0LFxuICBSZWZyZXNoT2JqZWN0Q2FjaGVzUmVxdWVzdCxcbn0gZnJvbSAnQGFsaWNsb3VkL2NkbjIwMTgwNTEwJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJ0BhbGljbG91ZC9vcGVuYXBpLWNsaWVudCc7XG5pbXBvcnQgT1NTIGZyb20gJ2FsaS1vc3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGxvZGFzaCBhcyBfLCBsb2dnZXIsIG9yYSB9IGZyb20gJ0B5cWcvbWF4LXV0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbnR5cGUgQWxpT1NTQ29uZmlnID0ge1xuICBjZG5EaXI6IHN0cmluZztcbiAgaHRtbERpcj86IHN0cmluZztcbiAgY2RuUmV0cnk/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdml0ZUFsaW9zc1BsdWdpbihvcHRpb25zOiBBbGlPU1NDb25maWcpOiBQbHVnaW5PcHRpb24ge1xuICBsZXQgdml0ZUNvbmZpZzogUmVzb2x2ZWRDb25maWc7XG4gIGxldCBmaWx0ZXJGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGFsaXl1bkJ1Y2tldE1hcCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyh7XG4gICAgICBmZWF0OiBbXG4gICAgICAgICdmaW50b3BpYS13ZWInLFxuICAgICAgICAnaHR0cHM6Ly9zdGF0aWMtYWxpLnlhbmdxaWFuZ3Vhbi5jb20nLFxuICAgICAgICAnb3NzLWNuLWJlaWppbmcnLFxuICAgICAgXSxcbiAgICAgIHByb2Q6IFtcbiAgICAgICAgJ2ZpbnRvcGlhLXdlYicsXG4gICAgICAgICdodHRwczovL3N0YXRpYy1hbGkueWFuZ3FpYW5ndWFuLmNvbScsXG4gICAgICAgICdvc3MtY24tYmVpamluZycsXG4gICAgICBdLFxuICAgICAgdGVzdDogW1xuICAgICAgICAnZmludG9waWEtd2ViLXRlc3QnLFxuICAgICAgICAnaHR0cHM6Ly9zdGF0aWMtYWxpLXRlc3QueWFuZ3FpYW5ndWFuLmNvbScsXG4gICAgICAgICdvc3MtY24tYmVpamluZycsXG4gICAgICBdLFxuICAgIH0pLm1hcCgoW3N0YWdlLCBbbmFtZSwgb3JpZ2luLCByZWdpb24sIGVuZHBvaW50XV0pID0+IFtcbiAgICAgIHN0YWdlLFxuICAgICAgeyBuYW1lLCBvcmlnaW4sIHJlZ2lvbiwgZW5kcG9pbnQgfSxcbiAgICBdKSxcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICd2aXRlLXBsdWdpbi1hbGlvc3MnLFxuICAgIGVuZm9yY2U6ICdwb3N0JyxcbiAgICBhcHBseTogXCJidWlsZFwiLFxuICAgIC8vIFx1OTE0RFx1N0Y2RVx1ODlFM1x1Njc5MFx1OTRBOVx1NUI1MFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGNvbnN0IFNUQUdFID0gcHJvY2Vzcy5lbnYuU1RBR0UgYXMgJ3Rlc3QnIHwgJ3Byb2QnO1xuICAgICAgaWYgKCFTVEFHRSkge1xuICAgICAgICBjb25zb2xlLndhcm4oY2hhbGsueWVsbG93KCdcdTdGM0FcdTVDMTFcdTczQUZcdTU4ODNcdTUzRDhcdTkxQ0YgU1RBR0VcdUZGMENcdTVDMDZcdThERjNcdThGQzdcdTk2M0ZcdTkxQ0NcdTRFOTEgQ0ROIFx1NEUwQVx1NEYyMCcpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBcdThCQkVcdTdGNkUgcHVibGljUGF0aFxuICAgICAgY29uc3QgYnVja2V0ID0gYWxpeXVuQnVja2V0TWFwW1NUQUdFXTtcbiAgICAgIGlmIChidWNrZXQgJiYgb3B0aW9ucz8uY2RuRGlyKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmFzZTogYCR7YnVja2V0Lm9yaWdpbn0vJHtvcHRpb25zLmNkbkRpcn1gXG4gICAgICAgIH0gYXMgVXNlckNvbmZpZztcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gXHU4M0I3XHU1M0Q2XHU4OUUzXHU2NzkwXHU1NDBFXHU3Njg0IFZpdGUgXHU5MTREXHU3RjZFXG4gICAgY29uZmlnUmVzb2x2ZWQoY29uZmlnKSB7XG4gICAgICB2aXRlQ29uZmlnID0gY29uZmlnO1xuICAgIH0sXG5cbiAgICBnZW5lcmF0ZUJ1bmRsZShfLCBidW5kbGUpIHtcbiAgICAgIC8vIFx1NEYxQVx1NTkxQVx1NkIyMVx1NjI2N1x1ODg0Q1xuICAgICAgaWYoXy5mb3JtYXQgPT09ICd1bWQnKSB7XG4gICAgICAgIGZpbHRlckZpZWxkcyA9IE9iamVjdC5rZXlzKGJ1bmRsZSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8vIFx1Njc4NFx1NUVGQVx1NUI4Q1x1NjIxMFx1OTRBOVx1NUI1MFxuICAgIGFzeW5jIGNsb3NlQnVuZGxlKCkge1xuICAgICAgY29uc3QgU1RBR0UgPSBwcm9jZXNzLmVudi5TVEFHRSBhcyAndGVzdCcgfCAncHJvZCc7XG4gICAgICBpZiAoIVNUQUdFIHx8IG9wdGlvbnM/LmNkblJldHJ5KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXHU4REYzXHU4RkM3XHU5NjNGXHU5MUNDXHU0RTkxIENETiBcdTRFMEFcdTRGMjAnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBjZG5EaXIgfSA9IG9wdGlvbnMgfHwge1xuICAgICAgICBjZG5EaXI6ICcnLFxuICAgICAgfTtcblxuICAgICAgaWYgKGNkbkRpcikge1xuICAgICAgICBpZiAoY2RuRGlyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnY2RuRGlyXHU3OTgxXHU2QjYyXHU0RUU1L1x1NUYwMFx1NTkzNCcpKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjZG5EaXIuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnY2RuRGlyXHU1RkM1XHU5ODdCXHU0RUU1L1x1N0VEM1x1NUMzRScpKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxpeXVuQWNjZXNzS2V5SWQgPVxuICAgICAgICBwcm9jZXNzLmVudi5hbGl5dW5BY2Nlc3NLZXlJZCB8fCAnTFRBSTV0TGNCTkVCUkxrZmFrOW5SQTFNJztcbiAgICAgIGNvbnN0IGFsaXl1bkFjY2Vzc0tleVNlY3JldCA9XG4gICAgICAgIHByb2Nlc3MuZW52LmFsaXl1bkFjY2Vzc0tleVNlY3JldCB8fCAnd3hJa2syZGQ1NklzaWJENmJCQ2VFbWE3UUZxZGkxJztcblxuICAgICAgLy8gXHU1MjFEXHU1OUNCXHU1MzE2IE9TUyBcdTVCQTJcdTYyMzdcdTdBRUZcbiAgICAgIGNvbnN0IGFsaXl1bkJ1Y2tldCA9IGFsaXl1bkJ1Y2tldE1hcFtTVEFHRV07XG4gICAgICBpZiAoIWFsaXl1bkJ1Y2tldCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFx1OTYzRlx1OTFDQ1x1NEU5MUJ1Y2tldFx1OTE0RFx1N0Y2RVx1NEUwRFx1NUI1OFx1NTcyOCwgXHU1RjUzXHU1MjREXHU3M0FGXHU1ODgzXHU2NjJGJHtTVEFHRX0gXHU3NkVFXHU1MjREXHU2NTJGXHU2MzAxXHU3Njg0c3RhZ2VcdTY3MDk6ICR7T2JqZWN0LmtleXMoXG4gICAgICAgICAgICBhbGl5dW5CdWNrZXRNYXAsXG4gICAgICAgICAgKS5qb2luKCcsICcpfWAsXG4gICAgICAgICkpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlZ2lvbiwgb3JpZ2luOiBjZG5PcmlnaW4sIGVuZHBvaW50IH0gPSBhbGl5dW5CdWNrZXQ7XG5cbiAgICAgIGNvbnN0IGFsaW9zc0NvbmZpZyA9IHtcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBhY2Nlc3NLZXlJZDogYWxpeXVuQWNjZXNzS2V5SWQsXG4gICAgICAgIGFjY2Vzc0tleVNlY3JldDogYWxpeXVuQWNjZXNzS2V5U2VjcmV0LFxuICAgICAgICBidWNrZXQ6IGFsaXl1bkJ1Y2tldC5uYW1lLFxuICAgICAgICBzZWN1cmU6IHRydWUsXG4gICAgICAgIHRpbWVvdXQ6IDE4MDAwMDAsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3V0RGlyID0gdml0ZUNvbmZpZy5idWlsZC5vdXREaXI7XG4gICAgICBjb25zb2xlLmxvZyhvdXREaXIsICdPdXREaXInKTtcbiAgICAgIGNvbnN0IG91dHB1dFBhdGggPSBqb2luKHByb2Nlc3MuY3dkKCksIG91dERpcik7XG4gICAgICBjb25zdCBtYXhSZXRyaWVzID0gMztcblxuICAgICAgbG9nZ2VyLmluZm8oJ2FsaW9zcycsICdcdTVGMDBcdTU5Q0JcdTRFMEFcdTRGMjBjZG5cdThENDRcdTZFOTAnLCAnXHVEODNEXHVERTgwJyk7XG4gICAgICBjb25zdCBwdXRCYXRjaFNpemUgPSA1MDtcbiAgICAgIGNvbnN0IGZpbGVDaHVua3MgPSBfLmNodW5rKGZpbHRlckZpZWxkcywgcHV0QmF0Y2hTaXplKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTkxNERcdTdGNkVcdTRGRTFcdTYwNkY6ICR7SlNPTi5zdHJpbmdpZnkoYWxpb3NzQ29uZmlnLCBudWxsLCAyKX1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTY1NzBcdTkxQ0Y6ICR7ZmlsdGVyRmllbGRzLmxlbmd0aH1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTUyMDZcdTYyNzlcdTY1NzBcdTkxQ0Y6ICR7ZmlsZUNodW5rcy5sZW5ndGh9YCk7XG4gICAgICBsb2dnZXIuaW5mbyhgXHU0RTBBXHU0RjIwXHU2NTg3XHU0RUY2XHU1MjA2XHU2Mjc5XHU1OTI3XHU1QzBGOiAke3B1dEJhdGNoU2l6ZX1gKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTY1ODdcdTRFRjZcdTY3MDBcdTU5MjdcdTkxQ0RcdThCRDVcdTZCMjFcdTY1NzA6ICR7bWF4UmV0cmllc31gKTtcblxuICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYSh7XG4gICAgICAgIHByZWZpeFRleHQ6ICdhbGlvc3MudXBsb2FkJyxcbiAgICAgICAgc3Bpbm5lcjogJ2Flc3RoZXRpYycsXG4gICAgICB9KS5zdGFydCgnXHU1RjAwXHU1OUNCXHU0RTBBXHU0RjIwY2RuXHU4RDQ0XHU2RTkwJyk7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZEZpbGVXaXRoUmV0cnkoXG4gICAgICAgIGNsaWVudCxcbiAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgIHJldHJpZXMgPSBtYXhSZXRyaWVzLFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IGpvaW4oY2RuRGlyLCBmaWxlbmFtZSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRmlsZSA9IGpvaW4ob3V0cHV0UGF0aCwgZmlsZW5hbWUpO1xuICAgICAgICBjb25zb2xlLmxvZyhsb2NhbEZpbGUsIFwibG9jYWxGaWxlXCIpO1xuXG4gICAgICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IHJldHJpZXM7IGF0dGVtcHQrKykge1xuICAgICAgICAgIGNvbnN0IGF0dGVtcHRUZXh0ID0gYXR0ZW1wdCA9PT0gMSA/ICcnIDogYCAoXHU5MUNEXHU4QkQ1ICR7YXR0ZW1wdH0pYDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYFx1NEUwQVx1NEYyMFx1NEUyRCAke2ZpbGVuYW1lfSAke2F0dGVtcHRUZXh0fS4uLmApO1xuICAgICAgICAgICAgYXdhaXQgY2xpZW50LnB1dChrZXksIGxvY2FsRmlsZSk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgXHU0RTBBXHU0RjIwXHU1QjhDXHU2MjEwICR7ZmlsZW5hbWV9ICR7YXR0ZW1wdFRleHR9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBcdTRFMEFcdTRGMjBcdTU5MzFcdThEMjUgJHtmaWxlbmFtZX0gJHthdHRlbXB0VGV4dH1gKTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgXHU2NzAwXHU1OTI3XHU5MUNEXHU4QkQ1XHU2QjIxXHU2NTcwXHU1NDBFXHU5NjNGXHU5MUNDXHU0RTkxXHU0RTBBXHU0RjIwXHU1OTMxXHU4RDI1ICR7ZmlsZW5hbWV9YCk7XG4gICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBcdTkxQ0RcdThCRDVcdTRFMEFcdTRGMjAgJHtmaWxlbmFtZX0gJHthdHRlbXB0VGV4dH0uLi5gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmlsZUNodW5rcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpbGVDaHVua3MsIGtleSkpIHtcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGZpbGVDaHVua3Nba2V5XTtcbiAgICAgICAgICBzcGlubmVyLmluZm8oXG4gICAgICAgICAgICBgXHU3QjJDJHsra2V5ICsgMX0vJHtmaWxlQ2h1bmtzLmxlbmd0aH1cdTYyNzlcdTRFMEFcdTRGMjAgLSAke2NodW5rLmxlbmd0aH0gXHU0RTJBXHU2NTg3XHU0RUY2YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBPU1MoYWxpb3NzQ29uZmlnKTtcblxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgY2h1bmsubWFwKChmaWxlbmFtZSkgPT4gdXBsb2FkRmlsZVdpdGhSZXRyeShjbGllbnQsIGZpbGVuYW1lKSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzcGlubmVyLmluZm8oYFx1N0IyQyR7K2tleSArIDF9LyR7ZmlsZUNodW5rcy5sZW5ndGh9XHU2Mjc5XHU0RTBBXHU0RjIwXHU1QjhDXHU2MjEwYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdcdTRFMEFcdTRGMjBjZG5cdThENDRcdTZFOTBcdTVCOENcdTYyMTAnKTtcbiAgICAgIGNvbnN0IGNkbkNsaWVudCA9IG5ldyBDZG5DbGllbnQuZGVmYXVsdChuZXcgQ29uZmlnKHtcbiAgICAgICAgYWNjZXNzS2V5SWQ6IGFsaXl1bkFjY2Vzc0tleUlkLFxuICAgICAgICBhY2Nlc3NLZXlTZWNyZXQ6IGFsaXl1bkFjY2Vzc0tleVNlY3JldCxcbiAgICAgICAgcmVnaW9uSWQ6IHJlZ2lvbixcbiAgICAgIH0pKTtcbiAgXG4gICAgICBjb25zdCB2YWxpZEFzc2V0VXJscyA9IGZpbHRlckZpZWxkcy5tYXAoXG4gICAgICAgIChmaWxlbmFtZTogc3RyaW5nKSA9PiBgJHtjZG5PcmlnaW59LyR7Y2RuRGlyfSR7ZmlsZW5hbWV9YCxcbiAgICAgICk7XG4gICAgICBjb25zdCBjZG5Ib3N0bmFtZSA9IG5ldyBVUkwoY2RuT3JpZ2luKS5ob3N0bmFtZTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDtcbiAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICB3aGlsZSAoc3RhcnQgPCB2YWxpZEFzc2V0VXJscy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY2RuVXJscyA9IHZhbGlkQXNzZXRVcmxzLnNsaWNlKHN0YXJ0LCBzdGFydCArIGJhdGNoU2l6ZSk7XG5cbiAgICAgICAgY29uc3QgY2RuVXJsUGF0aHMgPSBjZG5VcmxzLm1hcCgoYXNzZXRQYXRoKSA9PlxuICAgICAgICAgIGpvaW4oY2RuSG9zdG5hbWUsIGNkbkRpciwgYXNzZXRQYXRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0UGF0aCA9IGNkblVybFBhdGhzLmpvaW4oJ1xcbicpO1xuICAgICAgICAvLyByZWZyZXNoXG4gICAgICAgIGNvbnN0IHJlZnJlc2hSZXEgPSBuZXcgUmVmcmVzaE9iamVjdENhY2hlc1JlcXVlc3QoeyBvYmplY3RQYXRoIH0pO1xuICAgICAgICBsb2dnZXIuaW5mbygnXHU1RjAwXHU1OUNCXHU1MjM3XHU2NUIwY2RuXHU3RjEzXHU1QjU4Jyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgY2RuQ2xpZW50LnJlZnJlc2hPYmplY3RDYWNoZXMocmVmcmVzaFJlcSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NTIzN1x1NjVCMGNkblx1N0YxM1x1NUI1OFx1NjIxMFx1NTI5RicpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1x1NTIzN1x1NjVCMGNkblx1N0YxM1x1NUI1OFx1NTkzMVx1OEQyNScsIGVycik7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBQdXNoT2JqZWN0Q2FjaGVSZXF1ZXN0KHsgb2JqZWN0UGF0aCB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NUYwMFx1NTlDQlx1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OCcpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGNkbkNsaWVudC5wdXNoT2JqZWN0Q2FjaGUocmVxdWVzdCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oJ1x1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OFx1NjIxMFx1NTI5RicpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1x1NjNBOFx1OTAwMWNkblx1N0YxM1x1NUI1OFx1NTkzMVx1OEQyNScsIGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBzdGFydCArPSBiYXRjaFNpemU7XG5cbiAgICAgICAgLy8gXHU4RjkzXHU1MUZBXHU1MjM3XHU2NUIwXHU1NDBFY2RuXHU1NzMwXHU1NzQwXG4gICAgICAgIGxvZ2dlci5pbmZvKCdcdTUyMzdcdTY1QjBcdTU0MEVjZG5cdTU3MzBcdTU3NDAnLCBjZG5VcmxzKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufSIsICJ7XG4gICAgXCJuYW1lXCI6IFwiQHlxZy9wZXJtaXNzaW9uXCIsXG4gICAgXCJ2ZXJzaW9uXCI6IFwiMS4zLjAtYWxwaGEuMTBcIixcbiAgICBcIm1haW5cIjogXCJkaXN0L2luZGV4LmpzXCIsXG4gICAgXCJtb2R1bGVcIjogXCJkaXN0L2luZGV4LmpzXCIsXG4gICAgXCJ0eXBlXCI6IFwibW9kdWxlXCIsXG4gICAgXCJwdWJsaXNoQ29uZmlnXCI6IHtcbiAgICAgICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIixcbiAgICAgICAgXCJyZWdpc3RyeVwiOiBcImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL1wiXG4gICAgfSxcbiAgICBcInNjcmlwdHNcIjoge1xuICAgICAgICBcImJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiB2aXRlIGJ1aWxkXCIsXG4gICAgICAgIFwiZGV2XCI6IFwidml0ZVwiLFxuICAgICAgICBcInByZXZpZXdcIjogXCJ2aXRlIHByZXZpZXdcIixcbiAgICAgICAgXCJkZW1vOmJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiBTVEFHRT10ZXN0IHZpdGUgYnVpbGRcIixcbiAgICAgICAgXCJwcm9kOmJ1aWxkXCI6IFwidnVlLXRzYyAtYiAmJiBTVEFHRT1wcm9kIHZpdGUgYnVpbGRcIlxuXG4gICAgfSxcbiAgICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgICAgIFwiQGFudC1kZXNpZ24vaWNvbnMtdnVlXCI6IFwiXjcuMC4xXCIsXG4gICAgICAgIFwiQGNvbW1pdGxpbnQvY2xpXCI6IFwiXjE5LjUuMFwiLFxuICAgICAgICBcIkBjb21taXRsaW50L2NvbmZpZy1jb252ZW50aW9uYWxcIjogXCJeMTkuNS4wXCIsXG4gICAgICAgIFwiQHR5cGVzL3Z1ZVwiOiBcIl4yLjAuMFwiLFxuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9wYXJzZXJcIjogXCJeOC4xMy4wXCIsXG4gICAgICAgIFwiQHZpdGVqcy9wbHVnaW4tdnVlXCI6IFwiXjUuMS40XCIsXG4gICAgICAgIFwiYW50LWRlc2lnbi12dWVcIjogXCI0LnhcIixcbiAgICAgICAgXCJheGlvc1wiOiBcIl4xLjcuN1wiLFxuICAgICAgICBcImVzbGludFwiOiBcIl45LjE0LjBcIixcbiAgICAgICAgXCJodXNreVwiOiBcIl45XCIsXG4gICAgICAgIFwibGludC1zdGFnZWRcIjogXCJeMTMuMi4wXCIsXG4gICAgICAgIFwidHlwZXNjcmlwdFwiOiBcIn41LjUuNFwiLFxuICAgICAgICBcInZpdGVcIjogXCJeNS40LjlcIixcbiAgICAgICAgXCJ2aXRlLXBsdWdpbi1jc3MtaW5qZWN0ZWQtYnktanNcIjogXCJeMy41LjJcIixcbiAgICAgICAgXCJ2dWVcIjogXCJeMy41LjEyXCIsXG4gICAgICAgIFwidnVlLXRzY1wiOiBcIl4yLjEuOFwiLFxuICAgICAgICBcIkBhbGljbG91ZC9jZG4yMDE4MDUxMFwiOiBcIjMuMS4yXCIsXG4gICAgICAgIFwiQGFsaWNsb3VkL29wZW5hcGktY2xpZW50XCI6IFwiMC40LjEyXCIsXG4gICAgICAgIFwiQG9yaWdpbmpzL3ZpdGUtcGx1Z2luLWNvbW1vbmpzXCI6IFwiMS4wLjNcIixcbiAgICAgICAgXCJAeXFnL21heC11dGlsc1wiOiBcIl4xLjAuMlwiLFxuICAgICAgICBcImFsaS1vc3NcIjogXCI2LjE3LjFcIixcbiAgICAgICAgXCJjaGFsa1wiOiBcIjUuMy4wXCIsXG4gICAgICAgIFwib3JhXCI6IFwiNS40LjFcIlxuICAgIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBeVQsT0FBTyxTQUFTO0FBQ3pVLFNBQVMsb0JBQW9CO0FBRTdCLE9BQU8sMkJBQTJCOzs7QUNEbEMsT0FBTztBQUFBLEVBQ0w7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixPQUFPLFNBQVM7QUFDaEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsV0FBVztBQUNwQixTQUFTLFVBQVUsR0FBRyxRQUFRLFdBQVc7QUFDekMsT0FBTyxXQUFXO0FBUUgsU0FBUixpQkFBa0MsU0FBcUM7QUFDNUUsTUFBSTtBQUNKLE1BQUksZUFBeUIsQ0FBQztBQUM5QixRQUFNLGtCQUFrQixPQUFPO0FBQUEsSUFDN0IsT0FBTyxRQUFRO0FBQUEsTUFDYixNQUFNO0FBQUEsUUFDSjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLE1BQ0EsTUFBTTtBQUFBLFFBQ0o7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE1BQU07QUFBQSxRQUNKO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDLEVBQUUsSUFB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
|