sonamu 0.9.19 → 0.10.0
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/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +200 -387
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +21 -32
- package/dist/auth/audit-log/builders.js +2 -3
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.js +19 -41
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +151 -258
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +156 -310
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +8 -7
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +146 -314
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +9 -20
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.js +1 -2
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +99 -195
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +7 -7
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +14 -4
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/skills/sonamu/upsert.md +53 -6
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
package/dist/ui/cdd-service.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { Sonamu, init_sonamu } from "../api/sonamu.js";
|
|
3
|
+
import fs from "fs";
|
|
3
4
|
import path from "path";
|
|
4
5
|
import os from "os";
|
|
5
6
|
import { spawn } from "child_process";
|
|
6
|
-
import fs from "fs";
|
|
7
|
-
|
|
8
7
|
//#region src/ui/cdd-service.ts
|
|
9
8
|
/** contract/ 디렉터리 절대 경로 반환 (apiRootPath 기준) */
|
|
10
9
|
function getContractDir() {
|
|
@@ -18,15 +17,12 @@ function getProjectRoot() {
|
|
|
18
17
|
function assertInsideContractDir(filePath) {
|
|
19
18
|
const contractDir = getContractDir();
|
|
20
19
|
const resolved = path.resolve(contractDir, filePath);
|
|
21
|
-
if (!resolved.startsWith(contractDir + path.sep) && resolved !== contractDir) {
|
|
22
|
-
throw new Error(`경로가 contract/ 디렉터리 밖을 참조합니다: ${filePath}`);
|
|
23
|
-
}
|
|
20
|
+
if (!resolved.startsWith(contractDir + path.sep) && resolved !== contractDir) throw new Error(`경로가 contract/ 디렉터리 밖을 참조합니다: ${filePath}`);
|
|
24
21
|
}
|
|
25
22
|
/** 파일명에서 CddFileType 판별 */
|
|
26
23
|
function detectFileType(fileName) {
|
|
27
24
|
if (fileName.endsWith(".contract.md")) return "contract";
|
|
28
25
|
if (fileName.endsWith(".rules.json")) return "rules";
|
|
29
|
-
return undefined;
|
|
30
26
|
}
|
|
31
27
|
/** 디렉터리를 재귀 탐색하여 CddTreeNode 트리를 생성 */
|
|
32
28
|
function scanDirectory(dirPath, relativeTo) {
|
|
@@ -38,24 +34,20 @@ function scanDirectory(dirPath, relativeTo) {
|
|
|
38
34
|
if (entry.isDirectory()) {
|
|
39
35
|
if (entry.name === "rules") continue;
|
|
40
36
|
const children = scanDirectory(fullPath, relativeTo);
|
|
41
|
-
if (children.length > 0) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
48
|
-
}
|
|
37
|
+
if (children.length > 0) nodes.push({
|
|
38
|
+
name: entry.name,
|
|
39
|
+
path: relPath,
|
|
40
|
+
type: "directory",
|
|
41
|
+
children
|
|
42
|
+
});
|
|
49
43
|
} else if (entry.isFile()) {
|
|
50
44
|
const fileType = detectFileType(entry.name);
|
|
51
|
-
if (fileType && fileType !== "rules") {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
});
|
|
58
|
-
}
|
|
45
|
+
if (fileType && fileType !== "rules") nodes.push({
|
|
46
|
+
name: entry.name,
|
|
47
|
+
path: relPath,
|
|
48
|
+
type: "file",
|
|
49
|
+
fileType
|
|
50
|
+
});
|
|
59
51
|
}
|
|
60
52
|
}
|
|
61
53
|
return nodes;
|
|
@@ -63,16 +55,13 @@ function scanDirectory(dirPath, relativeTo) {
|
|
|
63
55
|
/** contract/ 디렉터리의 트리 구조를 반환 */
|
|
64
56
|
function getCddTree() {
|
|
65
57
|
const contractDir = getContractDir();
|
|
66
|
-
if (!fs.existsSync(contractDir)) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
const tree = scanDirectory(contractDir, contractDir);
|
|
58
|
+
if (!fs.existsSync(contractDir)) return {
|
|
59
|
+
exists: false,
|
|
60
|
+
tree: []
|
|
61
|
+
};
|
|
73
62
|
return {
|
|
74
63
|
exists: true,
|
|
75
|
-
tree
|
|
64
|
+
tree: scanDirectory(contractDir, contractDir)
|
|
76
65
|
};
|
|
77
66
|
}
|
|
78
67
|
/** 파일 내용을 읽어 반환 (contract.md → markdown 원문, rules.json → JSON 문자열) */
|
|
@@ -80,14 +69,10 @@ function readContent(filePath) {
|
|
|
80
69
|
assertInsideContractDir(filePath);
|
|
81
70
|
const contractDir = getContractDir();
|
|
82
71
|
const absPath = path.resolve(contractDir, filePath);
|
|
83
|
-
if (!fs.existsSync(absPath)) {
|
|
84
|
-
throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
85
|
-
}
|
|
86
|
-
const content = fs.readFileSync(absPath, "utf-8");
|
|
87
|
-
const fileType = detectFileType(path.basename(filePath));
|
|
72
|
+
if (!fs.existsSync(absPath)) throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
88
73
|
return {
|
|
89
|
-
content,
|
|
90
|
-
fileType:
|
|
74
|
+
content: fs.readFileSync(absPath, "utf-8"),
|
|
75
|
+
fileType: detectFileType(path.basename(filePath)) ?? "contract"
|
|
91
76
|
};
|
|
92
77
|
}
|
|
93
78
|
/** 파일을 외부 에디터로 직접 편집 */
|
|
@@ -95,11 +80,8 @@ async function editContent(filePath) {
|
|
|
95
80
|
assertInsideContractDir(filePath);
|
|
96
81
|
const contractDir = getContractDir();
|
|
97
82
|
const absPath = path.resolve(contractDir, filePath);
|
|
98
|
-
if (!fs.existsSync(absPath)) {
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
const editor = resolveEditorCli();
|
|
102
|
-
await runEditor(editor, absPath);
|
|
83
|
+
if (!fs.existsSync(absPath)) throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
84
|
+
await runEditor(resolveEditorCli(), absPath);
|
|
103
85
|
return {
|
|
104
86
|
success: true,
|
|
105
87
|
filePath
|
|
@@ -110,18 +92,11 @@ function resolveEditorCli(options) {
|
|
|
110
92
|
const wait = options?.wait ?? true;
|
|
111
93
|
const appName = Sonamu.config.externalEditor ?? "Visual Studio Code";
|
|
112
94
|
const mapping = EDITOR_CLI_MAP[appName];
|
|
113
|
-
if (!mapping) {
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
const searchPaths = [`/Applications/${appName}.app`, `${os.homedir()}/Applications/${appName}.app`];
|
|
117
|
-
const bundlePath = searchPaths.find((p) => fs.existsSync(p));
|
|
118
|
-
if (!bundlePath) {
|
|
119
|
-
throw new Error(`앱 번들을 찾을 수 없습니다: ${appName} (/Applications 확인)`);
|
|
120
|
-
}
|
|
95
|
+
if (!mapping) throw new Error(`지원되지 않는 에디터입니다: ${appName} (지원: ${Object.keys(EDITOR_CLI_MAP).join(", ")})`);
|
|
96
|
+
const bundlePath = [`/Applications/${appName}.app`, `${os.homedir()}/Applications/${appName}.app`].find((p) => fs.existsSync(p));
|
|
97
|
+
if (!bundlePath) throw new Error(`앱 번들을 찾을 수 없습니다: ${appName} (/Applications 확인)`);
|
|
121
98
|
const cliBin = path.join(bundlePath, mapping.cli);
|
|
122
|
-
if (!fs.existsSync(cliBin)) {
|
|
123
|
-
throw new Error(`에디터 CLI를 찾을 수 없습니다: ${cliBin}`);
|
|
124
|
-
}
|
|
99
|
+
if (!fs.existsSync(cliBin)) throw new Error(`에디터 CLI를 찾을 수 없습니다: ${cliBin}`);
|
|
125
100
|
return {
|
|
126
101
|
bin: cliBin,
|
|
127
102
|
args: wait ? [mapping.waitFlag] : []
|
|
@@ -132,29 +107,23 @@ function runEditor(editor, filePath) {
|
|
|
132
107
|
return new Promise((resolve, reject) => {
|
|
133
108
|
const child = spawn(editor.bin, [...editor.args, filePath], { stdio: "inherit" });
|
|
134
109
|
child.on("error", (err) => {
|
|
135
|
-
reject(new Error(`에디터 실행 실패 (${editor.bin}): ${err.message}`));
|
|
110
|
+
reject(/* @__PURE__ */ new Error(`에디터 실행 실패 (${editor.bin}): ${err.message}`));
|
|
136
111
|
});
|
|
137
112
|
child.on("close", (code) => {
|
|
138
|
-
if (code === 0)
|
|
139
|
-
|
|
140
|
-
} else {
|
|
141
|
-
reject(new Error(`에디터가 비정상 종료되었습니다 (exit code: ${code})`));
|
|
142
|
-
}
|
|
113
|
+
if (code === 0) resolve();
|
|
114
|
+
else reject(/* @__PURE__ */ new Error(`에디터가 비정상 종료되었습니다 (exit code: ${code})`));
|
|
143
115
|
});
|
|
144
116
|
});
|
|
145
117
|
}
|
|
146
118
|
/** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */
|
|
147
119
|
function openSourceFile(filePath) {
|
|
148
120
|
const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(Sonamu.apiRootPath, filePath);
|
|
149
|
-
if (!fs.existsSync(absPath)) {
|
|
150
|
-
throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
151
|
-
}
|
|
121
|
+
if (!fs.existsSync(absPath)) throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
152
122
|
const editor = resolveEditorCli({ wait: false });
|
|
153
|
-
|
|
123
|
+
spawn(editor.bin, [...editor.args, absPath], {
|
|
154
124
|
stdio: "ignore",
|
|
155
125
|
detached: true
|
|
156
|
-
});
|
|
157
|
-
child.unref();
|
|
126
|
+
}).unref();
|
|
158
127
|
}
|
|
159
128
|
/** contract/rules/ 디렉터리 내 .rules.json 파일 목록 반환 */
|
|
160
129
|
function listRules() {
|
|
@@ -193,9 +162,7 @@ function listRules() {
|
|
|
193
162
|
function readRule(ruleKey) {
|
|
194
163
|
const contractDir = getContractDir();
|
|
195
164
|
const absPath = path.join(contractDir, "rules", `${ruleKey}.rules.json`);
|
|
196
|
-
if (!fs.existsSync(absPath)) {
|
|
197
|
-
throw new Error(`Rules 파일을 찾을 수 없습니다: ${ruleKey}`);
|
|
198
|
-
}
|
|
165
|
+
if (!fs.existsSync(absPath)) throw new Error(`Rules 파일을 찾을 수 없습니다: ${ruleKey}`);
|
|
199
166
|
const raw = fs.readFileSync(absPath, "utf-8");
|
|
200
167
|
const doc = JSON.parse(raw);
|
|
201
168
|
return {
|
|
@@ -210,21 +177,16 @@ function addRule(req) {
|
|
|
210
177
|
const contractDir = getContractDir();
|
|
211
178
|
const rulesDir = path.join(contractDir, "rules");
|
|
212
179
|
const absPath = path.join(rulesDir, `${req.ruleKey}.rules.json`);
|
|
213
|
-
if (!fs.existsSync(absPath)) {
|
|
214
|
-
throw new Error(`Rules 파일을 찾을 수 없습니다: ${req.ruleKey}`);
|
|
215
|
-
}
|
|
180
|
+
if (!fs.existsSync(absPath)) throw new Error(`Rules 파일을 찾을 수 없습니다: ${req.ruleKey}`);
|
|
216
181
|
const raw = fs.readFileSync(absPath, "utf-8");
|
|
217
182
|
const doc = JSON.parse(raw);
|
|
218
183
|
const rules = Array.isArray(doc.rules) ? doc.rules : [];
|
|
219
|
-
const nextId = generateNextRuleId(rules);
|
|
220
184
|
const newEntry = {
|
|
221
|
-
id:
|
|
185
|
+
id: generateNextRuleId(rules),
|
|
222
186
|
when: req.when,
|
|
223
187
|
instruction: req.instruction
|
|
224
188
|
};
|
|
225
|
-
if (req.examples && req.examples.length > 0)
|
|
226
|
-
newEntry.examples = req.examples;
|
|
227
|
-
}
|
|
189
|
+
if (req.examples && req.examples.length > 0) newEntry.examples = req.examples;
|
|
228
190
|
rules.push(newEntry);
|
|
229
191
|
doc.rules = rules;
|
|
230
192
|
fs.writeFileSync(absPath, `${JSON.stringify(doc, null, 2)}\n`, "utf-8");
|
|
@@ -274,20 +236,17 @@ function parseAcEntries(content) {
|
|
|
274
236
|
describeDepth = braceDepth;
|
|
275
237
|
}
|
|
276
238
|
const testMatch = trimmed.match(/^(?:test|it)\(["'`](.+?)["'`]/);
|
|
277
|
-
if (testMatch) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
});
|
|
282
|
-
}
|
|
239
|
+
if (testMatch) entries.push({
|
|
240
|
+
describe: currentDescribe,
|
|
241
|
+
test: testMatch[1]
|
|
242
|
+
});
|
|
283
243
|
if (!pendingTestAs && trimmed.match(/^testAs\s*\(/)) {
|
|
284
244
|
const inlineMatch = trimmed.match(/^testAs\s*\(\s*\{[^}]*\}\s*,\s*["'`](.+?)["'`]/);
|
|
285
|
-
if (inlineMatch) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
} else {
|
|
245
|
+
if (inlineMatch) entries.push({
|
|
246
|
+
describe: currentDescribe,
|
|
247
|
+
test: inlineMatch[1]
|
|
248
|
+
});
|
|
249
|
+
else {
|
|
291
250
|
pendingTestAs = true;
|
|
292
251
|
testAsBraceDepth = 0;
|
|
293
252
|
testAsNeedName = false;
|
|
@@ -308,26 +267,14 @@ function parseAcEntries(content) {
|
|
|
308
267
|
}
|
|
309
268
|
}
|
|
310
269
|
}
|
|
311
|
-
} else if (pendingTestAs) {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
const nameMatch = trimmed.match(/}\s*,\s*["'`](.+?)["'`]/);
|
|
320
|
-
if (nameMatch) {
|
|
321
|
-
entries.push({
|
|
322
|
-
describe: currentDescribe,
|
|
323
|
-
test: nameMatch[1]
|
|
324
|
-
});
|
|
325
|
-
pendingTestAs = false;
|
|
326
|
-
testAsNeedName = false;
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
} else {
|
|
330
|
-
const nameMatch = trimmed.match(/^["'`](.+?)["'`]/);
|
|
270
|
+
} else if (pendingTestAs) if (!testAsNeedName) {
|
|
271
|
+
for (const ch of trimmed) {
|
|
272
|
+
if (ch === "{") testAsBraceDepth++;
|
|
273
|
+
if (ch === "}") testAsBraceDepth--;
|
|
274
|
+
}
|
|
275
|
+
if (testAsBraceDepth <= 0) {
|
|
276
|
+
testAsNeedName = true;
|
|
277
|
+
const nameMatch = trimmed.match(/}\s*,\s*["'`](.+?)["'`]/);
|
|
331
278
|
if (nameMatch) {
|
|
332
279
|
entries.push({
|
|
333
280
|
describe: currentDescribe,
|
|
@@ -337,14 +284,22 @@ function parseAcEntries(content) {
|
|
|
337
284
|
testAsNeedName = false;
|
|
338
285
|
}
|
|
339
286
|
}
|
|
287
|
+
} else {
|
|
288
|
+
const nameMatch = trimmed.match(/^["'`](.+?)["'`]/);
|
|
289
|
+
if (nameMatch) {
|
|
290
|
+
entries.push({
|
|
291
|
+
describe: currentDescribe,
|
|
292
|
+
test: nameMatch[1]
|
|
293
|
+
});
|
|
294
|
+
pendingTestAs = false;
|
|
295
|
+
testAsNeedName = false;
|
|
296
|
+
}
|
|
340
297
|
}
|
|
341
298
|
for (const ch of trimmed) {
|
|
342
299
|
if (ch === "{") braceDepth++;
|
|
343
300
|
if (ch === "}") {
|
|
344
301
|
braceDepth--;
|
|
345
|
-
if (currentDescribe && braceDepth <= describeDepth)
|
|
346
|
-
currentDescribe = null;
|
|
347
|
-
}
|
|
302
|
+
if (currentDescribe && braceDepth <= describeDepth) currentDescribe = null;
|
|
348
303
|
}
|
|
349
304
|
}
|
|
350
305
|
}
|
|
@@ -356,25 +311,21 @@ function getAcList() {
|
|
|
356
311
|
const files = findTestFiles(projectRoot);
|
|
357
312
|
const acFiles = [];
|
|
358
313
|
for (const absPath of files) {
|
|
359
|
-
const
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
entries
|
|
365
|
-
});
|
|
366
|
-
}
|
|
314
|
+
const entries = parseAcEntries(fs.readFileSync(absPath, "utf-8"));
|
|
315
|
+
if (entries.length > 0) acFiles.push({
|
|
316
|
+
path: path.relative(projectRoot, absPath),
|
|
317
|
+
entries
|
|
318
|
+
});
|
|
367
319
|
}
|
|
368
|
-
const total = acFiles.reduce((sum, f) => sum + f.entries.length, 0);
|
|
369
320
|
return {
|
|
370
321
|
files: acFiles,
|
|
371
|
-
total
|
|
322
|
+
total: acFiles.reduce((sum, f) => sum + f.entries.length, 0)
|
|
372
323
|
};
|
|
373
324
|
}
|
|
374
325
|
/** *.test.ts 파일을 재귀 탐색 (node_modules, dist 제외) */
|
|
375
326
|
function findTestFiles(dir) {
|
|
376
327
|
const results = [];
|
|
377
|
-
const IGNORE = new Set([
|
|
328
|
+
const IGNORE = /* @__PURE__ */ new Set([
|
|
378
329
|
"node_modules",
|
|
379
330
|
"dist",
|
|
380
331
|
".git",
|
|
@@ -390,11 +341,8 @@ function findTestFiles(dir) {
|
|
|
390
341
|
for (const entry of entries) {
|
|
391
342
|
if (IGNORE.has(entry.name)) continue;
|
|
392
343
|
const fullPath = path.join(currentDir, entry.name);
|
|
393
|
-
if (entry.isDirectory())
|
|
394
|
-
|
|
395
|
-
} else if (entry.isFile() && entry.name.endsWith(".test.ts")) {
|
|
396
|
-
results.push(fullPath);
|
|
397
|
-
}
|
|
344
|
+
if (entry.isDirectory()) walk(fullPath);
|
|
345
|
+
else if (entry.isFile() && entry.name.endsWith(".test.ts")) results.push(fullPath);
|
|
398
346
|
}
|
|
399
347
|
}
|
|
400
348
|
walk(dir);
|
|
@@ -419,8 +367,8 @@ var init_cdd_service = __esmMin((() => {
|
|
|
419
367
|
}
|
|
420
368
|
};
|
|
421
369
|
}));
|
|
422
|
-
|
|
423
370
|
//#endregion
|
|
424
371
|
init_cdd_service();
|
|
425
372
|
export { addRule, editContent, getAcList, getCddTree, init_cdd_service, listRules, openSourceFile, readContent, readRule };
|
|
426
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6WyJub2RlczogQ2RkVHJlZU5vZGVbXSIsInJ1bGVzOiBDZGRSdWxlU3VtbWFyeVtdIiwicnVsZXM6IENkZFJ1bGVFbnRyeVtdIiwibmV3RW50cnk6IENkZFJ1bGVFbnRyeSIsImVudHJpZXM6IENkZEFjRW50cnlbXSIsImN1cnJlbnREZXNjcmliZTogc3RyaW5nIHwgbnVsbCIsImFjRmlsZXM6IENkZEFjRmlsZVtdIiwicmVzdWx0czogc3RyaW5nW10iLCJlbnRyaWVzOiBmcy5EaXJlbnRbXSIsIkVESVRPUl9DTElfTUFQOiBSZWNvcmQ8c3RyaW5nLCB7IGNsaTogc3RyaW5nOyB3YWl0RmxhZzogc3RyaW5nIH0+Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIENkZEFjRW50cnksXG4gIHR5cGUgQ2RkQWNGaWxlLFxuICB0eXBlIENkZEFjTGlzdFJlc3VsdCxcbiAgdHlwZSBDZGRBZGRSdWxlUmVxdWVzdCxcbiAgdHlwZSBDZGRDb250ZW50UmVzdWx0LFxuICB0eXBlIENkZEZpbGVUeXBlLFxuICB0eXBlIENkZFJ1bGVEZXRhaWwsXG4gIHR5cGUgQ2RkUnVsZUVudHJ5LFxuICB0eXBlIENkZFJ1bGVTdW1tYXJ5LFxuICB0eXBlIENkZFRyZWVOb2RlLFxufSBmcm9tIFwiLi9jZGQtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuICBDZGRBY0VudHJ5LFxuICBDZGRBY0ZpbGUsXG4gIENkZEFjTGlzdFJlc3VsdCxcbiAgQ2RkQWRkUnVsZVJlcXVlc3QsXG4gIENkZENvbnRlbnRSZXN1bHQsXG4gIENkZEZpbGVUeXBlLFxuICBDZGRSdWxlRGV0YWlsLFxuICBDZGRSdWxlRW50cnksXG4gIENkZFJ1bGVTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDtlITroZzsoJ3tirgg66Oo7Yq4IOqyveuhnCDrsJjtmZggKi9cbmZ1bmN0aW9uIGdldFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIi4uXCIsIFwiLi5cIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKSByZXR1cm4gXCJjb250cmFjdFwiO1xuICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgcmV0dXJuIFwicnVsZXNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHJlbGF0aXZlVG8pO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZGlyZWN0b3J5XCIsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUgJiYgZmlsZVR5cGUgIT09IFwicnVsZXNcIikge1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqIGNvbnRyYWN0LyDrlJTroInthLDrpqzsnZgg7Yq466asIOq1rOyhsOulvCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZGRUcmVlKCk6IHsgZXhpc3RzOiBib29sZWFuOyB0cmVlOiBDZGRUcmVlTm9kZVtdIH0ge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCB0cmVlOiBbXSB9O1xuICB9XG4gIGNvbnN0IHRyZWUgPSBzY2FuRGlyZWN0b3J5KGNvbnRyYWN0RGlyLCBjb250cmFjdERpcik7XG4gIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZSB9O1xufVxuXG4vKiog7YyM7J28IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250cmFjdC5tZCDihpIgbWFya2Rvd24g7JuQ66y4LCBydWxlcy5qc29uIOKGkiBKU09OIOusuOyekOyXtCkgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudFJlc3VsdCB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZmlsZVR5cGUgPSBkZXRlY3RGaWxlVHlwZShwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50LFxuICAgIGZpbGVUeXBlOiBmaWxlVHlwZSA/PyBcImNvbnRyYWN0XCIsXG4gIH07XG59XG5cbi8qKiDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsp4HsoJEg7Y647KeRICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdENvbnRlbnQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGVkaXRvciA9IHJlc29sdmVFZGl0b3JDbGkoKTtcbiAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgYWJzUGF0aCk7XG5cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbn1cblxuLyoqIOyXkOuUlO2EsOuzhCDslbEg67KI65OkIOuCtCBDTEkg6rK966GcICsgLS13YWl0IO2UjOuemOq3uCDrp6TtlZEgKi9cbmNvbnN0IEVESVRPUl9DTElfTUFQOiBSZWNvcmQ8c3RyaW5nLCB7IGNsaTogc3RyaW5nOyB3YWl0RmxhZzogc3RyaW5nIH0+ID0ge1xuICBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jb2RlXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIFplZDogeyBjbGk6IFwiQ29udGVudHMvTWFjT1MvY2xpXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIEN1cnNvcjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY3Vyc29yXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG59O1xuXG4vKiog7JWxIOuyiOuTpCBDTEkg6rK966Gc66W8IHJlc29sdmUuIHdhaXQ9ZmFsc2XsnbTrqbQgLS13YWl0IO2UjOuemOq3uOulvCDsg53rnrUgKi9cbmZ1bmN0aW9uIHJlc29sdmVFZGl0b3JDbGkob3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW4gfSk6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB3YWl0ID0gb3B0aW9ucz8ud2FpdCA/PyB0cnVlO1xuICBjb25zdCBhcHBOYW1lID0gU29uYW11LmNvbmZpZy5leHRlcm5hbEVkaXRvciA/PyBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiO1xuICBjb25zdCBtYXBwaW5nID0gRURJVE9SX0NMSV9NQVBbYXBwTmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IHsgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhydWxlc0RpcikpIHJldHVybiB7IHJ1bGVzOiBbXSB9O1xuXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhydWxlc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBydWxlczogQ2RkUnVsZVN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXkgPSBlbnRyeS5uYW1lLnJlcGxhY2UoL1xcLnJ1bGVzXFwuanNvbiQvLCBcIlwiKTtcbiAgICBjb25zdCByZWxQYXRoID0gYHJ1bGVzLyR7ZW50cnkubmFtZX1gO1xuICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGVudHJ5Lm5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogdW5rbm93bltdIH07XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgICAgIHJ1bGVDb3VudDogQXJyYXkuaXNBcnJheShkb2MucnVsZXMpID8gZG9jLnJ1bGVzLmxlbmd0aCA6IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IDAsXG4gICAgICAgIHBhcnNlRXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHJ1bGVzIH07XG59XG5cbi8qKiBydWxlcyDtjIzsnbwg7IOB7IS4IOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSdWxlKHJ1bGVLZXk6IHN0cmluZyk6IENkZFJ1bGVEZXRhaWwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIiwgYCR7cnVsZUtleX0ucnVsZXMuanNvbmApO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUnVsZXMg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3J1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogQ2RkUnVsZUVudHJ5W10gfTtcblxuICByZXR1cm4ge1xuICAgIGtleTogcnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgcnVsZXM6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdLFxuICB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J287JeQIOq3nOy5mSDstpTqsIAgKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRSdWxlKHJlcTogQ2RkQWRkUnVsZVJlcXVlc3QpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgYCR7cmVxLnJ1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtyZXEucnVsZUtleX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICBjb25zdCBkb2MgPSBKU09OLnBhcnNlKHJhdykgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuICBjb25zdCBydWxlczogQ2RkUnVsZUVudHJ5W10gPSBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXTtcblxuICBjb25zdCBuZXh0SWQgPSBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXMpO1xuICBjb25zdCBuZXdFbnRyeTogQ2RkUnVsZUVudHJ5ID0ge1xuICAgIGlkOiBuZXh0SWQsXG4gICAgd2hlbjogcmVxLndoZW4sXG4gICAgaW5zdHJ1Y3Rpb246IHJlcS5pbnN0cnVjdGlvbixcbiAgfTtcbiAgaWYgKHJlcS5leGFtcGxlcyAmJiByZXEuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0VudHJ5LmV4YW1wbGVzID0gcmVxLmV4YW1wbGVzO1xuICB9XG5cbiAgcnVsZXMucHVzaChuZXdFbnRyeSk7XG4gIGRvYy5ydWxlcyA9IHJ1bGVzO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoYWJzUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkoZG9jLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiByZXEucnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtyZXEucnVsZUtleX0ucnVsZXMuanNvbmAsXG4gICAgZGVzY3JpcHRpb246IHR5cGVvZiBkb2MuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzLFxuICB9O1xufVxuXG4vKiog6riw7KG0IGlkIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg64uk7J2MIOyInOuyiCBpZCDsg53shLEgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlczogQ2RkUnVsZUVudHJ5W10pOiBzdHJpbmcge1xuICBpZiAocnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJSLTAwMVwiO1xuXG4gIGNvbnN0IG51bWVyaWNQYXR0ZXJuID0gL14oLis/KShcXGQrKSQvO1xuICBsZXQgYmVzdFByZWZpeCA9IFwiUi1cIjtcbiAgbGV0IG1heE51bSA9IDA7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBudW1lcmljUGF0dGVybi5leGVjKHJ1bGUuaWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGlmIChudW0gPiBtYXhOdW0pIHtcbiAgICAgICAgYmVzdFByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgbWF4TnVtID0gbnVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHROdW0gPSBtYXhOdW0gKyAxO1xuICBjb25zdCBwYWRMZW4gPSBNYXRoLm1heCgzLCBTdHJpbmcobWF4TnVtKS5sZW5ndGgpO1xuICByZXR1cm4gYCR7YmVzdFByZWZpeH0ke1N0cmluZyhuZXh0TnVtKS5wYWRTdGFydChwYWRMZW4sIFwiMFwiKX1gO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEFDIEFQSSAobW9kdWxlcy9jZGQgYWMtbGlzdCDtjIzsi7Eg66Gc7KeBIOuzteyCrClcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogZGVzY3JpYmUvdGVzdCDtjKjthLQg7YyM7IuxICovXG5mdW5jdGlvbiBwYXJzZUFjRW50cmllcyhjb250ZW50OiBzdHJpbmcpOiBDZGRBY0VudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBDZGRBY0VudHJ5W10gPSBbXTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuXG4gIGxldCBjdXJyZW50RGVzY3JpYmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgZGVzY3JpYmVEZXB0aCA9IDA7XG4gIGxldCBicmFjZURlcHRoID0gMDtcbiAgbGV0IHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgbGV0IHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICBsZXQgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICBjb25zdCBkZXNjcmliZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXmRlc2NyaWJlXFwoW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICBpZiAoZGVzY3JpYmVNYXRjaCkge1xuICAgICAgY3VycmVudERlc2NyaWJlID0gZGVzY3JpYmVNYXRjaFsxXTtcbiAgICAgIGRlc2NyaWJlRGVwdGggPSBicmFjZURlcHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHRlc3RNYXRjaCA9IHRyaW1tZWQubWF0Y2goL14oPzp0ZXN0fGl0KVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKHRlc3RNYXRjaCkge1xuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSxcbiAgICAgICAgdGVzdDogdGVzdE1hdGNoWzFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFwZW5kaW5nVGVzdEFzICYmIHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoLykpIHtcbiAgICAgIGNvbnN0IGlubGluZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXnRlc3RBc1xccypcXChcXHMqXFx7W159XSpcXH1cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgaWYgKGlubGluZU1hdGNoKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IGlubGluZU1hdGNoWzFdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IHRydWU7XG4gICAgICAgIHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IFwie1wiKSB0ZXN0QXNCcmFjZURlcHRoKys7XG4gICAgICAgICAgaWYgKGNoID09PSBcIn1cIikgdGVzdEFzQnJhY2VEZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXN0QXNCcmFjZURlcHRoIDw9IDApIHtcbiAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvfVxccyosXFxzKltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSwgdGVzdDogbmFtZU1hdGNoWzFdIH0pO1xuICAgICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdUZXN0QXMpIHtcbiAgICAgIGlmICghdGVzdEFzTmVlZE5hbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgaWYgKGNoID09PSBcIntcIikgYnJhY2VEZXB0aCsrO1xuICAgICAgaWYgKGNoID09PSBcIn1cIikge1xuICAgICAgICBicmFjZURlcHRoLS07XG4gICAgICAgIGlmIChjdXJyZW50RGVzY3JpYmUgJiYgYnJhY2VEZXB0aCA8PSBkZXNjcmliZURlcHRoKSB7XG4gICAgICAgICAgY3VycmVudERlc2NyaWJlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOuCtCAqLnRlc3QudHMg7YyM7J287J2EIOyKpOy6lO2VmOyXrCBBQyDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNMaXN0KCk6IENkZEFjTGlzdFJlc3VsdCB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZ2V0UHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZmlsZXMgPSBmaW5kVGVzdEZpbGVzKHByb2plY3RSb290KTtcblxuICBjb25zdCBhY0ZpbGVzOiBDZGRBY0ZpbGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFic1BhdGggb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlQWNFbnRyaWVzKGNvbnRlbnQpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjRmlsZXMucHVzaCh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGFic1BhdGgpLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdG90YWwgPSBhY0ZpbGVzLnJlZHVjZSgoc3VtLCBmKSA9PiBzdW0gKyBmLmVudHJpZXMubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIHsgZmlsZXM6IGFjRmlsZXMsIHRvdGFsIH07XG59XG5cbi8qKiAqLnRlc3QudHMg7YyM7J287J2EIOyerOq3gCDtg5Dsg4kgKG5vZGVfbW9kdWxlcywgZGlzdCDsoJzsmbgpICovXG5mdW5jdGlvbiBmaW5kVGVzdEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBJR05PUkUgPSBuZXcgU2V0KFtcIm5vZGVfbW9kdWxlc1wiLCBcImRpc3RcIiwgXCIuZ2l0XCIsIFwiY29udHJhY3RcIl0pO1xuXG4gIGZ1bmN0aW9uIHdhbGsoY3VycmVudERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChJR05PUkUuaGFzKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgd2FsayhmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIudGVzdC50c1wiKSkge1xuICAgICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhbGsoZGlyKTtcbiAgcmVzdWx0cy5zb3J0KCk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFpQ0EsU0FBUyxpQkFBeUI7QUFDaEMsUUFBTyxLQUFLLEtBQUssT0FBTyxhQUFhLE1BQU0sTUFBTSxXQUFXOzs7QUFJOUQsU0FBUyxpQkFBeUI7QUFDaEMsUUFBTyxLQUFLLEtBQUssT0FBTyxhQUFhLE1BQU0sS0FBSzs7O0FBSWxELFNBQVMsd0JBQXdCLFVBQXdCO0NBQ3ZELE1BQU0sY0FBYyxnQkFBZ0I7Q0FDcEMsTUFBTSxXQUFXLEtBQUssUUFBUSxhQUFhLFNBQVM7QUFDcEQsS0FBSSxDQUFDLFNBQVMsV0FBVyxjQUFjLEtBQUssSUFBSSxJQUFJLGFBQWEsYUFBYTtBQUM1RSxRQUFNLElBQUksTUFBTSxnQ0FBZ0MsV0FBVzs7OztBQUsvRCxTQUFTLGVBQWUsVUFBMkM7QUFDakUsS0FBSSxTQUFTLFNBQVMsZUFBZSxDQUFFLFFBQU87QUFD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
|
|
373
|
+
|
|
374
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RkLXNlcnZpY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3VpL2NkZC1zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICB0eXBlIENkZEFjRW50cnksXG4gIHR5cGUgQ2RkQWNGaWxlLFxuICB0eXBlIENkZEFjTGlzdFJlc3VsdCxcbiAgdHlwZSBDZGRBZGRSdWxlUmVxdWVzdCxcbiAgdHlwZSBDZGRDb250ZW50UmVzdWx0LFxuICB0eXBlIENkZEZpbGVUeXBlLFxuICB0eXBlIENkZFJ1bGVEZXRhaWwsXG4gIHR5cGUgQ2RkUnVsZUVudHJ5LFxuICB0eXBlIENkZFJ1bGVTdW1tYXJ5LFxuICB0eXBlIENkZFRyZWVOb2RlLFxufSBmcm9tIFwiLi9jZGQtdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUge1xuICBDZGRBY0VudHJ5LFxuICBDZGRBY0ZpbGUsXG4gIENkZEFjTGlzdFJlc3VsdCxcbiAgQ2RkQWRkUnVsZVJlcXVlc3QsXG4gIENkZENvbnRlbnRSZXN1bHQsXG4gIENkZEZpbGVUeXBlLFxuICBDZGRSdWxlRGV0YWlsLFxuICBDZGRSdWxlRW50cnksXG4gIENkZFJ1bGVTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDtlITroZzsoJ3tirgg66Oo7Yq4IOqyveuhnCDrsJjtmZggKi9cbmZ1bmN0aW9uIGdldFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcIi4uXCIsIFwiLi5cIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lm1kXCIpKSByZXR1cm4gXCJjb250cmFjdFwiO1xuICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgcmV0dXJuIFwicnVsZXNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwicnVsZXNcIikgY29udGludWU7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHNjYW5EaXJlY3RvcnkoZnVsbFBhdGgsIHJlbGF0aXZlVG8pO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZGlyZWN0b3J5XCIsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUgJiYgZmlsZVR5cGUgIT09IFwicnVsZXNcIikge1xuICAgICAgICBub2Rlcy5wdXNoKHtcbiAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgICAgdHlwZTogXCJmaWxlXCIsXG4gICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBub2Rlcztcbn1cblxuLyoqIGNvbnRyYWN0LyDrlJTroInthLDrpqzsnZgg7Yq466asIOq1rOyhsOulvCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZGRUcmVlKCk6IHsgZXhpc3RzOiBib29sZWFuOyB0cmVlOiBDZGRUcmVlTm9kZVtdIH0ge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjb250cmFjdERpcikpIHtcbiAgICByZXR1cm4geyBleGlzdHM6IGZhbHNlLCB0cmVlOiBbXSB9O1xuICB9XG4gIGNvbnN0IHRyZWUgPSBzY2FuRGlyZWN0b3J5KGNvbnRyYWN0RGlyLCBjb250cmFjdERpcik7XG4gIHJldHVybiB7IGV4aXN0czogdHJ1ZSwgdHJlZSB9O1xufVxuXG4vKiog7YyM7J28IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250cmFjdC5tZCDihpIgbWFya2Rvd24g7JuQ66y4LCBydWxlcy5qc29uIOKGkiBKU09OIOusuOyekOyXtCkgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudFJlc3VsdCB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZmlsZVR5cGUgPSBkZXRlY3RGaWxlVHlwZShwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb250ZW50LFxuICAgIGZpbGVUeXBlOiBmaWxlVHlwZSA/PyBcImNvbnRyYWN0XCIsXG4gIH07XG59XG5cbi8qKiDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsp4HsoJEg7Y647KeRICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdENvbnRlbnQoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4pOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZmlsZVBhdGg6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZUNvbnRyYWN0RGlyKGZpbGVQYXRoKTtcblxuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IGVkaXRvciA9IHJlc29sdmVFZGl0b3JDbGkoKTtcbiAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgYWJzUGF0aCk7XG5cbiAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbn1cblxuLyoqIOyXkOuUlO2EsOuzhCDslbEg67KI65OkIOuCtCBDTEkg6rK966GcICsgLS13YWl0IO2UjOuemOq3uCDrp6TtlZEgKi9cbmNvbnN0IEVESVRPUl9DTElfTUFQOiBSZWNvcmQ8c3RyaW5nLCB7IGNsaTogc3RyaW5nOyB3YWl0RmxhZzogc3RyaW5nIH0+ID0ge1xuICBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jb2RlXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIFplZDogeyBjbGk6IFwiQ29udGVudHMvTWFjT1MvY2xpXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG4gIEN1cnNvcjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY3Vyc29yXCIsIHdhaXRGbGFnOiBcIi0td2FpdFwiIH0sXG59O1xuXG4vKiog7JWxIOuyiOuTpCBDTEkg6rK966Gc66W8IHJlc29sdmUuIHdhaXQ9ZmFsc2XsnbTrqbQgLS13YWl0IO2UjOuemOq3uOulvCDsg53rnrUgKi9cbmZ1bmN0aW9uIHJlc29sdmVFZGl0b3JDbGkob3B0aW9ucz86IHsgd2FpdD86IGJvb2xlYW4gfSk6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0ge1xuICBjb25zdCB3YWl0ID0gb3B0aW9ucz8ud2FpdCA/PyB0cnVlO1xuICBjb25zdCBhcHBOYW1lID0gU29uYW11LmNvbmZpZy5leHRlcm5hbEVkaXRvciA/PyBcIlZpc3VhbCBTdHVkaW8gQ29kZVwiO1xuICBjb25zdCBtYXBwaW5nID0gRURJVE9SX0NMSV9NQVBbYXBwTmFtZV07XG4gIGlmICghbWFwcGluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGDsp4Dsm5DrkJjsp4Ag7JWK64qUIOyXkOuUlO2EsOyeheuLiOuLpDogJHthcHBOYW1lfSAo7KeA7JuQOiAke09iamVjdC5rZXlzKEVESVRPUl9DTElfTUFQKS5qb2luKFwiLCBcIil9KWAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlYXJjaFBhdGhzID0gW1xuICAgIGAvQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgICBgJHtvcy5ob21lZGlyKCl9L0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gIF07XG4gIGNvbnN0IGJ1bmRsZVBhdGggPSBzZWFyY2hQYXRocy5maW5kKChwKSA9PiBmcy5leGlzdHNTeW5jKHApKTtcbiAgaWYgKCFidW5kbGVQYXRoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDslbEg67KI65Ok7J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2FwcE5hbWV9ICgvQXBwbGljYXRpb25zIO2ZleyduClgKTtcbiAgfVxuXG4gIGNvbnN0IGNsaUJpbiA9IHBhdGguam9pbihidW5kbGVQYXRoLCBtYXBwaW5nLmNsaSk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhjbGlCaW4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsl5DrlJTthLAgQ0xJ66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2NsaUJpbn1gKTtcbiAgfVxuXG4gIHJldHVybiB7IGJpbjogY2xpQmluLCBhcmdzOiB3YWl0ID8gW21hcHBpbmcud2FpdEZsYWddIDogW10gfTtcbn1cblxuLyoqIOyXkOuUlO2EsCBDTEnrpbwg7Iuk7ZaJ7ZWY6rOgIO2DreydtCDri6vtnpAg65WM6rmM7KeAIOuMgOq4sCAqL1xuZnVuY3Rpb24gcnVuRWRpdG9yKGVkaXRvcjogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSwgZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBmaWxlUGF0aF0sIHtcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiZXJyb3JcIiwgKGVycikgPT4ge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSwIOyLpO2WiSDsi6TtjKggKCR7ZWRpdG9yLmJpbn0pOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGUpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsOqwgCDruYTsoJXsg4Eg7KKF66OM65CY7JeI7Iq164uI64ukIChleGl0IGNvZGU6ICR7Y29kZX0pYCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqIOyGjOyKpCDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDsl7TquLAgKOuMgOq4sO2VmOyngCDslYrsnYwpICovXG5leHBvcnQgZnVuY3Rpb24gb3BlblNvdXJjZUZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5pc0Fic29sdXRlKGZpbGVQYXRoKSA/IGZpbGVQYXRoIDogcGF0aC5yZXNvbHZlKFNvbmFtdS5hcGlSb290UGF0aCwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgZWRpdG9yID0gcmVzb2x2ZUVkaXRvckNsaSh7IHdhaXQ6IGZhbHNlIH0pO1xuICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgYWJzUGF0aF0sIHtcbiAgICBzdGRpbzogXCJpZ25vcmVcIixcbiAgICBkZXRhY2hlZDogdHJ1ZSxcbiAgfSk7XG4gIGNoaWxkLnVucmVmKCk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUnVsZXMgQVBJXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cblxuLyoqIGNvbnRyYWN0L3J1bGVzLyDrlJTroInthLDrpqwg64K0IC5ydWxlcy5qc29uIO2MjOydvCDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFJ1bGVzKCk6IHsgcnVsZXM6IENkZFJ1bGVTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcnVsZXNEaXIgPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIik7XG4gIGlmICghZnMuZXhpc3RzU3luYyhydWxlc0RpcikpIHJldHVybiB7IHJ1bGVzOiBbXSB9O1xuXG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhydWxlc0RpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBydWxlczogQ2RkUnVsZVN1bW1hcnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgIGlmICghZW50cnkuaXNGaWxlKCkgfHwgIWVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIucnVsZXMuanNvblwiKSkgY29udGludWU7XG5cbiAgICBjb25zdCBrZXkgPSBlbnRyeS5uYW1lLnJlcGxhY2UoL1xcLnJ1bGVzXFwuanNvbiQvLCBcIlwiKTtcbiAgICBjb25zdCByZWxQYXRoID0gYHJ1bGVzLyR7ZW50cnkubmFtZX1gO1xuICAgIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4ocnVsZXNEaXIsIGVudHJ5Lm5hbWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogdW5rbm93bltdIH07XG4gICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgICAgIHJ1bGVDb3VudDogQXJyYXkuaXNBcnJheShkb2MucnVsZXMpID8gZG9jLnJ1bGVzLmxlbmd0aCA6IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICBrZXksXG4gICAgICAgIHBhdGg6IHJlbFBhdGgsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcIlwiLFxuICAgICAgICBydWxlQ291bnQ6IDAsXG4gICAgICAgIHBhcnNlRXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHJ1bGVzIH07XG59XG5cbi8qKiBydWxlcyDtjIzsnbwg7IOB7IS4IOuwmO2ZmCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRSdWxlKHJ1bGVLZXk6IHN0cmluZyk6IENkZFJ1bGVEZXRhaWwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwicnVsZXNcIiwgYCR7cnVsZUtleX0ucnVsZXMuanNvbmApO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUnVsZXMg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3J1bGVLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3QgZG9jID0gSlNPTi5wYXJzZShyYXcpIGFzIHsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IHJ1bGVzPzogQ2RkUnVsZUVudHJ5W10gfTtcblxuICByZXR1cm4ge1xuICAgIGtleTogcnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtydWxlS2V5fS5ydWxlcy5qc29uYCxcbiAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGRvYy5kZXNjcmlwdGlvbiA9PT0gXCJzdHJpbmdcIiA/IGRvYy5kZXNjcmlwdGlvbiA6IFwiXCIsXG4gICAgcnVsZXM6IEFycmF5LmlzQXJyYXkoZG9jLnJ1bGVzKSA/IGRvYy5ydWxlcyA6IFtdLFxuICB9O1xufVxuXG4vKiogcnVsZXMg7YyM7J287JeQIOq3nOy5mSDstpTqsIAgKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRSdWxlKHJlcTogQ2RkQWRkUnVsZVJlcXVlc3QpOiBDZGRSdWxlRGV0YWlsIHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBydWxlc0RpciA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJydWxlc1wiKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihydWxlc0RpciwgYCR7cmVxLnJ1bGVLZXl9LnJ1bGVzLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1bGVzIO2MjOydvOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtyZXEucnVsZUtleX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhhYnNQYXRoLCBcInV0Zi04XCIpO1xuICBjb25zdCBkb2MgPSBKU09OLnBhcnNlKHJhdykgYXMgeyBkZXNjcmlwdGlvbj86IHN0cmluZzsgcnVsZXM/OiBDZGRSdWxlRW50cnlbXSB9O1xuICBjb25zdCBydWxlczogQ2RkUnVsZUVudHJ5W10gPSBBcnJheS5pc0FycmF5KGRvYy5ydWxlcykgPyBkb2MucnVsZXMgOiBbXTtcblxuICBjb25zdCBuZXh0SWQgPSBnZW5lcmF0ZU5leHRSdWxlSWQocnVsZXMpO1xuICBjb25zdCBuZXdFbnRyeTogQ2RkUnVsZUVudHJ5ID0ge1xuICAgIGlkOiBuZXh0SWQsXG4gICAgd2hlbjogcmVxLndoZW4sXG4gICAgaW5zdHJ1Y3Rpb246IHJlcS5pbnN0cnVjdGlvbixcbiAgfTtcbiAgaWYgKHJlcS5leGFtcGxlcyAmJiByZXEuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0VudHJ5LmV4YW1wbGVzID0gcmVxLmV4YW1wbGVzO1xuICB9XG5cbiAgcnVsZXMucHVzaChuZXdFbnRyeSk7XG4gIGRvYy5ydWxlcyA9IHJ1bGVzO1xuXG4gIGZzLndyaXRlRmlsZVN5bmMoYWJzUGF0aCwgYCR7SlNPTi5zdHJpbmdpZnkoZG9jLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiByZXEucnVsZUtleSxcbiAgICBwYXRoOiBgcnVsZXMvJHtyZXEucnVsZUtleX0ucnVsZXMuanNvbmAsXG4gICAgZGVzY3JpcHRpb246IHR5cGVvZiBkb2MuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgPyBkb2MuZGVzY3JpcHRpb24gOiBcIlwiLFxuICAgIHJ1bGVzLFxuICB9O1xufVxuXG4vKiog6riw7KG0IGlkIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg64uk7J2MIOyInOuyiCBpZCDsg53shLEgKi9cbmZ1bmN0aW9uIGdlbmVyYXRlTmV4dFJ1bGVJZChydWxlczogQ2RkUnVsZUVudHJ5W10pOiBzdHJpbmcge1xuICBpZiAocnVsZXMubGVuZ3RoID09PSAwKSByZXR1cm4gXCJSLTAwMVwiO1xuXG4gIGNvbnN0IG51bWVyaWNQYXR0ZXJuID0gL14oLis/KShcXGQrKSQvO1xuICBsZXQgYmVzdFByZWZpeCA9IFwiUi1cIjtcbiAgbGV0IG1heE51bSA9IDA7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBudW1lcmljUGF0dGVybi5leGVjKHJ1bGUuaWQpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY29uc3QgcHJlZml4ID0gbWF0Y2hbMV07XG4gICAgICBjb25zdCBudW0gPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0sIDEwKTtcbiAgICAgIGlmIChudW0gPiBtYXhOdW0pIHtcbiAgICAgICAgYmVzdFByZWZpeCA9IHByZWZpeDtcbiAgICAgICAgbWF4TnVtID0gbnVtO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5leHROdW0gPSBtYXhOdW0gKyAxO1xuICBjb25zdCBwYWRMZW4gPSBNYXRoLm1heCgzLCBTdHJpbmcobWF4TnVtKS5sZW5ndGgpO1xuICByZXR1cm4gYCR7YmVzdFByZWZpeH0ke1N0cmluZyhuZXh0TnVtKS5wYWRTdGFydChwYWRMZW4sIFwiMFwiKX1gO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEFDIEFQSSAobW9kdWxlcy9jZGQgYWMtbGlzdCDtjIzsi7Eg66Gc7KeBIOuzteyCrClcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogZGVzY3JpYmUvdGVzdCDtjKjthLQg7YyM7IuxICovXG5mdW5jdGlvbiBwYXJzZUFjRW50cmllcyhjb250ZW50OiBzdHJpbmcpOiBDZGRBY0VudHJ5W10ge1xuICBjb25zdCBlbnRyaWVzOiBDZGRBY0VudHJ5W10gPSBbXTtcbiAgY29uc3QgbGluZXMgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpO1xuXG4gIGxldCBjdXJyZW50RGVzY3JpYmU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBsZXQgZGVzY3JpYmVEZXB0aCA9IDA7XG4gIGxldCBicmFjZURlcHRoID0gMDtcbiAgbGV0IHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgbGV0IHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICBsZXQgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG5cbiAgICBjb25zdCBkZXNjcmliZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXmRlc2NyaWJlXFwoW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICBpZiAoZGVzY3JpYmVNYXRjaCkge1xuICAgICAgY3VycmVudERlc2NyaWJlID0gZGVzY3JpYmVNYXRjaFsxXTtcbiAgICAgIGRlc2NyaWJlRGVwdGggPSBicmFjZURlcHRoO1xuICAgIH1cblxuICAgIGNvbnN0IHRlc3RNYXRjaCA9IHRyaW1tZWQubWF0Y2goL14oPzp0ZXN0fGl0KVxcKFtcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgaWYgKHRlc3RNYXRjaCkge1xuICAgICAgZW50cmllcy5wdXNoKHtcbiAgICAgICAgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSxcbiAgICAgICAgdGVzdDogdGVzdE1hdGNoWzFdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFwZW5kaW5nVGVzdEFzICYmIHRyaW1tZWQubWF0Y2goL150ZXN0QXNcXHMqXFwoLykpIHtcbiAgICAgIGNvbnN0IGlubGluZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvXnRlc3RBc1xccypcXChcXHMqXFx7W159XSpcXH1cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgaWYgKGlubGluZU1hdGNoKSB7XG4gICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IGlubGluZU1hdGNoWzFdIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IHRydWU7XG4gICAgICAgIHRlc3RBc0JyYWNlRGVwdGggPSAwO1xuICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRyaW1tZWQpIHtcbiAgICAgICAgICBpZiAoY2ggPT09IFwie1wiKSB0ZXN0QXNCcmFjZURlcHRoKys7XG4gICAgICAgICAgaWYgKGNoID09PSBcIn1cIikgdGVzdEFzQnJhY2VEZXB0aC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXN0QXNCcmFjZURlcHRoIDw9IDApIHtcbiAgICAgICAgICB0ZXN0QXNOZWVkTmFtZSA9IHRydWU7XG4gICAgICAgICAgY29uc3QgbmFtZU1hdGNoID0gdHJpbW1lZC5tYXRjaCgvfVxccyosXFxzKltcIidgXSguKz8pW1wiJ2BdLyk7XG4gICAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgZGVzY3JpYmU6IGN1cnJlbnREZXNjcmliZSwgdGVzdDogbmFtZU1hdGNoWzFdIH0pO1xuICAgICAgICAgICAgcGVuZGluZ1Rlc3RBcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHBlbmRpbmdUZXN0QXMpIHtcbiAgICAgIGlmICghdGVzdEFzTmVlZE5hbWUpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0cmltbWVkKSB7XG4gICAgICAgICAgaWYgKGNoID09PSBcIntcIikgdGVzdEFzQnJhY2VEZXB0aCsrO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJ9XCIpIHRlc3RBc0JyYWNlRGVwdGgtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGVzdEFzQnJhY2VEZXB0aCA8PSAwKSB7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IG5hbWVNYXRjaCA9IHRyaW1tZWQubWF0Y2goL31cXHMqLFxccypbXCInYF0oLis/KVtcIidgXS8pO1xuICAgICAgICAgIGlmIChuYW1lTWF0Y2gpIHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICAgIHBlbmRpbmdUZXN0QXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlc3RBc05lZWROYW1lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuYW1lTWF0Y2ggPSB0cmltbWVkLm1hdGNoKC9eW1wiJ2BdKC4rPylbXCInYF0vKTtcbiAgICAgICAgaWYgKG5hbWVNYXRjaCkge1xuICAgICAgICAgIGVudHJpZXMucHVzaCh7IGRlc2NyaWJlOiBjdXJyZW50RGVzY3JpYmUsIHRlc3Q6IG5hbWVNYXRjaFsxXSB9KTtcbiAgICAgICAgICBwZW5kaW5nVGVzdEFzID0gZmFsc2U7XG4gICAgICAgICAgdGVzdEFzTmVlZE5hbWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2ggb2YgdHJpbW1lZCkge1xuICAgICAgaWYgKGNoID09PSBcIntcIikgYnJhY2VEZXB0aCsrO1xuICAgICAgaWYgKGNoID09PSBcIn1cIikge1xuICAgICAgICBicmFjZURlcHRoLS07XG4gICAgICAgIGlmIChjdXJyZW50RGVzY3JpYmUgJiYgYnJhY2VEZXB0aCA8PSBkZXNjcmliZURlcHRoKSB7XG4gICAgICAgICAgY3VycmVudERlc2NyaWJlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKiog7ZSE66Gc7KCd7Yq4IOuCtCAqLnRlc3QudHMg7YyM7J287J2EIOyKpOy6lO2VmOyXrCBBQyDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWNMaXN0KCk6IENkZEFjTGlzdFJlc3VsdCB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZ2V0UHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZmlsZXMgPSBmaW5kVGVzdEZpbGVzKHByb2plY3RSb290KTtcblxuICBjb25zdCBhY0ZpbGVzOiBDZGRBY0ZpbGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGFic1BhdGggb2YgZmlsZXMpIHtcbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gICAgY29uc3QgZW50cmllcyA9IHBhcnNlQWNFbnRyaWVzKGNvbnRlbnQpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGFjRmlsZXMucHVzaCh7XG4gICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIGFic1BhdGgpLFxuICAgICAgICBlbnRyaWVzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdG90YWwgPSBhY0ZpbGVzLnJlZHVjZSgoc3VtLCBmKSA9PiBzdW0gKyBmLmVudHJpZXMubGVuZ3RoLCAwKTtcbiAgcmV0dXJuIHsgZmlsZXM6IGFjRmlsZXMsIHRvdGFsIH07XG59XG5cbi8qKiAqLnRlc3QudHMg7YyM7J287J2EIOyerOq3gCDtg5Dsg4kgKG5vZGVfbW9kdWxlcywgZGlzdCDsoJzsmbgpICovXG5mdW5jdGlvbiBmaW5kVGVzdEZpbGVzKGRpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBJR05PUkUgPSBuZXcgU2V0KFtcIm5vZGVfbW9kdWxlc1wiLCBcImRpc3RcIiwgXCIuZ2l0XCIsIFwiY29udHJhY3RcIl0pO1xuXG4gIGZ1bmN0aW9uIHdhbGsoY3VycmVudERpcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IGVudHJpZXM6IGZzLkRpcmVudFtdO1xuICAgIHRyeSB7XG4gICAgICBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMoY3VycmVudERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChJR05PUkUuaGFzKGVudHJ5Lm5hbWUpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGN1cnJlbnREaXIsIGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgd2FsayhmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIudGVzdC50c1wiKSkge1xuICAgICAgICByZXN1bHRzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHdhbGsoZGlyKTtcbiAgcmVzdWx0cy5zb3J0KCk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQWlDQSxTQUFTLGlCQUF5QjtDQUNoQyxPQUFPLEtBQUssS0FBSyxPQUFPLGFBQWEsTUFBTSxNQUFNLFVBQVU7QUFDN0Q7O0FBR0EsU0FBUyxpQkFBeUI7Q0FDaEMsT0FBTyxLQUFLLEtBQUssT0FBTyxhQUFhLE1BQU0sSUFBSTtBQUNqRDs7QUFHQSxTQUFTLHdCQUF3QixVQUF3QjtDQUN2RCxNQUFNLGNBQWMsZUFBZTtDQUNuQyxNQUFNLFdBQVcsS0FBSyxRQUFRLGFBQWEsUUFBUTtDQUNuRCxJQUFJLENBQUMsU0FBUyxXQUFXLGNBQWMsS0FBSyxHQUFHLEtBQUssYUFBYSxhQUMvRCxNQUFNLElBQUksTUFBTSxnQ0FBZ0MsVUFBVTtBQUU5RDs7QUFHQSxTQUFTLGVBQWUsVUFBMkM7Q0FDakUsSUFBSSxTQUFTLFNBQVMsY0FBYyxHQUFHLE9BQU87Q0FDOUMsSUFBSSxTQUFTLFNBQVMsYUFBYSxHQUFHLE9BQU87QUFFL0M7O0FBR0EsU0FBUyxjQUFjLFNBQWlCLFlBQW1DO0NBQ3pFLE1BQU0sVUFBVSxHQUFHLFlBQVksU0FBUyxFQUFFLGVBQWUsS0FBSyxDQUFDO0NBQy9ELE1BQU0sUUFBdUIsQ0FBQztDQUU5QixLQUFLLE1BQU0sU0FBUyxTQUFTO0VBQzNCLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxNQUFNLElBQUk7RUFDOUMsTUFBTSxVQUFVLEtBQUssU0FBUyxZQUFZLFFBQVE7RUFFbEQsSUFBSSxNQUFNLFlBQVksR0FBRztHQUN2QixJQUFJLE1BQU0s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
|
package/dist/ui/cdd-types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {};
|