sonamu 0.7.11 → 0.7.13
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/api/config.d.ts +10 -6
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -1
- package/dist/api/sonamu.d.ts +4 -0
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +49 -5
- package/dist/bin/cli.js +118 -170
- package/dist/database/base-model.d.ts +10 -50
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +19 -84
- package/dist/database/base-model.types.d.ts +4 -4
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +1 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +24 -13
- package/dist/database/puri-subset.test-d.js +1 -1
- package/dist/database/puri-subset.types.d.ts +1 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -1
- package/dist/database/puri-subset.types.js +2 -2
- package/dist/database/puri.d.ts +82 -3
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +180 -14
- package/dist/database/puri.types.d.ts +33 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/puri.types.test-d.js +1 -1
- package/dist/entity/entity-manager.d.ts +5 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +8 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +33 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +53 -22
- package/dist/naite/messaging-types.d.ts.map +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite.js +2 -2
- package/dist/stream/sse.d.ts +2 -6
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +9 -3
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +7 -2
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +6 -5
- package/dist/syncer/module-loader.d.ts +5 -0
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -1
- package/dist/syncer/syncer.d.ts +5 -1
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +28 -19
- package/dist/tasks/decorator.d.ts +26 -0
- package/dist/tasks/decorator.d.ts.map +1 -0
- package/dist/tasks/decorator.js +28 -0
- package/dist/tasks/step-wrapper.d.ts +18 -0
- package/dist/tasks/step-wrapper.d.ts.map +1 -0
- package/dist/tasks/step-wrapper.js +38 -0
- package/dist/tasks/workflow-manager.d.ts +40 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -0
- package/dist/tasks/workflow-manager.js +193 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +7 -3
- package/dist/types/types.d.ts +26 -10
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +15 -2
- package/dist/ui/ai-api.d.ts +1 -0
- package/dist/ui/ai-api.d.ts.map +1 -0
- package/dist/ui/ai-api.js +50 -0
- package/dist/ui/ai-client.d.ts +1 -0
- package/dist/ui/ai-client.d.ts.map +1 -0
- package/dist/ui/ai-client.js +438 -0
- package/dist/ui/api.d.ts +3 -0
- package/dist/ui/api.d.ts.map +1 -0
- package/dist/ui/api.js +680 -0
- package/dist/ui-web/assets/brand-icons-Cu_C0hZ4.svg +1008 -0
- package/dist/ui-web/assets/brand-icons-F3SPCeH1.woff +0 -0
- package/dist/ui-web/assets/brand-icons-XL9sxUpA.woff2 +0 -0
- package/dist/ui-web/assets/brand-icons-sqJ2Pg7a.eot +0 -0
- package/dist/ui-web/assets/brand-icons-ubhWoxly.ttf +0 -0
- package/dist/ui-web/assets/flags-DOLqOU7Y.png +0 -0
- package/dist/ui-web/assets/icons-BOCtAERH.woff +0 -0
- package/dist/ui-web/assets/icons-CHzK1VD9.eot +0 -0
- package/dist/ui-web/assets/icons-D29ZQHHw.ttf +0 -0
- package/dist/ui-web/assets/icons-Du6TOHnR.woff2 +0 -0
- package/dist/ui-web/assets/icons-RwhydX30.svg +1518 -0
- package/dist/ui-web/assets/index-CpaB9P6g.css +1 -0
- package/dist/ui-web/assets/index-J9MCfjCd.js +95 -0
- package/dist/ui-web/assets/outline-icons-BfdLr8tr.svg +366 -0
- package/dist/ui-web/assets/outline-icons-DD8jm0uy.ttf +0 -0
- package/dist/ui-web/assets/outline-icons-DInHoiqI.woff2 +0 -0
- package/dist/ui-web/assets/outline-icons-LX8adJ4n.eot +0 -0
- package/dist/ui-web/assets/outline-icons-aQ88nltS.woff +0 -0
- package/dist/ui-web/assets/provider-utils_false-BKJD46kk.js +1 -0
- package/dist/ui-web/assets/provider-utils_false-Bu5lmX18.js +1 -0
- package/dist/ui-web/index.html +13 -0
- package/dist/ui-web/vite.svg +1 -0
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +10 -2
- package/dist/utils/model.d.ts +9 -2
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +16 -1
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +3 -1
- package/dist/vector/embedding.d.ts +2 -5
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +9 -13
- package/dist/vector/types.d.ts.map +1 -1
- package/dist/vector/types.js +1 -1
- package/package.json +9 -5
- package/src/api/config.ts +15 -11
- package/src/api/sonamu.ts +60 -6
- package/src/bin/cli.ts +57 -119
- package/src/database/base-model.ts +21 -128
- package/src/database/base-model.types.ts +3 -4
- package/src/database/db.ts +28 -18
- package/src/database/puri-subset.test-d.ts +1 -0
- package/src/database/puri-subset.types.ts +2 -0
- package/src/database/puri.ts +238 -27
- package/src/database/puri.types.test-d.ts +1 -1
- package/src/database/puri.types.ts +49 -6
- package/src/entity/entity-manager.ts +9 -0
- package/src/index.ts +1 -1
- package/src/migration/code-generation.ts +40 -1
- package/src/migration/postgresql-schema-reader.ts +53 -22
- package/src/naite/messaging-types.ts +43 -44
- package/src/naite/naite.ts +1 -1
- package/src/shared/app.shared.ts.txt +13 -0
- package/src/shared/web.shared.ts.txt +13 -0
- package/src/stream/sse.ts +15 -3
- package/src/syncer/api-parser.ts +6 -1
- package/src/syncer/file-patterns.ts +11 -9
- package/src/syncer/module-loader.ts +35 -0
- package/src/syncer/syncer.ts +34 -21
- package/src/tasks/decorator.ts +71 -0
- package/src/tasks/step-wrapper.ts +84 -0
- package/src/tasks/workflow-manager.ts +330 -0
- package/src/template/implementations/generated.template.ts +19 -6
- package/src/types/types.ts +20 -4
- package/src/ui/ai-api.ts +60 -0
- package/src/ui/ai-client.ts +499 -0
- package/src/ui/api.ts +786 -0
- package/src/utils/formatter.ts +8 -1
- package/src/utils/model.ts +26 -2
- package/src/utils/type-utils.ts +2 -0
- package/src/vector/embedding.ts +10 -14
- package/src/vector/types.ts +1 -2
- package/dist/vector/vector-search.d.ts +0 -47
- package/dist/vector/vector-search.d.ts.map +0 -1
- package/dist/vector/vector-search.js +0 -176
- package/src/vector/vector-search.ts +0 -261
package/dist/bin/cli.js
CHANGED
|
@@ -20,130 +20,129 @@ async function bootstrap() {
|
|
|
20
20
|
const notToInit = [
|
|
21
21
|
"dev",
|
|
22
22
|
"build",
|
|
23
|
-
"start"
|
|
24
|
-
"ui"
|
|
23
|
+
"start"
|
|
25
24
|
].includes(process.argv[2] ?? "");
|
|
26
25
|
if (!notToInit) {
|
|
27
26
|
await Sonamu.init(false, false);
|
|
28
27
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
28
|
+
try {
|
|
29
|
+
await tsicli(process.argv, {
|
|
30
|
+
types: {
|
|
31
|
+
"#entityId": {
|
|
32
|
+
type: "autocomplete",
|
|
33
|
+
name: "#entityId",
|
|
34
|
+
message: "Please input #entityId",
|
|
35
|
+
choices: EntityManager.getAllParentIds().map((entityId)=>({
|
|
36
|
+
title: entityId,
|
|
37
|
+
value: entityId
|
|
38
|
+
}))
|
|
39
|
+
},
|
|
40
|
+
"#recordIds": "number[]",
|
|
41
|
+
"#name": "string"
|
|
39
42
|
},
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
43
|
+
args: [
|
|
44
|
+
[
|
|
45
|
+
"fixture",
|
|
46
|
+
"init"
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
"fixture",
|
|
50
|
+
"import",
|
|
51
|
+
"#entityId",
|
|
52
|
+
"#recordIds"
|
|
53
|
+
],
|
|
54
|
+
[
|
|
55
|
+
"fixture",
|
|
56
|
+
"sync"
|
|
57
|
+
],
|
|
58
|
+
[
|
|
59
|
+
"migrate",
|
|
60
|
+
"run"
|
|
61
|
+
],
|
|
62
|
+
[
|
|
63
|
+
"migrate",
|
|
64
|
+
"check"
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
"migrate",
|
|
68
|
+
"rollback"
|
|
69
|
+
],
|
|
70
|
+
[
|
|
71
|
+
"migrate",
|
|
72
|
+
"reset"
|
|
73
|
+
],
|
|
74
|
+
[
|
|
75
|
+
"migrate",
|
|
76
|
+
"clear"
|
|
77
|
+
],
|
|
78
|
+
[
|
|
79
|
+
"migrate",
|
|
80
|
+
"status"
|
|
81
|
+
],
|
|
82
|
+
[
|
|
83
|
+
"stub",
|
|
84
|
+
"practice",
|
|
85
|
+
"#name"
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
"stub",
|
|
89
|
+
"entity",
|
|
90
|
+
"#name"
|
|
91
|
+
],
|
|
92
|
+
[
|
|
93
|
+
"scaffold",
|
|
94
|
+
"model",
|
|
95
|
+
"#entityId"
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"scaffold",
|
|
99
|
+
"model_test",
|
|
100
|
+
"#entityId"
|
|
101
|
+
],
|
|
102
|
+
[
|
|
103
|
+
"scaffold",
|
|
104
|
+
"view_list",
|
|
105
|
+
"#entityId"
|
|
106
|
+
],
|
|
107
|
+
[
|
|
108
|
+
"scaffold",
|
|
109
|
+
"view_form",
|
|
110
|
+
"#entityId"
|
|
111
|
+
],
|
|
112
|
+
[
|
|
113
|
+
"sync"
|
|
114
|
+
],
|
|
115
|
+
[
|
|
116
|
+
"dev"
|
|
117
|
+
],
|
|
118
|
+
[
|
|
119
|
+
"build"
|
|
120
|
+
],
|
|
121
|
+
[
|
|
122
|
+
"start"
|
|
123
|
+
]
|
|
114
124
|
],
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
scaffold_model,
|
|
137
|
-
scaffold_model_test,
|
|
138
|
-
ui,
|
|
139
|
-
// scaffold_view_list,
|
|
140
|
-
// scaffold_view_form,
|
|
141
|
-
sync,
|
|
142
|
-
dev,
|
|
143
|
-
build,
|
|
144
|
-
start
|
|
145
|
-
}
|
|
146
|
-
});
|
|
125
|
+
runners: {
|
|
126
|
+
migrate_status,
|
|
127
|
+
migrate_run,
|
|
128
|
+
fixture_init,
|
|
129
|
+
fixture_import,
|
|
130
|
+
fixture_sync,
|
|
131
|
+
stub_practice,
|
|
132
|
+
stub_entity,
|
|
133
|
+
scaffold_model,
|
|
134
|
+
scaffold_model_test,
|
|
135
|
+
// scaffold_view_list,
|
|
136
|
+
// scaffold_view_form,
|
|
137
|
+
sync,
|
|
138
|
+
dev,
|
|
139
|
+
build,
|
|
140
|
+
start
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
} finally{
|
|
144
|
+
await Sonamu.destroy();
|
|
145
|
+
}
|
|
147
146
|
}
|
|
148
147
|
bootstrap().finally(async ()=>{
|
|
149
148
|
await FixtureManager.destroy();
|
|
@@ -448,56 +447,5 @@ async function scaffold_model_test(entityId) {
|
|
|
448
447
|
entityId
|
|
449
448
|
});
|
|
450
449
|
}
|
|
451
|
-
async function ui() {
|
|
452
|
-
try {
|
|
453
|
-
const apiRootPath = findApiRootPath();
|
|
454
|
-
// 사용자 프로젝트의 패키지들 중에서 @sonamu-kit/ui를 찾습니다.
|
|
455
|
-
// 이를 위해서 createRequire를 사용하여 프로젝트 경로 기준으로 resolve합니다.
|
|
456
|
-
const projectRequire = createRequire(path.join(apiRootPath, "package.json"));
|
|
457
|
-
const uiPackagePath = projectRequire.resolve("@sonamu-kit/ui"); // 없으면 여기서 터져요(MODULE_NOT_FOUND)
|
|
458
|
-
const uiNodePath = path.join(path.dirname(uiPackagePath), "run-ui.js");
|
|
459
|
-
if (!await exists(uiNodePath)) {
|
|
460
|
-
console.log(chalk.red(`UI runner script not found at ${uiNodePath}. Please rebuild @sonamu-kit/ui.`));
|
|
461
|
-
return;
|
|
462
|
-
}
|
|
463
|
-
// UI를 별도 프로세스로 실행 (hmr-hook 활성화)
|
|
464
|
-
const uiProcess = spawn(process.execPath, [
|
|
465
|
-
"--import",
|
|
466
|
-
"sonamu/ts-loader-register",
|
|
467
|
-
"--import",
|
|
468
|
-
"sonamu/hmr-hook-register",
|
|
469
|
-
"--enable-source-maps",
|
|
470
|
-
"--no-warnings",
|
|
471
|
-
uiNodePath
|
|
472
|
-
], {
|
|
473
|
-
stdio: "inherit",
|
|
474
|
-
env: {
|
|
475
|
-
...process.env,
|
|
476
|
-
HOT: "yes",
|
|
477
|
-
API_ROOT_PATH: apiRootPath
|
|
478
|
-
}
|
|
479
|
-
});
|
|
480
|
-
// 종료 처리
|
|
481
|
-
const cleanup = ()=>{
|
|
482
|
-
console.log(chalk.yellow("\n\n👋 Shutting down UI server..."));
|
|
483
|
-
uiProcess.kill("SIGTERM");
|
|
484
|
-
process.exit(0);
|
|
485
|
-
};
|
|
486
|
-
process.on("SIGINT", cleanup);
|
|
487
|
-
process.on("SIGTERM", cleanup);
|
|
488
|
-
uiProcess.on("exit", (code)=>{
|
|
489
|
-
if (code !== 0) {
|
|
490
|
-
console.error(chalk.red(`❌ UI server exited with code ${code}`));
|
|
491
|
-
process.exit(code || 1);
|
|
492
|
-
}
|
|
493
|
-
});
|
|
494
|
-
} catch (e) {
|
|
495
|
-
if (e instanceof Error && e.message.includes("isn't declared")) {
|
|
496
|
-
console.log(`You need to install ${chalk.blue(`@sonamu-kit/ui`)} first.`);
|
|
497
|
-
return;
|
|
498
|
-
}
|
|
499
|
-
throw e;
|
|
500
|
-
}
|
|
501
|
-
}
|
|
502
450
|
|
|
503
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQlVJTERfRElSLCBTV0NfQlVJTERfQ09NTUFORCwgVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJ1aVwiXS5pbmNsdWRlcyhwcm9jZXNzLmFyZ3ZbMl0gPz8gXCJcIik7XG4gIGlmICghbm90VG9Jbml0KSB7XG4gICAgYXdhaXQgU29uYW11LmluaXQoZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIGF3YWl0IHRzaWNsaShwcm9jZXNzLmFyZ3YsIHtcbiAgICB0eXBlczoge1xuICAgICAgXCIjZW50aXR5SWRcIjoge1xuICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjZW50aXR5SWRcIixcbiAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICB2YWx1ZTogZW50aXR5SWQsXG4gICAgICAgIH0pKSxcbiAgICAgIH0sXG4gICAgICBcIiNyZWNvcmRJZHNcIjogXCJudW1iZXJbXVwiLFxuICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXJnczogW1xuICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgIFtcImZpeHR1cmVcIiwgXCJzeW5jXCJdLFxuICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjaGVja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyb2xsYmFja1wiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyZXNldFwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJjbGVhclwiXSxcbiAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInN0dWJcIiwgXCJlbnRpdHlcIiwgXCIjbmFtZVwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfbGlzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgW1widWlcIl0sXG4gICAgICBbXCJzeW5jXCJdLFxuICAgICAgW1wiZGV2XCJdLFxuICAgICAgW1wiYnVpbGRcIl0sXG4gICAgICBbXCJzdGFydFwiXSxcbiAgICBdLFxuICAgIHJ1bm5lcnM6IHtcbiAgICAgIG1pZ3JhdGVfc3RhdHVzLFxuICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICBmaXh0dXJlX2luaXQsXG4gICAgICBmaXh0dXJlX2ltcG9ydCxcbiAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgIHN0dWJfcHJhY3RpY2UsXG4gICAgICBzdHViX2VudGl0eSxcbiAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgc2NhZmZvbGRfbW9kZWxfdGVzdCxcbiAgICAgIHVpLFxuICAgICAgLy8gc2NhZmZvbGRfdmlld19saXN0LFxuICAgICAgLy8gc2NhZmZvbGRfdmlld19mb3JtLFxuICAgICAgc3luYyxcbiAgICAgIGRldixcbiAgICAgIGJ1aWxkLFxuICAgICAgc3RhcnQsXG4gICAgfSxcbiAgfSk7XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV2KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+agCBTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcblwiKSk7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBgLS1vbi1rZXk9ZjpzaGVsbChybSAke3BhdGguam9pbihhcGlSb290LCBcInNvbmFtdS5sb2NrXCIpfSk6cmVzdGFydDpGb3JjZSByZXN0YXJ0YCwgLy8gZiDriITrpbTrqbQgc29uYW11LmxvY2sg7YyM7J287J2EIOyngOyasOqzoCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg4p2MIFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOyXkCDtlYTsmpTtlZwgLnN3Y3Jj64qUIO2UhOuhnOygne2KuCDro6jtirjsl5DshJwg7LC+6rOgLCDsl4bsnLzrqbQgc29uYW116rCAIOq0gOumrO2VmOuKlCAuc3djcmMucHJvamVjdC1kZWZhdWx066W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqIHNvbmFtdS5jb25maWcudHPripQgc3Jj7JeQIOuTpOyWtOyeiOyngCDslYrquLAg65WM66y47JeQIFNXQ19CVUlMRF9DT01NQU5E66GcIOu5jOuTnOuQmOyngCDslYrsirXri4jri6QuXG4gKiDrlLDrnbzshJwg65Sw66GcIOu5jOuTnO2VtOykjeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZCgpIHtcbiAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gIC8vIOy2nOugpSDrlJTroInthqDrpqzrpbwg7KCc6rGw7ZWp64uI64ukLlxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSZW1vdmluZyBidWlsZCBkaXJlY3RvcnkuLi5cIikpO1xuICAgIGlmIChhd2FpdCBleGlzdHMoQlVJTERfRElSKSkge1xuICAgICAgYXdhaXQgcm0oQlVJTERfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiUmVtb3ZlIGJ1aWxkIGRpcmVjdG9yeSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gLnN3Y3JjIO2MjOydvOydhCDsp4DsoJXtlanri4jri6QuXG4gIGxldCBzd2NGaWxlUGF0aCA9IFwiLnN3Y3JjXCI7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhzd2NGaWxlUGF0aCkpIHtcbiAgICAgIC8vIOyCrOyaqeyekCDtlITroZzsoJ3tirjsl5AgLnN3Y3Jj6rCAIOyeiOycvOuptCDsmrDshKDsnLzroZwg7IKs7Jqp7ZWp64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlVzaW5nIC5zd2NyYyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOyVhOuLiOudvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg6rCA7KC464ukIOyUgeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJVc2luZyBkZWZhdWx0IC5zd2NyYyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgICAgIHN3Y0ZpbGVQYXRoID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcIi5zd2NyYy5wcm9qZWN0LWRlZmF1bHRcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiU2V0dGluZyB1cCBzd2MgY29uZmlnIGZpbGUgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIOyGjOyKpCDrlJTroInthqDrpqzrpbwg67mM65Oc7ZWp64uI64ukLlxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJCdWlsZGluZyB3aXRoIHN3Yy4uLlwiKSk7XG4gICAgZXhlY1N5bmMoU1dDX0JVSUxEX0NPTU1BTkQoc3djRmlsZVBhdGgpLCB7IGN3ZDogYXBpUm9vdCwgc3RkaW86IFwiaW5oZXJpdFwiIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiQnVpbGQgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIOuniOyngOunieyXkOuKlCDtg4DsnoUg7LK07YGs66W8IO2VtOyalC5cbiAgdHJ5IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiQ2hlY2tpbmcgdHlwZXMgd2l0aCB0c2MuLi5cIikpO1xuICAgIGV4ZWNTeW5jKFRTQ19UWVBFX0NIRUNLX0NPTU1BTkQsIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChcIlR5cGUgY2hlY2sgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc3RhcnQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDruYzrk5zrkJwg7ZSE66Gc7KCd7Yq466W8IOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDruYzrk5zrkJwg6rKw6rO866y8KGRpc3Qg65SU66CJ7Yag66as7J2YIGluZGV4LmpzIOyXlO2KuOumrO2PrOyduO2KuCnsnbQg7JeG64uk66m0IOyLpO2WieydhCDspJHri6jtlanri4jri6QuXG4gKiDshozsiqTrp7Ug7KeA7JuQ6rO8IGRvdGVudiDsp4Dsm5DsnYQg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFydCgpIHtcbiAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBlbnRyeVBvaW50ID0gXCJkaXN0L2luZGV4LmpzXCI7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGVudHJ5UG9pbnQpKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgJHtlbnRyeVBvaW50fSBub3QgZm91bmQuIFBsZWFzZSBidWlsZCB5b3VyIHByb2plY3QgZmlyc3QuYCkpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJSdW46IHlhcm4gc29uYW11IGJ1aWxkXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IHNwYXduIH0gPSBhd2FpdCBpbXBvcnQoXCJjaGlsZF9wcm9jZXNzXCIpO1xuICBjb25zdCBzZXJ2ZXJQcm9jZXNzID0gc3Bhd24oXG4gICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICBbXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCBcIi1yXCIsIFwiZG90ZW52L2NvbmZpZ1wiLCBlbnRyeVBvaW50XSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgfSxcbiAgKTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsICgpID0+IHtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwTWlncmF0b3IoKSB7XG4gIC8vIG1pZ3JhdG9yXG4gIG1pZ3JhdG9yID0gbmV3IE1pZ3JhdG9yKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRml4dHVyZU1hbmFnZXIoKSB7XG4gIEZpeHR1cmVNYW5hZ2VyLmluaXQoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9ydW4oKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXG4gICAgXCJhcHBseVwiLFxuICAgIE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdIC8q7Iu5IOuLpCEqLyxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9zdGF0dXMoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgLy8gc3RhdHVzO1xuICBjb25zb2xlLmxvZyhzdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZV9yZW1vdGUuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIGNvbnN0IGxvY2FsQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy50ZXN0LmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICByZXR1cm4gcmVtb3RlQ29ubi5ob3N0ID09PSBsb2NhbENvbm4uaG9zdCAmJiByZW1vdGVDb25uLmRhdGFiYXNlID09PSBsb2NhbENvbm4uZGF0YWJhc2U7XG4gICAgICB9KSgpLFxuICAgIH0sXG4gIF0gYXMge1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgY29uZmlnOiBLbmV4LkNvbmZpZztcbiAgICB0b1NraXA/OiBib29sZWFuO1xuICB9W107XG5cbiAgLy8gMS4g6riw7KSAREIg7Iqk7YKk66eI66W8IOuNpO2UhFxuICBjb25zb2xlLmxvZyhcIkRVTVAuLi5cIik7XG4gIGNvbnN0IGR1bXBGaWxlbmFtZSA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBjb25zdCBzcmNDb25uID0gc3JjQ29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICBjb25zdCBtaWdyYXRpb25zRHVtcCA9IGAvdG1wL3NvbmFtdS1maXh0dXJlLWluaXQtbWlncmF0aW9ucy0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGV4ZWNTeW5jKFxuICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC1kIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSA+ICR7ZHVtcEZpbGVuYW1lfWAsXG4gICk7XG4gIGNvbnN0IF9kYiA9IGtuZXgoc3JjQ29uZmlnKTtcbiAgY29uc3QgW1ttaWdyYXRpb25zXV0gPSBhd2FpdCBfZGIucmF3KFxuICAgIFwiU0VMRUNUIENPVU5UKCopIGFzIGNvdW50IEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnRhYmxlcyBXSEVSRSB0YWJsZV9zY2hlbWEgPSA/IEFORCB0YWJsZV9uYW1lID0gJ2tuZXhfbWlncmF0aW9ucydcIixcbiAgICBbc3JjQ29ubi5kYXRhYmFzZV0sXG4gICk7XG4gIGlmIChtaWdyYXRpb25zLmNvdW50ID4gMCkge1xuICAgIGV4ZWNTeW5jKFxuICAgICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9IGtuZXhfbWlncmF0aW9ucyBrbmV4X21pZ3JhdGlvbnNfbG9jayA+ICR7bWlncmF0aW9uc0R1bXB9YCxcbiAgICApO1xuICB9XG5cbiAgLy8gMi4g64yA7IOBREIg6rCB6rCB7JeQIOuMgO2VmOyXrCDsobTsnqzsl6zrtoAg7ZmV7J24IO2bhCDrtpPquLBcbiAgZm9yIGF3YWl0IChjb25zdCB7IGxhYmVsLCBjb25maWcsIHRvU2tpcCB9IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBjb25uID0gY29uZmlnLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuXG4gICAgaWYgKHRvU2tpcCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2xhYmVsfTogU2tpcHBlZCFgKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBkYiA9IGtuZXgoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAuLi4oKGNvbmZpZy5jb25uZWN0aW9uID8/IHt9KSBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWcpLFxuICAgICAgICBkYXRhYmFzZTogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBjb25zdCBbW3Jvd11dID0gYXdhaXQgZGIucmF3KGBTSE9XIERBVEFCQVNFUyBMSUtFIFwiJHtjb25uLmRhdGFiYXNlfVwiYCk7XG4gICAgaWYgKHJvdykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGAke2xhYmVsfTogRGF0YWJhc2UgXCIke2Nvbm4uZGF0YWJhc2V9XCIgQWxyZWFkeSBleGlzdHNgKSk7XG4gICAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgU1lOQyB0byAke2xhYmVsfS4uLmApO1xuICAgIGNvbnN0IG15c3FsQ21kID0gYG15c3FsIC1oJHtjb25uLmhvc3R9IC11JHtjb25uLnVzZXJ9IC1wJHtjb25uLnBhc3N3b3JkfWA7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdEUk9QIERBVEFCQVNFIElGIEVYSVNUUyBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnQ1JFQVRFIERBVEFCQVNFIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke2R1bXBGaWxlbmFtZX1gKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKG1pZ3JhdGlvbnNEdW1wKSkge1xuICAgICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9ICR7Y29ubi5kYXRhYmFzZX0gPCAke21pZ3JhdGlvbnNEdW1wfWApO1xuICAgIH1cblxuICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGF3YWl0IF9kYi5kZXN0cm95KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW1wb3J0KGVudGl0eUlkOiBzdHJpbmcsIHJlY29yZElkczogbnVtYmVyW10pIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmltcG9ydEZpeHR1cmUoZW50aXR5SWQsIHJlY29yZElkcyk7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9zeW5jKCkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX3ByYWN0aWNlKG5hbWU6IHN0cmluZykge1xuICBjb25zdCBwcmFjdGljZURpciA9IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwicHJhY3RpY2VzXCIpO1xuICBjb25zdCBmaWxlTmFtZXMgPSBhd2FpdCByZWFkZGlyKHByYWN0aWNlRGlyKTtcblxuICBjb25zdCBtYXhTZXFObyA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHByYWN0aWNlRGlyKSkpIHtcbiAgICAgIGF3YWl0IG1rZGlyKHByYWN0aWNlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJlZFNlcXMgPSBmaWxlTmFtZXNcbiAgICAgIC5maWx0ZXIoKGZpbGVOYW1lKSA9PiBmaWxlTmFtZS5zdGFydHNXaXRoKFwicFwiKSAmJiBmaWxlTmFtZS5lbmRzV2l0aChcIi50c1wiKSlcbiAgICAgIC5tYXAoKGZpbGVOYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IFssIHNlcU5vXSA9IGZpbGVOYW1lLm1hdGNoKC9ecChbMC05XSspLS8pID8/IFtcIjBcIiwgXCIwXCJdO1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VxTm8pO1xuICAgICAgfSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiBiIC0gYSk7XG5cbiAgICBpZiAoZmlsdGVyZWRTZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJlZFNlcXNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIDA7XG4gIH0pKCk7XG5cbiAgY29uc3QgY3VycmVudFNlcU5vID0gbWF4U2VxTm8gKyAxO1xuICBjb25zdCBmaWxlTmFtZSA9IGBwJHtjdXJyZW50U2VxTm99LSR7bmFtZX0udHNgO1xuICBjb25zdCBkc3RQYXRoID0gcGF0aC5qb2luKHByYWN0aWNlRGlyLCBmaWxlTmFtZSk7XG5cbiAgY29uc3QgY29kZSA9IFtcbiAgICBgaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXCJcIixcbiAgICBgY29uc29sZS5jbGVhcigpO2AsXG4gICAgYGNvbnNvbGUubG9nKFwiJHtmaWxlTmFtZX1cIik7YCxcbiAgICBcIlwiLFxuICAgIGBTb25hbXUucnVuU2NyaXB0KGFzeW5jICgpID0+IHtgLFxuICAgIGAgLy8gVE9ET2AsXG4gICAgYH0pO2AsXG4gICAgXCJcIixcbiAgXS5qb2luKFwiXFxuXCIpO1xuICBhd2FpdCB3cml0ZUZpbGUoZHN0UGF0aCwgY29kZSk7XG5cbiAgZXhlY1N5bmMoYGNvZGUgJHtkc3RQYXRofWApO1xuXG4gIGNvbnN0IHJ1bkNvZGUgPSBgeWFybiBub2RlIC1yIGRvdGVudi9jb25maWcgLS1lbmFibGUtc291cmNlLW1hcHMgZGlzdC9wcmFjdGljZXMvJHtmaWxlTmFtZS5yZXBsYWNlKFxuICAgIFwiLnRzXCIsXG4gICAgXCIuanNcIixcbiAgKX1gO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay5ibHVlKHJ1bkNvZGUpfSBjb3BpZWQgdG8gY2xpcGJvYXJkLmApO1xuICBleGVjU3luYyhgZWNobyBcIiR7cnVuQ29kZX1cIiB8IHBiY29weWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdHViX2VudGl0eShlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuY3JlYXRlRW50aXR5KHsgZW50aXR5SWQsIHRpdGxlOiBlbnRpdHlJZCB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWwoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbF90ZXN0KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxfdGVzdFwiLCB7XG4gICAgZW50aXR5SWQsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiB1aSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCDtjKjtgqTsp4Drk6Qg7KSR7JeQ7IScIEBzb25hbXUta2l0L3Vp66W8IOywvuyKteuLiOuLpC5cbiAgICAvLyDsnbTrpbwg7JyE7ZW07IScIGNyZWF0ZVJlcXVpcmXrpbwg7IKs7Jqp7ZWY7JesIO2UhOuhnOygne2KuCDqsr3roZwg6riw7KSA7Jy866GcIHJlc29sdmXtlanri4jri6QuXG4gICAgY29uc3QgcHJvamVjdFJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKHBhdGguam9pbihhcGlSb290UGF0aCwgXCJwYWNrYWdlLmpzb25cIikpO1xuICAgIGNvbnN0IHVpUGFja2FnZVBhdGggPSBwcm9qZWN0UmVxdWlyZS5yZXNvbHZlKFwiQHNvbmFtdS1raXQvdWlcIik7IC8vIOyXhuycvOuptCDsl6zquLDshJwg7YSw7KC47JqUKE1PRFVMRV9OT1RfRk9VTkQpXG4gICAgY29uc3QgdWlOb2RlUGF0aCA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUodWlQYWNrYWdlUGF0aCksIFwicnVuLXVpLmpzXCIpO1xuXG4gICAgaWYgKCEoYXdhaXQgZXhpc3RzKHVpTm9kZVBhdGgpKSkge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnJlZChgVUkgcnVubmVyIHNjcmlwdCBub3QgZm91bmQgYXQgJHt1aU5vZGVQYXRofS4gUGxlYXNlIHJlYnVpbGQgQHNvbmFtdS1raXQvdWkuYCksXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVJ66W8IOuzhOuPhCDtlITroZzshLjsiqTroZwg7Iuk7ZaJIChobXItaG9vayDtmZzshLHtmZQpXG4gICAgY29uc3QgdWlQcm9jZXNzID0gc3Bhd24oXG4gICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgW1xuICAgICAgICBcIi0taW1wb3J0XCIsXG4gICAgICAgIFwic29uYW11L3RzLWxvYWRlci1yZWdpc3RlclwiLFxuICAgICAgICBcIi0taW1wb3J0XCIsXG4gICAgICAgIFwic29uYW11L2htci1ob29rLXJlZ2lzdGVyXCIsXG4gICAgICAgIFwiLS1lbmFibGUtc291cmNlLW1hcHNcIixcbiAgICAgICAgXCItLW5vLXdhcm5pbmdzXCIsXG4gICAgICAgIHVpTm9kZVBhdGgsXG4gICAgICBdLFxuICAgICAge1xuICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICAgIEhPVDogXCJ5ZXNcIixcbiAgICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290UGF0aCwgLy8gVUnripQg7JaY66eMIOyVjOuptCDrj7zsmpQhIOuCmOuouOyngOuKlCDslpjqsIAg65ag7IScIOyVjOyVhOyEnCDtlaAg6rKD7J6EIOOFjlxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8g7KKF66OMIOyymOumrFxuICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24gVUkgc2VydmVyLi4uXCIpKTtcbiAgICAgIHVpUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBjbGVhbnVwKTtcbiAgICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICAgIHVpUHJvY2Vzcy5vbihcImV4aXRcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgVUkgc2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KGNvZGUgfHwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcyhcImlzbid0IGRlY2xhcmVkXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgWW91IG5lZWQgdG8gaW5zdGFsbCAke2NoYWxrLmJsdWUoYEBzb25hbXUta2l0L3VpYCl9IGZpcnN0LmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJleGVjU3luYyIsInNwYXduIiwibWtkaXIiLCJyZWFkZGlyIiwicm0iLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJCVUlMRF9ESVIiLCJTV0NfQlVJTERfQ09NTUFORCIsIlRTQ19UWVBFX0NIRUNLX0NPTU1BTkQiLCJtaWdyYXRvciIsImJvb3RzdHJhcCIsIm5vdFRvSW5pdCIsImluY2x1ZGVzIiwiYXJndiIsImluaXQiLCJ0eXBlcyIsInR5cGUiLCJuYW1lIiwibWVzc2FnZSIsImNob2ljZXMiLCJnZXRBbGxQYXJlbnRJZHMiLCJtYXAiLCJlbnRpdHlJZCIsInRpdGxlIiwidmFsdWUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInVpIiwic3luYyIsImRldiIsImJ1aWxkIiwic3RhcnQiLCJmaW5hbGx5IiwiZGVzdHJveSIsInN5bmNlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImNsZWFudXAiLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYmx1ZSIsInJlY3Vyc2l2ZSIsImZvcmNlIiwic3djRmlsZVBhdGgiLCJkaXJuYW1lIiwic2V0dXBNaWdyYXRvciIsInNldHVwRml4dHVyZU1hbmFnZXIiLCJydW5BY3Rpb24iLCJPYmplY3QiLCJrZXlzIiwiZGJDb25maWciLCJzdGF0dXMiLCJnZXRTdGF0dXMiLCJzcmNDb25maWciLCJkZXZlbG9wbWVudF9tYXN0ZXIiLCJ0YXJnZXRzIiwibGFiZWwiLCJmaXh0dXJlX3JlbW90ZSIsInRlc3QiLCJ0b1NraXAiLCJyZW1vdGVDb25uIiwiY29ubmVjdGlvbiIsImxvY2FsQ29ubiIsImhvc3QiLCJkYXRhYmFzZSIsImR1bXBGaWxlbmFtZSIsIkRhdGUiLCJub3ciLCJzcmNDb25uIiwibWlncmF0aW9uc0R1bXAiLCJ1c2VyIiwicGFzc3dvcmQiLCJfZGIiLCJtaWdyYXRpb25zIiwicmF3IiwiY291bnQiLCJjb25uIiwiZGIiLCJ1bmRlZmluZWQiLCJyb3ciLCJteXNxbENtZCIsInJlY29yZElkcyIsImltcG9ydEZpeHR1cmUiLCJwcmFjdGljZURpciIsImFwaVJvb3RQYXRoIiwiZmlsZU5hbWVzIiwibWF4U2VxTm8iLCJmaWx0ZXJlZFNlcXMiLCJmaWx0ZXIiLCJmaWxlTmFtZSIsInN0YXJ0c1dpdGgiLCJlbmRzV2l0aCIsInNlcU5vIiwibWF0Y2giLCJwYXJzZUludCIsInNvcnQiLCJhIiwiYiIsImxlbmd0aCIsImN1cnJlbnRTZXFObyIsImRzdFBhdGgiLCJydW5Db2RlIiwicmVwbGFjZSIsImNyZWF0ZUVudGl0eSIsImdlbmVyYXRlVGVtcGxhdGUiLCJwcm9qZWN0UmVxdWlyZSIsInVpUGFja2FnZVBhdGgiLCJ1aU5vZGVQYXRoIiwidWlQcm9jZXNzIiwiZSIsIkVycm9yIl0sIm1h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
|
|
451
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCB7IGV4ZWNTeW5jLCBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgQlVJTERfRElSLCBTV0NfQlVJTERfQ09NTUFORCwgVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRzaWNsaShwcm9jZXNzLmFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImNoZWNrXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwicm9sbGJhY2tcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJyZXNldFwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImNsZWFyXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiZGV2XCJdLFxuICAgICAgICBbXCJidWlsZFwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgc3luYyxcbiAgICAgICAgZGV2LFxuICAgICAgICBidWlsZCxcbiAgICAgICAgc3RhcnQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IFNvbmFtdS5kZXN0cm95KCk7XG4gIH1cbn1cblxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcbn0pO1xuXG4vKipcbiAqIHBucG0gc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDsi7Htgaztlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq47JeQIOuMgO2VtCBITVIg7KeA7JuQ7ZWY64qUIOqwnOuwnCDshJzrsoTrpbwg652E7JuM7KSN64uI64ukLlxuICpcbiAqIFR5cGVTY3JpcHTrpbwg67CU66GcIOyLpO2Wie2VoCDsiJgg7J6I64+E66GdIEBzb25hbXUta2l0L3RzLWxvYWRlcuulvCxcbiAqIEhNUuydhCDsp4Dsm5DtlZjquLAg7JyE7ZW0IEBzb25hbXUta2l0L2htci1ob29r7J2EIGltcG9ydO2VmOupsCxcbiAqIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZW0IC0tZW5hYmxlLXNvdXJjZS1tYXBzIO2UjOuemOq3uOulvCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOydtOuVjCBAc29uYW11LWtpdC90cy1sb2FkZXLsmYAgQHNvbmFtdS1raXQvaG1yLWhvb2vripQgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrmJDtlZwg7Iuk7ZaJ7JeQIOyCrOyaqe2VmOuKlCBAc29uYW11LWtpdC9obXItcnVubmVy64+EIOuniOywrOqwgOyngOuhnCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuUsOudvOyEnCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47JeQ7ISc64qUIOydtCDshLgg7Yyo7YKk7KeA66W8IOyngeygkSDshKTsuZjtlaAg7ZWE7JqU6rCAIOyXhuyKteuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXYoKSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5qAIFN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcblxuICAvLyDsnbQgc29uYW11IO2MqO2CpOyngOqwgCBkZXBlbmRlbmNpZXProZwg6rCA7KeA6rOgIOyeiOuKlCBAc29uYW11LWtpdC9obXItcnVubmVy7J2YIGJpbi9ydW4uanPrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAvLyDsnbQg6rK966GcKC9iaW4vcnVuLmpzKeuKlCBAc29uYW11LWtpdC9obXItcnVubmVy7J2YIHBhY2thZ2UuanNvbuydmCBiaW4g7ZWE65Oc7JeQIOuqheyLnOuQmOyWtCDsnojripQg6re46rKD6rO8IOqwmeyKteuLiOuLpC5cbiAgY29uc3QgaG90UnVubmVyQmluUGF0aCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKFxuICAgIFwiQHNvbmFtdS1raXQvaG1yLXJ1bm5lci9iaW4vcnVuLmpzXCIsXG4gICk7XG5cbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsIC8vIG5vZGVcbiAgICBbXG4gICAgICBob3RSdW5uZXJCaW5QYXRoLCAvLyDsnbTroIfqsowg7ZW07IScIGhvdC1ydW5uZXLrpbwg7Iuk7ZaJ7ZWY6rWs7JqUXG4gICAgICBcIi0tY2xlYXItc2NyZWVuPWZhbHNlXCIsIC8vIOydtO2VmCBob3QtcnVubmVy7JeQ6rKMIOuEmOqyqOykhCDsnbjsnpDrk6TsnoXri4jri6QuXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS90cy1sb2FkZXItcmVnaXN0ZXJcIiwgLy8gVHlwZVNjcmlwdCDshJztj6ztirjrpbwg7JyE7ZWcIOuhnOuNlCxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2htci1ob29rLXJlZ2lzdGVyXCIsIC8vIEhNUuydhCDsp4Dsm5DtlZjquLAg7JyE7ZWcIGhvb2ssXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIC8vIOq3uOumrOqzoCDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VnCDtlIzrnpjqt7jsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PXI6cmVzdGFydDpSZXN0YXJ0IHNlcnZlclwiLCAvLyByIOuIhOultOuptCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhtci1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gKlxuICog67mM65Oc7JeQIO2VhOyalO2VnCAuc3djcmPripQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCDssL7qs6AsIOyXhuycvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICogc29uYW11LmNvbmZpZy50c+uKlCBzcmPsl5Ag65Ok7Ja07J6I7KeAIOyViuq4sCDrlYzrrLjsl5AgU1dDX0JVSUxEX0NPTU1BTkTroZwg67mM65Oc65CY7KeAIOyViuyKteuLiOuLpC5cbiAqIOuUsOudvOyEnCDrlLDroZwg67mM65Oc7ZW07KSN64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkKCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG5cbiAgLy8g7Lac66ClIOuUlOugie2GoOumrOulvCDsoJzqsbDtlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJlbW92aW5nIGJ1aWxkIGRpcmVjdG9yeS4uLlwiKSk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhCVUlMRF9ESVIpKSB7XG4gICAgICBhd2FpdCBybShCVUlMRF9ESVIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJSZW1vdmUgYnVpbGQgZGlyZWN0b3J5IGZhaWxlZC5cIiksIGVycm9yKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyAuc3djcmMg7YyM7J287J2EIOyngOygle2VqeuLiOuLpC5cbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOyasOyEoOycvOuhnCDsgqzsmqntlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiVXNpbmcgLnN3Y3JjIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7JWE64uI652866m0IHNvbmFtdeqwgCDqtIDrpqztlZjripQgLnN3Y3JjLnByb2plY3QtZGVmYXVsdOulvCDqsIDsoLjri6Qg7JSB64uI64ukLlxuICAgICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlVzaW5nIGRlZmF1bHQgLnN3Y3JjIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgICAgc3djRmlsZVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIHN3YyBjb25maWcgZmlsZSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g7IaM7IqkIOuUlOugie2GoOumrOulvCDruYzrk5ztlanri4jri6QuXG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIkJ1aWxkaW5nIHdpdGggc3djLi4uXCIpKTtcbiAgICBleGVjU3luYyhTV0NfQlVJTERfQ09NTUFORChzd2NGaWxlUGF0aCksIHsgY3dkOiBhcGlSb290LCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJCdWlsZCBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8g66eI7KeA66eJ7JeQ64qUIO2DgOyehSDssrTtgazrpbwg7ZW07JqULlxuICB0cnkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoXCJDaGVja2luZyB0eXBlcyB3aXRoIHRzYy4uLlwiKSk7XG4gICAgZXhlY1N5bmMoVFNDX1RZUEVfQ0hFQ0tfQ09NTUFORCwge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiVHlwZSBjaGVjayBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcbiAgICBcImFwcGx5XCIsXG4gICAgT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKSBhcyAoa2V5b2YgU29uYW11REJDb25maWcpW10gLyrsi7kg64ukISovLFxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3N0YXR1cygpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuXG4gIGNvbnN0IHN0YXR1cyA9IGF3YWl0IG1pZ3JhdG9yLmdldFN0YXR1cygpO1xuICAvLyBzdGF0dXM7XG4gIGNvbnNvbGUubG9nKHN0YXR1cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfaW5pdCgpIHtcbiAgY29uc3Qgc3JjQ29uZmlnID0gU29uYW11LmRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlcjtcbiAgY29uc3QgdGFyZ2V0cyA9IFtcbiAgICB7XG4gICAgICBsYWJlbDogXCIoUkVNT1RFKSBGaXh0dXJlIERCXCIsXG4gICAgICBjb25maWc6IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlX3JlbW90ZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJkb3RlbnYiLCJjb25maWciLCJleGVjU3luYyIsInNwYXduIiwibWtkaXIiLCJyZWFkZGlyIiwicm0iLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJCVUlMRF9ESVIiLCJTV0NfQlVJTERfQ09NTUFORCIsIlRTQ19UWVBFX0NIRUNLX0NPTU1BTkQiLCJtaWdyYXRvciIsImJvb3RzdHJhcCIsIm5vdFRvSW5pdCIsImluY2x1ZGVzIiwiYXJndiIsImluaXQiLCJ0eXBlcyIsInR5cGUiLCJuYW1lIiwibWVzc2FnZSIsImNob2ljZXMiLCJnZXRBbGxQYXJlbnRJZHMiLCJtYXAiLCJlbnRpdHlJZCIsInRpdGxlIiwidmFsdWUiLCJhcmdzIiwicnVubmVycyIsIm1pZ3JhdGVfc3RhdHVzIiwibWlncmF0ZV9ydW4iLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInN5bmMiLCJkZXYiLCJidWlsZCIsInN0YXJ0IiwiZGVzdHJveSIsImZpbmFsbHkiLCJzeW5jZXIiLCJhcGlSb290IiwiZW50cnlQb2ludCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJib2xkIiwiaG90UnVubmVyQmluUGF0aCIsInVybCIsInJlc29sdmUiLCJzZXJ2ZXJQcm9jZXNzIiwiZXhlY1BhdGgiLCJqb2luIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJjbGVhbnVwIiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImJsdWUiLCJyZWN1cnNpdmUiLCJmb3JjZSIsInN3Y0ZpbGVQYXRoIiwiZGlybmFtZSIsInNldHVwTWlncmF0b3IiLCJzZXR1cEZpeHR1cmVNYW5hZ2VyIiwicnVuQWN0aW9uIiwiT2JqZWN0Iiwia2V5cyIsImRiQ29uZmlnIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwic3JjQ29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwidGFyZ2V0cyIsImxhYmVsIiwiZml4dHVyZV9yZW1vdGUiLCJ0ZXN0IiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImNvbm5lY3Rpb24iLCJsb2NhbENvbm4iLCJob3N0IiwiZGF0YWJhc2UiLCJkdW1wRmlsZW5hbWUiLCJEYXRlIiwibm93Iiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwiZmlsdGVyZWRTZXFzIiwiZmlsdGVyIiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJsZW5ndGgiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJnZW5lcmF0ZVRlbXBsYXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsU0FBU0MsUUFBUSxFQUFFQyxLQUFLLFFBQVEsZ0JBQWdCO0FBQ2hELFNBQVNDLEtBQUssRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUM1RCxPQUFPQyxVQUF5QixPQUFPO0FBQ3ZDLFNBQVNDLGFB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
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
|
|
2
2
|
import type { Knex } from "knex";
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
5
|
-
import {
|
|
6
|
-
import type { EnhancerMap, ExecuteSubsetQueryResult, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
|
|
3
|
+
import type { ListResult } from "..";
|
|
4
|
+
import type { DatabaseSchemaExtend, SonamuQueryMode } from "../types/types";
|
|
5
|
+
import type { EnhancerMap, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
|
|
7
6
|
import type { DBPreset } from "./db";
|
|
8
7
|
import { Puri } from "./puri";
|
|
9
8
|
import type { InferAllSubsets, PuriLoaderQueries, PuriSubsetFn } from "./puri-subset.types";
|
|
@@ -24,49 +23,6 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
24
23
|
constructor(subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
|
|
25
24
|
getDB(which: DBPreset): Knex;
|
|
26
25
|
getPuri(which: DBPreset): PuriWrapper;
|
|
27
|
-
private _vectorSearch;
|
|
28
|
-
/**
|
|
29
|
-
* 벡터 검색 인스턴스 반환
|
|
30
|
-
* - 기본 provider: voyage
|
|
31
|
-
* - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
|
|
32
|
-
*/
|
|
33
|
-
getVector<T = Record<string, unknown>>(): VectorSearch<T>;
|
|
34
|
-
/**
|
|
35
|
-
* 벡터 검색 (코사인 유사도)
|
|
36
|
-
* @param query - 검색어
|
|
37
|
-
* @param options - 검색 옵션
|
|
38
|
-
*/
|
|
39
|
-
vectorSearch<T = Record<string, unknown>>(query: string, options?: VectorSearchOptions & {
|
|
40
|
-
provider?: EmbeddingProvider;
|
|
41
|
-
}): Promise<VectorSearchResult<T>[]>;
|
|
42
|
-
/**
|
|
43
|
-
* 하이브리드 검색 (Vector + FTS)
|
|
44
|
-
* @param query - 검색어
|
|
45
|
-
* @param options - 검색 옵션
|
|
46
|
-
*/
|
|
47
|
-
hybridSearch<T = Record<string, unknown>>(query: string, options?: HybridSearchOptions & {
|
|
48
|
-
provider?: EmbeddingProvider;
|
|
49
|
-
}): Promise<HybridSearchResult<T>[]>;
|
|
50
|
-
/**
|
|
51
|
-
* 단일 레코드에 임베딩 저장
|
|
52
|
-
* @param id - 레코드 ID
|
|
53
|
-
* @param text - 임베딩할 텍스트
|
|
54
|
-
* @param options - provider, embeddingColumn 옵션
|
|
55
|
-
*/
|
|
56
|
-
saveEmbedding(id: number, text: string, options?: {
|
|
57
|
-
provider?: EmbeddingProvider;
|
|
58
|
-
embeddingColumn?: string;
|
|
59
|
-
}): Promise<void>;
|
|
60
|
-
/**
|
|
61
|
-
* 여러 레코드에 임베딩 일괄 저장
|
|
62
|
-
* @param items - { id, text } 배열
|
|
63
|
-
* @param options - provider, embeddingColumn, onProgress 옵션
|
|
64
|
-
*/
|
|
65
|
-
saveEmbeddingsBatch(items: EmbeddingItem[], options?: {
|
|
66
|
-
provider?: EmbeddingProvider;
|
|
67
|
-
embeddingColumn?: string;
|
|
68
|
-
onProgress?: ProgressCallback;
|
|
69
|
-
}): Promise<void>;
|
|
70
26
|
destroy(): Promise<void>;
|
|
71
27
|
getInsertedIds(wdb: Knex, rows: UnknownDBRecord[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
|
|
72
28
|
/**
|
|
@@ -99,17 +55,21 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
99
55
|
* 3. Hydrate (flat → 중첩 객체)
|
|
100
56
|
* 4. Enhancer 적용 (virtual 필드 계산)
|
|
101
57
|
*/
|
|
102
|
-
executeSubsetQuery<T extends TSubsetKey, TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries
|
|
58
|
+
executeSubsetQuery<T extends TSubsetKey, TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries>, LP extends {
|
|
59
|
+
num?: number;
|
|
60
|
+
page?: number;
|
|
61
|
+
queryMode?: SonamuQueryMode;
|
|
62
|
+
}>(params: {
|
|
103
63
|
subset: T;
|
|
104
64
|
qb: Puri<any, any, any>;
|
|
105
65
|
params: {
|
|
106
66
|
num: number;
|
|
107
67
|
page: number;
|
|
108
|
-
queryMode?:
|
|
68
|
+
queryMode?: SonamuQueryMode;
|
|
109
69
|
};
|
|
110
70
|
debug?: boolean;
|
|
111
71
|
optimizeCountQuery?: boolean;
|
|
112
|
-
} & EnhancerParam<TSubsetKey, TComputedResults, TSubsetMapping>): Promise<
|
|
72
|
+
} & EnhancerParam<TSubsetKey, TComputedResults, TSubsetMapping>): Promise<ListResult<LP, TSubsetMapping[T]>>;
|
|
113
73
|
/**
|
|
114
74
|
* COUNT 쿼리 실행 (내부 메서드)
|
|
115
75
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAG5E,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,KAAK,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE/C;;;;;;;GAOG;AACH,qBAAa,cAAc,CACzB,UAAU,SAAS,MAAM,GAAG,KAAK,EACjC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,EAClD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,KAAK,EAC/D,cAAc,SAAS,iBAAiB,CAAC,UAAU,CAAC,GAAG,KAAK;IAK1D,SAAS,CAAC,aAAa,CAAC,EAAE,cAAc;IACxC,SAAS,CAAC,aAAa,CAAC,EAAE,cAAc;IAJnC,SAAS,EAAE,MAAM,CAAa;gBAGzB,aAAa,CAAC,EAAE,cAAc,YAAA,EAC9B,aAAa,CAAC,EAAE,cAAc,YAAA;IAG1C,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW;IAY/B,OAAO;IAIP,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,eAAe,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,GAAE,MAAY;IAiCzB;;;;;OAKG;IACH,gBAAgB,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,CAAC;YAcvB,IAAI,CAAC,oBAAoB;qCAJrB;gBAAE,YAAY,EAAE,IAAI,CAAA;aAAE;WAIW,EAAE,CAAC;kBACM;YAEjE,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAEjE,CAAC,GAAG,SAAS,SAAS,UAAU,EAAE,EAChC,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,GAChB,yBAAyB,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SACnD;;IAIL;;;OAGG;IACH,eAAe,CAAC,CAAC,SAAS,UAAU,EAClC,SAAS,EAAE,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC,cAAc,EAAE,cAAc,CAAC,EAAE,cAAc,CAAC;IAK5F;;;;;;;OAOG;IACG,kBAAkB,CACtB,CAAC,SAAS,UAAU,EACpB,gBAAgB,SAAS,eAAe,CAAC,cAAc,EAAE,cAAc,CAAC,EACxE,EAAE,SAAS;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,eAAe,CAAC;KAC7B,EAED,MAAM,EAAE;QACN,MAAM,EAAE,CAAC,CAAC;QACV,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACxB,MAAM,EAAE;YACN,GAAG,EAAE,MAAM,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,CAAC,EAAE,eAAe,CAAC;SAC7B,CAAC;QACF,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,aAAa,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,GAC9D,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAkC7C;;OAEG;YACW,iBAAiB;IA0C/B;;OAEG;YACW,gBAAgB;IAkC9B;;OAEG;YACW,cAAc;IA+B5B;;;;;OAKG;IACH,OAAO,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;CAiEnD;AAED;;;GAGG;AACH,KAAK,aAAa,CAChB,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAChD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,IAC5C,CAAC,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACpF;IAAE,SAAS,CAAC,EAAE,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;CAAE,GACzE;IAAE,SAAS,EAAE,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;CAAE,CAAC;AAE7E,KAAK,oBAAoB,CACvB,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAChD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,IAC5C;KACD,CAAC,IAAI,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;CAC7E,CAAC,UAAU,CAAC,CAAC;AAEd,eAAO,MAAM,SAAS,4CAAuB,CAAC"}
|