sonamu 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +21 -9
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +15 -10
- package/dist/template/implementations/service.template.d.ts.map +1 -1
- package/dist/template/implementations/service.template.js +2 -2
- package/package.json +3 -3
- package/src/shared/app.shared.ts.txt +469 -0
- package/src/shared/web.shared.ts.txt +3 -3
- package/src/syncer/syncer.ts +21 -8
- package/src/template/implementations/model.template.ts +20 -10
- package/src/template/implementations/service.template.ts +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../../src/syncer/syncer.ts"],"names":[],"mappings":"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"}
|
package/dist/syncer/syncer.js
CHANGED
|
@@ -2,6 +2,7 @@ import { hot } from "@sonamu-kit/hmr-hook";
|
|
|
2
2
|
import assert from "assert";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
5
|
+
import inflection from "inflection";
|
|
5
6
|
import { minimatch } from "minimatch";
|
|
6
7
|
import path, { dirname } from "path";
|
|
7
8
|
import { group, unique } from "radashi";
|
|
@@ -114,13 +115,13 @@ export class Syncer {
|
|
|
114
115
|
// 따라서 /src/에서 찾습니다.
|
|
115
116
|
const srcPath = path.join(import.meta.dirname.replace("/dist/", "/src/"), `../shared/${target}.shared.ts.txt`);
|
|
116
117
|
if (!await exists(srcPath)) {
|
|
117
|
-
|
|
118
|
+
continue;
|
|
118
119
|
}
|
|
119
120
|
if (!await exists(path.join(Sonamu.appRootPath, target))) {
|
|
120
121
|
throw new Error(`Tried to copy sonamu.shared.ts to target '${target}' but the target directory does not exist. Please check your project directory structure.`);
|
|
121
122
|
}
|
|
122
123
|
// 이건 프로젝트에 .ts 소스 코드 파일을 생성하는 것이므로 src의 .ts 경로로 갑니다.
|
|
123
|
-
const destPath = path.join(Sonamu.appRootPath, target, "
|
|
124
|
+
const destPath = path.join(Sonamu.appRootPath, target, "src/services/sonamu.shared.ts");
|
|
124
125
|
// 정말 혹시나지만 target 디렉토리는 있어도 src/services 디렉토리는 없을 수 있으므로 미리 생성해줍니다.
|
|
125
126
|
if (!await exists(path.dirname(destPath))) {
|
|
126
127
|
await mkdir(path.dirname(destPath), {
|
|
@@ -129,7 +130,7 @@ export class Syncer {
|
|
|
129
130
|
console.warn(`Created directory '${path.dirname(destPath)}' because it did not exist.`);
|
|
130
131
|
}
|
|
131
132
|
if (await areFilesSame(srcPath, destPath)) {
|
|
132
|
-
|
|
133
|
+
continue;
|
|
133
134
|
}
|
|
134
135
|
await writeFile(destPath, await readFile(srcPath));
|
|
135
136
|
!isTest() && console.log(chalk.bold("Copied: ") + chalk.blue(path.relative(Sonamu.appRootPath, destPath)));
|
|
@@ -249,12 +250,13 @@ export class Syncer {
|
|
|
249
250
|
namesRecord: EntityManager.getNamesFromId(entityId)
|
|
250
251
|
};
|
|
251
252
|
}
|
|
252
|
-
if (modelPath.endsWith(".frame.
|
|
253
|
-
const [, frameName] = modelPath.match(/.+\/(.+)\.frame\.
|
|
254
|
-
console.log(modelPath, "->", frameName);
|
|
253
|
+
if (modelPath.endsWith(".frame.ts")) {
|
|
254
|
+
const [, frameName] = modelPath.match(/.+\/(.+)\.frame\.ts$/) ?? [];
|
|
255
255
|
assert(frameName);
|
|
256
|
+
// frameName을 PascalCase로 변환 (dashboard -> Dashboard)
|
|
257
|
+
const frameId = inflection.camelize(frameName);
|
|
256
258
|
return {
|
|
257
|
-
namesRecord: EntityManager.getNamesFromId(
|
|
259
|
+
namesRecord: EntityManager.getNamesFromId(frameId)
|
|
258
260
|
};
|
|
259
261
|
}
|
|
260
262
|
throw new Error("not reachable");
|
|
@@ -334,7 +336,17 @@ export class Syncer {
|
|
|
334
336
|
}
|
|
335
337
|
const oldFileContent = (await readFile(fromPath)).toString();
|
|
336
338
|
const newFileContent = (()=>{
|
|
337
|
-
|
|
339
|
+
// web이나 app 등에는 sonamu가 없습니다.
|
|
340
|
+
// 따라서 sonamu에 대한 import는 함께 복사되는 sonamu.shared.ts에 대한 import로 치환해야 합니다.
|
|
341
|
+
// 문제는 리소스 종류에 따라 sonamu.shared.ts로 가는 경로가 다르다는 점입니다.
|
|
342
|
+
// 예를 들어 sonamu.generated.ts 입장에서 sonamu.shared.ts는 같은 디렉토리에 있으니 ./sonamu.shared로 치환하면 되지만,
|
|
343
|
+
// user.types.ts 입장에서 sonamu.shared.ts는 상위 디렉토리에 있으니 ../sonamu.shared로 치환해야 합니다.
|
|
344
|
+
// 이 문제를 해결하기 위해 복사하고자 하는 리소스의 경로(toPath)를 기준으로 sonamu.shared.ts가 있는 디렉토리를 찾아서 상대 경로를 계산하도록 하였습니다.
|
|
345
|
+
const servicesDir = toPath.replace(/\/services\/.*$/, "/services");
|
|
346
|
+
const fileDir = dirname(toPath);
|
|
347
|
+
const relativePath = path.relative(fileDir, servicesDir);
|
|
348
|
+
const sharedPath = relativePath === "" ? "./sonamu.shared" : `${relativePath}/sonamu.shared`;
|
|
349
|
+
const nfc = oldFileContent.replace(/from "sonamu"/g, `from "${sharedPath}"`);
|
|
338
350
|
return nfc;
|
|
339
351
|
})();
|
|
340
352
|
return writeFile(toPath, newFileContent);
|
|
@@ -420,4 +432,4 @@ export class Syncer {
|
|
|
420
432
|
}
|
|
421
433
|
}
|
|
422
434
|
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICBpc1N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuL3NyYy9zZXJ2aWNlcy9zb25hbXUuc2hhcmVkLnRzXCIpO1xuXG4gICAgICAvLyDsoJXrp5Ag7Zi57Iuc64KY7KeA66eMIHRhcmdldCDrlJTroInthqDrpqzripQg7J6I7Ja064+EIHNyYy9zZXJ2aWNlcyDrlJTroInthqDrpqzripQg7JeG7J2EIOyImCDsnojsnLzrr4DroZwg66+466asIOyDneyEse2VtOykjeuLiOuLpC5cbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhwYXRoLmRpcm5hbWUoZGVzdFBhdGgpKSkpIHtcbiAgICAgICAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIGNvbnNvbGUud2FybihgQ3JlYXRlZCBkaXJlY3RvcnkgJyR7cGF0aC5kaXJuYW1lKGRlc3RQYXRoKX0nIGJlY2F1c2UgaXQgZGlkIG5vdCBleGlzdC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGFyZUZpbGVzU2FtZShzcmNQYXRoLCBkZXN0UGF0aCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgpKTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUuanNcIikgfHwgbW9kZWxQYXRoLmVuZHNXaXRoKFwiLmZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lXFwuKGpzfHRzKSQvKSA/PyBbXTtcbiAgICAgICAgY29uc29sZS5sb2cobW9kZWxQYXRoLCBcIi0+XCIsIGZyYW1lTmFtZSk7XG4gICAgICAgIGFzc2VydChmcmFtZU5hbWUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGZyYW1lTmFtZSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJub3QgcmVhY2hhYmxlXCIpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKHBhcmFtcyk7XG4gICAgYXdhaXQgdGhpcy5hY3Rpb25HZW5lcmF0ZUh0dHBzKCk7XG4gIH1cblxuICAvLyB3ZWIvLnNvbmFtdS5lbnYg7JeQIO2YhOyerCDshKTsoJXqsJIg7KCA7J6lXG4gIGFzeW5jIGFjdGlvblN5bmNDb25maWcoKSB7XG4gICAgY29uc3QgeyBob3N0LCBwb3J0IH0gPSBTb25hbXUuY29uZmlnLnNlcnZlci5saXN0ZW4gPz8ge307XG4gICAgY29uc3QgY29udGVudCA9IGBBUElfSE9TVD0ke2hvc3QgPz8gXCJsb2NhbGhvc3RcIn1cXG5BUElfUE9SVD0ke3BvcnQgPz8gMzAwMH1gO1xuXG4gICAgTmFpdGUudChcImFjdGlvblN5bmNDb25maWdcIiwgeyBjb250ZW50IH0pO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgU29uYW11LmNvbmZpZy5zeW5jLnRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuc29uYW11LmVudlwiKSwgY29udGVudCk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQudHPsmYAgc29uYW11LmdlbmVyYXRlZC5zc28udHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNjaGVtYXMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRfc3NvXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZFwiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICBdKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogKi5zZXJ2aWNlLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHBhcmFtc0FycmF5XG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2VydmljZXMoXG4gICAgcGFyYW1zQXJyYXk6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10sXG4gICk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBOYWl0ZS50KFwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlc1wiLCBwYXJhbXNBcnJheSk7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwYXJhbXNBcnJheS5tYXAoYXN5bmMgKHBhcmFtcykgPT5cbiAgICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwic2VydmljZVwiLCBwYXJhbXMgYXMgVGVtcGxhdGVPcHRpb25zW1wic2VydmljZVwiXSwge1xuICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgKVxuICAgIClcbiAgICAgIC5mbGF0KClcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC5odHRw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZUh0dHBzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gICAgY29uc3QgW3Jlc10gPSBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFxuICAgICAgXCJnZW5lcmF0ZWRfaHR0cFwiLFxuICAgICAgeyBlbnRpdHlJZDogXCJkdW1teVwiIH0sXG4gICAgICB7IG92ZXJ3cml0ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgYXNzZXJ0KHJlcyk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnR5cGVzLnRzLCAqLmZ1bmN0aW9ucy50cywgKi5nZW5lcmF0ZWQudHPrpbwg7YOA6rKfIOuUlOugie2GoOumrOyXkCDrs7Xsgqztlanri4jri6QuXG4gICAqIEBwYXJhbSB0c1BhdGhzXG4gICAqIEByZXR1cm5zIOuzteyCrOuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICBjb25zdCB7IGRpcjogYXBpRGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgdGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT5cbiAgICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHRzUGF0aHMubWFwKGFzeW5jIChyZWFsU3JjKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGRzdCA9IHJlYWxTcmNcbiAgICAgICAgICAgICAgICAucmVwbGFjZShgLyR7YXBpRGlyfS9gLCBgLyR7dGFyZ2V0fS9gKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKFwiL2FwcGxpY2F0aW9uL1wiLCBcIi9zZXJ2aWNlcy9cIik7XG4gICAgICAgICAgICAgIGNvbnN0IGRpciA9IGRpcm5hbWUoZHN0KTtcbiAgICAgICAgICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKGRpcikpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWtkaXIoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUoZHN0LnJlcGxhY2UoYCR7U29uYW11LmFwcFJvb3RQYXRofS9gLCBcIlwiKSksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKHJlYWxTcmMsIGRzdCk7XG4gICAgICAgICAgICAgIHJldHVybiBkc3Q7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICkuZmxhdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3B5RmlsZVdpdGhSZXBsYWNlQ29yZVRvU2hhcmVkKGZyb21QYXRoOiBzdHJpbmcsIHRvUGF0aDogc3RyaW5nKSB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKGZyb21QYXRoKSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvbGRGaWxlQ29udGVudCA9IChhd2FpdCByZWFkRmlsZShmcm9tUGF0aCkpLnRvU3RyaW5nKCk7XG5cbiAgICBjb25zdCBuZXdGaWxlQ29udGVudCA9ICgoKSA9PiB7XG4gICAgICBjb25zdCBuZmMgPSBvbGRGaWxlQ29udGVudC5yZXBsYWNlKC9mcm9tIFwic29uYW11XCIvZywgYGZyb20gXCIuL3NvbmFtdS5zaGFyZWRcImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgc3luY1VJKCkge1xuICAgIGNvbnN0IHVpUG9ydCA9IFNvbmFtdS5jb25maWcudWk/LnBvcnQgPz8gNTcwMDA7XG5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBmZXRjaChgaHR0cDovLzEyNy4wLjAuMToke3VpUG9ydH0vYXBpL3JlbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgfSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRmFpbGVkIHRvIHJlbG9hZCBTb25hbXUgVUk6ICR7ZS5tZXNzYWdlfWApKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJtaW5pbWF0Y2giLCJwYXRoIiwiZGlybmFtZSIsImdyb3VwIiwidW5pcXVlIiwicmVnaXN0ZXJlZEFwaXMiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZU1hbmFnZXIiLCJUZW1wbGF0ZUtleSIsIm1hcEFzeW5jIiwicmVkdWNlQXN5bmMiLCJjZW50ZXJUZXh0IiwiaXNUZXN0IiwiZXhpc3RzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJhcmVGaWxlc1NhbWUiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJyZW5ld0NoZWNrc3VtcyIsImdlbmVyYXRlVGVtcGxhdGUiLCJyZW5kZXJUZW1wbGF0ZSIsImNyZWF0ZUVudGl0eSIsImRlbEVudGl0eSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJsb2FkQXBpcyIsImxvYWRNb2RlbHMiLCJsb2FkVHlwZXMiLCJTeW5jZXIiLCJhcGlzIiwidHlwZXMiLCJtb2RlbHMiLCJpc1N5bmNpbmciLCJzeW5jIiwidGFyZ2V0cyIsImNvbmZpZyIsImNvcHlTaGFyZWRUb1RhcmdldHMiLCJjaGFuZ2VkRmlsZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwibG9nIiwiYmxhY2siLCJiZ0dyZWVuIiwiZG9TeW5jQWN0aW9ucyIsIndoZW5UaGlzSGFwcGVucyIsIndhaXRGb3JVcFRvIiwic3luY0Zyb21XYXRjaGVyIiwiZXZlbnQiLCJkaWZmRmlsZVBhdGgiLCJpbnZhbGlkYXRlZFBhdGhzIiwiaW52YWxpZGF0ZUZpbGUiLCJib2xkIiwiaW52YWxpZGF0ZWRQYXRoIiwicmVtb3ZlZEFwaXMiLCJyZW1vdmVJbnZhbGlkYXRlZFJlZ2lzdGVyZWRBcGlzIiwiYmx1ZSIsInJlbGF0aXZlIiwiYXBpUm9vdFBhdGgiLCJncmF5IiwiaXNJbkNoZWNrUGF0dGVybkdyb3VwIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInBhdHRlcm4iLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJzeW5jVUkiLCJlbmRzV2l0aCIsImVudGl0eUlkIiwiZ2V0RW50aXR5SWRGcm9tUGF0aCIsInRvUmVtb3ZlIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwic3BsaWNlIiwiaW5kZXhPZiIsInRhcmdldCIsInNyY1BhdGgiLCJqb2luIiwicmVwbGFjZSIsImFwcFJvb3RQYXRoIiwiRXJyb3IiLCJkZXN0UGF0aCIsInJlY3Vyc2l2ZSIsIndhcm4iLCJkaWZmRmlsZVBhdGhzIiwiZGlmZkdyb3VwcyIsImNhbGN1bGF0ZURpZmZHcm91cHMiLCJkaWZmVHlwZXMiLCJrZXlzIiwiaW5jbHVkZXMiLCJoYW5kbGVFbnRpdHlDaGFuZ2UiLCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UiLCJoYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UiLCJhY3Rpb25TeW5jQ29uZmlnIiwiZGlmZkZpbGVzIiwiciIsIm1hdGNoZWQiLCJtYXRjaCIsInQiLCJyZWxvYWQiLCJlbnRpdHkiLCJnZXQiLCJ0eXBlRmlsZVBhdGgiLCJuYW1lcyIsImZzIiwicGFyZW50SWQiLCJ1bmRlZmluZWQiLCJhY3Rpb25HZW5lcmF0ZVNjaGVtYXMiLCJnZW5lcmF0ZWQiLCJwdXNoIiwidHNQYXRocyIsImZ1bmN0aW9ucyIsImFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyIsIm1lcmdlZEdyb3VwIiwibW9kZWwiLCJmcmFtZSIsInBhcmFtcyIsIm1hcCIsIm1vZGVsUGF0aCIsIm5hbWVzUmVjb3JkIiwiZ2V0TmFtZXNGcm9tSWQiLCJmcmFtZU5hbWUiLCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzIiwiYWN0aW9uR2VuZXJhdGVIdHRwcyIsImhvc3QiLCJwb3J0Iiwic2VydmVyIiwibGlzdGVuIiwiY29udGVudCIsIlByb21pc2UiLCJhbGwiLCJvdmVyd3JpdGUiLCJmbGF0IiwicGFyYW1zQXJyYXkiLCJyZXMiLCJkaXIiLCJhcGlEaXIiLCJyZWFsU3JjIiwiZHN0IiwiY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZCIsImZyb21QYXRoIiwidG9QYXRoIiwib2xkRmlsZUNvbnRlbnQiLCJ0b1N0cmluZyIsIm5ld0ZpbGVDb250ZW50IiwibmZjIiwiY2hlY2tFeGlzdHNHZW5Db2RlIiwidGVtcGxhdGVLZXkiLCJlbnVtSWQiLCJnZW5QYXRoIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInN1YlBhdGgiLCJmdWxsUGF0aCIsImlzRXhpc3RzIiwiY2hlY2tFeGlzdHMiLCJlbnVtcyIsIm9wdGlvbnMiLCJlbnVtc0tleXMiLCJuYW1lIiwiY29uc3RhbnQiLCJyZXN1bHQiLCJrZXkiLCJ0cGwiLCJzdGFydHNXaXRoIiwiY29tcG9uZW50SWQiLCJwIiwidWlQb3J0IiwidWkiLCJmZXRjaCIsIm1ldGhvZCIsImNhdGNoIiwiZSIsImRpbSIsIm1lc3NhZ2UiLCJmb3JtIiwidGVtcGxhdGVPcHRpb25zIiwiX2dlbmVyYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsR0FBRyxRQUFRLHVCQUF1QjtBQUMzQyxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLEtBQUssRUFBRUMsUUFBUSxFQUFFQyxTQUFTLFFBQVEsbUJBQWM7QUFDekQsU0FBU0MsU0FBUyxRQUFRLFlBQVk7QUFDdEMsT0FBT0MsUUFBUUMsT0FBTyxRQUFRLE9BQU87QUFDckMsU0FBU0MsS0FBSyxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUV4QyxTQUFTQyxjQUFj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
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IG1pbmltYXRjaCB9IGZyb20gXCJtaW5pbWF0Y2hcIjtcbmltcG9ydCBwYXRoLCB7IGRpcm5hbWUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIsIHR5cGUgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgVGVtcGxhdGVNYW5hZ2VyIH0gZnJvbSBcIi4uL3RlbXBsYXRlL3RlbXBsYXRlLW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVPcHRpb25zLCBQYXRoQW5kQ29kZSB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGVLZXksIHR5cGUgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBtYXBBc3luYywgcmVkdWNlQXN5bmMgfSBmcm9tIFwiLi4vdXRpbHMvYXN5bmMtdXRpbHNcIjtcbmltcG9ydCB7IGNlbnRlclRleHQgfSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBpc1Rlc3QgfSBmcm9tIFwiLi4vdXRpbHMvY29udHJvbGxlclwiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBydW5XaXRoR3JhY2VmdWxTaHV0ZG93biB9IGZyb20gXCIuLi91dGlscy9wcm9jZXNzLXV0aWxzXCI7XG5pbXBvcnQgeyBhcmVGaWxlc1NhbWUsIGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcywgcmVuZXdDaGVja3N1bXMgfSBmcm9tIFwiLi9jaGVja3N1bVwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVUZW1wbGF0ZSwgcmVuZGVyVGVtcGxhdGUgfSBmcm9tIFwiLi9jb2RlLWdlbmVyYXRvclwiO1xuaW1wb3J0IHsgY3JlYXRlRW50aXR5LCBkZWxFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdHktb3BlcmF0aW9uc1wiO1xuaW1wb3J0IHsgdHlwZSBGaWxlVHlwZSwgZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCB9IGZyb20gXCIuL2ZpbGUtcGF0dGVybnNcIjtcbmltcG9ydCB7XG4gIHR5cGUgTG9hZGVkQXBpcyxcbiAgdHlwZSBMb2FkZWRNb2RlbHMsXG4gIHR5cGUgTG9hZGVkVHlwZXMsXG4gIGxvYWRBcGlzLFxuICBsb2FkTW9kZWxzLFxuICBsb2FkVHlwZXMsXG59IGZyb20gXCIuL21vZHVsZS1sb2FkZXJcIjtcblxudHlwZSBEaWZmR3JvdXBzID0ge1xuICBba2V5IGluIEZpbGVUeXBlXTogQWJzb2x1dGVQYXRoW107XG59O1xuXG5leHBvcnQgY2xhc3MgU3luY2VyIHtcbiAgYXBpczogTG9hZGVkQXBpcyA9IFtdO1xuICB0eXBlczogTG9hZGVkVHlwZXMgPSB7fTtcbiAgbW9kZWxzOiBMb2FkZWRNb2RlbHMgPSB7fTtcbiAgaXNTeW5jaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIOyytO2BrOyErOydtCDrs4Dqsr3rkJwg67aA67aE7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDri6Trp4wgc29uYW11LnNoYXJlZC50c+uKlCDssrTtgazshKwg67mE6rWQIOyXhuydtCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBhc3luYyBzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuXG4gICAgLy8gc29uYW11LnNoYXJlZC50c+uKlCDrrLTsobDqsbQg7Iux7YGsKOuzteyCrCntlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5jb3B5U2hhcmVkVG9UYXJnZXRzKHRhcmdldHMpO1xuXG4gICAgLy8g6re4IOuLpOydjOu2gO2EsOuKlCDrs4Dqsr3rkJwg7YyM7J287J2EIOywvuyVhOyEnCDrj5nquLDtmZQg7J6R7JeF7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICBjb25zdCBjaGFuZ2VkRmlsZXMgPSBhd2FpdCBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTtcbiAgICBpZiAoY2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KFwiQWxsIGZpbGVzIGFyZSBzeW5jZWQhXCIpKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g66eM7JW9IOyLse2BrCDspJHsl5Ag7ZSE66Gc7IS47Iqk6rCAIOyjveycvOuptCDqvKzsl6zrsoTrpqzquLAg65WM66y47JeQLFxuICAgIC8vIOyLnOq3uOuEkOyXkOuPhCDsnqDsi5wg67KE7Yu4IOyImCDsnojripQg7ZmY6rK9IOyGjeyXkOyEnCDsi7Htgazrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGF3YWl0IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyDslpjqsIAg7Iux7YGsIOyekeyXhSDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoY2hhbmdlZEZpbGVzKTtcblxuICAgICAgICAvLyDsi7Htgawg7JWh7IWY7J20IOuBneuCmOuptCDtla3sg4Eg7LK07YGs7ISs7J2EIOuLpOyLnCDqsLHsi6Dtlanri4jri6QuXG4gICAgICAgIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gICAgICB9LFxuICAgICAgeyB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLCB3YWl0Rm9yVXBUbzogMjAwMDAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoZXLqsIAg6rCQ7KeA7ZWcIO2MjOydvCDrs4Dqsr0g7IKs7ZWt7JeQIOuMgO2VtCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDso7zslrTsp4Qg67OA6rK9IO2MjOydvOuTpCDspJEg7LK07YGs7ISsIOq0gOumrCDrjIDsg4Hsnbgg6rKD65Ok66eMIOqwgOyguOuLpOqwgCDsi7Htgazrpbwg7KeE7ZaJ7ZWp64uI64ukLlxuICAgKiDssrTtgazshKwg7YyM7J28IOyXheuNsOydtO2KuOuKlCDsl6zquLDsl5DshJwg7ZWY7KeAIOyViuyKteuLiOuLpC4g7Zi47Lac7J6Q6rCAIO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aCAtIOuzgOqyvSDtjIzsnbzrk6QuIO2UhOuhnOygne2KuCDro6jtirjrtoDthLAgXCJzcmMvXCIg65iQ64qUIFwiZGlzdC9cIuuhnCDsi5zsnpHtlZjripQg7IOB64yAIOqyveuhnOyeheuLiOuLpC4g7JiI7IucOiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICAgKi9cbiAgYXN5bmMgc3luY0Zyb21XYXRjaGVyKGV2ZW50OiBzdHJpbmcsIGRpZmZGaWxlUGF0aDogQWJzb2x1dGVQYXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiICYmIGV2ZW50ICE9PSBcInVubGlua1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7J2864uoIOuzgOqyveuQnCDtjIzsnbzqs7wgZGVwZW5kZW50IO2MjOydvOuTpOydhCBpbnZhbGlkYXRlIO2VqeuLiOuLpC5cbiAgICAvLyDtlZwg67KIIOydtOyDgSBpbXBvcnTrkJwg7Lmc6rWs65Ok7JeQIOuMgO2VtOyEnOunjCDsi6TsoJwg7J6R7JeF7J20IOydvOyWtOuCqeuLiOuLpC5cbiAgICAvLyDqt7jrn6zri4gg7JWI7Ius7ZWY6rOgIGludmFsaWRhdGUg7ZW064+EIOuQqeuLiOuLpC5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7ISc64qUIGhvdC5pbnZhbGlkYXRlRmlsZeyLnCDstIjquLAg7JeQ65+s6rCAIOuwnOyDne2VmOq4sCDrlYzrrLjsl5AgaW52YWxpZGF0ZSDtlZjsp4Ag7JWK7Iq164uI64ukLlxuICAgIGlmICghaXNUZXN0KCkpIHtcbiAgICAgIGNvbnN0IGludmFsaWRhdGVkUGF0aHMgPSAoYXdhaXQgaG90LmludmFsaWRhdGVGaWxlKGRpZmZGaWxlUGF0aCwgZXZlbnQpKSBhcyBBYnNvbHV0ZVBhdGhbXTtcblxuICAgICAgaWYgKGludmFsaWRhdGVkUGF0aHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKGDwn5SEIEludmFsaWRhdGVkOmApKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGludmFsaWRhdGVkUGF0aCBvZiBpbnZhbGlkYXRlZFBhdGhzKSB7XG4gICAgICAgICAgLy8g66eM7JW9IG1vZGVsLnRzIO2MjOydvOydtCDrs4Dqsr0oaW52YWxpZGF0ZSnrkJjsl4jri6Q/IOq3uOufrOuptCByZWdpc3RlcmVkQXBpcyDspJHsl5DshJwg7J20IOuqqOuNuOyXkCDtlbTri7ntlZjripQgYXBp65Ok7J2AIOyngOybjOykmOyalC5cbiAgICAgICAgICAvLyByZWdpc3RlcmVkQXBpc+uKlCDthrXsnLzroZwg64ukIOuCoOugpOuyhOumtCDsiJgg7JeG7Iq164uI64ukLiByZWdpc3RlcmVkQXBpc+yXkCDsmKzrnbzsmKTripQg7Lmc6rWs65Ok7J2AIOy0iOq4sCDroZzrk5zsi5wg65iQ64qUIEhNUuyLnOyXkOunjCDrk7HroZ3rkJjquLAg65WM66y47J6F64uI64ukLlxuICAgICAgICAgIC8vIOuUsOudvOyEnCBtb2RlbC50cyDtjIzsnbzsnZgg67OA6rK97Jy866GcIOuLpOydjOuyiCDsg4jroZzsmrQgZXZhbOydtCDsmIjsg4HrkJjripQg7J20IOyLnOygkOyXkOyEnOunjCwg7J20IOuqqOuNuOyXkOyEnCDrgpjsmKggcmVnaXN0ZXJlZEFwaXPrk6TsnYQg7KeA7JuM7KSEIOyImCDsnojsirXri4jri6QuXG4gICAgICAgICAgY29uc3QgcmVtb3ZlZEFwaXMgPSB0aGlzLnJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoaW52YWxpZGF0ZWRQYXRoKTtcbiAgICAgICAgICBpZiAocmVtb3ZlZEFwaXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSxcbiAgICAgICAgICAgICAgY2hhbGsuZ3JheShgKHdpdGggJHtyZW1vdmVkQXBpcy5sZW5ndGh9IEFQSXMpYCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKGAtICR7cGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIGludmFsaWRhdGVkUGF0aCl9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzSW5DaGVja1BhdHRlcm5Hcm91cCA9IE9iamVjdC52YWx1ZXMoZ2V0Q2hlY2tzdW1QYXR0ZXJuR3JvdXBJbkFic29sdXRlUGF0aCgpKS5zb21lKFxuICAgICAgKHBhdHRlcm4pID0+IG1pbmltYXRjaChkaWZmRmlsZVBhdGgsIHBhdHRlcm4pLFxuICAgICk7XG5cbiAgICAvLyDtlaAg7J28KHN5bmMp7J20IOyeiOycvOuptCDtlanri4jri6QuXG4gICAgaWYgKGlzSW5DaGVja1BhdHRlcm5Hcm91cCkge1xuICAgICAgYXdhaXQgdGhpcy5kb1N5bmNBY3Rpb25zKFtkaWZmRmlsZVBhdGhdKTtcbiAgICB9XG5cbiAgICAvLyDsi7Htgawg7J6R7JeF7J20IOuBneuCmOuptCDrqqjrk6Ag66qo65OI7J2EIOuhnOuTnO2VqeuLiOuLpC5cbiAgICAvLyBobXItaG9va+yXkCDsnZjtlbQgaW52YWxpZGF0ZeuQnCDrtoDrtoTrk6TsnbQg7JWE64uI652866m0IOy6kOyLnCDqt7jrjIDroZwg7Jyg7KeA7ZWp64uI64ukLlxuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRNb2RlbHMoKTtcbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkQXBpcygpO1xuXG4gICAgdGhpcy5zeW5jVUkoKTtcbiAgfVxuXG4gIHJlbW92ZUludmFsaWRhdGVkUmVnaXN0ZXJlZEFwaXMoXG4gICAgaW52YWxpZGF0ZWRQYXRoOiBBYnNvbHV0ZVBhdGgsXG4gICk6ICh0eXBlb2YgcmVnaXN0ZXJlZEFwaXMpW251bWJlcl1bXSB7XG4gICAgaWYgKCFpbnZhbGlkYXRlZFBhdGguZW5kc1dpdGgoXCIubW9kZWwudHNcIiAvKuyGjOyKpCDsvZTrk5zrpbwg64uk66Oo64qUIOyDge2ZqeydtOuLiCAudHMg6rK966Gc66GcIOu0heuLiOuLpC4qLykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChpbnZhbGlkYXRlZFBhdGgpO1xuICAgIGNvbnN0IHRvUmVtb3ZlID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IGFwaS5tb2RlbE5hbWUgPT09IGAke2VudGl0eUlkfU1vZGVsYCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgdG9SZW1vdmUpIHtcbiAgICAgIHJlZ2lzdGVyZWRBcGlzLnNwbGljZShyZWdpc3RlcmVkQXBpcy5pbmRleE9mKGFwaSksIDEpO1xuICAgIH1cblxuICAgIHJldHVybiB0b1JlbW92ZTtcbiAgfVxuXG4gIGFzeW5jIGNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0czogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyDsp4DquIgg6rCA7KC46rCA66Ck64qUIOydtCDtjIzsnbzsnYAgU29uYW11IOy9lOuTnOuyoOydtOyKpOydmCDsnbzrtoDsnoXri4jri6QuXG4gICAgICAvLyDqt7jrn7DrjbAgZGlzdCDsho0g67mM65Oc65CcIOyGjOyKpCDsvZTrk5wg7YyM7J287J20IO2VhOyalO2VnCDqsoPsnbQg7JWE64uI6rOgLCBzcmPsl5Drp4wg7J6I64qUIO2FjeyKpO2KuCDtjIzsnbzsnbQg7ZWE7JqU7ZWp64uI64ukLlxuICAgICAgLy8g65Sw65287IScIC9zcmMv7JeQ7IScIOywvuyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIGltcG9ydC5tZXRhLmRpcm5hbWUucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpLFxuICAgICAgICBgLi4vc2hhcmVkLyR7dGFyZ2V0fS5zaGFyZWQudHMudHh0YCxcbiAgICAgICk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMoc3JjUGF0aCkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCJzcmMvc2VydmljZXMvc29uYW11LnNoYXJlZC50c1wiKTtcblxuICAgICAgLy8g7KCV66eQIO2YueyLnOuCmOyngOunjCB0YXJnZXQg65SU66CJ7Yag66as64qUIOyeiOyWtOuPhCBzcmMvc2VydmljZXMg65SU66CJ7Yag66as64qUIOyXhuydhCDsiJgg7J6I7Jy866+A66GcIOuvuOumrCDsg53shLHtlbTspI3ri4jri6QuXG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMocGF0aC5kaXJuYW1lKGRlc3RQYXRoKSkpKSB7XG4gICAgICAgIGF3YWl0IG1rZGlyKHBhdGguZGlybmFtZShkZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBjb25zb2xlLndhcm4oYENyZWF0ZWQgZGlyZWN0b3J5ICcke3BhdGguZGlybmFtZShkZXN0UGF0aCl9JyBiZWNhdXNlIGl0IGRpZCBub3QgZXhpc3QuYCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBhcmVGaWxlc1NhbWUoc3JjUGF0aCwgZGVzdFBhdGgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoZGVzdFBhdGgsIGF3YWl0IHJlYWRGaWxlKHNyY1BhdGgpKTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmJvbGQoXCJDb3BpZWQ6IFwiKSArIGNoYWxrLmJsdWUocGF0aC5yZWxhdGl2ZShTb25hbXUuYXBwUm9vdFBhdGgsIGRlc3RQYXRoKSksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRUeXBlcygpIHtcbiAgICB0aGlzLnR5cGVzID0gYXdhaXQgbG9hZFR5cGVzKCk7XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZE1vZGVscygpIHtcbiAgICB0aGlzLm1vZGVscyA9IGF3YWl0IGxvYWRNb2RlbHMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkQXBpcygpIHtcbiAgICB0aGlzLmFwaXMgPSBhd2FpdCBsb2FkQXBpcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyLpOygnCDsi7Htgazrpbwg7IiY7ZaJ7ZWY64qUIOuzuOyytOyeheuLiOuLpC5cbiAgICog67OA6rK965CcIO2MjOydvOuTpOydhCDtg4DsnoXrs4TroZwg67aE66WY7ZWY6rOgIOqwgSDtg4DsnoXsl5Ag66ee64qUIOyVoeyFmOydhCDsi6Ttlontlanri4jri6QuXG4gICAqIEBwYXJhbSBkaWZmRmlsZVBhdGhzIC0g67OA6rK965CcIO2MjOydvOuTpOydmCDsoIjrjIAg6rK966GcIOuqqeuhnVxuICAgKiBAcmV0dXJucyBkaWZmVHlwZXMgLSDrs4Dqsr3rkJwg7YyM7J287J2YIO2DgOyehSDrqqnroZ0gKGVudGl0eSwgdHlwZXMsIG1vZGVsIOuTsSlcbiAgICovXG4gIGFzeW5jIGRvU3luY0FjdGlvbnMoZGlmZkZpbGVQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHsgZGlmZlR5cGVzOiBzdHJpbmdbXSB9PiB7XG4gICAgY29uc3QgZGlmZkdyb3VwcyA9IHRoaXMuY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZVBhdGhzKTtcbiAgICBjb25zdCBkaWZmVHlwZXMgPSBPYmplY3Qua2V5cyhkaWZmR3JvdXBzKTtcblxuICAgIC8vIO2KuOumrOqxsDogZW50aXR5LCB0eXBlc1xuICAgIC8vIOyVoeyFmDog7Iqk7YKk66eIIOyDneyEsVxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJlbnRpdHlcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHMsIGRpZmZUeXBlcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiB0eXBlcywgZW51bXMsIGdlbmVyYXRlZCDrs4Dqsr3si5xcbiAgICAvLyDslaHshZg6IO2MjOydvCDsi7HtgawgdHlwZXMsIGVudW1zLCBnZW5lcmF0ZWRcbiAgICBpZiAoXG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJ0eXBlc1wiKSB8fFxuICAgICAgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnVuY3Rpb25zXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJnZW5lcmF0ZWRcIilcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogbW9kZWxcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwibW9kZWxcIikgfHwgZGlmZlR5cGVzLmluY2x1ZGVzKFwiZnJhbWVcIikpIHtcbiAgICAgIGF3YWl0IHRoaXMuaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHMpO1xuICAgIH1cblxuICAgIC8vIO2KuOumrOqxsDogY29uZmlnXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImNvbmZpZ1wiKSkge1xuICAgICAgYXdhaXQgdGhpcy5hY3Rpb25TeW5jQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpZmZUeXBlcyxcbiAgICB9O1xuICB9XG5cbiAgY2FsY3VsYXRlRGlmZkdyb3VwcyhkaWZmRmlsZXM6IEFic29sdXRlUGF0aFtdKTogRGlmZkdyb3VwcyB7XG4gICAgcmV0dXJuIGdyb3VwKGRpZmZGaWxlcywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoZWQgPSByLm1hdGNoKC9cXC4obW9kZWx8dHlwZXN8ZnVuY3Rpb25zfGVudGl0eXxnZW5lcmF0ZWR8ZnJhbWV8Y29uZmlnKVxcLlt0al1zLyk7XG4gICAgICByZXR1cm4gbWF0Y2hlZD8uWzFdID8/IFwidW5rbm93blwiO1xuICAgIH0pIGFzIHVua25vd24gYXMgRGlmZkdyb3VwcztcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZUVudGl0eUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzLCBkaWZmVHlwZXM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZUVudGl0eUNoYW5nZVwiLCB7IGRpZmZHcm91cHMsIGRpZmZUeXBlcyB9KTtcblxuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIucmVsb2FkKCk7XG5cbiAgICAvLyB0eXBlcyDsg53shLEoZW50aXR5IOyDiOuhnCDstpTqsIDrkJwg6rK97JqwKVxuICAgIC8vIHBhcmVudElk6rCAIOyXhuqzoCwgdHlwZXPqsIAg7JeG64qUIOqyveyasOyXkOunjCDsg53shLFcbiAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChkaWZmR3JvdXBzLmVudGl0eT8uWzBdKTtcblxuICAgIGlmIChlbnRpdHlJZCkge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuICAgICAgLy8g7ZSE66Gc7KCd7Yq47JeQIOyDneyEseuQmOyWtOyVvCDtlZjripQgLnRzIO2MjOydvOydmCDqsr3roZzsnoXri4jri6QuXG4gICAgICBjb25zdCB0eXBlRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgIFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke2VudGl0eS5uYW1lcy5mc30vJHtlbnRpdHkubmFtZXMuZnN9LnR5cGVzLnRzYCxcbiAgICAgICk7XG4gICAgICBpZiAoZW50aXR5LnBhcmVudElkID09PSB1bmRlZmluZWQgJiYgIShhd2FpdCBleGlzdHModHlwZUZpbGVQYXRoKSkpIHtcbiAgICAgICAgYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcImluaXRfdHlwZXNcIiwgeyBlbnRpdHlJZCB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2NoZW1hcygpO1xuXG4gICAgZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMuZ2VuZXJhdGVkID8/IFtdKSxcbiAgICAgIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQudHNcIikgYXMgQWJzb2x1dGVQYXRoLFxuICAgIF0pO1xuICAgIGRpZmZUeXBlcy5wdXNoKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPEZpbGVUeXBlW10+IHtcbiAgICBjb25zdCB0c1BhdGhzID0gdW5pcXVlKFtcbiAgICAgIC4uLihkaWZmR3JvdXBzLnR5cGVzID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmZ1bmN0aW9ucyA/PyBbXSksXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgIF0pO1xuICAgIE5haXRlLnQoXCJoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2VcIiwgeyBkaWZmR3JvdXBzIH0pO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIHR5cGVzL2Z1bmN0aW9ucy9nZW5lcmF0ZWQgY2hhbmdlczogJHt0c1BhdGhzLm1hcCgocCkgPT4gcGF0aC5yZWxhdGl2ZShTb25hbXUuYXBpUm9vdFBhdGgsIHApKS5qb2luKFwiLCBcIil9YFxuICAgIC8vICAgKVxuICAgIC8vICk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNGaWxlc1RvVGFyZ2V0cyh0c1BhdGhzKTtcblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZShkaWZmR3JvdXBzOiBEaWZmR3JvdXBzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgTmFpdGUudChcImhhbmRsZU1vZGVsT3JGcmFtZUNoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG4gICAgY29uc3QgbWVyZ2VkR3JvdXAgPSBbLi4uKGRpZmZHcm91cHMubW9kZWwgPz8gW10pLCAuLi4oZGlmZkdyb3Vwcy5mcmFtZSA/PyBbXSldO1xuXG4gICAgLy8gY29uc29sZS5sb2coXG4gICAgLy8gICBjaGFsay5ncmF5KFxuICAgIC8vICAgICBgW1Byb2Nlc3NpbmddIEhhbmRsaW5nIG1vZGVsL2ZyYW1lIGNoYW5nZXM6ICR7bWVyZ2VkR3JvdXAubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIC8vIGdlbmVyYXRlZF9odHRwLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci50eXBlc+ulvCDslIHri4jri6QuXG4gICAgLy8gc2VydmljZS50ZW1wbGF0ZS50c+yXkOyEnCBzeW5jZXIuYXBpc+ulvCDslIHri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlOYW1lc1JlY29yZDtcbiAgICB9W10gPSBtZXJnZWRHcm91cC5tYXAoKG1vZGVsUGF0aCkgPT4ge1xuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiKSkge1xuICAgICAgICBjb25zdCBlbnRpdHlJZCA9IEVudGl0eU1hbmFnZXIuZ2V0RW50aXR5SWRGcm9tUGF0aChtb2RlbFBhdGgpO1xuICAgICAgICBhc3NlcnQoZW50aXR5SWQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5hbWVzUmVjb3JkOiBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbFBhdGguZW5kc1dpdGgoXCIuZnJhbWUudHNcIikpIHtcbiAgICAgICAgY29uc3QgWywgZnJhbWVOYW1lXSA9IG1vZGVsUGF0aC5tYXRjaCgvLitcXC8oLispXFwuZnJhbWVcXC50cyQvKSA/PyBbXTtcbiAgICAgICAgYXNzZXJ0KGZyYW1lTmFtZSk7XG4gICAgICAgIC8vIGZyYW1lTmFtZeydhCBQYXNjYWxDYXNl66GcIOuzgO2ZmCAoZGFzaGJvYXJkIC0+IERhc2hib2FyZClcbiAgICAgICAgY29uc3QgZnJhbWVJZCA9IGluZmxlY3Rpb24uY2FtZWxpemUoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZUlkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vdCByZWFjaGFibGVcIik7XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlU2VydmljZXMocGFyYW1zKTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkdlbmVyYXRlSHR0cHMoKTtcbiAgfVxuXG4gIC8vIHdlYi8uc29uYW11LmVudiDsl5Ag7ZiE7J6sIOyEpOygleqwkiDsoIDsnqVcbiAgYXN5bmMgYWN0aW9uU3luY0NvbmZpZygpIHtcbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IFNvbmFtdS5jb25maWcuc2VydmVyLmxpc3RlbiA/PyB7fTtcbiAgICBjb25zdCBjb250ZW50ID0gYEFQSV9IT1NUPSR7aG9zdCA/PyBcImxvY2FsaG9zdFwifVxcbkFQSV9QT1JUPSR7cG9ydCA/PyAzMDAwfWA7XG5cbiAgICBOYWl0ZS50KFwiYWN0aW9uU3luY0NvbmZpZ1wiLCB7IGNvbnRlbnQgfSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBTb25hbXUuY29uZmlnLnN5bmMudGFyZ2V0cy5tYXAoYXN5bmMgKHRhcmdldCkgPT4ge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBcIi5zb25hbXUuZW52XCIpLCBjb250ZW50KTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmdlbmVyYXRlZC50c+yZgCBzb25hbXUuZ2VuZXJhdGVkLnNzby50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcIOuwsOyXtC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlU2NoZW1hcygpOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcImdlbmVyYXRlZF9zc29cIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkXCIsIHt9LCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KSxcbiAgICAgIF0pXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLnNlcnZpY2UudHPrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gcGFyYW1zQXJyYXlcbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhcbiAgICBwYXJhbXNBcnJheToge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSxcbiAgKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIE5haXRlLnQoXCJhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzXCIsIHBhcmFtc0FycmF5KTtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHBhcmFtc0FycmF5Lm1hcChhc3luYyAocGFyYW1zKSA9PlxuICAgICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJzZXJ2aWNlXCIsIHBhcmFtcyBhcyBUZW1wbGF0ZU9wdGlvbnNbXCJzZXJ2aWNlXCJdLCB7XG4gICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKVxuICAgICAgLmZsYXQoKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLmh0dHDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnC5cbiAgICovXG4gIGFzeW5jIGFjdGlvbkdlbmVyYXRlSHR0cHMoKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGg+IHtcbiAgICBjb25zdCBbcmVzXSA9IGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoXG4gICAgICBcImdlbmVyYXRlZF9odHRwXCIsXG4gICAgICB7IGVudGl0eUlkOiBcImR1bW15XCIgfSxcbiAgICAgIHsgb3ZlcndyaXRlOiB0cnVlIH0sXG4gICAgKTtcbiAgICBhc3NlcnQocmVzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqICoudHlwZXMudHMsICouZnVuY3Rpb25zLnRzLCAqLmdlbmVyYXRlZC50c+ulvCDtg4Dqsp8g65SU66CJ7Yag66as7JeQIOuzteyCrO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIHRzUGF0aHNcbiAgICogQHJldHVybnMg67O17IKs65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHM6IEFic29sdXRlUGF0aFtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0cyB9ID0gU29uYW11LmNvbmZpZy5zeW5jO1xuICAgIGNvbnN0IHsgZGlyOiBhcGlEaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICB0YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PlxuICAgICAgICAgIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgdHNQYXRocy5tYXAoYXN5bmMgKHJlYWxTcmMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZHN0ID0gcmVhbFNyY1xuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGAvJHthcGlEaXJ9L2AsIGAvJHt0YXJnZXR9L2ApXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoXCIvYXBwbGljYXRpb24vXCIsIFwiL3NlcnZpY2VzL1wiKTtcbiAgICAgICAgICAgICAgY29uc3QgZGlyID0gZGlybmFtZShkc3QpO1xuICAgICAgICAgICAgICBpZiAoIShhd2FpdCBleGlzdHMoZGlyKSkpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShkc3QucmVwbGFjZShgJHtTb25hbXUuYXBwUm9vdFBhdGh9L2AsIFwiXCIpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQocmVhbFNyYywgZHN0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGRzdDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICksXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQoZnJvbVBhdGg6IHN0cmluZywgdG9QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMoZnJvbVBhdGgpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZEZpbGVDb250ZW50ID0gKGF3YWl0IHJlYWRGaWxlKGZyb21QYXRoKSkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IG5ld0ZpbGVDb250ZW50ID0gKCgpID0+IHtcbiAgICAgIC8vIHdlYuydtOuCmCBhcHAg65Ox7JeQ64qUIHNvbmFtdeqwgCDsl4bsirXri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgc29uYW117JeQIOuMgO2VnCBpbXBvcnTripQg7ZWo6ruYIOuzteyCrOuQmOuKlCBzb25hbXUuc2hhcmVkLnRz7JeQIOuMgO2VnCBpbXBvcnTroZwg7LmY7ZmY7ZW07JW8IO2VqeuLiOuLpC5cbiAgICAgIC8vIOusuOygnOuKlCDrpqzshozsiqQg7KKF66WY7JeQIOuUsOudvCBzb25hbXUuc2hhcmVkLnRz66GcIOqwgOuKlCDqsr3roZzqsIAg64uk66W064uk64qUIOygkOyeheuLiOuLpC5cbiAgICAgIC8vIOyYiOulvCDrk6TslrQgc29uYW11LmdlbmVyYXRlZC50cyDsnoXsnqXsl5DshJwgc29uYW11LnNoYXJlZC50c+uKlCDqsJnsnYAg65SU66CJ7Yag66as7JeQIOyeiOycvOuLiCAuL3NvbmFtdS5zaGFyZWTroZwg7LmY7ZmY7ZWY66m0IOuQmOyngOunjCxcbiAgICAgIC8vIHVzZXIudHlwZXMudHMg7J6F7J6l7JeQ7IScIHNvbmFtdS5zaGFyZWQudHPripQg7IOB7JyEIOuUlOugie2GoOumrOyXkCDsnojsnLzri4ggLi4vc29uYW11LnNoYXJlZOuhnCDsuZjtmZjtlbTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW0IOuzteyCrO2VmOqzoOyekCDtlZjripQg66as7IaM7Iqk7J2YIOqyveuhnCh0b1BhdGgp66W8IOq4sOykgOycvOuhnCBzb25hbXUuc2hhcmVkLnRz6rCAIOyeiOuKlCDrlJTroInthqDrpqzrpbwg7LC+7JWE7IScIOyDgeuMgCDqsr3roZzrpbwg6rOE7IKw7ZWY64+E66GdIO2VmOyYgOyKteuLiOuLpC5cbiAgICAgIGNvbnN0IHNlcnZpY2VzRGlyID0gdG9QYXRoLnJlcGxhY2UoL1xcL3NlcnZpY2VzXFwvLiokLywgXCIvc2VydmljZXNcIik7XG4gICAgICBjb25zdCBmaWxlRGlyID0gZGlybmFtZSh0b1BhdGgpO1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzZXJ2aWNlc0Rpcik7XG4gICAgICBjb25zdCBzaGFyZWRQYXRoID0gcmVsYXRpdmVQYXRoID09PSBcIlwiID8gXCIuL3NvbmFtdS5zaGFyZWRcIiA6IGAke3JlbGF0aXZlUGF0aH0vc29uYW11LnNoYXJlZGA7XG5cbiAgICAgIGNvbnN0IG5mYyA9IG9sZEZpbGVDb250ZW50LnJlcGxhY2UoL2Zyb20gXCJzb25hbXVcIi9nLCBgZnJvbSBcIiR7c2hhcmVkUGF0aH1cImApO1xuICAgICAgcmV0dXJuIG5mYztcbiAgICB9KSgpO1xuICAgIHJldHVybiB3cml0ZUZpbGUodG9QYXRoLCBuZXdGaWxlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOyXlO2LsO2LsOyZgCDthZztlIzrpr8g7YKk7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZUtleSDthZztlIzrpr8g7YKkXG4gICAqIEBwYXJhbSBlbnVtSWQg7Je06rGw7ZiVIElEXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHNHZW5Db2RlKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgdGVtcGxhdGVLZXk6IFRlbXBsYXRlS2V5LFxuICAgIGVudW1JZD86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IHN1YlBhdGg6IHN0cmluZzsgZnVsbFBhdGg6IHN0cmluZzsgaXNFeGlzdHM6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBnZW5QYXRoIH0gPSBUZW1wbGF0ZU1hbmFnZXIuZ2V0KHRlbXBsYXRlS2V5KS5nZXRUYXJnZXRBbmRQYXRoKFxuICAgICAgRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChlbnRpdHlJZCksXG4gICAgICBlbnVtSWQsXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YlBhdGggPSBwYXRoLmpvaW4odGFyZ2V0LCBnZW5QYXRoKTtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHN1YlBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJQYXRoLFxuICAgICAgZnVsbFBhdGgsXG4gICAgICBpc0V4aXN0czogYXdhaXQgZXhpc3RzKGZ1bGxQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7Je06rGw7ZiV7JeQIOuMgO2VtCwg7IOd7ISx65CcIOy9lOuTnOqwgCDsobTsnqztlZjripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZW50aXR5SWQg7JeU7Yuw7YuwIElEXG4gICAqIEBwYXJhbSBlbnVtcyDsl7TqsbDtmJUg66CI7J2067iUXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIOyXrOu2gFxuICAgKi9cbiAgYXN5bmMgY2hlY2tFeGlzdHMoXG4gICAgZW50aXR5SWQ6IHN0cmluZyxcbiAgICBlbnVtczoge1xuICAgICAgW25hbWU6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+Pj47XG4gICAgfSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4+IHtcbiAgICBjb25zdCBrZXlzOiBUZW1wbGF0ZUtleVtdID0gVGVtcGxhdGVLZXkub3B0aW9ucztcbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudW1zS2V5cyA9IE9iamVjdC5rZXlzKGVudW1zKS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IG5hbWVzLmNvbnN0YW50KTtcblxuICAgIHJldHVybiBhd2FpdCByZWR1Y2VBc3luYyhcbiAgICAgIGtleXMsXG4gICAgICBhc3luYyAocmVzdWx0LCBrZXkpID0+IHtcbiAgICAgICAgY29uc3QgdHBsID0gVGVtcGxhdGVNYW5hZ2VyLmdldChrZXkpO1xuICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJ2aWV3X2VudW1zXCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmMoZW51bXNLZXlzLCBhc3luYyAoY29tcG9uZW50SWQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFyZ2V0LCBwYXRoOiBwIH0gPSB0cGwuZ2V0VGFyZ2V0QW5kUGF0aChuYW1lcywgY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7Y29tcG9uZW50SWR9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMpO1xuICAgICAgICBjb25zdCB7IHRhcmdldHMgfSA9IFNvbmFtdS5jb25maWcuc3luYztcbiAgICAgICAgaWYgKHRhcmdldC5pbmNsdWRlcyhcIjp0YXJnZXRcIikpIHtcbiAgICAgICAgICBhd2FpdCBtYXBBc3luYyh0YXJnZXRzLCBhc3luYyAodCkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W2Ake2tleX1fXyR7dH1gXSA9IGF3YWl0IGV4aXN0cyhcbiAgICAgICAgICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LnJlcGxhY2UoXCI6dGFyZ2V0XCIsIHQpLCBwKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBhd2FpdCBleGlzdHMocGF0aC5qb2luKFNvbmFtdS5hcHBSb290UGF0aCwgdGFyZ2V0LCBwKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIHt9IGFzIFJlY29yZDxgJHtUZW1wbGF0ZUtleX0ke3N0cmluZ31gLCBib29sZWFuPixcbiAgICApO1xuICB9XG5cbiAgc3luY1VJKCkge1xuICAgIGNvbnN0IHVpUG9ydCA9IFNvbmFtdS5jb25maWcudWk/LnBvcnQgPz8gNTcwMDA7XG5cbiAgICBpZiAoIWlzVGVzdCgpKSB7XG4gICAgICBmZXRjaChgaHR0cDovLzEyNy4wLjAuMToke3VpUG9ydH0vYXBpL3JlbG9hZGAsIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgfSkuY2F0Y2goKGUpID0+IGNvbnNvbGUubG9nKGNoYWxrLmRpbShgRmFpbGVkIHRvIHJlbG9hZCBTb25hbXUgVUk6ICR7ZS5tZXNzYWdlfWApKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlRW50aXR5KGZvcm06IFRlbXBsYXRlT3B0aW9uc1tcImVudGl0eVwiXSkge1xuICAgIHJldHVybiBhd2FpdCBjcmVhdGVFbnRpdHkoZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICog7ZWY7JyE7Zi47ZmY7JqpIO2UhOuhneyLnCDrqZTshozrk5zsnoXri4jri6QuXG4gICAqL1xuICBhc3luYyBkZWxFbnRpdHkoZW50aXR5SWQ6IHN0cmluZyk6IFByb21pc2U8eyBkZWxQYXRoczogc3RyaW5nW10gfT4ge1xuICAgIHJldHVybiBhd2FpdCBkZWxFbnRpdHkoZW50aXR5SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZTxUIGV4dGVuZHMgVGVtcGxhdGVLZXk+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgICBfZ2VuZXJhdGVPcHRpb25zPzogR2VuZXJhdGVPcHRpb25zLFxuICApOiBQcm9taXNlPEFic29sdXRlUGF0aFtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IGdlbmVyYXRlVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMsIF9nZW5lcmF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZGVyVGVtcGxhdGU8VCBleHRlbmRzIGtleW9mIFRlbXBsYXRlT3B0aW9ucz4oXG4gICAga2V5OiBULFxuICAgIHRlbXBsYXRlT3B0aW9uczogVGVtcGxhdGVPcHRpb25zW1RdLFxuICApOiBQcm9taXNlPFBhdGhBbmRDb2RlW10+IHtcbiAgICByZXR1cm4gYXdhaXQgcmVuZGVyVGVtcGxhdGUoa2V5LCB0ZW1wbGF0ZU9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVuZXdDaGVja3N1bXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmV3Q2hlY2tzdW1zKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJob3QiLCJhc3NlcnQiLCJjaGFsayIsIm1rZGlyIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJpbmZsZWN0aW9uIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiVGVtcGxhdGVLZXkiLCJtYXBBc3luYyIsInJlZHVjZUFzeW5jIiwiY2VudGVyVGV4dCIsImlzVGVzdCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwic3luY1VJIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImluY2x1ZGVzIiwiaGFuZGxlRW50aXR5Q2hhbmdlIiwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlIiwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlIiwiYWN0aW9uU3luY0NvbmZpZyIsImRpZmZGaWxlcyIsInIiLCJtYXRjaGVkIiwibWF0Y2giLCJ0IiwicmVsb2FkIiwiZW50aXR5IiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwiZnJhbWVJZCIsImNhbWVsaXplIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJob3N0IiwicG9ydCIsInNlcnZlciIsImxpc3RlbiIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwib3ZlcndyaXRlIiwiZmxhdCIsInBhcmFtc0FycmF5IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsInNlcnZpY2VzRGlyIiwiZmlsZURpciIsInJlbGF0aXZlUGF0aCIsInNoYXJlZFBhdGgiLCJuZmMiLCJjaGVja0V4aXN0c0dlbkNvZGUiLCJ0ZW1wbGF0ZUtleSIsImVudW1JZCIsImdlblBhdGgiLCJnZXRUYXJnZXRBbmRQYXRoIiwic3ViUGF0aCIsImZ1bGxQYXRoIiwiaXNFeGlzdHMiLCJjaGVja0V4aXN0cyIsImVudW1zIiwib3B0aW9ucyIsImVudW1zS2V5cyIsIm5hbWUiLCJjb25zdGFudCIsInJlc3VsdCIsImtleSIsInRwbCIsInN0YXJ0c1dpdGgiLCJjb21wb25lbnRJZCIsInAiLCJ1aVBvcnQiLCJ1aSIsImZldGNoIiwibWV0aG9kIiwiY2F0Y2giLCJlIiwiZGltIiwibWVzc2FnZSIsImZvcm0iLCJ0ZW1wbGF0ZU9wdGlvbnMiLCJfZ2VuZXJhdGVPcHRpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxHQUFHLFFBQVEsdUJBQXVCO0FBQzNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUN6RCxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxTQUFTLFFBQVEsWUFBWTtBQUN0QyxPQUFPQyxRQUFRQyxPQUFPLFFBQVEsT0FBTztBQUNyQyxTQUFTQyxLQUFLLEVBQUVDLE1BQU0sUUFBUSxVQUFVO0FBRXhDLFNBQVNDLGNBQWMsUUFBUSx1QkFBb0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUN2QyxTQUFTQyxhQUFhLFFBQWdDLDhCQUEyQjtBQUNqRixTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLGVBQWUsUUFBUSxrQ0FBK0I7QUFFL0QsU0FBU0MsV0FBVyxRQUE4QixvQkFBaUI7QUFDbkUsU0FBU0MsUUFBUSxFQUFFQyxXQUFXLFFBQVEsMEJBQXVCO0FBQzdELFNBQVNDLFVBQVUsUUFBUSwyQkFBd0I7QUFDbkQsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBRTNDLFNBQVNDLHVCQUF1QixRQUFRLDRCQUF5QjtBQUNqRSxTQUFTQyxZQUFZLEVBQUVDLDhCQUE4QixFQUFFQyxjQUFjLFFBQVEsZ0JBQWE7QUFDMUYsU0FBU0MsZ0JBQWdCLEVBQUVDLGNBQWMsUUFBUSxzQkFBbUI7QUFDcEUsU0FBU0MsWUFBWSxFQUFFQyxTQUFTLFFBQVEseUJBQXNCO0FBQzlELFNBQXdCQyxxQ0FBcUMsUUFBUSxxQkFBa0I7QUFDdkYsU0FJRUMsUUFBUSxFQUNSQyxVQUFVLEVBQ1ZDLFNBQVMsUUFDSixxQkFBa0I7QUFNekIsT0FBTyxNQUFNQztJQUNYQyxPQUFtQixFQUFFLENBQUM7SUFDdEJDLFFBQXFCLENBQUMsRUFBRTtJQUN4QkMsU0FBdUIsQ0FBQyxFQUFFO0lBQzFCQyxZQUFxQixNQUFNO0lBRTNCOzs7O0dBSUMsR0FDRCxNQUFNQyxPQUFzQjtRQUMxQixNQUFNLEVBQUVDLE9BQU8sRUFBRSxHQUFHNUIsT0FBTzZCLE1BQU0sQ0FBQ0YsSUFBSTtRQUV0QyxtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLENBQUNHLG1CQUFtQixDQUFDRjtRQUUvQixxQ0FBcUM7UUFDckMsTUFBTUcsZUFBZSxNQUFNbkI7UUFDM0IsSUFBSW1CLGFBQWFDLE1BQU0sS0FBSyxHQUFHO1lBQzdCQyxRQUFRQyxHQUFHLENBQUM3QyxNQUFNOEMsS0FBSyxDQUFDQyxPQUFPLENBQUM3QixXQUFXO1lBQzNDO1FBQ0Y7UUFFQSxnQ0FBZ0M7UUFDaEMscUNBQXFDO1FBQ3JDLE1BQU1HLHdCQUNKO1lBQ0UsdUJBQXVCO1lBQ3ZCLE1BQU0sSUFBSSxDQUFDMkIsYUFBYSxDQUFDTjtZQUV6QiwrQkFBK0I7WUFDL0IsTUFBTWxCO1FBQ1IsR0FDQTtZQUFFeUIsaUJBQWlCO1lBQVdDLGFBQWE7UUFBTTtJQUVyRDtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTUMsZ0JBQWdCQyxLQUFhLEVBQUVDLFlBQTBCLEVBQWlCO1FBQzlFLElBQUlELFVBQVUsWUFBWUEsVUFBVSxTQUFTQSxVQUFVLFVBQVU7WUFDL0Q7UUFDRjtRQUVBLDRDQUE0QztRQUM1Qyx5Q0FBeUM7UUFDekMsOEJBQThCO1FBQzlCLG9FQUFvRTtRQUNwRSxJQUFJLENBQUNqQyxVQUFVO1lBQ2IsTUFBTW1DLG1CQUFvQixNQUFNeEQsSUFBSXlELGNBQWMsQ0FBQ0YsY0FBY0Q7WUFFakUsSUFBSUUsaUJBQWlCWCxNQUFNLEdBQUcsR0FBRztnQkFDL0JDLFFBQVFDLEdBQUcsQ0FBQzdDLE1BQU13RCxJQUFJLENBQUMsQ0FBQyxlQUFlLENBQUM7Z0JBRXhDLEtBQUssTUFBTUMsbUJBQW1CSCxpQkFBa0I7b0JBQzlDLG1GQUFtRjtvQkFDbkYsNEZBQTRGO29CQUM1RiwyRkFBMkY7b0JBQzNGLE1BQU1JLGNBQWMsSUFBSSxDQUFDQywrQkFBK0IsQ0FBQ0Y7b0JBQ3pELElBQUlDLFlBQVlmLE1BQU0sR0FBRyxHQUFHO3dCQUMxQkMsUUFBUUMsR0FBRyxDQUNUN0MsTUFBTTRELElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRXRELEtBQUt1RCxRQUFRLENBQUNsRCxPQUFPbUQsV0FBVyxFQUFFTCxrQkFBa0IsR0FDcEV6RCxNQUFNK0QsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFTCxZQUFZZixNQUFNLENBQUMsTUFBTSxDQUFDO29CQUVsRCxPQUFPO3dCQUNMQyxRQUFRQyxHQUFHLENBQUM3QyxNQUFNNEQsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFdEQsS0FBS3VELFFBQVEsQ0FBQ2xELE9BQU9tRCxXQUFXLEVBQUVMLGtCQUFrQjtvQkFDbEY7Z0JBQ0Y7WUFDRjtRQUNGO1FBRUEsTUFBTU8sd0JBQXdCQyxPQUFPQyxNQUFNLENBQUNyQyx5Q0FBeUNzQyxJQUFJLENBQ3ZGLENBQUNDLFVBQVkvRCxVQUFVZ0QsY0FBY2U7UUFHdkMsc0JBQXNCO1FBQ3RCLElBQUlKLHVCQUF1QjtZQUN6QixNQUFNLElBQUksQ0FBQ2hCLGFBQWEsQ0FBQztnQkFBQ0s7YUFBYTtRQUN6QztRQUVBLDJCQUEyQjtRQUMzQixtREFBbUQ7UUFDbkQsTUFBTSxJQUFJLENBQUNnQixhQUFhO1FBQ3hCLE1BQU0sSUFBSSxDQUFDQyxjQUFjO1FBQ3pCLE1BQU0sSUFBSSxDQUFDQyxZQUFZO1FBRXZCLElBQUksQ0FBQ0MsTUFBTTtJQUNiO0lBRUFiLGdDQUNFRixlQUE2QixFQUNNO1FBQ25DLElBQUksQ0FBQ0EsZ0JBQWdCZ0IsUUFBUSxDQUFDLFlBQVksOEJBQThCLE1BQUs7WUFDM0UsT0FBTyxFQUFFO1FBQ1g7UUFFQSxNQUFNQyxXQUFXOUQsY0FBYytELG1CQUFtQixDQUFDbEI7UUFDbkQsTUFBTW1CLFdBQVdsRSxlQUFlbUUsTUFBTSxDQUFDLENBQUNDLE1BQVFBLElBQUlDLFNBQVMsS0FBSyxHQUFHTCxTQUFTLEtBQUssQ0FBQztRQUNwRixLQUFLLE1BQU1JLE9BQU9GLFNBQVU7WUFDMUJsRSxlQUFlc0UsTUFBTSxDQUFDdEUsZUFBZXVFLE9BQU8sQ0FBQ0gsTUFBTTtRQUNyRDtRQUVBLE9BQU9GO0lBQ1Q7SUFFQSxNQUFNbkMsb0JBQW9CRixPQUFpQixFQUFpQjtRQUMxRCxLQUFLLE1BQU0yQyxVQUFVM0MsUUFBUztZQUM1QixzQ0FBc0M7WUFDdEMsK0RBQStEO1lBQy9ELG9CQUFvQjtZQUNwQixNQUFNNEMsVUFBVTdFLEtBQUs4RSxJQUFJLENBQ3ZCLFlBQVk3RSxPQUFPLENBQUM4RSxPQUFPLENBQUMsVUFBVSxVQUN0QyxDQUFDLFVBQVUsRUFBRUgsT0FBTyxjQUFjLENBQUM7WUFFckMsSUFBSSxDQUFFLE1BQU05RCxPQUFPK0QsVUFBVztnQkFDNUI7WUFDRjtZQUNBLElBQUksQ0FBRSxNQUFNL0QsT0FBT2QsS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU8yRSxXQUFXLEVBQUVKLFVBQVc7Z0JBQzFELE1BQU0sSUFBSUssTUFDUixDQUFDLDBDQUEwQyxFQUFFTCxPQUFPLHlGQUF5RixDQUFDO1lBRWxKO1lBRUEscURBQXFEO1lBQ3JELE1BQU1NLFdBQVdsRixLQUFLOEUsSUFBSSxDQUFDekUsT0FBTzJFLFdBQVcsRUFBRUosUUFBUTtZQUV2RCxvRUFBb0U7WUFDcEUsSUFBSSxDQUFFLE1BQU05RCxPQUFPZCxLQUFLQyxPQUFPLENBQUNpRixZQUFhO2dCQUMzQyxNQUFNdkYsTUFBTUssS0FBS0MsT0FBTyxDQUFDaUYsV0FBVztvQkFBRUMsV0FBVztnQkFBSztnQkFDdEQ3QyxRQUFROEMsSUFBSSxDQUFDLENBQUMsbUJBQW1CLEVBQUVwRixLQUFLQyxPQUFPLENBQUNpRixVQUFVLDJCQUEyQixDQUFDO1lBQ3hGO1lBRUEsSUFBSSxNQUFNbEUsYUFBYTZELFNBQVNLLFdBQVc7Z0JBQ3pDO1lBQ0Y7WUFFQSxNQUFNckYsVUFBVXFGLFVBQVUsTUFBTXRGLFNBQVNpRjtZQUV6QyxDQUFDaEUsWUFDQ3lCLFFBQVFDLEdBQUcsQ0FDVDdDLE1BQU13RCxJQUFJLENBQUMsY0FBY3hELE1BQU00RCxJQUFJLENBQUN0RCxLQUFLdUQsUUFBUSxDQUFDbEQsT0FBTzJFLFdBQVcsRUFBRUU7UUFFNUU7SUFDRjtJQUVBLE1BQU1uQixnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDbEMsS0FBSyxHQUFHLE1BQU1IO0lBQ3JCO0lBRUEsTUFBTXNDLGlCQUFpQjtRQUNyQixJQUFJLENBQUNsQyxNQUFNLEdBQUcsTUFBTUw7SUFDdEI7SUFFQSxNQUFNd0MsZUFBZTtRQUNuQixJQUFJLENBQUNyQyxJQUFJLEdBQUcsTUFBTUo7SUFDcEI7SUFFQTs7Ozs7R0FLQyxHQUNELE1BQU1rQixjQUFjMkMsYUFBNkIsRUFBb0M7UUFDbkYsTUFBTUMsYUFBYSxJQUFJLENBQUNDLG1CQUFtQixDQUFDRjtRQUM1QyxNQUFNRyxZQUFZN0IsT0FBTzhCLElBQUksQ0FBQ0g7UUFFOUIscUJBQXFCO1FBQ3JCLGFBQWE7UUFDYixJQUFJRSxVQUFVRSxRQUFRLENBQUMsV0FBVztZQUNoQyxNQUFNLElBQUksQ0FBQ0Msa0JBQWtCLENBQUNMLFlBQVlFO1FBQzVDO1FBRUEsbUNBQW1DO1FBQ25DLG9DQUFvQztRQUNwQyxJQUNFQSxVQUFVRSxRQUFRLENBQUMsWUFDbkJGLFVBQVVFLFFBQVEsQ0FBQyxnQkFDbkJGLFVBQVVFLFFBQVEsQ0FBQyxjQUNuQjtZQUNBLE1BQU0sSUFBSSxDQUFDRSx1Q0FBdUMsQ0FBQ047UUFDckQ7UUFFQSxhQUFhO1FBQ2IsSUFBSUUsVUFBVUUsUUFBUSxDQUFDLFlBQVlGLFVBQVVFLFFBQVEsQ0FBQyxVQUFVO1lBQzlELE1BQU0sSUFBSSxDQUFDRyx3QkFBd0IsQ0FBQ1A7UUFDdEM7UUFFQSxjQUFjO1FBQ2QsSUFBSUUsVUFBVUUsUUFBUSxDQUFDLFdBQVc7WUFDaEMsTUFBTSxJQUFJLENBQUNJLGdCQUFnQjtRQUM3QjtRQUVBLE9BQU87WUFDTE47UUFDRjtJQUNGO0lBRUFELG9CQUFvQlEsU0FBeUIsRUFBYztRQUN6RCxPQUFPN0YsTUFBTTZGLFdBQVcsQ0FBQ0M7WUFDdkIsTUFBTUMsVUFBVUQsRUFBRUUsS0FBSyxDQUFDO1lBQ3hCLE9BQU9ELFNBQVMsQ0FBQyxFQUFFLElBQUk7UUFDekI7SUFDRjtJQUVBLE1BQU1OLG1CQUFtQkwsVUFBc0IsRUFBRUUsU0FBbUIsRUFBaUI7UUFDbkZqRixNQUFNNEYsQ0FBQyxDQUFDLHNCQUFzQjtZQUFFYjtZQUFZRTtRQUFVO1FBRXRELE1BQU1sRixjQUFjOEYsTUFBTTtRQUUxQiw2QkFBNkI7UUFDN0Isa0NBQWtDO1FBQ2xDLE1BQU1oQyxXQUFXOUQsY0FBYytELG1CQUFtQixDQUFDaUIsV0FBV2UsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUV6RSxJQUFJakMsVUFBVTtZQUNaLE1BQU1pQyxTQUFTL0YsY0FBY2dHLEdBQUcsQ0FBQ2xDO1lBQ2pDLGdDQUFnQztZQUNoQyxNQUFNbUMsZUFBZXZHLEtBQUs4RSxJQUFJLENBQzVCekUsT0FBT21ELFdBQVcsRUFDbEIsQ0FBQyxnQkFBZ0IsRUFBRTZDLE9BQU9HLEtBQUssQ0FBQ0MsRUFBRSxDQUFDLENBQUMsRUFBRUosT0FBT0csS0FBSyxDQUFDQyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBRWxFLElBQUlKLE9BQU9LLFFBQVEsS0FBS0MsYUFBYSxDQUFFLE1BQU03RixPQUFPeUYsZUFBZ0I7Z0JBQ2xFLE1BQU1wRixpQkFBaUIsY0FBYztvQkFBRWlEO2dCQUFTO1lBQ2xEO1FBQ0Y7UUFFQSxNQUFNLElBQUksQ0FBQ3dDLHFCQUFxQjtRQUVoQ3RCLFdBQVd1QixTQUFTLEdBQUcxRyxPQUFPO2VBQ3hCbUYsV0FBV3VCLFNBQVMsSUFBSSxFQUFFO1lBQzlCN0csS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU9tRCxXQUFXLEVBQUU7U0FDL0I7UUFDRGdDLFVBQVVzQixJQUFJLENBQUM7SUFDakI7SUFFQSxNQUFNbEIsd0NBQXdDTixVQUFzQixFQUF1QjtRQUN6RixNQUFNeUIsVUFBVTVHLE9BQU87ZUFDakJtRixXQUFXekQsS0FBSyxJQUFJLEVBQUU7ZUFDdEJ5RCxXQUFXMEIsU0FBUyxJQUFJLEVBQUU7ZUFDMUIxQixXQUFXdUIsU0FBUyxJQUFJLEVBQUU7U0FDL0I7UUFDRHRHLE1BQU00RixDQUFDLENBQUMsMkNBQTJDO1lBQUViO1FBQVc7UUFFaEUsZUFBZTtRQUNmLGdCQUFnQjtRQUNoQix3SUFBd0k7UUFDeEksTUFBTTtRQUNOLEtBQUs7UUFFTCxNQUFNLElBQUksQ0FBQzJCLHdCQUF3QixDQUFDRjtRQUVwQyxPQUFPLEVBQUU7SUFDWDtJQUVBLE1BQU1sQix5QkFBeUJQLFVBQXNCLEVBQWlCO1FBQ3BFL0UsTUFBTTRGLENBQUMsQ0FBQyw0QkFBNEI7WUFBRWI7UUFBVztRQUNqRCxNQUFNNEIsY0FBYztlQUFLNUIsV0FBVzZCLEtBQUssSUFBSSxFQUFFO2VBQU83QixXQUFXOEIsS0FBSyxJQUFJLEVBQUU7U0FBRTtRQUU5RSxlQUFlO1FBQ2YsZ0JBQWdCO1FBQ2hCLDhIQUE4SDtRQUM5SCxNQUFNO1FBQ04sS0FBSztRQUVMLGtEQUFrRDtRQUNsRCwwQ0FBMEM7UUFDMUMsTUFBTSxJQUFJLENBQUNwRCxjQUFjO1FBQ3pCLE1BQU0sSUFBSSxDQUFDRCxhQUFhO1FBQ3hCLE1BQU0sSUFBSSxDQUFDRSxZQUFZO1FBRXZCLE1BQU1vRCxTQUVBSCxZQUFZSSxHQUFHLENBQUMsQ0FBQ0M7WUFDckIsSUFBSUEsVUFBVXBELFFBQVEsQ0FBQyxjQUFjO2dCQUNuQyxNQUFNQyxXQUFXOUQsY0FBYytELG1CQUFtQixDQUFDa0Q7Z0JBQ25EOUgsT0FBTzJFO2dCQUNQLE9BQU87b0JBQ0xvRCxhQUFhbEgsY0FBY21ILGNBQWMsQ0FBQ3JEO2dCQUM1QztZQUNGO1lBQ0EsSUFBSW1ELFVBQVVwRCxRQUFRLENBQUMsY0FBYztnQkFDbkMsTUFBTSxHQUFHdUQsVUFBVSxHQUFHSCxVQUFVckIsS0FBSyxDQUFDLDJCQUEyQixFQUFFO2dCQUNuRXpHLE9BQU9pSTtnQkFDUCxxREFBcUQ7Z0JBQ3JELE1BQU1DLFVBQVU3SCxXQUFXOEgsUUFBUSxDQUFDRjtnQkFDcEMsT0FBTztvQkFDTEYsYUFBYWxILGNBQWNtSCxjQUFjLENBQUNFO2dCQUM1QztZQUNGO1lBQ0EsTUFBTSxJQUFJMUMsTUFBTTtRQUNsQjtRQUVBLE1BQU0sSUFBSSxDQUFDNEMsc0JBQXNCLENBQUNSO1FBQ2xDLE1BQU0sSUFBSSxDQUFDUyxtQkFBbUI7SUFDaEM7SUFFQSw4QkFBOEI7SUFDOUIsTUFBTWhDLG1CQUFtQjtRQUN2QixNQUFNLEVBQUVpQyxJQUFJLEVBQUVDLElBQUksRUFBRSxHQUFHM0gsT0FBTzZCLE1BQU0sQ0FBQytGLE1BQU0sQ0FBQ0MsTUFBTSxJQUFJLENBQUM7UUFDdkQsTUFBTUMsVUFBVSxDQUFDLFNBQVMsRUFBRUosUUFBUSxZQUFZLFdBQVcsRUFBRUMsUUFBUSxNQUFNO1FBRTNFekgsTUFBTTRGLENBQUMsQ0FBQyxvQkFBb0I7WUFBRWdDO1FBQVE7UUFDdEMsTUFBTUMsUUFBUUMsR0FBRyxDQUNmaEksT0FBTzZCLE1BQU0sQ0FBQ0YsSUFBSSxDQUFDQyxPQUFPLENBQUNxRixHQUFHLENBQUMsT0FBTzFDO1lBQ3BDLE1BQU0vRSxVQUFVRyxLQUFLOEUsSUFBSSxDQUFDekUsT0FBTzJFLFdBQVcsRUFBRUosUUFBUSxnQkFBZ0J1RDtRQUN4RTtJQUVKO0lBRUE7OztHQUdDLEdBQ0QsTUFBTXZCLHdCQUFpRDtRQUNyRCxPQUFPLEFBQ0wsQ0FBQSxNQUFNd0IsUUFBUUMsR0FBRyxDQUFDO1lBQ2hCbEgsaUJBQWlCLGlCQUFpQixDQUFDLEdBQUc7Z0JBQUVtSCxXQUFXO1lBQUs7WUFDeERuSCxpQkFBaUIsYUFBYSxDQUFDLEdBQUc7Z0JBQUVtSCxXQUFXO1lBQUs7U0FDckQsQ0FBQSxFQUVBQyxJQUFJLEdBQ0pBLElBQUk7SUFDVDtJQUVBOzs7O0dBSUMsR0FDRCxNQUFNVix1QkFDSlcsV0FFRyxFQUNnQjtRQUNuQmpJLE1BQU00RixDQUFDLENBQUMsMEJBQTBCcUM7UUFDbEMsT0FBTyxBQUNMLENBQUEsTUFBTUosUUFBUUMsR0FBRyxDQUNmRyxZQUFZbEIsR0FBRyxDQUFDLE9BQU9ELFNBQ3JCbEcsaUJBQWlCLFdBQVdrRyxRQUFzQztnQkFDaEVpQixXQUFXO1lBQ2IsSUFFSixFQUVDQyxJQUFJLEdBQ0pBLElBQUk7SUFDVDtJQUVBOzs7R0FHQyxHQUNELE1BQU1ULHNCQUE2QztRQUNqRCxNQUFNLENBQUNXLElBQUksR0FBRyxNQUFNdEgsaUJBQ2xCLGtCQUNBO1lBQUVpRCxVQUFVO1FBQVEsR0FDcEI7WUFBRWtFLFdBQVc7UUFBSztRQUVwQjdJLE9BQU9nSjtRQUNQLE9BQU9BO0lBQ1Q7SUFFQTs7OztHQUlDLEdBQ0QsTUFBTXhCLHlCQUF5QkYsT0FBdUIsRUFBcUI7UUFDekUsTUFBTSxFQUFFOUUsT0FBTyxFQUFFLEdBQUc1QixPQUFPNkIsTUFBTSxDQUFDRixJQUFJO1FBQ3RDLE1BQU0sRUFBRTBHLEtBQUtDLE1BQU0sRUFBRSxHQUFHdEksT0FBTzZCLE1BQU0sQ0FBQ3NDLEdBQUc7UUFFekMsT0FBTyxBQUNMLENBQUEsTUFBTTRELFFBQVFDLEdBQUcsQ0FDZnBHLFFBQVFxRixHQUFHLENBQUMsT0FBTzFDLFNBQ2pCd0QsUUFBUUMsR0FBRyxDQUNUdEIsUUFBUU8sR0FBRyxDQUFDLE9BQU9zQjtnQkFDakIsTUFBTUMsTUFBTUQsUUFDVDdELE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTRELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUvRCxPQUFPLENBQUMsQ0FBQyxFQUNwQ0csT0FBTyxDQUFDLGlCQUFpQjtnQkFDNUIsTUFBTTJELE1BQU16SSxRQUFRNEk7Z0JBQ3BCLElBQUksQ0FBRSxNQUFNL0gsT0FBTzRILE1BQU87b0JBQ3hCLE1BQU0vSSxNQUFNK0ksS0FBSzt3QkFBRXZELFdBQVc7b0JBQUs7Z0JBQ3JDO2dCQUNBLENBQUN0RSxZQUNDeUIsUUFBUUMsR0FBRyxDQUNUN0MsTUFBTXdELElBQUksQ0FBQyxjQUFjeEQsTUFBTTRELElBQUksQ0FBQ3VGLElBQUk5RCxPQUFPLENBQUMsR0FBRzFFLE9BQU8yRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBRTlFLE1BQU0sSUFBSSxDQUFDOEQsK0JBQStCLENBQUNGLFNBQVNDO2dCQUNwRCxPQUFPQTtZQUNULEtBR04sRUFDQU4sSUFBSTtJQUNSO0lBRUEsTUFBY08sZ0NBQWdDQyxRQUFnQixFQUFFQyxNQUFjLEVBQUU7UUFDOUUsSUFBSSxDQUFFLE1BQU1sSSxPQUFPaUksV0FBWTtZQUM3QjtRQUNGO1FBRUEsTUFBTUUsaUJBQWlCLEFBQUMsQ0FBQSxNQUFNckosU0FBU21KLFNBQVEsRUFBR0csUUFBUTtRQUUxRCxNQUFNQyxpQkFBaUIsQUFBQyxDQUFBO1lBQ3RCLDhCQUE4QjtZQUM5Qix3RUFBd0U7WUFDeEUscURBQXFEO1lBQ3JELDJGQUEyRjtZQUMzRixnRkFBZ0Y7WUFDaEYsa0dBQWtHO1lBQ2xHLE1BQU1DLGNBQWNKLE9BQU9qRSxPQUFPLENBQUMsbUJBQW1CO1lBQ3RELE1BQU1zRSxVQUFVcEosUUFBUStJO1lBQ3hCLE1BQU1NLGVBQWV0SixLQUFLdUQsUUFBUSxDQUFDOEYsU0FBU0Q7WUFDNUMsTUFBTUcsYUFBYUQsaUJBQWlCLEtBQUssb0JBQW9CLEdBQUdBLGFBQWEsY0FBYyxDQUFDO1lBRTVGLE1BQU1FLE1BQU1QLGVBQWVsRSxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxFQUFFd0UsV0FBVyxDQUFDLENBQUM7WUFDM0UsT0FBT0M7UUFDVCxDQUFBO1FBQ0EsT0FBTzNKLFVBQVVtSixRQUFRRztJQUMzQjtJQUVBOzs7Ozs7R0FNQyxHQUNELE1BQU1NLG1CQUNKckYsUUFBZ0IsRUFDaEJzRixXQUF3QixFQUN4QkMsTUFBZSxFQUNvRDtRQUNuRSxNQUFNLEVBQUUvRSxNQUFNLEVBQUU1RSxNQUFNNEosT0FBTyxFQUFFLEdBQUdwSixnQkFBZ0I4RixHQUFHLENBQUNvRCxhQUFhRyxnQkFBZ0IsQ0FDakZ2SixjQUFjbUgsY0FBYyxDQUFDckQsV0FDN0J1RjtRQUdGLE1BQU1HLFVBQVU5SixLQUFLOEUsSUFBSSxDQUFDRixRQUFRZ0Y7UUFDbEMsTUFBTUcsV0FBVy9KLEtBQUs4RSxJQUFJLENBQUN6RSxPQUFPMkUsV0FBVyxFQUFFOEU7UUFDL0MsT0FBTztZQUNMQTtZQUNBQztZQUNBQyxVQUFVLE1BQU1sSixPQUFPaUo7UUFDekI7SUFDRjtJQUVBOzs7OztHQUtDLEdBQ0QsTUFBTUUsWUFDSjdGLFFBQWdCLEVBQ2hCOEYsS0FFQyxFQUNvRDtRQUNyRCxNQUFNekUsT0FBc0JoRixZQUFZMEosT0FBTztRQUMvQyxNQUFNM0QsUUFBUWxHLGNBQWNtSCxjQUFjLENBQUNyRDtRQUMzQyxNQUFNZ0csWUFBWXpHLE9BQU84QixJQUFJLENBQUN5RSxPQUFPM0YsTUFBTSxDQUFDLENBQUM4RixPQUFTQSxTQUFTN0QsTUFBTThELFFBQVE7UUFFN0UsT0FBTyxNQUFNM0osWUFDWDhFLE1BQ0EsT0FBTzhFLFFBQVFDO1lBQ2IsTUFBTUMsTUFBTWpLLGdCQUFnQjhGLEdBQUcsQ0FBQ2tFO1lBQ2hDLElBQUlBLElBQUlFLFVBQVUsQ0FBQyxlQUFlO2dCQUNoQyxNQUFNaEssU0FBUzBKLFdBQVcsT0FBT087b0JBQy9CLE1BQU0sRUFBRS9GLE1BQU0sRUFBRTVFLE1BQU00SyxDQUFDLEVBQUUsR0FBR0gsSUFBSVosZ0JBQWdCLENBQUNyRCxPQUFPbUU7b0JBQ3hESixNQUFNLENBQUMsR0FBR0MsSUFBSSxFQUFFLEVBQUVHLGFBQWEsQ0FBQyxHQUFHLE1BQU03SixPQUN2Q2QsS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU8yRSxXQUFXLEVBQUVKLFFBQVFnRztnQkFFMUM7Z0JBQ0EsT0FBT0w7WUFDVDtZQUVBLE1BQU0sRUFBRTNGLE1BQU0sRUFBRTVFLE1BQU00SyxDQUFDLEVBQUUsR0FBR0gsSUFBSVosZ0JBQWdCLENBQUNyRDtZQUNqRCxNQUFNLEVBQUV2RSxPQUFPLEVBQUUsR0FBRzVCLE9BQU82QixNQUFNLENBQUNGLElBQUk7WUFDdEMsSUFBSTRDLE9BQU9jLFFBQVEsQ0FBQyxZQUFZO2dCQUM5QixNQUFNaEYsU0FBU3VCLFNBQVMsT0FBT2tFO29CQUM3Qm9FLE1BQU0sQ0FBQyxHQUFHQyxJQUFJLEVBQUUsRUFBRXJFLEdBQUcsQ0FBQyxHQUFHLE1BQU1yRixPQUM3QmQsS0FBSzhFLElBQUksQ0FBQ3pFLE9BQU8yRSxXQUFXLEVBQUVKLE9BQU9HLE9BQU8sQ0FBQyxXQUFXb0IsSUFBSXlFO2dCQUVoRTtZQUNGLE9BQU87Z0JBQ0xMLE1BQU0sQ0FBQ0MsSUFBSSxHQUFHLE1BQU0xSixPQUFPZCxLQUFLOEUsSUFBSSxDQUFDekUsT0FBTzJFLFdBQVcsRUFBRUosUUFBUWdHO1lBQ25FO1lBRUEsT0FBT0w7UUFDVCxHQUNBLENBQUM7SUFFTDtJQUVBckcsU0FBUztRQUNQLE1BQU0yRyxTQUFTeEssT0FBTzZCLE1BQU0sQ0FBQzRJLEVBQUUsRUFBRTlDLFFBQVE7UUFFekMsSUFBSSxDQUFDbkgsVUFBVTtZQUNia0ssTUFBTSxDQUFDLGlCQUFpQixFQUFFRixPQUFPLFdBQVcsQ0FBQyxFQUFFO2dCQUM3Q0csUUFBUTtZQUNWLEdBQUdDLEtBQUssQ0FBQyxDQUFDQyxJQUFNNUksUUFBUUMsR0FBRyxDQUFDN0MsTUFBTXlMLEdBQUcsQ0FBQyxDQUFDLDRCQUE0QixFQUFFRCxFQUFFRSxPQUFPLEVBQUU7UUFDbEY7SUFDRjtJQUVBOztHQUVDLEdBQ0QsTUFBTS9KLGFBQWFnSyxJQUErQixFQUFFO1FBQ2xELE9BQU8sTUFBTWhLLGFBQWFnSztJQUM1QjtJQUVBOztHQUVDLEdBQ0QsTUFBTS9KLFVBQVU4QyxRQUFnQixFQUFtQztRQUNqRSxPQUFPLE1BQU05QyxVQUFVOEM7SUFDekI7SUFFQTs7R0FFQyxHQUNELE1BQU1qRCxpQkFDSnFKLEdBQU0sRUFDTmMsZUFBbUMsRUFDbkNDLGdCQUFrQyxFQUNUO1FBQ3pCLE9BQU8sTUFBTXBLLGlCQUFpQnFKLEtBQUtjLGlCQUFpQkM7SUFDdEQ7SUFFQTs7R0FFQyxHQUNELE1BQU1uSyxlQUNKb0osR0FBTSxFQUNOYyxlQUFtQyxFQUNYO1FBQ3hCLE9BQU8sTUFBTWxLLGVBQWVvSixLQUFLYztJQUNuQztJQUVBOztHQUVDLEdBQ0QsTUFBTXBLLGlCQUFnQztRQUNwQyxPQUFPLE1BQU1BO0lBQ2Y7QUFDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/model.template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/model.template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,eAAgB,SAAQ,QAAQ;;IAK3C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IASnC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,eAAe,CAAC,OAAO,CAAC;;;;;;CA6KpD"}
|
|
@@ -21,6 +21,8 @@ export class Template__model extends Template {
|
|
|
21
21
|
});
|
|
22
22
|
const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
|
|
23
23
|
const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
|
|
24
|
+
const subsetKeyZodType = await getZodTypeById(`${entityId}SubsetKey`);
|
|
25
|
+
const subsetKeys = subsetKeyZodType.enum;
|
|
24
26
|
const names = EntityManager.getNamesFromId(entityId);
|
|
25
27
|
const entity = EntityManager.get(entityId);
|
|
26
28
|
const vlTpl = new Template__view_list();
|
|
@@ -92,8 +94,8 @@ class ${entityId}ModelClass extends BaseModelClass<
|
|
|
92
94
|
const params = {
|
|
93
95
|
num: 24,
|
|
94
96
|
page: 1,
|
|
95
|
-
search: "${def.search}",
|
|
96
|
-
orderBy: "${def.orderBy}",
|
|
97
|
+
search: "${def.search}" as const,
|
|
98
|
+
orderBy: "${def.orderBy}" as const,
|
|
97
99
|
...rawParams,
|
|
98
100
|
};
|
|
99
101
|
|
|
@@ -125,18 +127,21 @@ class ${entityId}ModelClass extends BaseModelClass<
|
|
|
125
127
|
exhaustive(params.orderBy);
|
|
126
128
|
}
|
|
127
129
|
}
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
+
|
|
131
|
+
const enhancers = this.createEnhancers({
|
|
132
|
+
${Object.keys(subsetKeys).map((key)=>`${key}: (row) => ({
|
|
133
|
+
...row,
|
|
134
|
+
// 서브셋별로 virtual 필드 계산로직 추가
|
|
135
|
+
}),`).join("\n")}
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return this.executeSubsetQuery({
|
|
130
139
|
subset,
|
|
131
140
|
qb,
|
|
132
141
|
params,
|
|
142
|
+
enhancers,
|
|
133
143
|
debug: false,
|
|
134
144
|
});
|
|
135
|
-
|
|
136
|
-
return {
|
|
137
|
-
rows,
|
|
138
|
-
total,
|
|
139
|
-
};
|
|
140
145
|
}
|
|
141
146
|
|
|
142
147
|
@api({ httpMethod: "POST" })
|
|
@@ -178,4 +183,4 @@ export const ${entityId}Model = new ${entityId}ModelClass(${names.camel}SubsetQu
|
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
|
|
181
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvbW9kZWwudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uLy4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IGdldFpvZFR5cGVCeUlkLCB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlIH0gZnJvbSBcIi4uL3pvZC1jb252ZXJ0ZXJcIjtcbmltcG9ydCB7IFRlbXBsYXRlX192aWV3X2xpc3QgfSBmcm9tIFwiLi92aWV3X2xpc3QudGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19tb2RlbCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJtb2RlbFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgobmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9Lm1vZGVsLnRzYCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1wibW9kZWxcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgZW50aXR5SWQgfSk7XG5cbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICBjb25zdCB2bFRwbCA9IG5ldyBUZW1wbGF0ZV9fdmlld19saXN0KCk7XG4gICAgaWYgKGxpc3RQYXJhbXNOb2RlPy5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGxpc3RQYXJhbXNOb2Rl6rCAIOyXhuyKteuLiOuLpC4gJHtlbnRpdHlJZH1gKTtcbiAgICB9XG4gICAgY29uc3QgZGVmID0gdmxUcGwuZ2V0RGVmYXVsdChsaXN0UGFyYW1zTm9kZS5jaGlsZHJlbik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKSxcbiAgICAgIGJvZHk6IGBcbmltcG9ydCB7IEJhc2VNb2RlbENsYXNzLCB0eXBlIExpc3RSZXN1bHQsIGFzQXJyYXksIE5vdEZvdW5kRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBhcGksIGV4aGF1c3RpdmUgfSBmcm9tICdzb25hbXUnO1xuaW1wb3J0IHtcbiAgJHtlbnRpdHlJZH1TdWJzZXRLZXksXG4gICR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZyxcbn0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gICR7bmFtZXMuY2FtZWx9U3Vic2V0UXVlcmllcyxcbiAgJHtuYW1lcy5jYW1lbH1Mb2FkZXJRdWVyaWVzLFxufSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZC5zc29cIjtcbmltcG9ydCB7ICR7ZW50aXR5SWR9TGlzdFBhcmFtcywgJHtlbnRpdHlJZH1TYXZlUGFyYW1zIH0gZnJvbSBcIi4vJHtuYW1lcy5mc30udHlwZXNcIjtcblxuLypcbiAgJHtlbnRpdHlJZH0gTW9kZWxcbiovXG5jbGFzcyAke2VudGl0eUlkfU1vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgJHtlbnRpdHlJZH1TdWJzZXRLZXksXG4gICR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9U3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mICR7bmFtZXMuY2FtZWx9TG9hZGVyUXVlcmllc1xuPiB7XG4gIG1vZGVsTmFtZSA9IFwiJHtlbnRpdHlJZH1cIjtcblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJzd3JcIl0sIHJlc291cmNlTmFtZTogXCIke2VudGl0eUlkfVwiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXJcbiAgKTogUHJvbWlzZTwke2VudGl0eUlkfVN1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICBpZCxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oXFxg7KG07J6s7ZWY7KeAIOyViuuKlCAke25hbWVzLmNhcGl0YWx9IElEIFxcJHtpZH1cXGApO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgJHtlbnRpdHlJZH1TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiAke2VudGl0eUlkfUxpc3RQYXJhbXNcbiAgKTogUHJvbWlzZTwke2VudGl0eUlkfVN1YnNldE1hcHBpbmdbVF0gfCBudWxsPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwge1xuICAgICAgLi4ubGlzdFBhcmFtcyxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwic3dyXCJdLCByZXNvdXJjZU5hbWU6IFwiJHtuYW1lcy5jYXBpdGFsUGx1cmFsfVwiIH0pXG4gIGFzeW5jIGZpbmRNYW55PFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleSwgTFAgZXh0ZW5kcyAke2VudGl0eUlkfUxpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCAke2VudGl0eUlkfVN1YnNldE1hcHBpbmdbVF0+PiB7XG4gICAgLy8gcGFyYW1zIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDI0LFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCIke2RlZi5zZWFyY2h9XCIsXG4gICAgICBvcmRlckJ5OiBcIiR7ZGVmLm9yZGVyQnl9XCIsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfTtcblxuICAgIC8vIGJ1aWxkIHF1ZXJpZXNcbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgXG4gICAgLy8gaWRcbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwiJHtlbnRpdHkudGFibGV9LmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgLy8gc2VhcmNoLWtleXdvcmRcbiAgICBpZiAocGFyYW1zLnNlYXJjaCAmJiBwYXJhbXMua2V5d29yZCAmJiBwYXJhbXMua2V5d29yZC5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJpZFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwiJHtlbnRpdHkudGFibGV9LmlkXCIsIE51bWJlcihwYXJhbXMua2V5d29yZCkpO1xuICAgICAgICAvLyB9IGVsc2UgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiZmllbGRcIikge1xuICAgICAgICAvLyAgIHFiLndoZXJlKFwiJHtlbnRpdHkudGFibGV9LmZpZWxkXCIsIFwibGlrZVwiLCBcXGAlXFwke3BhcmFtcy5rZXl3b3JkfSVcXGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXFxg6rWs7ZiE65CY7KeAIOyViuydgCDqsoDsg4kg7ZWE65OcIFxcJHtwYXJhbXMuc2VhcmNofVxcYCk7XG4gICAgICB9XG4gICAgfVxuICAgICAgXG4gICAgLy8gb3JkZXJCeVxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkge1xuICAgICAgLy8gZGVmYXVsdCBvcmRlckJ5XG4gICAgICBpZiAocGFyYW1zLm9yZGVyQnkgPT09IFwiaWQtZGVzY1wiKSB7XG4gICAgICAgIHFiLm9yZGVyQnkoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgXCJkZXNjXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhoYXVzdGl2ZShwYXJhbXMub3JkZXJCeSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IHsgcm93cywgdG90YWwgfSA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHJvd3MsXG4gICAgICB0b3RhbCxcbiAgICB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiIH0pXG4gIGFzeW5jIHNhdmUoXG4gICAgc3BhOiAke2VudGl0eUlkfVNhdmVQYXJhbXNbXVxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHJlZ2lzdGVyXG4gICAgc3BhLmZvckVhY2goKHNwKSA9PiB7XG4gICAgICB3ZGIudWJSZWdpc3RlcihcIiR7ZW50aXR5LnRhYmxlfVwiLCBzcCk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwiJHtlbnRpdHkudGFibGV9XCIpO1xuXG4gICAgICByZXR1cm4gaWRzO1xuICAgIH0pO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBndWFyZHM6IFsgXCJhZG1pblwiIF0gfSlcbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwiJHtlbnRpdHkudGFibGV9XCIpLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpZHMubGVuZ3RoO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCAke2VudGl0eUlkfU1vZGVsID0gbmV3ICR7ZW50aXR5SWR9TW9kZWxDbGFzcygke25hbWVzLmNhbWVsfVN1YnNldFF1ZXJpZXMsICR7bmFtZXMuY2FtZWx9TG9hZGVyUXVlcmllcyk7XG4gICAgICBgLnRyaW0oKSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJUZW1wbGF0ZSIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsIlRlbXBsYXRlX192aWV3X2xpc3QiLCJUZW1wbGF0ZV9fbW9kZWwiLCJnZXRUYXJnZXRBbmRQYXRoIiwibmFtZXMiLCJkaXIiLCJjb25maWciLCJhcGkiLCJ0YXJnZXQiLCJwYXRoIiwiZnMiLCJyZW5kZXIiLCJlbnRpdHlJZCIsInQiLCJsaXN0UGFyYW1zWm9kVHlwZSIsImxpc3RQYXJhbXNOb2RlIiwiZ2V0TmFtZXNGcm9tSWQiLCJlbnRpdHkiLCJnZXQiLCJ2bFRwbCIsImNoaWxkcmVuIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJkZWYiLCJnZXREZWZhdWx0IiwiYm9keSIsImNhbWVsIiwiY2FwaXRhbCIsImNhcGl0YWxQbHVyYWwiLCJzZWFyY2giLCJvcmRlckJ5IiwidGFibGUiLCJ0cmltIiwiaW1wb3J0S2V5cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLHFCQUFZO0FBQ25DLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBQ3BGLFNBQVNDLEtBQUssUUFBUSx1QkFBb0I7QUFFMUMsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGNBQWMsRUFBRUMsc0JBQXNCLFFBQVEsc0JBQW1CO0FBQzFFLFNBQVNDLG1CQUFtQixRQUFRLDBCQUF1QjtBQUUzRCxPQUFPLE1BQU1DLHdCQUF3Qko7SUFDbkMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFLLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxNQUFNLEVBQUVDLEdBQUcsRUFBRSxHQUFHVixPQUFPVyxNQUFNLENBQUNDLEdBQUc7UUFFakMsT0FBTztZQUNMQyxRQUFRLEdBQUdILElBQUksZ0JBQWdC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
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvbW9kZWwudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeiBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgZ2V0Wm9kVHlwZUJ5SWQsIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUgfSBmcm9tIFwiLi4vem9kLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgVGVtcGxhdGVfX3ZpZXdfbGlzdCB9IGZyb20gXCIuL3ZpZXdfbGlzdC50ZW1wbGF0ZVwiO1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19tb2RlbCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJtb2RlbFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgobmFtZXM6IEVudGl0eU5hbWVzUmVjb3JkKSB7XG4gICAgY29uc3QgeyBkaXIgfSA9IFNvbmFtdS5jb25maWcuYXBpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYCR7bmFtZXMuZnN9LyR7bmFtZXMuZnN9Lm1vZGVsLnRzYCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcmVuZGVyKHsgZW50aXR5SWQgfTogVGVtcGxhdGVPcHRpb25zW1wibW9kZWxcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgZW50aXR5SWQgfSk7XG5cbiAgICBjb25zdCBsaXN0UGFyYW1zWm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfUxpc3RQYXJhbXNgKTtcbiAgICBjb25zdCBsaXN0UGFyYW1zTm9kZSA9IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUobGlzdFBhcmFtc1pvZFR5cGUpO1xuXG4gICAgY29uc3Qgc3Vic2V0S2V5Wm9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKGAke2VudGl0eUlkfVN1YnNldEtleWApO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSAoc3Vic2V0S2V5Wm9kVHlwZSBhcyB6LlpvZEVudW0pLmVudW07XG5cbiAgICBjb25zdCBuYW1lcyA9IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpO1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcblxuICAgIGNvbnN0IHZsVHBsID0gbmV3IFRlbXBsYXRlX192aWV3X2xpc3QoKTtcbiAgICBpZiAobGlzdFBhcmFtc05vZGU/LmNoaWxkcmVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbGlzdFBhcmFtc05vZGXqsIAg7JeG7Iq164uI64ukLiAke2VudGl0eUlkfWApO1xuICAgIH1cbiAgICBjb25zdCBkZWYgPSB2bFRwbC5nZXREZWZhdWx0KGxpc3RQYXJhbXNOb2RlLmNoaWxkcmVuKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgobmFtZXMpLFxuICAgICAgYm9keTogYFxuaW1wb3J0IHsgQmFzZU1vZGVsQ2xhc3MsIHR5cGUgTGlzdFJlc3VsdCwgYXNBcnJheSwgTm90Rm91bmRFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIGFwaSwgZXhoYXVzdGl2ZSB9IGZyb20gJ3NvbmFtdSc7XG5pbXBvcnQge1xuICAke2VudGl0eUlkfVN1YnNldEtleSxcbiAgJHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nLFxufSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHtcbiAgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLFxuICAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMsXG59IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgJHtlbnRpdHlJZH1MaXN0UGFyYW1zLCAke2VudGl0eUlkfVNhdmVQYXJhbXMgfSBmcm9tIFwiLi8ke25hbWVzLmZzfS50eXBlc1wiO1xuXG4vKlxuICAke2VudGl0eUlkfSBNb2RlbFxuKi9cbmNsYXNzICR7ZW50aXR5SWR9TW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICAke2VudGl0eUlkfVN1YnNldEtleSxcbiAgJHtlbnRpdHlJZH1TdWJzZXRNYXBwaW5nLFxuICB0eXBlb2YgJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgJHtuYW1lcy5jYW1lbH1Mb2FkZXJRdWVyaWVzXG4+IHtcbiAgbW9kZWxOYW1lID0gXCIke2VudGl0eUlkfVwiO1xuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInN3clwiXSwgcmVzb3VyY2VOYW1lOiBcIiR7ZW50aXR5SWR9XCIgfSlcbiAgYXN5bmMgZmluZEJ5SWQ8VCBleHRlbmRzICR7ZW50aXR5SWR9U3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlclxuICApOiBQcm9taXNlPCR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihcXGDsobTsnqztlZjsp4Ag7JWK64qUICR7bmFtZXMuY2FwaXRhbH0gSUQgXFwke2lkfVxcYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJvd3NbMF07XG4gIH1cblxuICBhc3luYyBmaW5kT25lPFQgZXh0ZW5kcyAke2VudGl0eUlkfVN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6ICR7ZW50aXR5SWR9TGlzdFBhcmFtc1xuICApOiBQcm9taXNlPCR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJzd3JcIl0sIHJlc291cmNlTmFtZTogXCIke25hbWVzLmNhcGl0YWxQbHVyYWx9XCIgfSlcbiAgYXN5bmMgZmluZE1hbnk8VCBleHRlbmRzICR7ZW50aXR5SWR9U3Vic2V0S2V5LCBMUCBleHRlbmRzICR7ZW50aXR5SWR9TGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsICR7ZW50aXR5SWR9U3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICAvLyBwYXJhbXMgd2l0aCBkZWZhdWx0c1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcIiR7ZGVmLnNlYXJjaH1cIiBhcyBjb25zdCxcbiAgICAgIG9yZGVyQnk6IFwiJHtkZWYub3JkZXJCeX1cIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9O1xuXG4gICAgLy8gYnVpbGQgcXVlcmllc1xuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcbiAgICBcbiAgICAvLyBpZFxuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCIke2VudGl0eS50YWJsZX0uaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICAvLyBzZWFyY2gta2V5d29yZFxuICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5rZXl3b3JkICYmIHBhcmFtcy5rZXl3b3JkLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwYXJhbXMuc2VhcmNoID09PSBcImlkXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uaWRcIiwgTnVtYmVyKHBhcmFtcy5rZXl3b3JkKSk7XG4gICAgICAgIC8vIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgIC8vICAgcWIud2hlcmUoXCIke2VudGl0eS50YWJsZX0uZmllbGRcIiwgXCJsaWtlXCIsIFxcYCVcXCR7cGFyYW1zLmtleXdvcmR9JVxcYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihcXGDqtaztmITrkJjsp4Ag7JWK7J2AIOqygOyDiSDtlYTrk5wgXFwke3BhcmFtcy5zZWFyY2h9XFxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgICBcbiAgICAvLyBvcmRlckJ5XG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSB7XG4gICAgICAvLyBkZWZhdWx0IG9yZGVyQnlcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcIiR7ZW50aXR5LnRhYmxlfS5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGhhdXN0aXZlKHBhcmFtcy5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICAke09iamVjdC5rZXlzKHN1YnNldEtleXMpXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgKGtleSkgPT4gYCR7a2V5fTogKHJvdykgPT4gKHtcbiAgICAgICAgICAuLi5yb3csXG4gICAgICAgICAgLy8g7ISc67iM7IWL67OE66GcIHZpcnR1YWwg7ZWE65OcIOqzhOyCsOuhnOyngSDstpTqsIBcbiAgICAgICAgfSksYCxcbiAgICAgICAgKVxuICAgICAgICAuam9pbihcIlxcblwiKX1cbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiB9KVxuICBhc3luYyBzYXZlKFxuICAgIHNwYTogJHtlbnRpdHlJZH1TYXZlUGFyYW1zW11cbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCIke2VudGl0eS50YWJsZX1cIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcIiR7ZW50aXR5LnRhYmxlfVwiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgZ3VhcmRzOiBbIFwiYWRtaW5cIiBdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcIiR7ZW50aXR5LnRhYmxlfVwiKS53aGVyZUluKFwiJHtlbnRpdHkudGFibGV9LmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgJHtlbnRpdHlJZH1Nb2RlbCA9IG5ldyAke2VudGl0eUlkfU1vZGVsQ2xhc3MoJHtuYW1lcy5jYW1lbH1TdWJzZXRRdWVyaWVzLCAke25hbWVzLmNhbWVsfUxvYWRlclF1ZXJpZXMpO1xuICAgICAgYC50cmltKCksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGUiLCJnZXRab2RUeXBlQnlJZCIsInpvZFR5cGVUb1JlbmRlcmluZ05vZGUiLCJUZW1wbGF0ZV9fdmlld19saXN0IiwiVGVtcGxhdGVfX21vZGVsIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsIm5hbWVzIiwiZGlyIiwiY29uZmlnIiwiYXBpIiwidGFyZ2V0IiwicGF0aCIsImZzIiwicmVuZGVyIiwiZW50aXR5SWQiLCJ0IiwibGlzdFBhcmFtc1pvZFR5cGUiLCJsaXN0UGFyYW1zTm9kZSIsInN1YnNldEtleVpvZFR5cGUiLCJzdWJzZXRLZXlzIiwiZW51bSIsImdldE5hbWVzRnJvbUlkIiwiZW50aXR5IiwiZ2V0IiwidmxUcGwiLCJjaGlsZHJlbiIsInVuZGVmaW5lZCIsIkVycm9yIiwiZGVmIiwiZ2V0RGVmYXVsdCIsImJvZHkiLCJjYW1lbCIsImNhcGl0YWwiLCJjYXBpdGFsUGx1cmFsIiwic2VhcmNoIiwib3JkZXJCeSIsInRhYmxlIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImtleSIsImpvaW4iLCJ0cmltIiwiaW1wb3J0S2V5cyJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsTUFBTSxRQUFRLHFCQUFZO0FBQ25DLFNBQVNDLGFBQWEsUUFBZ0MsaUNBQThCO0FBQ3BGLFNBQVNDLEtBQUssUUFBUSx1QkFBb0I7QUFFMUMsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGNBQWMsRUFBRUMsc0JBQXNCLFFBQVEsc0JBQW1CO0FBQzFFLFNBQVNDLG1CQUFtQixRQUFRLDBCQUF1QjtBQUMzRCxPQUFPLE1BQU1DLHdCQUF3Qko7SUFDbkMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFLLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxNQUFNLEVBQUVDLEdBQUcsRUFBRSxHQUFHVixPQUFPVyxNQUFNLENBQUNDLEdBQUc7UUFFakMsT0FBTztZQUNMQyxRQUFRLEdBQUdILElBQUksZ0JBQWdCLENBQUM7WUFDaENJLE1BQU0sR0FBR0wsTUFBTU0sRUFBRSxDQUFDLENBQUMsRUFBRU4sTUFBTU0sRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUMxQztJQUNGO0lBRUEsTUFBTUMsT0FBTyxFQUFFQyxRQUFRLEVBQTRCLEVBQUU7UUFDbkRmLE1BQU1nQixDQUFDLENBQUMsVUFBVTtZQUFFRDtRQUFTO1FBRTdCLE1BQU1FLG9CQUFvQixNQUFNZixlQUFlLEdBQUdhLFNBQVMsVUFBVSxDQUFDO1FBQ3RFLE1BQU1HLGlCQUFpQmYsdUJBQXVCYztRQUU5QyxNQUFNRSxtQkFBbUIsTUFBTWpCLGVBQWUsR0FBR2EsU0FBUyxTQUFTLENBQUM7UUFDcEUsTUFBTUssYUFBYSxBQUFDRCxpQkFBK0JFLElBQUk7UUFFdkQsTUFBTWQsUUFBUVIsY0FBY3VCLGNBQWMsQ0FBQ1A7UUFDM0MsTUFBTVEsU0FBU3hCLGNBQWN5QixHQUFHLENBQUNUO1FBRWpDLE1BQU1VLFFBQVEsSUFBSXJCO1FBQ2xCLElBQUljLGdCQUFnQlEsYUFBYUMsV0FBVztZQUMxQyxNQUFNLElBQUlDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRWIsVUFBVTtRQUNyRDtRQUNBLE1BQU1jLE1BQU1KLE1BQU1LLFVBQVUsQ0FBQ1osZUFBZVEsUUFBUTtRQUVwRCxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUNwQixnQkFBZ0IsQ0FBQ0MsTUFBTTtZQUMvQndCLE1BQU0sQ0FBQzs7O0VBR1gsRUFBRWhCLFNBQVM7RUFDWCxFQUFFQSxTQUFTOzs7RUFHWCxFQUFFUixNQUFNeUIsS0FBSyxDQUFDO0VBQ2QsRUFBRXpCLE1BQU15QixLQUFLLENBQUM7O1NBRVAsRUFBRWpCLFNBQVMsWUFBWSxFQUFFQSxTQUFTLHFCQUFxQixFQUFFUixNQUFNTSxFQUFFLENBQUM7OztFQUd6RSxFQUFFRSxTQUFTOztNQUVQLEVBQUVBLFNBQVM7RUFDZixFQUFFQSxTQUFTO0VBQ1gsRUFBRUEsU0FBUztTQUNKLEVBQUVSLE1BQU15QixLQUFLLENBQUM7U0FDZCxFQUFFekIsTUFBTXlCLEtBQUssQ0FBQzs7ZUFFUixFQUFFakIsU0FBUzs7c0VBRTRDLEVBQUVBLFNBQVM7MkJBQ3RELEVBQUVBLFNBQVM7OzthQUd6QixFQUFFQSxTQUFTOzs7Ozs7OzRDQU9vQixFQUFFUixNQUFNMEIsT0FBTyxDQUFDOzs7Ozs7MEJBTWxDLEVBQUVsQixTQUFTOztnQkFFckIsRUFBRUEsU0FBUzthQUNkLEVBQUVBLFNBQVM7Ozs7Ozs7Ozs7c0VBVThDLEVBQUVSLE1BQU0yQixhQUFhLENBQUM7MkJBQ2pFLEVBQUVuQixTQUFTLHNCQUFzQixFQUFFQSxTQUFTOzs7NEJBRzNDLEVBQUVBLFNBQVM7Ozs7O2VBS3hCLEVBQUVjLElBQUlNLE1BQU0sQ0FBQztnQkFDWixFQUFFTixJQUFJTyxPQUFPLENBQUM7Ozs7Ozs7OztrQkFTWixFQUFFYixPQUFPYyxLQUFLLENBQUM7Ozs7OztrQkFNZixFQUFFZCxPQUFPYyxLQUFLLENBQUM7O3VCQUVWLEVBQUVkLE9BQU9jLEtBQUssQ0FBQzs7Ozs7Ozs7OztvQkFVbEIsRUFBRWQsT0FBT2MsS0FBSyxDQUFDOzs7Ozs7O01BTzdCLEVBQUVDLE9BQU9DLElBQUksQ0FBQ25CLFlBQ1hvQixHQUFHLENBQ0YsQ0FBQ0MsTUFBUSxHQUFHQSxJQUFJOzs7V0FHZixDQUFDLEVBRUhDLElBQUksQ0FBQyxNQUFNOzs7Ozs7Ozs7Ozs7OztTQWNYLEVBQUUzQixTQUFTOzs7Ozs7c0JBTUUsRUFBRVEsT0FBT2MsS0FBSyxDQUFDOzs7OztzQ0FLQyxFQUFFZCxPQUFPYyxLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozt3QkFZN0IsRUFBRWQsT0FBT2MsS0FBSyxDQUFDLFlBQVksRUFBRWQsT0FBT2MsS0FBSyxDQUFDOzs7Ozs7O2FBT3JELEVBQUV0QixTQUFTLFlBQVksRUFBRUEsU0FBUyxXQUFXLEVBQUVSLE1BQU15QixLQUFLLENBQUMsZUFBZSxFQUFFekIsTUFBTXlCLEtBQUssQ0FBQztNQUMvRixDQUFDLENBQUNXLElBQUk7WUFDTkMsWUFBWSxFQUFFO1FBQ2hCO0lBQ0Y7QUFDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/service.template.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,iBAAkB,SAAQ,QAAQ;;IAK7C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOzC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC;;;;;;;
|
|
1
|
+
{"version":3,"file":"service.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/service.template.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,iBAAkB,SAAQ,QAAQ;;IAK7C,gBAAgB,CAAC,KAAK,EAAE,iBAAiB;;;;IAOzC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,eAAe,CAAC,SAAS,CAAC;;;;;;;IAmClD,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG;QAClC,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB;IAgHD,WAAW,CACT,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM;IA8BpB,oBAAoB,CAClB,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,oBAAoB,EAAE,QAAQ,EAAE;IA2ClC,SAAS,CACP,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM;IAoBpB,iBAAiB,CACf,GAAG,EAAE,WAAW,EAChB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM;IAWpB,YAAY,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;CAmB7E"}
|
|
@@ -23,7 +23,7 @@ export class Template__service extends Template {
|
|
|
23
23
|
namesRecord
|
|
24
24
|
});
|
|
25
25
|
const { syncer: { apis } } = Sonamu;
|
|
26
|
-
const apisForThisModel = apis.filter((api)=>api.modelName === `${namesRecord.capital}Model`);
|
|
26
|
+
const apisForThisModel = apis.filter((api)=>api.modelName === `${namesRecord.capital}Model` || api.modelName === `${namesRecord.capital}Frame`);
|
|
27
27
|
// 서비스 TypeSource
|
|
28
28
|
const { lines, importKeys } = this.getTypeSource(apisForThisModel);
|
|
29
29
|
// AxiosProgressEvent 있는지 확인
|
|
@@ -199,4 +199,4 @@ export async function ${api.methodName}${typeParamsDef}(${paramsDef}): Promise<R
|
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZS50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBkaWZmLCBncm91cCwgc29ydCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7XG4gIGFwaVBhcmFtVG9Uc0NvZGUsXG4gIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdCxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZSBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIjp0YXJnZXQvc3JjL3NlcnZpY2VzXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5mc30uc2VydmljZS50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IG5hbWVzUmVjb3JkIH06IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgbmFtZXNSZWNvcmQgfSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzeW5jZXI6IHsgYXBpcyB9LFxuICAgIH0gPSBTb25hbXU7XG5cbiAgICBjb25zdCBhcGlzRm9yVGhpc01vZGVsID0gYXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7bmFtZXNSZWNvcmQuY2FwaXRhbH1Nb2RlbGApO1xuXG4gICAgLy8g7ISc67mE7IqkIFR5cGVTb3VyY2VcbiAgICBjb25zdCB7IGxpbmVzLCBpbXBvcnRLZXlzIH0gPSB0aGlzLmdldFR5cGVTb3VyY2UoYXBpc0ZvclRoaXNNb2RlbCk7XG5cbiAgICAvLyBBeGlvc1Byb2dyZXNzRXZlbnQg7J6I64qU7KeAIO2ZleyduFxuICAgIGNvbnN0IGhhc0F4aW9zUHJvZ3Jlc3NFdmVudCA9IGFwaXMuZmluZCgoYXBpKSA9PlxuICAgICAgKGFwaS5vcHRpb25zLmNsaWVudHMgPz8gW10pLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzUmVjb3JkKSxcbiAgICAgIGJvZHk6IGxpbmVzLmpvaW4oXCJcXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBpbXBvcnRLZXlzLmZpbHRlcigoa2V5KSA9PiBbXCJMaXN0UmVzdWx0XCJdLmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgcXMgZnJvbSBcInFzXCI7YCxcbiAgICAgICAgYGltcG9ydCB1c2VTV1IsIHsgdHlwZSBTV1JSZXNwb25zZSB9IGZyb20gXCJzd3JcIjtgLFxuICAgICAgICBgaW1wb3J0IHsgZmV0Y2gsIExpc3RSZXN1bHQsIFNXUkVycm9yLCBTd3JPcHRpb25zLCBoYW5kbGVDb25kaXRpb25hbCwgc3dyUG9zdEZldGNoZXIsIEV2ZW50SGFuZGxlcnMsIFNTRVN0cmVhbU9wdGlvbnMsIHVzZVNTRVN0cmVhbSB9IGZyb20gJy4uL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICAgIC4uLihoYXNBeGlvc1Byb2dyZXNzRXZlbnQgPyBbYGltcG9ydCB7IHR5cGUgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSAnYXhpb3MnO2BdIDogW10pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHlwZVNvdXJjZShhcGlzOiBFeHRlbmRlZEFwaVtdKToge1xuICAgIGxpbmVzOiBzdHJpbmdbXTtcbiAgICBpbXBvcnRLZXlzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIOygnOuEpOumreyXkOyEnCDshKDslrjtlZwg7YOA7J6FLCBpbXBvcnRLZXlz7JeQ7IScIOygnOyZuCDtlYTsmpRcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBncm91cHMgPSBncm91cChhcGlzLCAoYXBpKSA9PiBhcGkubW9kZWxOYW1lKTtcbiAgICBjb25zdCBib2R5ID0gT2JqZWN0LmtleXMoZ3JvdXBzKVxuICAgICAgLm1hcCgobW9kZWxOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBncm91cHNbbW9kZWxOYW1lXTtcbiAgICAgICAgYXNzZXJ0KG1ldGhvZHMpO1xuICAgICAgICBjb25zdCBtZXRob2RDb2RlcyA9IG1ldGhvZHNcbiAgICAgICAgICAubWFwKChhcGkpID0+IHtcbiAgICAgICAgICAgIC8vIOy7qO2FjeyKpO2KuCDsoJzsmbjrkJwg7YyM652866+47YSwIOumrOyKpO2KuFxuICAgICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICAgIShwYXJhbS5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSwgLy8gX+uhnCDsi5zsnpHtlZjripQg7YyM652866+47YSw64qUIOygnOyZuFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7YyM652866+47YSwIO2DgOyehSDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgLm1hcCgodHlwZVBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KFxuICAgICAgICAgICAgICBhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0eXBlUGFyYW0pID0+IHR5cGVQYXJhbS5pZCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcblxuICAgICAgICAgICAgLy8g7YyM652866+47YSwIOygleydmCAo6rCd7LK0IO2Yle2DnClcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID0gYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0KHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcblxuICAgICAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZCh1bndyYXBQcm9taXNlT25jZShhcGkucmV0dXJuVHlwZSkpLFxuICAgICAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7Y6Y7J2066Gc65OcIOuNsOydtO2EsCDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWREZWYgPSBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocGFyYW0pID0+IHBhcmFtLm5hbWUpLmpvaW4oXCIsIFwiKX0gfWA7XG5cbiAgICAgICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgICBjb25zdCBjbGllbnRzID0gYXBpLm9wdGlvbnMuY2xpZW50cyA/PyBbXTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIC8vIO2BtOudvOydtOyWuO2KuOuzhOuhnCDsg53shLFcbiAgICAgICAgICAgICAgLi4uc29ydChjbGllbnRzLCAoY2xpZW50KSA9PiAoY2xpZW50ID09PSBcInN3clwiID8gMCA6IDEpKS5tYXAoKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiYXhpb3NcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQXhpb3MoXG4gICAgICAgICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgICAgICAgIGFwaUJhc2VVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNEZWYsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZURlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImF4aW9zLW11bHRpcGFydFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBeGlvc011bHRpcGFydChcbiAgICAgICAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgICAgICAgYXBpQmFzZVVybCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1zRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcInN3clwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJTd3IoXG4gICAgICAgICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgICAgICAgIGFwaUJhc2VVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNEZWYsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZURlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIndpbmRvdy1mZXRjaFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJXaW5kb3dGZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgICAgICAgYXBpQmFzZVVybCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1zRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAvLyBOb3Qgc3VwcG9ydGVkICR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjbGllbnQsIHRydWUpfSB5ZXQuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyDsiqTtirjrpqzrsI3snbgg6rK97JqwXG4gICAgICAgICAgICAgIC4uLihhcGkuc3RyZWFtT3B0aW9ucyA/IFt0aGlzLnJlbmRlclN0cmVhbShhcGksIGFwaUJhc2VVcmwsIHBhcmFtc0RlZkFzT2JqZWN0KV0gOiBbXSksXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuam9pbihcIlxcblxcblwiKTtcblxuICAgICAgICByZXR1cm4gYGV4cG9ydCBuYW1lc3BhY2UgJHttb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJTZXJ2aWNlXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiU2VydmljZVwiKX0ge1xuJHttZXRob2RDb2Rlc31cbn1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXFxuXCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVzOiBbYm9keV0sXG4gICAgICBpbXBvcnRLZXlzOiBkaWZmKHVuaXF1ZShpbXBvcnRLZXlzKSwgdHlwZVBhcmFtTmFtZXMpLFxuICAgIH07XG4gIH1cblxuICByZW5kZXJBeGlvcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFwaUJhc2VVcmw6IHN0cmluZyxcbiAgICB0eXBlUGFyYW1zRGVmOiBzdHJpbmcsXG4gICAgcGFyYW1zRGVmOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZURlZjogc3RyaW5nLFxuICAgIHBheWxvYWREZWY6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kTmFtZUF4aW9zID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICA/IGBnZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgaWYgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lQXhpb3N9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgICByZXR1cm4gZmV0Y2goe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9P1xcJHtxcy5zdHJpbmdpZnkoJHtwYXlsb2FkRGVmfSl9XFxgLFxuICAgICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgICB9KTtcbn1cbiAgICBgLnRyaW0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWVBeGlvc30ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICAgIHJldHVybiBmZXRjaCh7XG4gICAgICBtZXRob2Q6ICcke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9JyxcbiAgICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICAgIGRhdGE6ICR7cGF5bG9hZERlZn0sXG4gICAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICAgIH0pO1xufVxuICAgICAgYC50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQXhpb3NNdWx0aXBhcnQoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcGlCYXNlVXJsOiBzdHJpbmcsXG4gICAgdHlwZVBhcmFtc0RlZjogc3RyaW5nLFxuICAgIHBhcmFtc0RlZjogc3RyaW5nLFxuICAgIHJldHVyblR5cGVEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNXaXRob3V0Q29udGV4dDogQXBpUGFyYW1bXSxcbiAgKSB7XG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IGFwaS51cGxvYWRPcHRpb25zPy5tb2RlID09PSBcIm11bHRpcGxlXCI7XG4gICAgY29uc3QgZmlsZVBhcmFtTmFtZSA9IGlzTXVsdGlwbGUgPyBcImZpbGVzXCIgOiBcImZpbGVcIjtcbiAgICBjb25zdCBmaWxlUGFyYW1UeXBlID0gaXNNdWx0aXBsZSA/IFwiRmlsZVtdXCIgOiBcIkZpbGVcIjtcblxuICAgIGNvbnN0IGZvcm1EYXRhRGVmID0gaXNNdWx0aXBsZVxuICAgICAgPyBbXG4gICAgICAgICAgYCR7ZmlsZVBhcmFtTmFtZX0uZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiJHtmaWxlUGFyYW1OYW1lfVwiLCBmKSB9ICk7IGAsXG4gICAgICAgICAgLi4ucGFyYW1zV2l0aG91dENvbnRleHQubWFwKFxuICAgICAgICAgICAgKHBhcmFtKSA9PiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgLFxuICAgICAgICAgICksXG4gICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgOiBbXG4gICAgICAgICAgYGZvcm1EYXRhLmFwcGVuZChcIiR7ZmlsZVBhcmFtTmFtZX1cIiwgJHtmaWxlUGFyYW1OYW1lfSk7YCxcbiAgICAgICAgICAuLi5wYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoXG4gICAgICAgICAgICAocGFyYW0pID0+IGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuXG4gICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHthcGkubWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICAke2ZpbGVQYXJhbU5hbWV9OiAke2ZpbGVQYXJhbVR5cGV9LFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOkF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZFxuICApOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICR7Zm9ybURhdGFEZWZ9XG4gICAgcmV0dXJuIGZldGNoKHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcIm11bHRpcGFydC9mb3JtLWRhdGFcIixcbiAgICAgIH0sXG4gICAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICAgIH0pO1xuICB9XG4gIGAudHJpbSgpO1xuICB9XG5cbiAgcmVuZGVyU3dyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXBpQmFzZVVybDogc3RyaW5nLFxuICAgIHR5cGVQYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNEZWY6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlRGVmOiBzdHJpbmcsXG4gICAgcGF5bG9hZERlZjogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2ROYW1lU3dyID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICA/IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICA6IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpfWA7XG4gICAgcmV0dXJuIGAgIGV4cG9ydCBmdW5jdGlvbiAke2luZmxlY3Rpb24uY2FtZWxpemUobWV0aG9kTmFtZVN3ciwgdHJ1ZSl9JHt0eXBlUGFyYW1zRGVmfSgke1tcbiAgICAgIHBhcmFtc0RlZixcbiAgICAgIFwic3dyT3B0aW9ucz86IFN3ck9wdGlvbnNcIixcbiAgICBdXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKVxuICAgICAgLmpvaW4oXCIsXCIpfSwgKTogU1dSUmVzcG9uc2U8JHtyZXR1cm5UeXBlRGVmfSwgU1dSRXJyb3I+IHtcbiAgICByZXR1cm4gdXNlU1dSKGhhbmRsZUNvbmRpdGlvbmFsKFtcbiAgICAgIFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgICAke3BheWxvYWREZWZ9LFxuICAgIF0sIHN3ck9wdGlvbnM/LmNvbmRpdGlvbmFsKSR7YXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJQT1NUXCIgPyBcIiwgc3dyUG9zdEZldGNoZXJcIiA6IFwiXCJ9JHtcbiAgICAgIGFwaS5vcHRpb25zLnRpbWVvdXQgPyBgLCB7IGxvYWRpbmdUaW1lb3V0OiAke2FwaS5vcHRpb25zLnRpbWVvdXR9IH1gIDogXCJcIlxuICAgIH0pO1xuICB9YDtcbiAgfVxuXG4gIHJlbmRlcldpbmRvd0ZldGNoKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXBpQmFzZVVybDogc3RyaW5nLFxuICAgIHR5cGVQYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXlsb2FkRGVmOiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHthcGkubWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gd2luZG93LmZldGNoKFxcYCR7YXBpQmFzZVVybH0/XFwke3FzLnN0cmluZ2lmeSgke3BheWxvYWREZWZ9KX1cXGAke1xuICAgICAgYXBpLm9wdGlvbnMudGltZW91dCA/IGAsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pIH1gIDogXCJcIlxuICAgIH0pO1xufVxuICAgIGAudHJpbSgpO1xuICB9XG5cbiAgcmVuZGVyU3RyZWFtKGFwaTogRXh0ZW5kZWRBcGksIGFwaUJhc2VVcmw6IHN0cmluZywgcGFyYW1zRGVmQXNPYmplY3Q6IHN0cmluZykge1xuICAgIGlmICghYXBpLnN0cmVhbU9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBcIi8vIHN0cmVhbU9wdGlvbnMgbm90IGZvdW5kXCI7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgcmV0dXJuIGAgIGV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zKSB7XG4gICAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbiAgfWA7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJpbmZsZWN0aW9uIiwiZGlmZiIsImdyb3VwIiwic29ydCIsInVuaXF1ZSIsImFwaVBhcmFtVG9Uc0NvZGUiLCJhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3QiLCJhcGlQYXJhbVR5cGVUb1RzVHlwZSIsInVud3JhcFByb21pc2VPbmNlIiwiU29uYW11IiwiTmFpdGUiLCJBcGlQYXJhbVR5cGUiLCJhc3NlcnREZWZpbmVkIiwiVGVtcGxhdGUiLCJ6b2RUeXBlVG9Uc1R5cGVEZWYiLCJUZW1wbGF0ZV9fc2VydmljZSIsImdldFRhcmdldEFuZFBhdGgiLCJuYW1lcyIsInRhcmdldCIsInBhdGgiLCJmcyIsInJlbmRlciIsIm5hbWVzUmVjb3JkIiwidCIsInN5bmNlciIsImFwaXMiLCJhcGlzRm9yVGhpc01vZGVsIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwiY2FwaXRhbCIsImxpbmVzIiwiaW1wb3J0S2V5cyIsImdldFR5cGVTb3VyY2UiLCJoYXNBeGlvc1Byb2dyZXNzRXZlbnQiLCJmaW5kIiwib3B0aW9ucyIsImNsaWVudHMiLCJpbmNsdWRlcyIsImJvZHkiLCJqb2luIiwia2V5IiwiY3VzdG9tSGVhZGVycyIsInR5cGVQYXJhbU5hbWVzIiwiZ3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsIm1ldGhvZHMiLCJtZXRob2RDb2RlcyIsInBhcmFtc1dpdGhvdXRDb250ZXh0IiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwidHlwZSIsImlzUmVmS25leCIsIm9wdGlvbmFsIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJ0eXBlUGFyYW1ldGVyc0FzVHNUeXBlIiwidHlwZVBhcmFtZXRlcnMiLCJ0eXBlUGFyYW0iLCJ0eXBlUGFyYW1zRGVmIiwiY29uY2F0IiwiaWQiLCJwYXJhbXNEZWYiLCJwYXJhbXNEZWZBc09iamVjdCIsInJldHVyblR5cGVEZWYiLCJyZXR1cm5UeXBlIiwicGF5bG9hZERlZiIsImFwaUJhc2VVcmwiLCJjb25maWciLCJyb3V0ZSIsInByZWZpeCIsImNsaWVudCIsInJlbmRlckF4aW9zIiwicmVuZGVyQXhpb3NNdWx0aXBhcnQiLCJyZW5kZXJTd3IiLCJyZW5kZXJXaW5kb3dGZXRjaCIsImNhbWVsaXplIiwic3RyZWFtT3B0aW9ucyIsInJlbmRlclN0cmVhbSIsInJlcGxhY2UiLCJtZXRob2ROYW1lQXhpb3MiLCJyZXNvdXJjZU5hbWUiLCJtZXRob2ROYW1lIiwiaHR0cE1ldGhvZCIsInRpbWVvdXQiLCJ0cmltIiwiaXNNdWx0aXBsZSIsInVwbG9hZE9wdGlvbnMiLCJtb2RlIiwiZmlsZVBhcmFtTmFtZSIsImZpbGVQYXJhbVR5cGUiLCJmb3JtRGF0YURlZiIsInBhcmFtc0RlZkNvbW1hIiwibWV0aG9kTmFtZVN3ciIsInAiLCJtZXRob2ROYW1lU3RyZWFtIiwibWV0aG9kTmFtZVN0cmVhbUNhbWVsaXplZCIsImV2ZW50c1R5cGVEZWYiLCJldmVudHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUNwRCxTQUNFQyxnQkFBZ0IsRUFDaEJDLHdCQUF3QixFQUN4QkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsUUFDWiwrQkFBNEI7QUFFbkMsU0FBU0MsTUFBTSxRQUFRLHNCQUFtQjtBQUUxQyxTQUFTQyxLQUFLLFFBQVEsdUJBQW9CO0FBRTFDLFNBQXdCQyxZQUFZLFFBQVEsdUJBQW9CO0FBQ2hFLFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFDbEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGtCQUFrQixRQUFRLHNCQUFtQjtBQUV0RCxPQUFPLE1BQU1DLDBCQUEwQkY7SUFDckMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFHLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxPQUFPO1lBQ0xDLFFBQVE7WUFDUkMsTUFBTSxHQUFHRixNQUFNRyxFQUFFLENBQUMsQ0FBQyxFQUFFSCxNQUFNRyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQzVDO0lBQ0Y7SUFFQUMsT0FBTyxFQUFFQyxXQUFXLEVBQThCLEVBQUU7UUFDbERaLE1BQU1hLENBQUMsQ0FBQyxVQUFVO1lBQUVEO1FBQVk7UUFFaEMsTUFBTSxFQUNKRSxRQUFRLEVBQUVDLElBQUksRUFBRSxFQUNqQixHQUFHaEI7UUFFSixNQUFNaUIsbUJBQW1CRCxLQUFLRSxNQUFNLENBQUMsQ0FBQ0MsTUFBUUEsSUFBSUMsU0FBUyxLQUFLLEdBQUdQLFlBQVlRLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFFN0YsaUJBQWlCO1FBQ2pCLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxVQUFVLEVBQUUsR0FBRyxJQUFJLENBQUNDLGFBQWEsQ0FBQ1A7UUFFakQsNEJBQTRCO1FBQzVCLE1BQU1RLHdCQUF3QlQsS0FBS1UsSUFBSSxDQUFDLENBQUNQLE1BQ3ZDLEFBQUNBLENBQUFBLElBQUlRLE9BQU8sQ0FBQ0MsT0FBTyxJQUFJLEVBQUUsQUFBRCxFQUFHQyxRQUFRLENBQUM7UUFHdkMsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDdEIsZ0JBQWdCLENBQUNNLFlBQVk7WUFDckNpQixNQUFNUixNQUFNUyxJQUFJLENBQUM7WUFDakJSLFlBQVlBLFdBQVdMLE1BQU0sQ0FBQyxDQUFDYyxNQUFRO29CQUFDO2lCQUFhLENBQUNILFFBQVEsQ0FBQ0csU0FBUztZQUN4RUMsZUFBZTtnQkFDYixDQUFDLHdCQUF3QixDQUFDO2dCQUMxQixDQUFDLG9CQUFvQixDQUFDO2dCQUN0QixDQUFDLCtDQUErQyxDQUFDO2dCQUNqRCxDQUFDLDZKQUE2SixDQUFDO21CQUMzSlIsd0JBQXdCO29CQUFDLENBQUMsZ0RBQWdELENBQUM7aUJBQUMsR0FBRyxFQUFFO2FBQ3RGO1FBQ0g7SUFDRjtJQUVBRCxjQUFjUixJQUFtQixFQUcvQjtRQUNBLE1BQU1PLGFBQXVCLEVBQUU7UUFFL0IsbUNBQW1DO1FBQ25DLElBQUlXLGlCQUEyQixFQUFFO1FBRWpDLE1BQU1DLFNBQVMxQyxNQUFNdUIsTUFBTSxDQUFDRyxNQUFRQSxJQUFJQyxTQUFTO1FBQ2pELE1BQU1VLE9BQU9NLE9BQU9DLElBQUksQ0FBQ0YsUUFDdEJHLEdBQUcsQ0FBQyxDQUFDbEI7WUFDSixNQUFNbUIsVUFBVUosTUFBTSxDQUFDZixVQUFVO1lBQ2pDOUIsT0FBT2lEO1lBQ1AsTUFBTUMsY0FBY0QsUUFDakJELEdBQUcsQ0FBQyxDQUFDbkI7Z0JBQ0osb0JBQW9CO2dCQUNwQixNQUFNc0IsdUJBQXVCdEIsSUFBSXVCLFVBQVUsQ0FBQ3hCLE1BQU0sQ0FDaEQsQ0FBQ3lCLFFBQ0MsQ0FBQ3pDLGFBQWEwQyxTQUFTLENBQUNELE1BQU1FLElBQUksS0FDbEMsQ0FBQzNDLGFBQWE0QyxTQUFTLENBQUNILE1BQU1FLElBQUksS0FDbEMsQ0FBRUYsQ0FBQUEsTUFBTUksUUFBUSxLQUFLLFFBQVFKLE1BQU1LLElBQUksQ0FBQ0MsVUFBVSxDQUFDLElBQUc7Z0JBRzFELGFBQWE7Z0JBQ2IsTUFBTUMseUJBQXlCL0IsSUFBSWdDLGNBQWMsQ0FDOUNiLEdBQUcsQ0FBQyxDQUFDYztvQkFDSixPQUFPdEQscUJBQXFCc0QsV0FBVzdCO2dCQUN6QyxHQUNDUSxJQUFJLENBQUM7Z0JBQ1IsTUFBTXNCLGdCQUFnQkgseUJBQXlCLENBQUMsQ0FBQyxFQUFFQSx1QkFBdUIsQ0FBQyxDQUFDLEdBQUc7Z0JBQy9FaEIsaUJBQWlCQSxlQUFlb0IsTUFBTSxDQUNwQ25DLElBQUlnQyxjQUFjLENBQUNiLEdBQUcsQ0FBQyxDQUFDYyxZQUFjQSxVQUFVRyxFQUFFO2dCQUdwRCxVQUFVO2dCQUNWLE1BQU1DLFlBQVk1RCxpQkFBaUI2QyxzQkFBc0JsQjtnQkFFekQsa0JBQWtCO2dCQUNsQixNQUFNa0Msb0JBQW9CNUQseUJBQXlCNEMsc0JBQXNCbEI7Z0JBRXpFLFdBQVc7Z0JBQ1gsTUFBTW1DLGdCQUFnQjVELHFCQUNwQkssY0FBY0osa0JBQWtCb0IsSUFBSXdDLFVBQVUsSUFDOUNwQztnQkFHRixjQUFjO2dCQUNkLE1BQU1xQyxhQUFhLENBQUMsRUFBRSxFQUFFbkIscUJBQXFCSCxHQUFHLENBQUMsQ0FBQ0ssUUFBVUEsTUFBTUssSUFBSSxFQUFFakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUV0RixTQUFTO2dCQUNULE1BQU04QixhQUFhLEdBQUc3RCxPQUFPOEQsTUFBTSxDQUFDM0MsR0FBRyxDQUFDNEMsS0FBSyxDQUFDQyxNQUFNLEdBQUc3QyxJQUFJVCxJQUFJLEVBQUU7Z0JBRWpFLE1BQU1rQixVQUFVVCxJQUFJUSxPQUFPLENBQUNDLE9BQU8sSUFBSSxFQUFFO2dCQUN6QyxPQUFPO29CQUNMLGFBQWE7dUJBQ1ZsQyxLQUFLa0MsU0FBUyxDQUFDcUMsU0FBWUEsV0FBVyxRQUFRLElBQUksR0FBSTNCLEdBQUcsQ0FBQyxDQUFDMkI7d0JBQzVELE9BQVFBOzRCQUNOLEtBQUs7Z0NBQ0gsT0FBTyxJQUFJLENBQUNDLFdBQVcsQ0FDckIvQyxLQUNBMEMsWUFDQVIsZUFDQUcsV0FDQUUsZUFDQUU7NEJBRUosS0FBSztnQ0FDSCxPQUFPLElBQUksQ0FBQ08sb0JBQW9CLENBQzlCaEQsS0FDQTBDLFlBQ0FSLGVBQ0FHLFdBQ0FFLGVBQ0FqQjs0QkFFSixLQUFLO2dDQUNILE9BQU8sSUFBSSxDQUFDMkIsU0FBUyxDQUNuQmpELEtBQ0EwQyxZQUNBUixlQUNBRyxXQUNBRSxlQUNBRTs0QkFFSixLQUFLO2dDQUNILE9BQU8sSUFBSSxDQUFDUyxpQkFBaUIsQ0FDM0JsRCxLQUNBMEMsWUFDQVIsZUFDQUcsV0FDQUk7NEJBRUo7Z0NBQ0UsT0FBTyxDQUFDLGlCQUFpQixFQUFFckUsV0FBVytFLFFBQVEsQ0FBQ0wsUUFBUSxNQUFNLEtBQUssQ0FBQzt3QkFDdkU7b0JBQ0Y7b0JBQ0EsV0FBVzt1QkFDUDlDLElBQUlvRCxhQUFhLEdBQUc7d0JBQUMsSUFBSSxDQUFDQyxZQUFZLENBQUNyRCxLQUFLMEMsWUFBWUo7cUJBQW1CLEdBQUcsRUFBRTtpQkFDckYsQ0FBQzFCLElBQUksQ0FBQztZQUNULEdBQ0NBLElBQUksQ0FBQztZQUVSLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRVgsVUFBVXFELE9BQU8sQ0FBQyxVQUFVLFdBQVdBLE9BQU8sQ0FBQyxVQUFVLFdBQVc7QUFDdkcsRUFBRWpDLFlBQVk7Q0FDYixDQUFDO1FBQ0ksR0FDQ1QsSUFBSSxDQUFDO1FBRVIsT0FBTztZQUNMVCxPQUFPO2dCQUFDUTthQUFLO1lBQ2JQLFlBQVkvQixLQUFLRyxPQUFPNEIsYUFBYVc7UUFDdkM7SUFDRjtJQUVBZ0MsWUFDRS9DLEdBQWdCLEVBQ2hCMEMsVUFBa0IsRUFDbEJSLGFBQXFCLEVBQ3JCRyxTQUFpQixFQUNqQkUsYUFBcUIsRUFDckJFLFVBQWtCLEVBQ2xCO1FBQ0EsTUFBTWMsa0JBQWtCdkQsSUFBSVEsT0FBTyxDQUFDZ0QsWUFBWSxHQUM1QyxDQUFDLEdBQUcsRUFBRXBGLFdBQVcrRSxRQUFRLENBQUNuRCxJQUFJUSxPQUFPLENBQUNnRCxZQUFZLEdBQUcsR0FDckR4RCxJQUFJeUQsVUFBVTtRQUVsQixJQUFJekQsSUFBSVEsT0FBTyxDQUFDa0QsVUFBVSxLQUFLLE9BQU87WUFDcEMsT0FBTyxDQUFDO3NCQUNRLEVBQUVILGtCQUFrQnJCLGNBQWMsQ0FBQyxFQUFFRyxVQUFVLFdBQVcsRUFBRUUsY0FBYzs7O2FBR25GLEVBQUVHLFdBQVcsaUJBQWlCLEVBQUVELFdBQVc7TUFDbEQsRUFBRXpDLElBQUlRLE9BQU8sQ0FBQ21ELE9BQU8sR0FBRyxDQUFDLDRCQUE0QixFQUFFM0QsSUFBSVEsT0FBTyxDQUFDbUQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7OztJQUd0RixDQUFDLENBQUNDLElBQUk7UUFDTixPQUFPO1lBQ0wsT0FBTyxDQUFDO3NCQUNRLEVBQUVMLGtCQUFrQnJCLGNBQWMsQ0FBQyxFQUFFRyxVQUFVLFdBQVcsRUFBRUUsY0FBYzs7ZUFFakYsRUFBRXZDLElBQUlRLE9BQU8sQ0FBQ2tELFVBQVUsQ0FBQzthQUMzQixFQUFFaEIsV0FBVztZQUNkLEVBQUVELFdBQVc7TUFDbkIsRUFBRXpDLElBQUlRLE9BQU8sQ0FBQ21ELE9BQU8sR0FBRyxDQUFDLDRCQUE0QixFQUFFM0QsSUFBSVEsT0FBTyxDQUFDbUQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7OztNQUdwRixDQUFDLENBQUNDLElBQUk7UUFDUjtJQUNGO0lBRUFaLHFCQUNFaEQsR0FBZ0IsRUFDaEIwQyxVQUFrQixFQUNsQlIsYUFBcUIsRUFDckJHLFNBQWlCLEVBQ2pCRSxhQUFxQixFQUNyQmpCLG9CQUFnQyxFQUNoQztRQUNBLE1BQU11QyxhQUFhN0QsSUFBSThELGFBQWEsRUFBRUMsU0FBUztRQUMvQyxNQUFNQyxnQkFBZ0JILGFBQWEsVUFBVTtRQUM3QyxNQUFNSSxnQkFBZ0JKLGFBQWEsV0FBVztRQUU5QyxNQUFNSyxjQUFjTCxhQUNoQjtZQUNFLEdBQUdHLGNBQWMsaUNBQWlDLEVBQUVBLGNBQWMsV0FBVyxDQUFDO2VBQzNFMUMscUJBQXFCSCxHQUFHLENBQ3pCLENBQUNLLFFBQVUsQ0FBQyxpQkFBaUIsRUFBRUEsTUFBTUssSUFBSSxDQUFDLFVBQVUsRUFBRUwsTUFBTUssSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUV4RSxDQUFDakIsSUFBSSxDQUFDLFFBQ1A7WUFDRSxDQUFDLGlCQUFpQixFQUFFb0QsY0FBYyxHQUFHLEVBQUVBLGNBQWMsRUFBRSxDQUFDO2VBQ3JEMUMscUJBQXFCSCxHQUFHLENBQ3pCLENBQUNLLFFBQVUsQ0FBQyxpQkFBaUIsRUFBRUEsTUFBTUssSUFBSSxDQUFDLFVBQVUsRUFBRUwsTUFBTUssSUFBSSxDQUFDLEdBQUcsQ0FBQztTQUV4RSxDQUFDakIsSUFBSSxDQUFDO1FBRVgsTUFBTXVELGlCQUFpQjlCLGNBQWMsS0FBSyxPQUFPO1FBQ2pELE9BQU8sQ0FBQztzQkFDVSxFQUFFckMsSUFBSXlELFVBQVUsR0FBR3ZCLGNBQWM7RUFDckQsRUFBRUcsWUFBWThCLGVBQWU7RUFDN0IsRUFBRUgsY0FBYyxFQUFFLEVBQUVDLGNBQWM7O2FBRXZCLEVBQUUxQixjQUFjOztJQUV6QixFQUFFMkIsWUFBWTs7O2FBR0wsRUFBRXhCLFdBQVc7Ozs7OztNQU1wQixFQUFFMUMsSUFBSVEsT0FBTyxDQUFDbUQsT0FBTyxHQUFHLENBQUMsNEJBQTRCLEVBQUUzRCxJQUFJUSxPQUFPLENBQUNtRCxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7O0VBR3hGLENBQUMsQ0FBQ0MsSUFBSTtJQUNOO0lBRUFYLFVBQ0VqRCxHQUFnQixFQUNoQjBDLFVBQWtCLEVBQ2xCUixhQUFxQixFQUNyQkcsU0FBaUIsRUFDakJFLGFBQXFCLEVBQ3JCRSxVQUFrQixFQUNsQjtRQUNBLE1BQU0yQixnQkFBZ0JwRSxJQUFJUSxPQUFPLENBQUNnRCxZQUFZLEdBQzFDLENBQUMsR0FBRyxFQUFFcEYsV0FBVytFLFFBQVEsQ0FBQ25ELElBQUlRLE9BQU8sQ0FBQ2dELFlBQVksR0FBRyxHQUNyRCxDQUFDLEdBQUcsRUFBRXBGLFdBQVcrRSxRQUFRLENBQUNuRCxJQUFJeUQsVUFBVSxHQUFHO1FBQy9DLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRXJGLFdBQVcrRSxRQUFRLENBQUNpQixlQUFlLFFBQVFsQyxjQUFjLENBQUMsRUFBRTtZQUN0Rkc7WUFDQTtTQUNELENBQ0V0QyxNQUFNLENBQUMsQ0FBQ3NFLElBQU1BLE1BQU0sSUFDcEJ6RCxJQUFJLENBQUMsS0FBSyxpQkFBaUIsRUFBRTJCLGNBQWM7O1FBRTFDLEVBQUVHLFdBQVc7TUFDZixFQUFFRCxXQUFXOytCQUNZLEVBQUV6QyxJQUFJUSxPQUFPLENBQUNrRCxVQUFVLEtBQUssU0FBUyxxQkFBcUIsS0FDcEYxRCxJQUFJUSxPQUFPLENBQUNtRCxPQUFPLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRTNELElBQUlRLE9BQU8sQ0FBQ21ELE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUN4RTtHQUNGLENBQUM7SUFDRjtJQUVBVCxrQkFDRWxELEdBQWdCLEVBQ2hCMEMsVUFBa0IsRUFDbEJSLGFBQXFCLEVBQ3JCRyxTQUFpQixFQUNqQkksVUFBa0IsRUFDbEI7UUFDQSxPQUFPLENBQUM7c0JBQ1UsRUFBRXpDLElBQUl5RCxVQUFVLEdBQUd2QixjQUFjLENBQUMsRUFBRUcsVUFBVTswQkFDMUMsRUFBRUssV0FBVyxpQkFBaUIsRUFBRUQsV0FBVyxJQUFJLEVBQ25FekMsSUFBSVEsT0FBTyxDQUFDbUQsT0FBTyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUzRCxJQUFJUSxPQUFPLENBQUNtRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FDckY7O0lBRUQsQ0FBQyxDQUFDQyxJQUFJO0lBQ1I7SUFFQVAsYUFBYXJELEdBQWdCLEVBQUUwQyxVQUFrQixFQUFFSixpQkFBeUIsRUFBRTtRQUM1RSxJQUFJLENBQUN0QyxJQUFJb0QsYUFBYSxFQUFFO1lBQ3RCLE9BQU87UUFDVDtRQUVBLE1BQU1rQixtQkFBbUJ0RSxJQUFJUSxPQUFPLENBQUNnRCxZQUFZLEdBQzdDLENBQUMsR0FBRyxFQUFFcEYsV0FBVytFLFFBQVEsQ0FBQ25ELElBQUlRLE9BQU8sQ0FBQ2dELFlBQVksR0FBRyxHQUNyRCxDQUFDLEdBQUcsRUFBRXBGLFdBQVcrRSxRQUFRLENBQUNuRCxJQUFJeUQsVUFBVSxHQUFHO1FBQy9DLE1BQU1jLDRCQUE0Qm5HLFdBQVcrRSxRQUFRLENBQUNtQixrQkFBa0I7UUFFeEUsTUFBTUUsZ0JBQWdCdEYsbUJBQW1CYyxJQUFJb0QsYUFBYSxDQUFDcUIsTUFBTTtRQUVqRSxPQUFPLENBQUMsa0JBQWtCLEVBQUVGLDBCQUEwQjtVQUNoRCxFQUFFakMsa0JBQWtCOzBCQUNKLEVBQUVrQyxjQUFjOzt3QkFFbEIsRUFBRUEsY0FBYyxJQUFJLEVBQUU5QixXQUFXO0dBQ3RELENBQUM7SUFDRjtBQUNGIn0=
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZS50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyBkaWZmLCBncm91cCwgc29ydCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7XG4gIGFwaVBhcmFtVG9Uc0NvZGUsXG4gIGFwaVBhcmFtVG9Uc0NvZGVBc09iamVjdCxcbiAgYXBpUGFyYW1UeXBlVG9Uc1R5cGUsXG4gIHVud3JhcFByb21pc2VPbmNlLFxufSBmcm9tIFwiLi4vLi4vYXBpL2NvZGUtY29udmVydGVyc1wiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuLi8uLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5TmFtZXNSZWNvcmQgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgQXBpUGFyYW0sIEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZSBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aChuYW1lczogRW50aXR5TmFtZXNSZWNvcmQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBcIjp0YXJnZXQvc3JjL3NlcnZpY2VzXCIsXG4gICAgICBwYXRoOiBgJHtuYW1lcy5mc30vJHtuYW1lcy5mc30uc2VydmljZS50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7IG5hbWVzUmVjb3JkIH06IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0pIHtcbiAgICBOYWl0ZS50KFwicmVuZGVyXCIsIHsgbmFtZXNSZWNvcmQgfSk7XG5cbiAgICBjb25zdCB7XG4gICAgICBzeW5jZXI6IHsgYXBpcyB9LFxuICAgIH0gPSBTb25hbXU7XG5cbiAgICBjb25zdCBhcGlzRm9yVGhpc01vZGVsID0gYXBpcy5maWx0ZXIoXG4gICAgICAoYXBpKSA9PlxuICAgICAgICBhcGkubW9kZWxOYW1lID09PSBgJHtuYW1lc1JlY29yZC5jYXBpdGFsfU1vZGVsYCB8fFxuICAgICAgICBhcGkubW9kZWxOYW1lID09PSBgJHtuYW1lc1JlY29yZC5jYXBpdGFsfUZyYW1lYCxcbiAgICApO1xuXG4gICAgLy8g7ISc67mE7IqkIFR5cGVTb3VyY2VcbiAgICBjb25zdCB7IGxpbmVzLCBpbXBvcnRLZXlzIH0gPSB0aGlzLmdldFR5cGVTb3VyY2UoYXBpc0ZvclRoaXNNb2RlbCk7XG5cbiAgICAvLyBBeGlvc1Byb2dyZXNzRXZlbnQg7J6I64qU7KeAIO2ZleyduFxuICAgIGNvbnN0IGhhc0F4aW9zUHJvZ3Jlc3NFdmVudCA9IGFwaXMuZmluZCgoYXBpKSA9PlxuICAgICAgKGFwaS5vcHRpb25zLmNsaWVudHMgPz8gW10pLmluY2x1ZGVzKFwiYXhpb3MtbXVsdGlwYXJ0XCIpLFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzUmVjb3JkKSxcbiAgICAgIGJvZHk6IGxpbmVzLmpvaW4oXCJcXG5cIiksXG4gICAgICBpbXBvcnRLZXlzOiBpbXBvcnRLZXlzLmZpbHRlcigoa2V5KSA9PiBbXCJMaXN0UmVzdWx0XCJdLmluY2x1ZGVzKGtleSkgPT09IGZhbHNlKSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgcXMgZnJvbSBcInFzXCI7YCxcbiAgICAgICAgYGltcG9ydCB1c2VTV1IsIHsgdHlwZSBTV1JSZXNwb25zZSB9IGZyb20gXCJzd3JcIjtgLFxuICAgICAgICBgaW1wb3J0IHsgZmV0Y2gsIExpc3RSZXN1bHQsIFNXUkVycm9yLCBTd3JPcHRpb25zLCBoYW5kbGVDb25kaXRpb25hbCwgc3dyUG9zdEZldGNoZXIsIEV2ZW50SGFuZGxlcnMsIFNTRVN0cmVhbU9wdGlvbnMsIHVzZVNTRVN0cmVhbSB9IGZyb20gJy4uL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICAgIC4uLihoYXNBeGlvc1Byb2dyZXNzRXZlbnQgPyBbYGltcG9ydCB7IHR5cGUgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSAnYXhpb3MnO2BdIDogW10pLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHlwZVNvdXJjZShhcGlzOiBFeHRlbmRlZEFwaVtdKToge1xuICAgIGxpbmVzOiBzdHJpbmdbXTtcbiAgICBpbXBvcnRLZXlzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIOygnOuEpOumreyXkOyEnCDshKDslrjtlZwg7YOA7J6FLCBpbXBvcnRLZXlz7JeQ7IScIOygnOyZuCDtlYTsmpRcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBjb25zdCBncm91cHMgPSBncm91cChhcGlzLCAoYXBpKSA9PiBhcGkubW9kZWxOYW1lKTtcbiAgICBjb25zdCBib2R5ID0gT2JqZWN0LmtleXMoZ3JvdXBzKVxuICAgICAgLm1hcCgobW9kZWxOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZHMgPSBncm91cHNbbW9kZWxOYW1lXTtcbiAgICAgICAgYXNzZXJ0KG1ldGhvZHMpO1xuICAgICAgICBjb25zdCBtZXRob2RDb2RlcyA9IG1ldGhvZHNcbiAgICAgICAgICAubWFwKChhcGkpID0+IHtcbiAgICAgICAgICAgIC8vIOy7qO2FjeyKpO2KuCDsoJzsmbjrkJwg7YyM652866+47YSwIOumrOyKpO2KuFxuICAgICAgICAgICAgY29uc3QgcGFyYW1zV2l0aG91dENvbnRleHQgPSBhcGkucGFyYW1ldGVycy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNSZWZLbmV4KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAgICAgIShwYXJhbS5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSwgLy8gX+uhnCDsi5zsnpHtlZjripQg7YyM652866+47YSw64qUIOygnOyZuFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7YyM652866+47YSwIO2DgOyehSDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUgPSBhcGkudHlwZVBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgLm1hcCgodHlwZVBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwaVBhcmFtVHlwZVRvVHNUeXBlKHR5cGVQYXJhbSwgaW1wb3J0S2V5cyk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgICAgIHR5cGVQYXJhbU5hbWVzID0gdHlwZVBhcmFtTmFtZXMuY29uY2F0KFxuICAgICAgICAgICAgICBhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0eXBlUGFyYW0pID0+IHR5cGVQYXJhbS5pZCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcblxuICAgICAgICAgICAgLy8g7YyM652866+47YSwIOygleydmCAo6rCd7LK0IO2Yle2DnClcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID0gYXBpUGFyYW1Ub1RzQ29kZUFzT2JqZWN0KHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcblxuICAgICAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHJldHVyblR5cGVEZWYgPSBhcGlQYXJhbVR5cGVUb1RzVHlwZShcbiAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZCh1bndyYXBQcm9taXNlT25jZShhcGkucmV0dXJuVHlwZSkpLFxuICAgICAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8g7Y6Y7J2066Gc65OcIOuNsOydtO2EsCDsoJXsnZhcbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWREZWYgPSBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocGFyYW0pID0+IHBhcmFtLm5hbWUpLmpvaW4oXCIsIFwiKX0gfWA7XG5cbiAgICAgICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgICAgIGNvbnN0IGFwaUJhc2VVcmwgPSBgJHtTb25hbXUuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9JHthcGkucGF0aH1gO1xuXG4gICAgICAgICAgICBjb25zdCBjbGllbnRzID0gYXBpLm9wdGlvbnMuY2xpZW50cyA/PyBbXTtcbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgIC8vIO2BtOudvOydtOyWuO2KuOuzhOuhnCDsg53shLFcbiAgICAgICAgICAgICAgLi4uc29ydChjbGllbnRzLCAoY2xpZW50KSA9PiAoY2xpZW50ID09PSBcInN3clwiID8gMCA6IDEpKS5tYXAoKGNsaWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2xpZW50KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiYXhpb3NcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQXhpb3MoXG4gICAgICAgICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgICAgICAgIGFwaUJhc2VVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNEZWYsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZURlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImF4aW9zLW11bHRpcGFydFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJBeGlvc011bHRpcGFydChcbiAgICAgICAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgICAgICAgYXBpQmFzZVVybCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1zRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcInN3clwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJTd3IoXG4gICAgICAgICAgICAgICAgICAgICAgYXBpLFxuICAgICAgICAgICAgICAgICAgICAgIGFwaUJhc2VVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNEZWYsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZURlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIndpbmRvdy1mZXRjaFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJXaW5kb3dGZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICBhcGksXG4gICAgICAgICAgICAgICAgICAgICAgYXBpQmFzZVVybCxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1zRGVmLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlZixcbiAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkRGVmLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAvLyBOb3Qgc3VwcG9ydGVkICR7aW5mbGVjdGlvbi5jYW1lbGl6ZShjbGllbnQsIHRydWUpfSB5ZXQuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAvLyDsiqTtirjrpqzrsI3snbgg6rK97JqwXG4gICAgICAgICAgICAgIC4uLihhcGkuc3RyZWFtT3B0aW9ucyA/IFt0aGlzLnJlbmRlclN0cmVhbShhcGksIGFwaUJhc2VVcmwsIHBhcmFtc0RlZkFzT2JqZWN0KV0gOiBbXSksXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuam9pbihcIlxcblxcblwiKTtcblxuICAgICAgICByZXR1cm4gYGV4cG9ydCBuYW1lc3BhY2UgJHttb2RlbE5hbWUucmVwbGFjZSgvTW9kZWwkLywgXCJTZXJ2aWNlXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiU2VydmljZVwiKX0ge1xuJHttZXRob2RDb2Rlc31cbn1gO1xuICAgICAgfSlcbiAgICAgIC5qb2luKFwiXFxuXFxuXCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVzOiBbYm9keV0sXG4gICAgICBpbXBvcnRLZXlzOiBkaWZmKHVuaXF1ZShpbXBvcnRLZXlzKSwgdHlwZVBhcmFtTmFtZXMpLFxuICAgIH07XG4gIH1cblxuICByZW5kZXJBeGlvcyhcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFwaUJhc2VVcmw6IHN0cmluZyxcbiAgICB0eXBlUGFyYW1zRGVmOiBzdHJpbmcsXG4gICAgcGFyYW1zRGVmOiBzdHJpbmcsXG4gICAgcmV0dXJuVHlwZURlZjogc3RyaW5nLFxuICAgIHBheWxvYWREZWY6IHN0cmluZyxcbiAgKSB7XG4gICAgY29uc3QgbWV0aG9kTmFtZUF4aW9zID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICA/IGBnZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICA6IGFwaS5tZXRob2ROYW1lO1xuXG4gICAgaWYgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lQXhpb3N9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgICByZXR1cm4gZmV0Y2goe1xuICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9P1xcJHtxcy5zdHJpbmdpZnkoJHtwYXlsb2FkRGVmfSl9XFxgLFxuICAgICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgICB9KTtcbn1cbiAgICBgLnRyaW0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWVBeGlvc30ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICAgIHJldHVybiBmZXRjaCh7XG4gICAgICBtZXRob2Q6ICcke2FwaS5vcHRpb25zLmh0dHBNZXRob2R9JyxcbiAgICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICAgIGRhdGE6ICR7cGF5bG9hZERlZn0sXG4gICAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICAgIH0pO1xufVxuICAgICAgYC50cmltKCk7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyQXhpb3NNdWx0aXBhcnQoXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICBhcGlCYXNlVXJsOiBzdHJpbmcsXG4gICAgdHlwZVBhcmFtc0RlZjogc3RyaW5nLFxuICAgIHBhcmFtc0RlZjogc3RyaW5nLFxuICAgIHJldHVyblR5cGVEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNXaXRob3V0Q29udGV4dDogQXBpUGFyYW1bXSxcbiAgKSB7XG4gICAgY29uc3QgaXNNdWx0aXBsZSA9IGFwaS51cGxvYWRPcHRpb25zPy5tb2RlID09PSBcIm11bHRpcGxlXCI7XG4gICAgY29uc3QgZmlsZVBhcmFtTmFtZSA9IGlzTXVsdGlwbGUgPyBcImZpbGVzXCIgOiBcImZpbGVcIjtcbiAgICBjb25zdCBmaWxlUGFyYW1UeXBlID0gaXNNdWx0aXBsZSA/IFwiRmlsZVtdXCIgOiBcIkZpbGVcIjtcblxuICAgIGNvbnN0IGZvcm1EYXRhRGVmID0gaXNNdWx0aXBsZVxuICAgICAgPyBbXG4gICAgICAgICAgYCR7ZmlsZVBhcmFtTmFtZX0uZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiJHtmaWxlUGFyYW1OYW1lfVwiLCBmKSB9ICk7IGAsXG4gICAgICAgICAgLi4ucGFyYW1zV2l0aG91dENvbnRleHQubWFwKFxuICAgICAgICAgICAgKHBhcmFtKSA9PiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgLFxuICAgICAgICAgICksXG4gICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgOiBbXG4gICAgICAgICAgYGZvcm1EYXRhLmFwcGVuZChcIiR7ZmlsZVBhcmFtTmFtZX1cIiwgJHtmaWxlUGFyYW1OYW1lfSk7YCxcbiAgICAgICAgICAuLi5wYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoXG4gICAgICAgICAgICAocGFyYW0pID0+IGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2AsXG4gICAgICAgICAgKSxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpO1xuXG4gICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHthcGkubWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICAke2ZpbGVQYXJhbU5hbWV9OiAke2ZpbGVQYXJhbVR5cGV9LFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOkF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZFxuICApOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICR7Zm9ybURhdGFEZWZ9XG4gICAgcmV0dXJuIGZldGNoKHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcIm11bHRpcGFydC9mb3JtLWRhdGFcIixcbiAgICAgIH0sXG4gICAgICBvblVwbG9hZFByb2dyZXNzLFxuICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICAgIH0pO1xuICB9XG4gIGAudHJpbSgpO1xuICB9XG5cbiAgcmVuZGVyU3dyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXBpQmFzZVVybDogc3RyaW5nLFxuICAgIHR5cGVQYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNEZWY6IHN0cmluZyxcbiAgICByZXR1cm5UeXBlRGVmOiBzdHJpbmcsXG4gICAgcGF5bG9hZERlZjogc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBtZXRob2ROYW1lU3dyID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICA/IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICA6IGB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpfWA7XG4gICAgcmV0dXJuIGAgIGV4cG9ydCBmdW5jdGlvbiAke2luZmxlY3Rpb24uY2FtZWxpemUobWV0aG9kTmFtZVN3ciwgdHJ1ZSl9JHt0eXBlUGFyYW1zRGVmfSgke1tcbiAgICAgIHBhcmFtc0RlZixcbiAgICAgIFwic3dyT3B0aW9ucz86IFN3ck9wdGlvbnNcIixcbiAgICBdXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKVxuICAgICAgLmpvaW4oXCIsXCIpfSwgKTogU1dSUmVzcG9uc2U8JHtyZXR1cm5UeXBlRGVmfSwgU1dSRXJyb3I+IHtcbiAgICByZXR1cm4gdXNlU1dSKGhhbmRsZUNvbmRpdGlvbmFsKFtcbiAgICAgIFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgICAke3BheWxvYWREZWZ9LFxuICAgIF0sIHN3ck9wdGlvbnM/LmNvbmRpdGlvbmFsKSR7YXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJQT1NUXCIgPyBcIiwgc3dyUG9zdEZldGNoZXJcIiA6IFwiXCJ9JHtcbiAgICAgIGFwaS5vcHRpb25zLnRpbWVvdXQgPyBgLCB7IGxvYWRpbmdUaW1lb3V0OiAke2FwaS5vcHRpb25zLnRpbWVvdXR9IH1gIDogXCJcIlxuICAgIH0pO1xuICB9YDtcbiAgfVxuXG4gIHJlbmRlcldpbmRvd0ZldGNoKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXBpQmFzZVVybDogc3RyaW5nLFxuICAgIHR5cGVQYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXJhbXNEZWY6IHN0cmluZyxcbiAgICBwYXlsb2FkRGVmOiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHthcGkubWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gd2luZG93LmZldGNoKFxcYCR7YXBpQmFzZVVybH0/XFwke3FzLnN0cmluZ2lmeSgke3BheWxvYWREZWZ9KX1cXGAke1xuICAgICAgYXBpLm9wdGlvbnMudGltZW91dCA/IGAsIHsgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pIH1gIDogXCJcIlxuICAgIH0pO1xufVxuICAgIGAudHJpbSgpO1xuICB9XG5cbiAgcmVuZGVyU3RyZWFtKGFwaTogRXh0ZW5kZWRBcGksIGFwaUJhc2VVcmw6IHN0cmluZywgcGFyYW1zRGVmQXNPYmplY3Q6IHN0cmluZykge1xuICAgIGlmICghYXBpLnN0cmVhbU9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBcIi8vIHN0cmVhbU9wdGlvbnMgbm90IGZvdW5kXCI7XG4gICAgfVxuXG4gICAgY29uc3QgbWV0aG9kTmFtZVN0cmVhbSA9IGFwaS5vcHRpb25zLnJlc291cmNlTmFtZVxuICAgICAgPyBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgOiBgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lKX1gO1xuICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWQgPSBpbmZsZWN0aW9uLmNhbWVsaXplKG1ldGhvZE5hbWVTdHJlYW0sIHRydWUpO1xuXG4gICAgY29uc3QgZXZlbnRzVHlwZURlZiA9IHpvZFR5cGVUb1RzVHlwZURlZihhcGkuc3RyZWFtT3B0aW9ucy5ldmVudHMpO1xuXG4gICAgcmV0dXJuIGAgIGV4cG9ydCBmdW5jdGlvbiAke21ldGhvZE5hbWVTdHJlYW1DYW1lbGl6ZWR9KFxuICBwYXJhbXM6ICR7cGFyYW1zRGVmQXNPYmplY3R9LFxuICBoYW5kbGVyczogRXZlbnRIYW5kbGVyczwke2V2ZW50c1R5cGVEZWZ9ICYgeyBlbmQ/OiAoKSA9PiB2b2lkIH0+LFxuICBvcHRpb25zOiBTU0VTdHJlYW1PcHRpb25zKSB7XG4gICAgcmV0dXJuIHVzZVNTRVN0cmVhbTwke2V2ZW50c1R5cGVEZWZ9PihcXGAke2FwaUJhc2VVcmx9XFxgLCBwYXJhbXMsIGhhbmRsZXJzLCBvcHRpb25zKTtcbiAgfWA7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJhc3NlcnQiLCJpbmZsZWN0aW9uIiwiZGlmZiIsImdyb3VwIiwic29ydCIsInVuaXF1ZSIsImFwaVBhcmFtVG9Uc0NvZGUiLCJhcGlQYXJhbVRvVHNDb2RlQXNPYmplY3QiLCJhcGlQYXJhbVR5cGVUb1RzVHlwZSIsInVud3JhcFByb21pc2VPbmNlIiwiU29uYW11IiwiTmFpdGUiLCJBcGlQYXJhbVR5cGUiLCJhc3NlcnREZWZpbmVkIiwiVGVtcGxhdGUiLCJ6b2RUeXBlVG9Uc1R5cGVEZWYiLCJUZW1wbGF0ZV9fc2VydmljZSIsImdldFRhcmdldEFuZFBhdGgiLCJuYW1lcyIsInRhcmdldCIsInBhdGgiLCJmcyIsInJlbmRlciIsIm5hbWVzUmVjb3JkIiwidCIsInN5bmNlciIsImFwaXMiLCJhcGlzRm9yVGhpc01vZGVsIiwiZmlsdGVyIiwiYXBpIiwibW9kZWxOYW1lIiwiY2FwaXRhbCIsImxpbmVzIiwiaW1wb3J0S2V5cyIsImdldFR5cGVTb3VyY2UiLCJoYXNBeGlvc1Byb2dyZXNzRXZlbnQiLCJmaW5kIiwib3B0aW9ucyIsImNsaWVudHMiLCJpbmNsdWRlcyIsImJvZHkiLCJqb2luIiwia2V5IiwiY3VzdG9tSGVhZGVycyIsInR5cGVQYXJhbU5hbWVzIiwiZ3JvdXBzIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsIm1ldGhvZHMiLCJtZXRob2RDb2RlcyIsInBhcmFtc1dpdGhvdXRDb250ZXh0IiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwidHlwZSIsImlzUmVmS25leCIsIm9wdGlvbmFsIiwibmFtZSIsInN0YXJ0c1dpdGgiLCJ0eXBlUGFyYW1ldGVyc0FzVHNUeXBlIiwidHlwZVBhcmFtZXRlcnMiLCJ0eXBlUGFyYW0iLCJ0eXBlUGFyYW1zRGVmIiwiY29uY2F0IiwiaWQiLCJwYXJhbXNEZWYiLCJwYXJhbXNEZWZBc09iamVjdCIsInJldHVyblR5cGVEZWYiLCJyZXR1cm5UeXBlIiwicGF5bG9hZERlZiIsImFwaUJhc2VVcmwiLCJjb25maWciLCJyb3V0ZSIsInByZWZpeCIsImNsaWVudCIsInJlbmRlckF4aW9zIiwicmVuZGVyQXhpb3NNdWx0aXBhcnQiLCJyZW5kZXJTd3IiLCJyZW5kZXJXaW5kb3dGZXRjaCIsImNhbWVsaXplIiwic3RyZWFtT3B0aW9ucyIsInJlbmRlclN0cmVhbSIsInJlcGxhY2UiLCJtZXRob2ROYW1lQXhpb3MiLCJyZXNvdXJjZU5hbWUiLCJtZXRob2ROYW1lIiwiaHR0cE1ldGhvZCIsInRpbWVvdXQiLCJ0cmltIiwiaXNNdWx0aXBsZSIsInVwbG9hZE9wdGlvbnMiLCJtb2RlIiwiZmlsZVBhcmFtTmFtZSIsImZpbGVQYXJhbVR5cGUiLCJmb3JtRGF0YURlZiIsInBhcmFtc0RlZkNvbW1hIiwibWV0aG9kTmFtZVN3ciIsInAiLCJtZXRob2ROYW1lU3RyZWFtIiwibWV0aG9kTmFtZVN0cmVhbUNhbWVsaXplZCIsImV2ZW50c1R5cGVEZWYiLCJldmVudHMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxTQUFTQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsSUFBSSxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUNwRCxTQUNFQyxnQkFBZ0IsRUFDaEJDLHdCQUF3QixFQUN4QkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsUUFDWiwrQkFBNEI7QUFFbkMsU0FBU0MsTUFBTSxRQUFRLHNCQUFtQjtBQUUxQyxTQUFTQyxLQUFLLFFBQVEsdUJBQW9CO0FBRTFDLFNBQXdCQyxZQUFZLFFBQVEsdUJBQW9CO0FBQ2hFLFNBQVNDLGFBQWEsUUFBUSx1QkFBb0I7QUFDbEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLGtCQUFrQixRQUFRLHNCQUFtQjtBQUV0RCxPQUFPLE1BQU1DLDBCQUEwQkY7SUFDckMsYUFBYztRQUNaLEtBQUssQ0FBQztJQUNSO0lBRUFHLGlCQUFpQkMsS0FBd0IsRUFBRTtRQUN6QyxPQUFPO1lBQ0xDLFFBQVE7WUFDUkMsTUFBTSxHQUFHRixNQUFNRyxFQUFFLENBQUMsQ0FBQyxFQUFFSCxNQUFNRyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBQzVDO0lBQ0Y7SUFF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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.7",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typescript",
|
|
@@ -78,8 +78,8 @@
|
|
|
78
78
|
"vitest": "^4.0.10",
|
|
79
79
|
"zod": "^4.1.12",
|
|
80
80
|
"@sonamu-kit/hmr-runner": "^0.1.1",
|
|
81
|
-
"@sonamu-kit/
|
|
82
|
-
"@sonamu-kit/
|
|
81
|
+
"@sonamu-kit/hmr-hook": "^0.4.1",
|
|
82
|
+
"@sonamu-kit/ts-loader": "^2.1.3"
|
|
83
83
|
},
|
|
84
84
|
"devDependencies": {
|
|
85
85
|
"@biomejs/biome": "^2.3.7",
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
/** biome-ignore-all lint/correctness/useExhaustiveDependencies: shared */
|
|
2
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: shared */
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
fetch
|
|
6
|
+
*/
|
|
7
|
+
import type { AxiosRequestConfig } from "axios";
|
|
8
|
+
import axios from "axios";
|
|
9
|
+
import qs from "qs";
|
|
10
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
11
|
+
import { Alert } from "react-native";
|
|
12
|
+
import EventSource from "react-native-sse";
|
|
13
|
+
import { type core, z } from "zod";
|
|
14
|
+
|
|
15
|
+
// AbortSignal.timeout polyfill for React Native
|
|
16
|
+
if (typeof AbortSignal !== "undefined" && !AbortSignal.timeout) {
|
|
17
|
+
AbortSignal.timeout = (ms: number): AbortSignal => {
|
|
18
|
+
const controller = new AbortController();
|
|
19
|
+
setTimeout(() => controller.abort(), ms);
|
|
20
|
+
return controller.signal;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// ISO 8601 및 타임존 포맷의 날짜 문자열을 Date 객체로 변환하는 reviver
|
|
25
|
+
function dateReviver(_key: string, value: any): any {
|
|
26
|
+
if (typeof value === "string") {
|
|
27
|
+
// ISO 8601 형식: 2024-01-15T09:30:00.000Z 또는 2024-01-15T09:30:00+09:00
|
|
28
|
+
const isoRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2})?$/;
|
|
29
|
+
|
|
30
|
+
// SQL Datetime 형식 (타임존 포함): 2024-01-15 09:30:00+09:00
|
|
31
|
+
const datetimeWithTimezoneRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$/;
|
|
32
|
+
|
|
33
|
+
// SQL Datetime 형식 (타임존 없음): 2024-01-15 09:30:00
|
|
34
|
+
const datetimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
|
|
35
|
+
|
|
36
|
+
if (
|
|
37
|
+
(isoRegex.test(value) ||
|
|
38
|
+
datetimeWithTimezoneRegex.test(value) ||
|
|
39
|
+
datetimeRegex.test(value)) &&
|
|
40
|
+
new Date(value).toString() !== "Invalid Date"
|
|
41
|
+
) {
|
|
42
|
+
return new Date(value);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Date 객체를 SQL date 문자열로 변환하는 함수 (날짜만)
|
|
49
|
+
function convertDateToDateString(date: Date): string {
|
|
50
|
+
const year = date.getFullYear();
|
|
51
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
52
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
53
|
+
return `${year}-${month}-${day}`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Date 객체를 SQL datetime 문자열로 변환하는 함수 (날짜+시간)
|
|
57
|
+
function convertDateToString(date: Date): string {
|
|
58
|
+
const year = date.getFullYear();
|
|
59
|
+
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
60
|
+
const day = String(date.getDate()).padStart(2, "0");
|
|
61
|
+
const hour = String(date.getHours()).padStart(2, "0");
|
|
62
|
+
const minute = String(date.getMinutes()).padStart(2, "0");
|
|
63
|
+
const second = String(date.getSeconds()).padStart(2, "0");
|
|
64
|
+
return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// 날짜만 필요한 필드들 (시간 제외)
|
|
68
|
+
const DATE_ONLY_FIELDS = ["birth_date", "test_performed_at", "specimen_collection_at"];
|
|
69
|
+
|
|
70
|
+
// 객체를 재귀적으로 순회하면서 Date를 문자열로 변환
|
|
71
|
+
function convertDatesToStrings(obj: any, parentKey?: string): any {
|
|
72
|
+
if (obj === null || obj === undefined) {
|
|
73
|
+
return obj;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (obj instanceof Date) {
|
|
77
|
+
// 날짜만 필요한 필드인지 확인
|
|
78
|
+
if (parentKey && DATE_ONLY_FIELDS.includes(parentKey)) {
|
|
79
|
+
return convertDateToDateString(obj);
|
|
80
|
+
}
|
|
81
|
+
return convertDateToString(obj);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (Array.isArray(obj)) {
|
|
85
|
+
return obj.map((item) => convertDatesToStrings(item, parentKey));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (typeof obj === "object") {
|
|
89
|
+
const result: any = {};
|
|
90
|
+
for (const key in obj) {
|
|
91
|
+
if (Object.hasOwn(obj, key)) {
|
|
92
|
+
result[key] = convertDatesToStrings(obj[key], key);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return obj;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
axios.defaults.transformResponse = [
|
|
102
|
+
(data) => {
|
|
103
|
+
if (typeof data === "string") {
|
|
104
|
+
try {
|
|
105
|
+
return JSON.parse(data, dateReviver);
|
|
106
|
+
} catch (_e) {
|
|
107
|
+
return data;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return data;
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
// Request interceptor: Date 객체를 SQL datetime 문자열로 변환
|
|
115
|
+
axios.interceptors.request.use(
|
|
116
|
+
(config) => {
|
|
117
|
+
// FormData는 변환하지 않음 (파일 업로드용)
|
|
118
|
+
if (config.data && !(config.data instanceof FormData)) {
|
|
119
|
+
config.data = convertDatesToStrings(config.data);
|
|
120
|
+
}
|
|
121
|
+
return config;
|
|
122
|
+
},
|
|
123
|
+
(error) => {
|
|
124
|
+
return Promise.reject(error);
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
export async function fetch(options: AxiosRequestConfig) {
|
|
129
|
+
try {
|
|
130
|
+
const res = await axios({
|
|
131
|
+
...options,
|
|
132
|
+
});
|
|
133
|
+
return res.data;
|
|
134
|
+
} catch (e: unknown) {
|
|
135
|
+
if (axios.isAxiosError(e) && e.response && e.response.data) {
|
|
136
|
+
const d = e.response.data as {
|
|
137
|
+
message: string;
|
|
138
|
+
issues: core.$ZodIssue[];
|
|
139
|
+
};
|
|
140
|
+
throw new SonamuError(e.response.status, d.message, d.issues);
|
|
141
|
+
}
|
|
142
|
+
throw e;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export class SonamuError extends Error {
|
|
147
|
+
isSonamuError: boolean;
|
|
148
|
+
|
|
149
|
+
constructor(
|
|
150
|
+
public code: number,
|
|
151
|
+
public message: string,
|
|
152
|
+
public issues: z.ZodIssue[],
|
|
153
|
+
) {
|
|
154
|
+
super(message);
|
|
155
|
+
this.isSonamuError = true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
export function isSonamuError(e: any): e is SonamuError {
|
|
159
|
+
return e && e.isSonamuError === true;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function defaultCatch(e: any) {
|
|
163
|
+
if (isSonamuError(e)) {
|
|
164
|
+
console.log(e);
|
|
165
|
+
Alert.alert(e.message);
|
|
166
|
+
} else {
|
|
167
|
+
Alert.alert("에러 발생");
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
Isomorphic Types
|
|
173
|
+
*/
|
|
174
|
+
export type ListResult<T> = {
|
|
175
|
+
rows: T[];
|
|
176
|
+
total?: number;
|
|
177
|
+
};
|
|
178
|
+
export const SonamuQueryMode = z.enum(["both", "list", "count"]);
|
|
179
|
+
export type SonamuQueryMode = z.infer<typeof SonamuQueryMode>;
|
|
180
|
+
|
|
181
|
+
/*
|
|
182
|
+
SWR
|
|
183
|
+
*/
|
|
184
|
+
export type SwrOptions = {
|
|
185
|
+
conditional?: () => boolean;
|
|
186
|
+
};
|
|
187
|
+
export type SWRError = {
|
|
188
|
+
name: string;
|
|
189
|
+
message: string;
|
|
190
|
+
statusCode: number;
|
|
191
|
+
};
|
|
192
|
+
export async function swrFetcher(args: [string, object]): Promise<any> {
|
|
193
|
+
try {
|
|
194
|
+
const [url, params] = args;
|
|
195
|
+
const res = await axios.get(`${url}?${qs.stringify(params)}`);
|
|
196
|
+
return res.data;
|
|
197
|
+
} catch (e: any) {
|
|
198
|
+
const error: any = new Error(e.response.data.message ?? e.response.message ?? "Unknown");
|
|
199
|
+
error.statusCode = e.response?.data.statusCode ?? e.response.status;
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export async function swrPostFetcher(args: [string, object]): Promise<any> {
|
|
204
|
+
try {
|
|
205
|
+
const [url, params] = args;
|
|
206
|
+
const res = await axios.post(url, params);
|
|
207
|
+
return res.data;
|
|
208
|
+
} catch (e: any) {
|
|
209
|
+
const error: any = new Error(e.response.data.message ?? e.response.message ?? "Unknown");
|
|
210
|
+
error.statusCode = e.response?.data.statusCode ?? e.response.status;
|
|
211
|
+
throw error;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
export function handleConditional(
|
|
215
|
+
args: [string, object],
|
|
216
|
+
conditional?: () => boolean,
|
|
217
|
+
): [string, object] | null {
|
|
218
|
+
if (conditional) {
|
|
219
|
+
return conditional() ? args : null;
|
|
220
|
+
}
|
|
221
|
+
return args;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
Utils
|
|
226
|
+
*/
|
|
227
|
+
export function zArrayable<T extends z.ZodTypeAny>(shape: T) {
|
|
228
|
+
return z.union([shape, shape.array()]);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
Custom Scalars
|
|
233
|
+
*/
|
|
234
|
+
export const SQLDateTimeString = z
|
|
235
|
+
.string()
|
|
236
|
+
.regex(/([0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2}:[0-9]{2})*)$/, {
|
|
237
|
+
message: "잘못된 SQLDate 타입",
|
|
238
|
+
})
|
|
239
|
+
.min(10)
|
|
240
|
+
.max(19)
|
|
241
|
+
.describe("SQLDateTimeString");
|
|
242
|
+
export type SQLDateTimeString = z.infer<typeof SQLDateTimeString>;
|
|
243
|
+
|
|
244
|
+
/*
|
|
245
|
+
Stream
|
|
246
|
+
*/
|
|
247
|
+
export type SSEStreamOptions = {
|
|
248
|
+
enabled?: boolean;
|
|
249
|
+
retry?: number;
|
|
250
|
+
retryInterval?: number;
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
export type SSEStreamState = {
|
|
254
|
+
isConnected: boolean;
|
|
255
|
+
error: string | null;
|
|
256
|
+
retryCount: number;
|
|
257
|
+
isEnded: boolean;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
export type EventHandlers<T> = {
|
|
261
|
+
[K in keyof T as K extends "end" ? never : K]?: (data: T[K]) => void;
|
|
262
|
+
} & (T extends { end?: any } ? { end?: () => void } : {});
|
|
263
|
+
|
|
264
|
+
export function useSSEStream<T extends Record<string, any>>(
|
|
265
|
+
url: string,
|
|
266
|
+
params: Record<string, any>,
|
|
267
|
+
handlers: {
|
|
268
|
+
[K in keyof T]?: (data: T[K]) => void;
|
|
269
|
+
} & { end?: () => void },
|
|
270
|
+
options: SSEStreamOptions = {},
|
|
271
|
+
): SSEStreamState {
|
|
272
|
+
const { enabled = true, retry = 3, retryInterval = 3000 } = options;
|
|
273
|
+
|
|
274
|
+
const [state, setState] = useState<SSEStreamState>({
|
|
275
|
+
isConnected: false,
|
|
276
|
+
error: null,
|
|
277
|
+
retryCount: 0,
|
|
278
|
+
isEnded: false,
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
const eventSourceRef = useRef<EventSource | null>(null);
|
|
282
|
+
const retryTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
283
|
+
const handlersRef = useRef(handlers);
|
|
284
|
+
const currentRetryCount = useRef(0);
|
|
285
|
+
|
|
286
|
+
// handlers를 ref로 관리해서 재연결 없이 업데이트
|
|
287
|
+
useEffect(() => {
|
|
288
|
+
handlersRef.current = handlers;
|
|
289
|
+
}, [handlers]);
|
|
290
|
+
|
|
291
|
+
// 연결 함수
|
|
292
|
+
const connect = useCallback(() => {
|
|
293
|
+
if (!enabled) return;
|
|
294
|
+
|
|
295
|
+
try {
|
|
296
|
+
// 기존 연결이 있으면 정리
|
|
297
|
+
if (eventSourceRef.current) {
|
|
298
|
+
eventSourceRef.current.close();
|
|
299
|
+
eventSourceRef.current = null;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// 재시도 타이머 정리
|
|
303
|
+
if (retryTimeoutRef.current) {
|
|
304
|
+
clearTimeout(retryTimeoutRef.current);
|
|
305
|
+
retryTimeoutRef.current = null;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// URL에 파라미터 추가 - 절대 URL로 변환
|
|
309
|
+
const queryString = qs.stringify(params);
|
|
310
|
+
const baseUrl = url.startsWith("http") ? url : `https://dev.amrintl.com${url}`;
|
|
311
|
+
const fullUrl = queryString ? `${baseUrl}?${queryString}` : baseUrl;
|
|
312
|
+
|
|
313
|
+
const eventSource = new EventSource(fullUrl);
|
|
314
|
+
eventSourceRef.current = eventSource;
|
|
315
|
+
|
|
316
|
+
// 연결 시도 중 상태 표시
|
|
317
|
+
setState((prev) => ({
|
|
318
|
+
...prev,
|
|
319
|
+
isConnected: false,
|
|
320
|
+
error: null,
|
|
321
|
+
isEnded: false,
|
|
322
|
+
retryCount: currentRetryCount.current,
|
|
323
|
+
}));
|
|
324
|
+
|
|
325
|
+
// 연결 성공 이벤트
|
|
326
|
+
eventSource.addEventListener("open", () => {
|
|
327
|
+
console.log("✅ SSE 연결 성공");
|
|
328
|
+
currentRetryCount.current = 0;
|
|
329
|
+
setState((prev) => ({
|
|
330
|
+
...prev,
|
|
331
|
+
isConnected: true,
|
|
332
|
+
error: null,
|
|
333
|
+
retryCount: 0,
|
|
334
|
+
isEnded: false,
|
|
335
|
+
}));
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
// 연결 에러 이벤트
|
|
339
|
+
eventSource.addEventListener("error", (event: any) => {
|
|
340
|
+
console.log("❌ SSE 연결 에러:", event);
|
|
341
|
+
|
|
342
|
+
// 이미 다른 연결로 교체되었는지 확인
|
|
343
|
+
if (eventSourceRef.current !== eventSource) {
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
setState((prev) => ({
|
|
348
|
+
...prev,
|
|
349
|
+
isConnected: false,
|
|
350
|
+
error: "Connection failed",
|
|
351
|
+
isEnded: false,
|
|
352
|
+
}));
|
|
353
|
+
|
|
354
|
+
// 자동 재연결 시도
|
|
355
|
+
if (currentRetryCount.current < retry) {
|
|
356
|
+
currentRetryCount.current += 1;
|
|
357
|
+
retryTimeoutRef.current = setTimeout(() => {
|
|
358
|
+
if (eventSourceRef.current === eventSource) {
|
|
359
|
+
setState((prev) => ({
|
|
360
|
+
...prev,
|
|
361
|
+
retryCount: currentRetryCount.current,
|
|
362
|
+
isEnded: false,
|
|
363
|
+
}));
|
|
364
|
+
connect();
|
|
365
|
+
}
|
|
366
|
+
}, retryInterval);
|
|
367
|
+
} else {
|
|
368
|
+
setState((prev) => ({
|
|
369
|
+
...prev,
|
|
370
|
+
error: `Connection failed after ${retry} attempts`,
|
|
371
|
+
}));
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
// 각 이벤트 타입별 리스너 등록
|
|
376
|
+
Object.keys(handlersRef.current).forEach((eventType) => {
|
|
377
|
+
if (eventType === "end") return; // end는 별도 처리
|
|
378
|
+
|
|
379
|
+
const handler = handlersRef.current[eventType as keyof T];
|
|
380
|
+
if (handler) {
|
|
381
|
+
(eventSource as any).addEventListener(eventType, (event: any) => {
|
|
382
|
+
// console.log(`SSE 이벤트 수신 [${eventType}]:`, event.data);
|
|
383
|
+
|
|
384
|
+
// 여전히 현재 연결인지 확인
|
|
385
|
+
if (eventSourceRef.current !== eventSource) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
try {
|
|
390
|
+
const data = JSON.parse(event.data, dateReviver);
|
|
391
|
+
handler(data);
|
|
392
|
+
} catch (error) {
|
|
393
|
+
console.error(`Failed to parse SSE data for event ${eventType}:`, error);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
setState((prev) => ({
|
|
397
|
+
...prev,
|
|
398
|
+
isEnded: false,
|
|
399
|
+
}));
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
// 공통 'end' 이벤트 처리
|
|
405
|
+
(eventSource as any).addEventListener("end", () => {
|
|
406
|
+
console.log("SSE 연결 정상종료");
|
|
407
|
+
if (eventSourceRef.current === eventSource) {
|
|
408
|
+
eventSource.close();
|
|
409
|
+
eventSourceRef.current = null;
|
|
410
|
+
setState((prev) => ({
|
|
411
|
+
...prev,
|
|
412
|
+
isConnected: false,
|
|
413
|
+
error: null,
|
|
414
|
+
isEnded: true,
|
|
415
|
+
}));
|
|
416
|
+
|
|
417
|
+
if (handlersRef.current.end) {
|
|
418
|
+
handlersRef.current.end();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
} catch (error) {
|
|
423
|
+
console.error("SSE 연결 중 오류:", error);
|
|
424
|
+
setState((prev) => ({
|
|
425
|
+
...prev,
|
|
426
|
+
error: error instanceof Error ? error.message : "Unknown error",
|
|
427
|
+
isConnected: false,
|
|
428
|
+
isEnded: false,
|
|
429
|
+
}));
|
|
430
|
+
}
|
|
431
|
+
}, [url, JSON.stringify(params), enabled, retry, retryInterval]);
|
|
432
|
+
|
|
433
|
+
// 연결 시작 및 정리
|
|
434
|
+
useEffect(() => {
|
|
435
|
+
if (enabled) {
|
|
436
|
+
connect();
|
|
437
|
+
} else {
|
|
438
|
+
// 연결 해제
|
|
439
|
+
if (eventSourceRef.current) {
|
|
440
|
+
eventSourceRef.current.close();
|
|
441
|
+
eventSourceRef.current = null;
|
|
442
|
+
}
|
|
443
|
+
if (retryTimeoutRef.current) {
|
|
444
|
+
clearTimeout(retryTimeoutRef.current);
|
|
445
|
+
retryTimeoutRef.current = null;
|
|
446
|
+
}
|
|
447
|
+
setState((prev) => ({
|
|
448
|
+
...prev,
|
|
449
|
+
isConnected: false,
|
|
450
|
+
error: null,
|
|
451
|
+
isEnded: true,
|
|
452
|
+
}));
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return () => {
|
|
456
|
+
// cleanup
|
|
457
|
+
if (eventSourceRef.current) {
|
|
458
|
+
eventSourceRef.current.close();
|
|
459
|
+
eventSourceRef.current = null;
|
|
460
|
+
}
|
|
461
|
+
if (retryTimeoutRef.current) {
|
|
462
|
+
clearTimeout(retryTimeoutRef.current);
|
|
463
|
+
retryTimeoutRef.current = null;
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
}, [connect]);
|
|
467
|
+
|
|
468
|
+
return state;
|
|
469
|
+
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
import type { AxiosRequestConfig } from "axios";
|
|
8
8
|
import axios from "axios";
|
|
9
9
|
import qs from "qs";
|
|
10
|
-
import { type
|
|
10
|
+
import { type core, z } from "zod";
|
|
11
11
|
|
|
12
12
|
// ISO 8601 및 타임존 포맷의 날짜 문자열을 Date 객체로 변환하는 reviver
|
|
13
13
|
function dateReviver(_key: string, value: any): any {
|
|
@@ -51,7 +51,7 @@ export async function fetch(options: AxiosRequestConfig) {
|
|
|
51
51
|
if (axios.isAxiosError(e) && e.response && e.response.data) {
|
|
52
52
|
const d = e.response.data as {
|
|
53
53
|
message: string;
|
|
54
|
-
issues: ZodIssue[];
|
|
54
|
+
issues: core.$ZodIssue[];
|
|
55
55
|
};
|
|
56
56
|
throw new SonamuError(e.response.status, d.message, d.issues);
|
|
57
57
|
}
|
|
@@ -196,7 +196,7 @@ export function useSSEStream<T extends Record<string, any>>(
|
|
|
196
196
|
});
|
|
197
197
|
|
|
198
198
|
const eventSourceRef = useRef<EventSource | null>(null);
|
|
199
|
-
const retryTimeoutRef = useRef<
|
|
199
|
+
const retryTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
200
200
|
const handlersRef = useRef(handlers);
|
|
201
201
|
|
|
202
202
|
// handlers를 ref로 관리해서 재연결 없이 업데이트
|
package/src/syncer/syncer.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { hot } from "@sonamu-kit/hmr-hook";
|
|
|
2
2
|
import assert from "assert";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import { mkdir, readFile, writeFile } from "fs/promises";
|
|
5
|
+
import inflection from "inflection";
|
|
5
6
|
import { minimatch } from "minimatch";
|
|
6
7
|
import path, { dirname } from "path";
|
|
7
8
|
import { group, unique } from "radashi";
|
|
@@ -156,7 +157,7 @@ export class Syncer {
|
|
|
156
157
|
`../shared/${target}.shared.ts.txt`,
|
|
157
158
|
);
|
|
158
159
|
if (!(await exists(srcPath))) {
|
|
159
|
-
|
|
160
|
+
continue;
|
|
160
161
|
}
|
|
161
162
|
if (!(await exists(path.join(Sonamu.appRootPath, target)))) {
|
|
162
163
|
throw new Error(
|
|
@@ -165,7 +166,7 @@ export class Syncer {
|
|
|
165
166
|
}
|
|
166
167
|
|
|
167
168
|
// 이건 프로젝트에 .ts 소스 코드 파일을 생성하는 것이므로 src의 .ts 경로로 갑니다.
|
|
168
|
-
const destPath = path.join(Sonamu.appRootPath, target, "
|
|
169
|
+
const destPath = path.join(Sonamu.appRootPath, target, "src/services/sonamu.shared.ts");
|
|
169
170
|
|
|
170
171
|
// 정말 혹시나지만 target 디렉토리는 있어도 src/services 디렉토리는 없을 수 있으므로 미리 생성해줍니다.
|
|
171
172
|
if (!(await exists(path.dirname(destPath)))) {
|
|
@@ -174,7 +175,7 @@ export class Syncer {
|
|
|
174
175
|
}
|
|
175
176
|
|
|
176
177
|
if (await areFilesSame(srcPath, destPath)) {
|
|
177
|
-
|
|
178
|
+
continue;
|
|
178
179
|
}
|
|
179
180
|
|
|
180
181
|
await writeFile(destPath, await readFile(srcPath));
|
|
@@ -321,12 +322,13 @@ export class Syncer {
|
|
|
321
322
|
namesRecord: EntityManager.getNamesFromId(entityId),
|
|
322
323
|
};
|
|
323
324
|
}
|
|
324
|
-
if (modelPath.endsWith(".frame.
|
|
325
|
-
const [, frameName] = modelPath.match(/.+\/(.+)\.frame\.
|
|
326
|
-
console.log(modelPath, "->", frameName);
|
|
325
|
+
if (modelPath.endsWith(".frame.ts")) {
|
|
326
|
+
const [, frameName] = modelPath.match(/.+\/(.+)\.frame\.ts$/) ?? [];
|
|
327
327
|
assert(frameName);
|
|
328
|
+
// frameName을 PascalCase로 변환 (dashboard -> Dashboard)
|
|
329
|
+
const frameId = inflection.camelize(frameName);
|
|
328
330
|
return {
|
|
329
|
-
namesRecord: EntityManager.getNamesFromId(
|
|
331
|
+
namesRecord: EntityManager.getNamesFromId(frameId),
|
|
330
332
|
};
|
|
331
333
|
}
|
|
332
334
|
throw new Error("not reachable");
|
|
@@ -444,7 +446,18 @@ export class Syncer {
|
|
|
444
446
|
const oldFileContent = (await readFile(fromPath)).toString();
|
|
445
447
|
|
|
446
448
|
const newFileContent = (() => {
|
|
447
|
-
|
|
449
|
+
// web이나 app 등에는 sonamu가 없습니다.
|
|
450
|
+
// 따라서 sonamu에 대한 import는 함께 복사되는 sonamu.shared.ts에 대한 import로 치환해야 합니다.
|
|
451
|
+
// 문제는 리소스 종류에 따라 sonamu.shared.ts로 가는 경로가 다르다는 점입니다.
|
|
452
|
+
// 예를 들어 sonamu.generated.ts 입장에서 sonamu.shared.ts는 같은 디렉토리에 있으니 ./sonamu.shared로 치환하면 되지만,
|
|
453
|
+
// user.types.ts 입장에서 sonamu.shared.ts는 상위 디렉토리에 있으니 ../sonamu.shared로 치환해야 합니다.
|
|
454
|
+
// 이 문제를 해결하기 위해 복사하고자 하는 리소스의 경로(toPath)를 기준으로 sonamu.shared.ts가 있는 디렉토리를 찾아서 상대 경로를 계산하도록 하였습니다.
|
|
455
|
+
const servicesDir = toPath.replace(/\/services\/.*$/, "/services");
|
|
456
|
+
const fileDir = dirname(toPath);
|
|
457
|
+
const relativePath = path.relative(fileDir, servicesDir);
|
|
458
|
+
const sharedPath = relativePath === "" ? "./sonamu.shared" : `${relativePath}/sonamu.shared`;
|
|
459
|
+
|
|
460
|
+
const nfc = oldFileContent.replace(/from "sonamu"/g, `from "${sharedPath}"`);
|
|
448
461
|
return nfc;
|
|
449
462
|
})();
|
|
450
463
|
return writeFile(toPath, newFileContent);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type z from "zod";
|
|
1
2
|
import { Sonamu } from "../../api";
|
|
2
3
|
import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
|
|
3
4
|
import { Naite } from "../../naite/naite";
|
|
@@ -5,7 +6,6 @@ import type { TemplateOptions } from "../../types/types";
|
|
|
5
6
|
import { Template } from "../template";
|
|
6
7
|
import { getZodTypeById, zodTypeToRenderingNode } from "../zod-converter";
|
|
7
8
|
import { Template__view_list } from "./view_list.template";
|
|
8
|
-
|
|
9
9
|
export class Template__model extends Template {
|
|
10
10
|
constructor() {
|
|
11
11
|
super("model");
|
|
@@ -26,6 +26,9 @@ export class Template__model extends Template {
|
|
|
26
26
|
const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
|
|
27
27
|
const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
|
|
28
28
|
|
|
29
|
+
const subsetKeyZodType = await getZodTypeById(`${entityId}SubsetKey`);
|
|
30
|
+
const subsetKeys = (subsetKeyZodType as z.ZodEnum).enum;
|
|
31
|
+
|
|
29
32
|
const names = EntityManager.getNamesFromId(entityId);
|
|
30
33
|
const entity = EntityManager.get(entityId);
|
|
31
34
|
|
|
@@ -99,8 +102,8 @@ class ${entityId}ModelClass extends BaseModelClass<
|
|
|
99
102
|
const params = {
|
|
100
103
|
num: 24,
|
|
101
104
|
page: 1,
|
|
102
|
-
search: "${def.search}",
|
|
103
|
-
orderBy: "${def.orderBy}",
|
|
105
|
+
search: "${def.search}" as const,
|
|
106
|
+
orderBy: "${def.orderBy}" as const,
|
|
104
107
|
...rawParams,
|
|
105
108
|
};
|
|
106
109
|
|
|
@@ -132,18 +135,25 @@ class ${entityId}ModelClass extends BaseModelClass<
|
|
|
132
135
|
exhaustive(params.orderBy);
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
|
-
|
|
136
|
-
const
|
|
138
|
+
|
|
139
|
+
const enhancers = this.createEnhancers({
|
|
140
|
+
${Object.keys(subsetKeys)
|
|
141
|
+
.map(
|
|
142
|
+
(key) => `${key}: (row) => ({
|
|
143
|
+
...row,
|
|
144
|
+
// 서브셋별로 virtual 필드 계산로직 추가
|
|
145
|
+
}),`,
|
|
146
|
+
)
|
|
147
|
+
.join("\n")}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
return this.executeSubsetQuery({
|
|
137
151
|
subset,
|
|
138
152
|
qb,
|
|
139
153
|
params,
|
|
154
|
+
enhancers,
|
|
140
155
|
debug: false,
|
|
141
156
|
});
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
rows,
|
|
145
|
-
total,
|
|
146
|
-
};
|
|
147
157
|
}
|
|
148
158
|
|
|
149
159
|
@api({ httpMethod: "POST" })
|
|
@@ -36,7 +36,11 @@ export class Template__service extends Template {
|
|
|
36
36
|
syncer: { apis },
|
|
37
37
|
} = Sonamu;
|
|
38
38
|
|
|
39
|
-
const apisForThisModel = apis.filter(
|
|
39
|
+
const apisForThisModel = apis.filter(
|
|
40
|
+
(api) =>
|
|
41
|
+
api.modelName === `${namesRecord.capital}Model` ||
|
|
42
|
+
api.modelName === `${namesRecord.capital}Frame`,
|
|
43
|
+
);
|
|
40
44
|
|
|
41
45
|
// 서비스 TypeSource
|
|
42
46
|
const { lines, importKeys } = this.getTypeSource(apisForThisModel);
|