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
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import inflection from "inflection";
|
|
2
|
+
export class StepWrapper {
|
|
3
|
+
#stepApi;
|
|
4
|
+
constructor(stepApi){
|
|
5
|
+
this.#stepApi = stepApi;
|
|
6
|
+
}
|
|
7
|
+
get(...args) {
|
|
8
|
+
let config;
|
|
9
|
+
let fn;
|
|
10
|
+
if (args.length === 2) {
|
|
11
|
+
const [rawObject, methodName] = args;
|
|
12
|
+
const method = rawObject[methodName];
|
|
13
|
+
config = {
|
|
14
|
+
name: inflection.underscore(methodName.toString())
|
|
15
|
+
};
|
|
16
|
+
fn = (...args)=>method.bind(rawObject)(...args);
|
|
17
|
+
} else {
|
|
18
|
+
const [rawConfig, rawObject, name] = args;
|
|
19
|
+
const method = rawObject[name];
|
|
20
|
+
config = {
|
|
21
|
+
name: rawConfig.name ?? inflection.underscore(name.toString())
|
|
22
|
+
};
|
|
23
|
+
fn = (...args)=>method.bind(rawObject)(...args);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
run: ((stepApi)=>{
|
|
27
|
+
return (...args)=>{
|
|
28
|
+
return stepApi.run(config, ()=>fn(...args));
|
|
29
|
+
};
|
|
30
|
+
})(this.#stepApi)
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
sleep(name, duration) {
|
|
34
|
+
return this.#stepApi.sleep(name, duration);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy9zdGVwLXdyYXBwZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBEdXJhdGlvblN0cmluZywgU3RlcEFwaSB9IGZyb20gXCJAc29uYW11LWtpdC90YXNrcy9pbnRlcm5hbFwiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PiA9ICguLi5hcmdzOiBUQXJncykgPT4gVFJlc3VsdDtcbmV4cG9ydCB0eXBlIFJ1bm5hYmxlU3RlcDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSB7XG4gIHJ1bjogU3RlcEZ1bmN0aW9uPFRBcmdzLCBQcm9taXNlPFRSZXN1bHQ+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIE1ldGhvZE5hbWVzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBfVFJlc3VsdFxuICA/IFRLZXlcbiAgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgTWV0aG9kQXJndW1lbnRzPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIC4uLmFyZ3M6IGluZmVyIFRBcmdzXG4pID0+IHVua25vd25cbiAgPyBUQXJnc1xuICA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBNZXRob2RSZXR1cm5UeXBlPFQsIFRLZXkgZXh0ZW5kcyBrZXlvZiBUPiA9IFRbVEtleV0gZXh0ZW5kcyAoXG4gIHRoaXM6IFQsXG4gIC4uLmFyZ3M6IGluZmVyIF9UQXJnc1xuKSA9PiBpbmZlciBUUmVzdWx0XG4gID8gVFJlc3VsdFxuICA6IG5ldmVyO1xuXG5leHBvcnQgY2xhc3MgU3RlcFdyYXBwZXIge1xuICByZWFkb25seSAjc3RlcEFwaTogU3RlcEFwaTtcblxuICBjb25zdHJ1Y3RvcihzdGVwQXBpOiBTdGVwQXBpKSB7XG4gICAgdGhpcy4jc3RlcEFwaSA9IHN0ZXBBcGk7XG4gIH1cblxuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihjb25maWc6IHsgbmFtZTogc3RyaW5nIH0sIG9iamVjdDogVCwgbmFtZTogTWV0aG9kTmFtZXM8VCwgVEtleT4pOiBSdW5uYWJsZVN0ZXA8VEFyZ3MsIFRSZXN1bHQ+O1xuICBnZXQ8XG4gICAgVCxcbiAgICBUS2V5IGV4dGVuZHMga2V5b2YgVCxcbiAgICBUQXJncyBleHRlbmRzIE1ldGhvZEFyZ3VtZW50czxULCBUS2V5PixcbiAgICBUUmVzdWx0IGV4dGVuZHMgTWV0aG9kUmV0dXJuVHlwZTxULCBUS2V5PixcbiAgPihvYmplY3Q6IFQsIG5hbWU6IE1ldGhvZE5hbWVzPFQsIFRLZXk+KTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PjtcbiAgZ2V0PFxuICAgIFQsXG4gICAgVEtleSBleHRlbmRzIGtleW9mIFQsXG4gICAgVEFyZ3MgZXh0ZW5kcyBNZXRob2RBcmd1bWVudHM8VCwgVEtleT4sXG4gICAgVFJlc3VsdCBleHRlbmRzIE1ldGhvZFJldHVyblR5cGU8VCwgVEtleT4sXG4gID4oXG4gICAgLi4uYXJnczogW3sgbmFtZTogc3RyaW5nIH0sIFQsIE1ldGhvZE5hbWVzPFQsIFRLZXk+XSB8IFtULCBNZXRob2ROYW1lczxULCBUS2V5Pl1cbiAgKTogUnVubmFibGVTdGVwPFRBcmdzLCBUUmVzdWx0PiB7XG4gICAgbGV0IGNvbmZpZzogeyBuYW1lOiBzdHJpbmcgfTtcbiAgICBsZXQgZm46IFN0ZXBGdW5jdGlvbjxUQXJncywgRXhjbHVkZTxUUmVzdWx0LCBuZXZlcj4+O1xuXG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCBbcmF3T2JqZWN0LCBtZXRob2ROYW1lXSA9IGFyZ3M7XG4gICAgICBjb25zdCBtZXRob2QgPSByYXdPYmplY3RbbWV0aG9kTmFtZV0gYXMgQ2FsbGFibGVGdW5jdGlvbjtcbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogaW5mbGVjdGlvbi51bmRlcnNjb3JlKG1ldGhvZE5hbWUudG9TdHJpbmcoKSkgfTtcblxuICAgICAgZm4gPSAoLi4uYXJnczogVEFyZ3MpID0+IG1ldGhvZC5iaW5kKHJhd09iamVjdCkoLi4uYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtyYXdDb25maWcsIHJhd09iamVjdCwgbmFtZV0gPSBhcmdzO1xuICAgICAgY29uc3QgbWV0aG9kID0gcmF3T2JqZWN0W25hbWVdIGFzIENhbGxhYmxlRnVuY3Rpb247XG5cbiAgICAgIGNvbmZpZyA9IHsgbmFtZTogcmF3Q29uZmlnLm5hbWUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKG5hbWUudG9TdHJpbmcoKSkgfTtcbiAgICAgIGZuID0gKC4uLmFyZ3M6IFRBcmdzKSA9PiBtZXRob2QuYmluZChyYXdPYmplY3QpKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBydW46ICgoc3RlcEFwaTogU3RlcEFwaSkgPT4ge1xuICAgICAgICByZXR1cm4gKC4uLmFyZ3M6IFRBcmdzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXBBcGkucnVuKGNvbmZpZywgKCkgPT4gZm4oLi4uYXJncykpO1xuICAgICAgICB9O1xuICAgICAgfSkodGhpcy4jc3RlcEFwaSksXG4gICAgfTtcbiAgfVxuXG4gIHNsZWVwKG5hbWU6IHN0cmluZywgZHVyYXRpb246IER1cmF0aW9uU3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI3N0ZXBBcGkuc2xlZXAobmFtZSwgZHVyYXRpb24pO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsIlN0ZXBXcmFwcGVyIiwic3RlcEFwaSIsImdldCIsImFyZ3MiLCJjb25maWciLCJmbiIsImxlbmd0aCIsInJhd09iamVjdCIsIm1ldGhvZE5hbWUiLCJtZXRob2QiLCJuYW1lIiwidW5kZXJzY29yZSIsInRvU3RyaW5nIiwiYmluZCIsInJhd0NvbmZpZyIsInJ1biIsInNsZWVwIiwiZHVyYXRpb24iXSwibWFwcGluZ3MiOiJBQUNBLE9BQU9BLGdCQUFnQixhQUFhO0FBMEJwQyxPQUFPLE1BQU1DO0lBQ0YsQ0FBQSxPQUFRLENBQVU7SUFFM0IsWUFBWUMsT0FBZ0IsQ0FBRTtRQUM1QixJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdBO0lBQ2xCO0lBY0FDLElBTUUsR0FBR0MsSUFBNkUsRUFDbEQ7UUFDOUIsSUFBSUM7UUFDSixJQUFJQztRQUVKLElBQUlGLEtBQUtHLE1BQU0sS0FBSyxHQUFHO1lBQ3JCLE1BQU0sQ0FBQ0MsV0FBV0MsV0FBVyxHQUFHTDtZQUNoQyxNQUFNTSxTQUFTRixTQUFTLENBQUNDLFdBQVc7WUFDcENKLFNBQVM7Z0JBQUVNLE1BQU1YLFdBQVdZLFVBQVUsQ0FBQ0gsV0FBV0ksUUFBUTtZQUFJO1lBRTlEUCxLQUFLLENBQUMsR0FBR0YsT0FBZ0JNLE9BQU9JLElBQUksQ0FBQ04sY0FBY0o7UUFDckQsT0FBTztZQUNMLE1BQU0sQ0FBQ1csV0FBV1AsV0FBV0csS0FBSyxHQUFHUDtZQUNyQyxNQUFNTSxTQUFTRixTQUFTLENBQUNHLEtBQUs7WUFFOUJOLFNBQVM7Z0JBQUVNLE1BQU1JLFVBQVVKLElBQUksSUFBSVgsV0FBV1ksVUFBVSxDQUFDRCxLQUFLRSxRQUFRO1lBQUk7WUFDMUVQLEtBQUssQ0FBQyxHQUFHRixPQUFnQk0sT0FBT0ksSUFBSSxDQUFDTixjQUFjSjtRQUNyRDtRQUVBLE9BQU87WUFDTFksS0FBSyxBQUFDLENBQUEsQ0FBQ2Q7Z0JBQ0wsT0FBTyxDQUFDLEdBQUdFO29CQUNULE9BQU9GLFFBQVFjLEdBQUcsQ0FBQ1gsUUFBUSxJQUFNQyxNQUFNRjtnQkFDekM7WUFDRixDQUFBLEVBQUcsSUFBSSxDQUFDLENBQUEsT0FBUTtRQUNsQjtJQUNGO0lBRUFhLE1BQU1OLElBQVksRUFBRU8sUUFBd0IsRUFBRTtRQUM1QyxPQUFPLElBQUksQ0FBQyxDQUFBLE9BQVEsQ0FBQ0QsS0FBSyxDQUFDTixNQUFNTztJQUNuQztBQUNGIn0=
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { RunnableWorkflow, SchemaInput, SchemaOutput, StandardSchemaV1, WorkflowRunHandle, WorkflowSpec } from "@sonamu-kit/tasks/internal";
|
|
2
|
+
import type { Knex } from "knex";
|
|
3
|
+
import type { WorkflowMetadata } from "./decorator";
|
|
4
|
+
import { StepWrapper } from "./step-wrapper";
|
|
5
|
+
export interface WorkflowOptions {
|
|
6
|
+
concurrency?: number;
|
|
7
|
+
usePubSub?: boolean;
|
|
8
|
+
listenDelay?: number;
|
|
9
|
+
}
|
|
10
|
+
export type WorkflowFunction<Input, Output> = (params: Readonly<{
|
|
11
|
+
input: Input;
|
|
12
|
+
step: StepWrapper;
|
|
13
|
+
version: string | null;
|
|
14
|
+
}>) => Promise<Output> | Output;
|
|
15
|
+
export type WorkflowCreateOptions<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined> = Omit<WorkflowSpec<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>, "version"> & {
|
|
16
|
+
id: string;
|
|
17
|
+
version: string | null;
|
|
18
|
+
function: WorkflowFunction<SchemaOutput<TSchema, Input>, Output>;
|
|
19
|
+
};
|
|
20
|
+
export declare class WorkflowManager {
|
|
21
|
+
#private;
|
|
22
|
+
private constructor();
|
|
23
|
+
/**
|
|
24
|
+
* 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
|
|
25
|
+
*/
|
|
26
|
+
synchronize(workflowMap: Map<string, WorkflowMetadata[]>): Promise<void>;
|
|
27
|
+
run<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: Omit<WorkflowCreateOptions<Input, Output, TSchema>, "function" | "schema" | "id">, input: SchemaInput<TSchema, Input>): Promise<WorkflowRunHandle<Output>>;
|
|
28
|
+
scheduleTask(workflow: Pick<WorkflowMetadata, "id" | "name" | "version">, schedule: WorkflowMetadata["schedules"][number]): Promise<void>;
|
|
29
|
+
unscheduleTask(name: string): Promise<void>;
|
|
30
|
+
registerWorkflow<Input, Output, TSchema extends StandardSchemaV1 | undefined = undefined>(options: WorkflowCreateOptions<Input, Output, TSchema>): RunnableWorkflow<SchemaOutput<TSchema, Input>, Output, SchemaInput<TSchema, Input>>;
|
|
31
|
+
unregisterWorkflow(workflow: Pick<WorkflowMetadata, "name" | "version" | "id">): Promise<void>;
|
|
32
|
+
setupWorker(options: WorkflowOptions): Promise<void>;
|
|
33
|
+
stopWorker(): Promise<void>;
|
|
34
|
+
stopSchedules(): Promise<void>;
|
|
35
|
+
destroySchedules(): Promise<void>;
|
|
36
|
+
destroy(): Promise<void>;
|
|
37
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
38
|
+
static create(dbConf: Knex.Config, runMigrations?: boolean): Promise<WorkflowManager>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=workflow-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-manager.d.ts","sourceRoot":"","sources":["../../src/tasks/workflow-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAEhB,iBAAiB,EACjB,YAAY,EACb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,WAAW,eAAe;IAE9B,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,SAAS,CAAC,EAAE,OAAO,CAAC;IAGpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,IAAI,CAC5C,MAAM,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC,KACC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAG9B,MAAM,MAAM,qBAAqB,CAC/B,KAAK,EACL,MAAM,EACN,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,IACtD,IAAI,CACN,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAC/E,SAAS,CACV,GAAG;IACF,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;CAClE,CAAC;AAEF,qBAAa,eAAe;;IAuB1B,OAAO;IAQP;;OAEG;IACG,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAqF9D,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACzE,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,EAC1F,KAAK,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,GACjC,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAW/B,YAAY,CAChB,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC,EAC3D,QAAQ,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IA8B3C,cAAc,CAAC,IAAI,EAAE,MAAM;IAajC,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAS,gBAAgB,GAAG,SAAS,GAAG,SAAS,EACtF,OAAO,EAAE,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,GACrD,gBAAgB,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IA4ChF,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAK9E,WAAW,CAAC,OAAO,EAAE,eAAe;IAMpC,UAAU;IAKV,aAAa;IAOb,gBAAgB;IAOhB,OAAO;IAOb,CAAC,MAAM,CAAC,YAAY,CAAC;WAKR,MAAM,CACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,eAAe,CAAC;CAI5B"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { BackendPostgres, OpenWorkflow } from "@sonamu-kit/tasks";
|
|
2
|
+
import assert from "assert";
|
|
3
|
+
import { schedule as cronSchedule } from "node-cron";
|
|
4
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
5
|
+
import { Naite } from "../naite/naite.js";
|
|
6
|
+
import { createMockSSEFactory } from "../stream/sse.js";
|
|
7
|
+
import { StepWrapper } from "./step-wrapper.js";
|
|
8
|
+
export class WorkflowManager {
|
|
9
|
+
// backend 인스턴스
|
|
10
|
+
#backend;
|
|
11
|
+
// OpenWorkflow 인스턴스
|
|
12
|
+
#ow;
|
|
13
|
+
// Worker 인스턴스 (없을 수 있으며, 이 때는 분산된 서버 환경에서 DB에 publish만 한다고 가정함)
|
|
14
|
+
#worker;
|
|
15
|
+
// 파일 경로 -> 파일에 정의된 워크플로우 메타데이터 목록
|
|
16
|
+
#workflowsMap;
|
|
17
|
+
// Task 이름 -> Task 정보 및 Input 값, Workflow ID
|
|
18
|
+
#scheduledTasks;
|
|
19
|
+
constructor(backend){
|
|
20
|
+
this.#backend = backend;
|
|
21
|
+
this.#ow = new OpenWorkflow({
|
|
22
|
+
backend
|
|
23
|
+
});
|
|
24
|
+
this.#worker = null;
|
|
25
|
+
this.#workflowsMap = new Map();
|
|
26
|
+
this.#scheduledTasks = new Map();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 정의된 워크플로우 및 워크플로우에 대한 scheduled tasks를 동기화합니다.
|
|
30
|
+
*/ async synchronize(workflowMap) {
|
|
31
|
+
// 1. 삭제된 파일은 일괄 삭제
|
|
32
|
+
await Promise.allSettled(Array.from(this.#workflowsMap.entries()).filter(([key])=>!workflowMap.has(key)).flatMap(([_, workflows])=>workflows.map((workflow)=>{
|
|
33
|
+
return Promise.allSettled([
|
|
34
|
+
...workflow.schedules.map((schedule)=>this.unscheduleTask(schedule.name)),
|
|
35
|
+
this.unregisterWorkflow(workflow)
|
|
36
|
+
]);
|
|
37
|
+
})));
|
|
38
|
+
// 2. 새로 추가된 파일은 일괄 등록
|
|
39
|
+
await Promise.allSettled(Array.from(workflowMap.entries()).filter(([key])=>!this.#workflowsMap.has(key)).flatMap(([_, workflows])=>workflows.map((workflow)=>{
|
|
40
|
+
this.registerWorkflow({
|
|
41
|
+
id: workflow.id,
|
|
42
|
+
name: workflow.name,
|
|
43
|
+
version: workflow.version ?? null,
|
|
44
|
+
schema: workflow.schema,
|
|
45
|
+
function: workflow.fn
|
|
46
|
+
});
|
|
47
|
+
return Promise.allSettled(workflow.schedules.map((schedule)=>this.scheduleTask(workflow, schedule)));
|
|
48
|
+
})));
|
|
49
|
+
// 3. 기존과 다른 것을 diff친 다음, 삭제 후 재등록
|
|
50
|
+
await Promise.allSettled(Array.from(workflowMap.entries()).filter(([key])=>this.#workflowsMap.has(key)).map(([key, newWorkflows])=>{
|
|
51
|
+
const previousWorkflows = this.#workflowsMap.get(key);
|
|
52
|
+
assert(previousWorkflows, "previous workflows not found");
|
|
53
|
+
return [
|
|
54
|
+
key,
|
|
55
|
+
[
|
|
56
|
+
previousWorkflows,
|
|
57
|
+
newWorkflows
|
|
58
|
+
]
|
|
59
|
+
];
|
|
60
|
+
}).map(async ([_, [previousWorkflows, newWorkflows]])=>{
|
|
61
|
+
// 기존 것들을 삭제부터 해야함.
|
|
62
|
+
await Promise.allSettled(previousWorkflows.filter((prevItem)=>!newWorkflows.some((newItem)=>newItem.id === prevItem.id)).map((prevItem)=>{
|
|
63
|
+
return Promise.allSettled([
|
|
64
|
+
...prevItem.schedules.map((schedule)=>this.unscheduleTask(schedule.name)),
|
|
65
|
+
this.unregisterWorkflow(prevItem)
|
|
66
|
+
]);
|
|
67
|
+
}));
|
|
68
|
+
// 새로 추가된 것들을 등록
|
|
69
|
+
await Promise.allSettled(newWorkflows.filter((newItem)=>!previousWorkflows.some((prevItem)=>prevItem.id === newItem.id)).map(async (newItem)=>{
|
|
70
|
+
this.registerWorkflow({
|
|
71
|
+
id: newItem.id,
|
|
72
|
+
name: newItem.name,
|
|
73
|
+
version: newItem.version ?? null,
|
|
74
|
+
schema: newItem.schema,
|
|
75
|
+
function: newItem.fn
|
|
76
|
+
});
|
|
77
|
+
return Promise.allSettled(newItem.schedules.map((schedule)=>this.scheduleTask(newItem, schedule)));
|
|
78
|
+
}));
|
|
79
|
+
}));
|
|
80
|
+
this.#workflowsMap = workflowMap;
|
|
81
|
+
}
|
|
82
|
+
// 워크플로우를 실행
|
|
83
|
+
run(options, input) {
|
|
84
|
+
return this.#ow.runWorkflow({
|
|
85
|
+
name: options.name,
|
|
86
|
+
version: options.version ?? undefined
|
|
87
|
+
}, input);
|
|
88
|
+
}
|
|
89
|
+
// cron task를 등록
|
|
90
|
+
async scheduleTask(workflow, schedule) {
|
|
91
|
+
const task = cronSchedule(schedule.expression, (async ({ name, version }, { input })=>{
|
|
92
|
+
const inputData = await (typeof input === "function" ? Promise.resolve(input()) : Promise.resolve(input));
|
|
93
|
+
return this.run({
|
|
94
|
+
name,
|
|
95
|
+
version: version ?? null
|
|
96
|
+
}, inputData);
|
|
97
|
+
}).bind(this, workflow, schedule), {
|
|
98
|
+
name: schedule.name,
|
|
99
|
+
timezone: Sonamu.config.api.timezone,
|
|
100
|
+
noOverlap: false
|
|
101
|
+
});
|
|
102
|
+
this.#scheduledTasks.set(schedule.name, {
|
|
103
|
+
task,
|
|
104
|
+
inputFn: schedule.input,
|
|
105
|
+
workflowId: workflow.id
|
|
106
|
+
});
|
|
107
|
+
await task.start();
|
|
108
|
+
}
|
|
109
|
+
// cron task를 중지
|
|
110
|
+
async unscheduleTask(name) {
|
|
111
|
+
const taskItem = this.#scheduledTasks.get(name);
|
|
112
|
+
if (!taskItem) {
|
|
113
|
+
console.error("scheduled task not found", name);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.#scheduledTasks.delete(name);
|
|
117
|
+
await taskItem.task.stop();
|
|
118
|
+
await taskItem.task.destroy();
|
|
119
|
+
}
|
|
120
|
+
// 워크플로우를 등록, 관련된 스케줄은 별도로 등록해야 함.
|
|
121
|
+
registerWorkflow(options) {
|
|
122
|
+
const fn = async (params)=>{
|
|
123
|
+
const baseContext = {
|
|
124
|
+
request: null,
|
|
125
|
+
reply: null,
|
|
126
|
+
headers: {},
|
|
127
|
+
createSSE: (schema)=>createMockSSEFactory(schema),
|
|
128
|
+
naiteStore: Naite.createStore(),
|
|
129
|
+
user: null,
|
|
130
|
+
passport: {
|
|
131
|
+
login: async ()=>{},
|
|
132
|
+
logout: ()=>{}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const contextProvider = Sonamu.config.tasks?.contextProvider;
|
|
136
|
+
const context = contextProvider ? await Promise.resolve(contextProvider(baseContext)) : baseContext;
|
|
137
|
+
const step = new StepWrapper(params.step);
|
|
138
|
+
return Sonamu.asyncLocalStorage.run({
|
|
139
|
+
context
|
|
140
|
+
}, ()=>options.function({
|
|
141
|
+
input: params.input,
|
|
142
|
+
step,
|
|
143
|
+
version: params.version
|
|
144
|
+
}));
|
|
145
|
+
};
|
|
146
|
+
const workflow = this.#ow.defineWorkflow({
|
|
147
|
+
name: options.name,
|
|
148
|
+
version: options.version ?? undefined,
|
|
149
|
+
schema: options.schema
|
|
150
|
+
}, fn);
|
|
151
|
+
return workflow;
|
|
152
|
+
}
|
|
153
|
+
// 워크플로우를 등록 해제, 관련된 스케줄은 별도로 해제해야 함.
|
|
154
|
+
async unregisterWorkflow(workflow) {
|
|
155
|
+
this.#ow.unregisterWorkflow(workflow.name, workflow.version ?? null);
|
|
156
|
+
}
|
|
157
|
+
// Worker를 설정 후 시작
|
|
158
|
+
async setupWorker(options) {
|
|
159
|
+
this.#worker = this.#ow.newWorker(options);
|
|
160
|
+
await this.#worker.start();
|
|
161
|
+
}
|
|
162
|
+
// Worker를 중지
|
|
163
|
+
async stopWorker() {
|
|
164
|
+
await this.#worker?.stop();
|
|
165
|
+
}
|
|
166
|
+
// cron task들을 모두 중지
|
|
167
|
+
async stopSchedules() {
|
|
168
|
+
await Promise.allSettled(Array.from(this.#scheduledTasks.values()).map(({ task })=>Promise.resolve(task.stop())));
|
|
169
|
+
}
|
|
170
|
+
// cron task들을 모두 정리
|
|
171
|
+
async destroySchedules() {
|
|
172
|
+
await Promise.allSettled(Array.from(this.#scheduledTasks.values()).map(({ task })=>Promise.resolve(task.destroy())));
|
|
173
|
+
this.#scheduledTasks.clear();
|
|
174
|
+
}
|
|
175
|
+
async destroy() {
|
|
176
|
+
await this.stopSchedules();
|
|
177
|
+
await this.stopWorker();
|
|
178
|
+
await this.destroySchedules();
|
|
179
|
+
await this.#backend.stop();
|
|
180
|
+
}
|
|
181
|
+
[Symbol.asyncDispose]() {
|
|
182
|
+
return this.destroy();
|
|
183
|
+
}
|
|
184
|
+
// BackendPostgres에서 처리하는 것들이 있어서 Knex 커넥션이 아니라 설정값을 넣어줘야함.
|
|
185
|
+
static async create(dbConf, runMigrations = true) {
|
|
186
|
+
const backend = await BackendPostgres.connect(dbConf, {
|
|
187
|
+
runMigrations
|
|
188
|
+
});
|
|
189
|
+
return new WorkflowManager(backend);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YXNrcy93b3JrZmxvdy1tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhY2tlbmRQb3N0Z3JlcywgT3BlbldvcmtmbG93LCB0eXBlIFdvcmtlciB9IGZyb20gXCJAc29uYW11LWtpdC90YXNrc1wiO1xuaW1wb3J0IHR5cGUge1xuICBSdW5uYWJsZVdvcmtmbG93LFxuICBTY2hlbWFJbnB1dCxcbiAgU2NoZW1hT3V0cHV0LFxuICBTdGFuZGFyZFNjaGVtYVYxLFxuICBTdGVwQXBpLFxuICBXb3JrZmxvd1J1bkhhbmRsZSxcbiAgV29ya2Zsb3dTcGVjLFxufSBmcm9tIFwiQHNvbmFtdS1raXQvdGFza3MvaW50ZXJuYWxcIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IHNjaGVkdWxlIGFzIGNyb25TY2hlZHVsZSwgdHlwZSBTY2hlZHVsZWRUYXNrIH0gZnJvbSBcIm5vZGUtY3JvblwiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi4vYXBpL2NvbnRleHRcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1NTRUZhY3RvcnkgfSBmcm9tIFwiLi4vc3RyZWFtL3NzZVwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjdXRhYmxlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tIFwiLi9kZWNvcmF0b3JcIjtcbmltcG9ydCB7IFN0ZXBXcmFwcGVyIH0gZnJvbSBcIi4vc3RlcC13cmFwcGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPcHRpb25zIHtcbiAgLy8gd29ya2Vy7JeQ7IScIOuPmeyLnCDsi6TtlontlaAg7YOc7Iqk7YGsIOyImCwg6riw67O47J2AIENQVSDsvZTslrQg7IiYIC0gMeqwnFxuICBjb25jdXJyZW5jeT86IG51bWJlcjtcblxuICAvLyB3b3JrZXLsl5DshJwg7IKs7Jqp7ZWgIHB1Yi9zdWIg7Jes67aALCDquLDrs7jsnYAgdHJ1ZVxuICB1c2VQdWJTdWI/OiBib29sZWFuO1xuXG4gIC8vIHB1Yi9zdWLsnLzroZwg7YOc7Iqk7YGs66W8IOyImOyLoO2WiOydhCDrlYwg7JuM7YGs7ZSM66Gc7JqwIOyLpO2Wieq5jOyngCDsp4Dsl7Ag7Iuc6rCELCDquLDrs7jsnYAgNTAwbXNcbiAgbGlzdGVuRGVsYXk/OiBudW1iZXI7XG59XG5cbi8vIFdvcmtmbG93IO2VqOyImOydmCDtg4DsnoUsIEBzb25hbXUta2l0L3Rhc2tz7JmAIOuLpOuluCDsoJDsnYAgc3RlcOydhCDtlZzrsogg6rCQ7Iu8IO2Yle2DnC5cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248SW5wdXQsIE91dHB1dD4gPSAoXG4gIHBhcmFtczogUmVhZG9ubHk8e1xuICAgIGlucHV0OiBJbnB1dDtcbiAgICBzdGVwOiBTdGVwV3JhcHBlcjtcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsO1xuICB9PixcbikgPT4gUHJvbWlzZTxPdXRwdXQ+IHwgT3V0cHV0O1xuXG4vLyBXb3JrZmxvd+ulvCDrk7HroZ3tlaAg65WM66W8IOychO2VnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFdvcmtmbG93Q3JlYXRlT3B0aW9uczxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVFNjaGVtYSBleHRlbmRzIFN0YW5kYXJkU2NoZW1hVjEgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4+ID0gT21pdDxcbiAgV29ya2Zsb3dTcGVjPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PixcbiAgXCJ2ZXJzaW9uXCJcbj4gJiB7XG4gIGlkOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gIGZ1bmN0aW9uOiBXb3JrZmxvd0Z1bmN0aW9uPFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dD47XG59O1xuXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dNYW5hZ2VyIHtcbiAgLy8gYmFja2VuZCDsnbjsiqTthLTsiqRcbiAgcmVhZG9ubHkgI2JhY2tlbmQ6IEJhY2tlbmRQb3N0Z3JlcztcblxuICAvLyBPcGVuV29ya2Zsb3cg7J247Iqk7YS07IqkXG4gIHJlYWRvbmx5ICNvdzogT3BlbldvcmtmbG93O1xuXG4gIC8vIFdvcmtlciDsnbjsiqTthLTsiqQgKOyXhuydhCDsiJgg7J6I7Jy866mwLCDsnbQg65WM64qUIOu2hOyCsOuQnCDshJzrsoQg7ZmY6rK97JeQ7IScIERC7JeQIHB1Ymxpc2jrp4wg7ZWc64uk6rOgIOqwgOygle2VqClcbiAgI3dvcmtlcjogV29ya2VyIHwgbnVsbDtcblxuICAvLyDtjIzsnbwg6rK966GcIC0+IO2MjOydvOyXkCDsoJXsnZjrkJwg7JuM7YGs7ZSM66Gc7JqwIOuplO2DgOuNsOydtO2EsCDrqqnroZ1cbiAgI3dvcmtmbG93c01hcDogTWFwPHN0cmluZywgV29ya2Zsb3dNZXRhZGF0YVtdPjtcblxuICAvLyBUYXNrIOydtOumhCAtPiBUYXNrIOygleuztCDrsI8gSW5wdXQg6rCSLCBXb3JrZmxvdyBJRFxuICAjc2NoZWR1bGVkVGFza3M6IE1hcDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgdGFzazogU2NoZWR1bGVkVGFzaztcbiAgICAgIGlucHV0Rm46IEV4ZWN1dGFibGU8U2NoZW1hSW5wdXQ8dW5rbm93biwgdW5rbm93bj4+O1xuICAgICAgd29ya2Zsb3dJZDogc3RyaW5nO1xuICAgIH1cbiAgPjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhY2tlbmQ6IEJhY2tlbmRQb3N0Z3Jlcykge1xuICAgIHRoaXMuI2JhY2tlbmQgPSBiYWNrZW5kO1xuICAgIHRoaXMuI293ID0gbmV3IE9wZW5Xb3JrZmxvdyh7IGJhY2tlbmQgfSk7XG4gICAgdGhpcy4jd29ya2VyID0gbnVsbDtcbiAgICB0aGlzLiN3b3JrZmxvd3NNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MgPSBuZXcgTWFwKCk7XG4gIH1cblxuICAvKipcbiAgICog7KCV7J2Y65CcIOybjO2BrO2UjOuhnOyasCDrsI8g7JuM7YGs7ZSM66Gc7Jqw7JeQIOuMgO2VnCBzY2hlZHVsZWQgdGFza3Prpbwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgc3luY2hyb25pemUod29ya2Zsb3dNYXA6IE1hcDxzdHJpbmcsIFdvcmtmbG93TWV0YWRhdGFbXT4pIHtcbiAgICAvLyAxLiDsgq3soJzrkJwg7YyM7J287J2AIOydvOq0hCDsgq3soJxcbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBBcnJheS5mcm9tKHRoaXMuI3dvcmtmbG93c01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiAhd29ya2Zsb3dNYXAuaGFzKGtleSkpXG4gICAgICAgIC5mbGF0TWFwKChbXywgd29ya2Zsb3dzXSkgPT5cbiAgICAgICAgICB3b3JrZmxvd3MubWFwKCh3b3JrZmxvdykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgICAgICAgIC4uLndvcmtmbG93LnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnVuc2NoZWR1bGVUYXNrKHNjaGVkdWxlLm5hbWUpKSxcbiAgICAgICAgICAgICAgdGhpcy51bnJlZ2lzdGVyV29ya2Zsb3cod29ya2Zsb3cpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIDIuIOyDiOuhnCDstpTqsIDrkJwg7YyM7J287J2AIOydvOq0hCDrk7HroZ1cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBBcnJheS5mcm9tKHdvcmtmbG93TWFwLmVudHJpZXMoKSlcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+ICF0aGlzLiN3b3JrZmxvd3NNYXAuaGFzKGtleSkpXG4gICAgICAgIC5mbGF0TWFwKChbXywgd29ya2Zsb3dzXSkgPT5cbiAgICAgICAgICB3b3JrZmxvd3MubWFwKCh3b3JrZmxvdykgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcldvcmtmbG93KHtcbiAgICAgICAgICAgICAgaWQ6IHdvcmtmbG93LmlkLFxuICAgICAgICAgICAgICBuYW1lOiB3b3JrZmxvdy5uYW1lLFxuICAgICAgICAgICAgICB2ZXJzaW9uOiB3b3JrZmxvdy52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgICAgICAgIHNjaGVtYTogd29ya2Zsb3cuc2NoZW1hLFxuICAgICAgICAgICAgICBmdW5jdGlvbjogd29ya2Zsb3cuZm4sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgICAgd29ya2Zsb3cuc2NoZWR1bGVzLm1hcCgoc2NoZWR1bGUpID0+IHRoaXMuc2NoZWR1bGVUYXNrKHdvcmtmbG93LCBzY2hlZHVsZSkpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICApO1xuXG4gICAgLy8gMy4g6riw7KG06rO8IOuLpOuluCDqsoPsnYQgZGlmZuy5nCDri6TsnYwsIOyCreygnCDtm4Qg7J6s65Ox66GdXG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh3b3JrZmxvd01hcC5lbnRyaWVzKCkpXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiB0aGlzLiN3b3JrZmxvd3NNYXAuaGFzKGtleSkpXG4gICAgICAgIC5tYXA8W3N0cmluZywgW1dvcmtmbG93TWV0YWRhdGFbXSwgV29ya2Zsb3dNZXRhZGF0YVtdXV0+KChba2V5LCBuZXdXb3JrZmxvd3NdKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNXb3JrZmxvd3MgPSB0aGlzLiN3b3JrZmxvd3NNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgYXNzZXJ0KHByZXZpb3VzV29ya2Zsb3dzLCBcInByZXZpb3VzIHdvcmtmbG93cyBub3QgZm91bmRcIik7XG4gICAgICAgICAgcmV0dXJuIFtrZXksIFtwcmV2aW91c1dvcmtmbG93cywgbmV3V29ya2Zsb3dzXV07XG4gICAgICAgIH0pXG4gICAgICAgIC5tYXAoYXN5bmMgKFtfLCBbcHJldmlvdXNXb3JrZmxvd3MsIG5ld1dvcmtmbG93c11dKSA9PiB7XG4gICAgICAgICAgLy8g6riw7KG0IOqyg+uTpOydhCDsgq3soJzrtoDthLAg7ZW07JW87ZWoLlxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIHByZXZpb3VzV29ya2Zsb3dzXG4gICAgICAgICAgICAgIC5maWx0ZXIoKHByZXZJdGVtKSA9PiAhbmV3V29ya2Zsb3dzLnNvbWUoKG5ld0l0ZW0pID0+IG5ld0l0ZW0uaWQgPT09IHByZXZJdGVtLmlkKSlcbiAgICAgICAgICAgICAgLm1hcCgocHJldkl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgICAgICAgICAgIC4uLnByZXZJdGVtLnNjaGVkdWxlcy5tYXAoKHNjaGVkdWxlKSA9PiB0aGlzLnVuc2NoZWR1bGVUYXNrKHNjaGVkdWxlLm5hbWUpKSxcbiAgICAgICAgICAgICAgICAgIHRoaXMudW5yZWdpc3RlcldvcmtmbG93KHByZXZJdGVtKSxcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIOyDiOuhnCDstpTqsIDrkJwg6rKD65Ok7J2EIOuTseuhnVxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgICAgIG5ld1dvcmtmbG93c1xuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChuZXdJdGVtKSA9PiAhcHJldmlvdXNXb3JrZmxvd3Muc29tZSgocHJldkl0ZW0pID0+IHByZXZJdGVtLmlkID09PSBuZXdJdGVtLmlkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAubWFwKGFzeW5jIChuZXdJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcldvcmtmbG93KHtcbiAgICAgICAgICAgICAgICAgIGlkOiBuZXdJdGVtLmlkLFxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3SXRlbS5uYW1lLFxuICAgICAgICAgICAgICAgICAgdmVyc2lvbjogbmV3SXRlbS52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICBzY2hlbWE6IG5ld0l0ZW0uc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgZnVuY3Rpb246IG5ld0l0ZW0uZm4sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICAgICAgICAgICAgbmV3SXRlbS5zY2hlZHVsZXMubWFwKChzY2hlZHVsZSkgPT4gdGhpcy5zY2hlZHVsZVRhc2sobmV3SXRlbSwgc2NoZWR1bGUpKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgdGhpcy4jd29ya2Zsb3dzTWFwID0gd29ya2Zsb3dNYXA7XG4gIH1cblxuICAvLyDsm4ztgaztlIzroZzsmrDrpbwg7Iuk7ZaJXG4gIHJ1bjxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogT21pdDxXb3JrZmxvd0NyZWF0ZU9wdGlvbnM8SW5wdXQsIE91dHB1dCwgVFNjaGVtYT4sIFwiZnVuY3Rpb25cIiB8IFwic2NoZW1hXCIgfCBcImlkXCI+LFxuICAgIGlucHV0OiBTY2hlbWFJbnB1dDxUU2NoZW1hLCBJbnB1dD4sXG4gICk6IFByb21pc2U8V29ya2Zsb3dSdW5IYW5kbGU8T3V0cHV0Pj4ge1xuICAgIHJldHVybiB0aGlzLiNvdy5ydW5Xb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICAgIGlucHV0LFxuICAgICk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrpbwg65Ox66GdXG4gIGFzeW5jIHNjaGVkdWxlVGFzayhcbiAgICB3b3JrZmxvdzogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcImlkXCIgfCBcIm5hbWVcIiB8IFwidmVyc2lvblwiPixcbiAgICBzY2hlZHVsZTogV29ya2Zsb3dNZXRhZGF0YVtcInNjaGVkdWxlc1wiXVtudW1iZXJdLFxuICApIHtcbiAgICBjb25zdCB0YXNrID0gY3JvblNjaGVkdWxlKFxuICAgICAgc2NoZWR1bGUuZXhwcmVzc2lvbixcbiAgICAgIChhc3luYyAoXG4gICAgICAgIHsgbmFtZSwgdmVyc2lvbiB9OiBQaWNrPFdvcmtmbG93TWV0YWRhdGEsIFwibmFtZVwiIHwgXCJ2ZXJzaW9uXCI+LFxuICAgICAgICB7IGlucHV0IH06IFdvcmtmbG93TWV0YWRhdGFbXCJzY2hlZHVsZXNcIl1bbnVtYmVyXSxcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBpbnB1dERhdGEgPSBhd2FpdCAodHlwZW9mIGlucHV0ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICA/IFByb21pc2UucmVzb2x2ZShpbnB1dCgpKVxuICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKGlucHV0KSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuKHsgbmFtZSwgdmVyc2lvbjogdmVyc2lvbiA/PyBudWxsIH0sIGlucHV0RGF0YSk7XG4gICAgICB9KS5iaW5kKHRoaXMsIHdvcmtmbG93LCBzY2hlZHVsZSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6IHNjaGVkdWxlLm5hbWUsXG4gICAgICAgIHRpbWV6b25lOiBTb25hbXUuY29uZmlnLmFwaS50aW1lem9uZSxcbiAgICAgICAgbm9PdmVybGFwOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuI3NjaGVkdWxlZFRhc2tzLnNldChzY2hlZHVsZS5uYW1lLCB7XG4gICAgICB0YXNrLFxuICAgICAgaW5wdXRGbjogc2NoZWR1bGUuaW5wdXQsXG4gICAgICB3b3JrZmxvd0lkOiB3b3JrZmxvdy5pZCxcbiAgICB9KTtcbiAgICBhd2FpdCB0YXNrLnN0YXJ0KCk7XG4gIH1cblxuICAvLyBjcm9uIHRhc2vrpbwg7KSR7KeAXG4gIGFzeW5jIHVuc2NoZWR1bGVUYXNrKG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRhc2tJdGVtID0gdGhpcy4jc2NoZWR1bGVkVGFza3MuZ2V0KG5hbWUpO1xuICAgIGlmICghdGFza0l0ZW0pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJzY2hlZHVsZWQgdGFzayBub3QgZm91bmRcIiwgbmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy4jc2NoZWR1bGVkVGFza3MuZGVsZXRlKG5hbWUpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suc3RvcCgpO1xuICAgIGF3YWl0IHRhc2tJdGVtLnRhc2suZGVzdHJveSgpO1xuICB9XG5cbiAgLy8g7JuM7YGs7ZSM66Gc7Jqw66W8IOuTseuhnSwg6rSA66Co65CcIOyKpOy8gOykhOydgCDrs4Trj4TroZwg65Ox66Gd7ZW07JW8IO2VqC5cbiAgcmVnaXN0ZXJXb3JrZmxvdzxJbnB1dCwgT3V0cHV0LCBUU2NoZW1hIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWFWMSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgb3B0aW9uczogV29ya2Zsb3dDcmVhdGVPcHRpb25zPElucHV0LCBPdXRwdXQsIFRTY2hlbWE+LFxuICApOiBSdW5uYWJsZVdvcmtmbG93PFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD4sIE91dHB1dCwgU2NoZW1hSW5wdXQ8VFNjaGVtYSwgSW5wdXQ+PiB7XG4gICAgY29uc3QgZm4gPSBhc3luYyAoXG4gICAgICBwYXJhbXM6IFJlYWRvbmx5PHtcbiAgICAgICAgaW5wdXQ6IFNjaGVtYU91dHB1dDxUU2NoZW1hLCBJbnB1dD47XG4gICAgICAgIHN0ZXA6IFN0ZXBBcGk7XG4gICAgICAgIHZlcnNpb246IHN0cmluZyB8IG51bGw7XG4gICAgICB9PixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGJhc2VDb250ZXh0ID0ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICB1c2VyOiBudWxsLFxuICAgICAgICBwYXNzcG9ydDoge1xuICAgICAgICAgIGxvZ2luOiBhc3luYyAoKSA9PiB7fSxcbiAgICAgICAgICBsb2dvdXQ6ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfSBhcyB1bmtub3duIGFzIENvbnRleHQ7XG5cbiAgICAgIGNvbnN0IGNvbnRleHRQcm92aWRlciA9IFNvbmFtdS5jb25maWcudGFza3M/LmNvbnRleHRQcm92aWRlcjtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSBjb250ZXh0UHJvdmlkZXJcbiAgICAgICAgPyBhd2FpdCBQcm9taXNlLnJlc29sdmUoY29udGV4dFByb3ZpZGVyKGJhc2VDb250ZXh0KSlcbiAgICAgICAgOiBiYXNlQ29udGV4dDtcblxuICAgICAgY29uc3Qgc3RlcCA9IG5ldyBTdGVwV3JhcHBlcihwYXJhbXMuc3RlcCk7XG4gICAgICByZXR1cm4gU29uYW11LmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgKCkgPT5cbiAgICAgICAgb3B0aW9ucy5mdW5jdGlvbih7IGlucHV0OiBwYXJhbXMuaW5wdXQsIHN0ZXAsIHZlcnNpb246IHBhcmFtcy52ZXJzaW9uIH0pLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd29ya2Zsb3cgPSB0aGlzLiNvdy5kZWZpbmVXb3JrZmxvdyhcbiAgICAgIHtcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gPz8gdW5kZWZpbmVkLFxuICAgICAgICBzY2hlbWE6IG9wdGlvbnMuc2NoZW1hLFxuICAgICAgfSxcbiAgICAgIGZuLFxuICAgICk7XG4gICAgcmV0dXJuIHdvcmtmbG93O1xuICB9XG5cbiAgLy8g7JuM7YGs7ZSM66Gc7Jqw66W8IOuTseuhnSDtlbTsoJwsIOq0gOugqOuQnCDsiqTsvIDspITsnYAg67OE64+E66GcIO2VtOygnO2VtOyVvCDtlaguXG4gIGFzeW5jIHVucmVnaXN0ZXJXb3JrZmxvdyh3b3JrZmxvdzogUGljazxXb3JrZmxvd01ldGFkYXRhLCBcIm5hbWVcIiB8IFwidmVyc2lvblwiIHwgXCJpZFwiPikge1xuICAgIHRoaXMuI293LnVucmVnaXN0ZXJXb3JrZmxvdyh3b3JrZmxvdy5uYW1lLCB3b3JrZmxvdy52ZXJzaW9uID8/IG51bGwpO1xuICB9XG5cbiAgLy8gV29ya2Vy66W8IOyEpOyglSDtm4Qg7Iuc7J6RXG4gIGFzeW5jIHNldHVwV29ya2VyKG9wdGlvbnM6IFdvcmtmbG93T3B0aW9ucykge1xuICAgIHRoaXMuI3dvcmtlciA9IHRoaXMuI293Lm5ld1dvcmtlcihvcHRpb25zKTtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXIuc3RhcnQoKTtcbiAgfVxuXG4gIC8vIFdvcmtlcuulvCDspJHsp4BcbiAgYXN5bmMgc3RvcFdvcmtlcigpIHtcbiAgICBhd2FpdCB0aGlzLiN3b3JrZXI/LnN0b3AoKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KSR7KeAXG4gIGFzeW5jIHN0b3BTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suc3RvcCgpKSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNyb24gdGFza+uTpOydhCDrqqjrkZAg7KCV66asXG4gIGFzeW5jIGRlc3Ryb3lTY2hlZHVsZXMoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgQXJyYXkuZnJvbSh0aGlzLiNzY2hlZHVsZWRUYXNrcy52YWx1ZXMoKSkubWFwKCh7IHRhc2sgfSkgPT4gUHJvbWlzZS5yZXNvbHZlKHRhc2suZGVzdHJveSgpKSksXG4gICAgKTtcbiAgICB0aGlzLiNzY2hlZHVsZWRUYXNrcy5jbGVhcigpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICBhd2FpdCB0aGlzLnN0b3BTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN0b3BXb3JrZXIoKTtcbiAgICBhd2FpdCB0aGlzLmRlc3Ryb3lTY2hlZHVsZXMoKTtcbiAgICBhd2FpdCB0aGlzLiNiYWNrZW5kLnN0b3AoKTtcbiAgfVxuXG4gIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpIHtcbiAgICByZXR1cm4gdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICAvLyBCYWNrZW5kUG9zdGdyZXPsl5DshJwg7LKY66as7ZWY64qUIOqyg+uTpOydtCDsnojslrTshJwgS25leCDsu6TrhKXshZjsnbQg7JWE64uI6528IOyEpOygleqwkuydhCDrhKPslrTspJjslbztlaguXG4gIHN0YXRpYyBhc3luYyBjcmVhdGUoXG4gICAgZGJDb25mOiBLbmV4LkNvbmZpZyxcbiAgICBydW5NaWdyYXRpb25zOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogUHJvbWlzZTxXb3JrZmxvd01hbmFnZXI+IHtcbiAgICBjb25zdCBiYWNrZW5kID0gYXdhaXQgQmFja2VuZFBvc3RncmVzLmNvbm5lY3QoZGJDb25mLCB7IHJ1bk1pZ3JhdGlvbnMgfSk7XG4gICAgcmV0dXJuIG5ldyBXb3JrZmxvd01hbmFnZXIoYmFja2VuZCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJCYWNrZW5kUG9zdGdyZXMiLCJPcGVuV29ya2Zsb3ciLCJhc3NlcnQiLCJzY2hlZHVsZSIsImNyb25TY2hlZHVsZSIsIlNvbmFtdSIsIk5haXRlIiwiY3JlYXRlTW9ja1NTRUZhY3RvcnkiLCJTdGVwV3JhcHBlciIsIldvcmtmbG93TWFuYWdlciIsImJhY2tlbmQiLCJNYXAiLCJzeW5jaHJvbml6ZSIsIndvcmtmbG93TWFwIiwiUHJvbWlzZSIsImFsbFNldHRsZWQiLCJBcnJheSIsImZyb20iLCJlbnRyaWVzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwiZmxhdE1hcCIsIl8iLCJ3b3JrZmxvd3MiLCJtYXAiLCJ3b3JrZmxvdyIsInNjaGVkdWxlcyIsInVuc2NoZWR1bGVUYXNrIiwibmFtZSIsInVucmVnaXN0ZXJXb3JrZmxvdyIsInJlZ2lzdGVyV29ya2Zsb3ciLCJpZCIsInZlcnNpb24iLCJzY2hlbWEiLCJmdW5jdGlvbiIsImZuIiwic2NoZWR1bGVUYXNrIiwibmV3V29ya2Zsb3dzIiwicHJldmlvdXNXb3JrZmxvd3MiLCJnZXQiLCJwcmV2SXRlbSIsInNvbWUiLCJuZXdJdGVtIiwicnVuIiwib3B0aW9ucyIsImlucHV0IiwicnVuV29ya2Zsb3ciLCJ1bmRlZmluZWQiLCJ0YXNrIiwiZXhwcmVzc2lvbiIsImlucHV0RGF0YSIsInJlc29sdmUiLCJiaW5kIiwidGltZXpvbmUiLCJjb25maWciLCJhcGkiLCJub092ZXJsYXAiLCJzZXQiLCJpbnB1dEZuIiwid29ya2Zsb3dJZCIsInN0YXJ0IiwidGFza0l0ZW0iLCJjb25zb2xlIiwiZXJyb3IiLCJkZWxldGUiLCJzdG9wIiwiZGVzdHJveSIsInBhcmFtcyIsImJhc2VDb250ZXh0IiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsIm5haXRlU3RvcmUiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJwYXNzcG9ydCIsImxvZ2luIiwibG9nb3V0IiwiY29udGV4dFByb3ZpZGVyIiwidGFza3MiLCJjb250ZXh0Iiwic3RlcCIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZGVmaW5lV29ya2Zsb3ciLCJzZXR1cFdvcmtlciIsIm5ld1dvcmtlciIsInN0b3BXb3JrZXIiLCJzdG9wU2NoZWR1bGVzIiwidmFsdWVzIiwiZGVzdHJveVNjaGVkdWxlcyIsImNsZWFyIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiY3JlYXRlIiwiZGJDb25mIiwicnVuTWlncmF0aW9ucyIsImNvbm5lY3QiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsRUFBRUMsWUFBWSxRQUFxQixvQkFBb0I7QUFVL0UsT0FBT0MsWUFBWSxTQUFTO0FBRTVCLFNBQVNDLFlBQVlDLFlBQVksUUFBNEIsWUFBWTtBQUd6RSxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0Msb0JBQW9CLFFBQVEsbUJBQWdCO0FBR3JELFNBQVNDLFdBQVcsUUFBUSxvQkFBaUI7QUFvQzdDLE9BQU8sTUFBTUM7SUFDWCxlQUFlO0lBQ04sQ0FBQSxPQUFRLENBQWtCO0lBRW5DLG9CQUFvQjtJQUNYLENBQUEsRUFBRyxDQUFlO0lBRTNCLGdFQUFnRTtJQUNoRSxDQUFBLE1BQU8sQ0FBZ0I7SUFFdkIsa0NBQWtDO0lBQ2xDLENBQUEsWUFBYSxDQUFrQztJQUUvQyw0Q0FBNEM7SUFDNUMsQ0FBQSxjQUFlLENBT2I7SUFFRixZQUFvQkMsT0FBd0IsQ0FBRTtRQUM1QyxJQUFJLENBQUMsQ0FBQSxPQUFRLEdBQUdBO1FBQ2hCLElBQUksQ0FBQyxDQUFBLEVBQUcsR0FBRyxJQUFJ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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"generated.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated.template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKlD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AACF,qBAAa,mBAAoB,SAAQ,QAAQ;;IAK/C,gBAAgB;;;;IAOhB,MAAM;;;;;;;IAmGN,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAqBrD,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,EAAO,GAAG,UAAU;IA6G9E,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAgD9D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;CA8CvD"}
|
|
@@ -163,13 +163,17 @@ export class Template__generated extends Template {
|
|
|
163
163
|
* - relation이 아니거나, relation이어도 nullable이면 포함
|
|
164
164
|
*/ const hasDefaultColumns = entity.props.filter((prop)=>(prop.type !== "relation" || prop.nullable === true) && (prop.nullable === true || prop.type !== "relation" && prop.dbDefault !== undefined)).map((prop)=>prop.type === "relation" ? `${prop.name}_id` : prop.name).concat("id");
|
|
165
165
|
/**
|
|
166
|
+
* hasVector props
|
|
167
|
+
* - vector 타입인 컬럼
|
|
168
|
+
*/ const hasVectorColumns = entity.props.filter((prop)=>prop.type === "vector" || prop.type === "vector[]").map((prop)=>prop.name);
|
|
169
|
+
/**
|
|
166
170
|
* generated props
|
|
167
171
|
* - generated 속성이 있는 컬럼 (INSERT/UPDATE 시 값 제공 불가)
|
|
168
172
|
*/ const generatedColumns = entity.props.filter((prop)=>prop.type !== "relation" && prop.generated !== undefined).map((prop)=>prop.name);
|
|
169
|
-
const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0;
|
|
173
|
+
const hasMetadata = fulltextColumns.length > 0 || virtualProps.length > 0 || hasDefaultColumns.length > 0 || generatedColumns.length > 0 || hasVectorColumns.length > 0;
|
|
170
174
|
const lines = [
|
|
171
175
|
`export const ${schemaName} = ${schemaBody};`,
|
|
172
|
-
`export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col)=>`"${col}"`).join(", ")}],` : "")}}` : "") + ";"
|
|
176
|
+
`export type ${schemaName} = z.infer<typeof ${schemaName}>` + (hasMetadata ? ` & {${(fulltextColumns.length > 0 ? `readonly __fulltext__: readonly [${fulltextColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (virtualProps.length > 0 ? `readonly __virtual__: readonly [${virtualProps.map((prop)=>`"${prop}"`).join(", ")}],` : "") + (hasDefaultColumns.length > 0 ? `readonly __hasDefault__: readonly [${hasDefaultColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (generatedColumns.length > 0 ? `readonly __generated__: readonly [${generatedColumns.map((col)=>`"${col}"`).join(", ")}],` : "") + (hasVectorColumns.length > 0 ? `readonly __vector__: readonly [${hasVectorColumns.map((col)=>`"${col}"`).join(", ")}],` : "")}}` : "") + ";"
|
|
173
177
|
];
|
|
174
178
|
return {
|
|
175
179
|
label: `BaseSchema: ${entity.id}`,
|
|
@@ -257,4 +261,4 @@ z.object({
|
|
|
257
261
|
}
|
|
258
262
|
}
|
|
259
263
|
|
|
260
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSwgaXNWaXJ0dWFsUHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJ6QXJyYXlhYmxlXCIsXG4gICAgICBcIlNRTERhdGVUaW1lU3RyaW5nXCIsXG4gICAgICBcIlN1YnNldFF1ZXJ5XCIsXG4gICAgICBcIlNvbmFtdVF1ZXJ5TW9kZVwiLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHMuam9pbihcIixcIil9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBnZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBFbnVtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAgIC5maWx0ZXIoKFtfLCBlbnVtTGFiZWxdKSA9PiBPYmplY3Qua2V5cyhlbnVtTGFiZWwpLmxlbmd0aCA+IDApXG4gICAgICAgICAgLmZsYXRNYXAoKFtlbnVtSWQsIGVudW1MYWJlbF0pID0+IFtcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgICAoZWwpID0+IGBcIiR7ZWx9XCJgLFxuICAgICAgICAgICAgKX1dKS5kZXNjcmliZShcIiR7ZW51bUlkfVwiKTtgLFxuICAgICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9TGFiZWwgPSAke0pTT04uc3RyaW5naWZ5KGVudW1MYWJlbCl9O2AsXG4gICAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5LCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogU291cmNlQ29kZSB7XG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZVNjaGVtYWA7XG4gICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbjogZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzY2hlbWFCb2R5ID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcbiAgICAgIGlmIChyZXN1bHQuZW5kc1dpdGgoXCIsXCIpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG5cbiAgICAvLyBmdWxsdGV4dCBpbmRleOyXkCDtj6ztlajrkJwg7Lus65+865OkIOy2lOy2nFxuICAgIC8vIFRPRE86IEdJTi9HaVNUIOyduOuNseyKpCDsg53shLHrkJwg7Lus65+8IOy2lOy2nFxuICAgIGNvbnN0IGZ1bGx0ZXh0Q29sdW1uczogRW50aXR5SW5kZXhbXCJjb2x1bW5zXCJdW10gPSBbXTtcblxuICAgIC8vIHZpcnR1YWwgcHJvcHNcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbFByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVkIHByb3BzXG4gICAgICogLSBnZW5lcmF0ZWQg7IaN7ISx7J20IOyeiOuKlCDsu6zrn7wgKElOU0VSVC9VUERBVEUg7IucIOqwkiDsoJzqs7Ug67aI6rCAKVxuICAgICAqL1xuICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiICYmIHByb3AuZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgY29uc3QgaGFzTWV0YWRhdGEgPVxuICAgICAgZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwIHx8XG4gICAgICBoYXNEZWZhdWx0Q29sdW1ucy5sZW5ndGggPiAwIHx8XG4gICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDA7XG5cbiAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7c2NoZW1hQm9keX07YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT5gICtcbiAgICAgICAgKGhhc01ldGFkYXRhXG4gICAgICAgICAgPyBgICYgeyR7XG4gICAgICAgICAgICAgIChmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZnVsbHRleHRfXzogcmVhZG9ubHkgWyR7ZnVsbHRleHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbCkgPT4gYFwiJHtjb2x9XCJgKVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAodmlydHVhbFByb3BzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX3ZpcnR1YWxfXzogcmVhZG9ubHkgWyR7dmlydHVhbFByb3BzLm1hcCgocHJvcCkgPT4gYFwiJHtwcm9wfVwiYCkuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgIDogXCJcIikgK1xuICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgaGFzRGVmYXVsdENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IFske2hhc0RlZmF1bHRDb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgKGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKVxuICAgICAgICAgICAgfX1gXG4gICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgIFwiO1wiLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBCYXNlU2NoZW1hOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgLy8gUHJvcCDsl4bripQgTUTsnbgg6rK97JqwIOyDneyEsSDsoJzsmbhcbiAgICBpZiAoZW50aXR5LnByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIGlmIChlbnRpdHkucGFyZW50SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZUxpc3RQYXJhbXNgO1xuXG4gICAgY29uc3QgZmlsdGVyUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwcm9wKSA9PiBwcm9wLnRvRmlsdGVyID09PSB0cnVlKTtcblxuICAgIGNvbnN0IHByb3BOb2RlczogRW50aXR5UHJvcE5vZGVbXSA9IGZpbHRlclByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZmlsdGVyQm9keSA9IHByb3BOb2Rlc1xuICAgICAgLm1hcCgocHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6IHpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fWAsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VMaXN0UGFyYW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWJzZXRTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgLi4uc3Vic2V0S2V5cy5mbGF0TWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgLy8g7ISc67iM7IWL7JeQ7IScIEZpZWxkRXhwcltdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBmaWVsZEV4cHJzID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAvLyBGaWVsZEV4cHJbXeuhnCBFbnRpdHlQcm9wTm9kZVtdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBwcm9wTm9kZXMgPSBlbnRpdHkuZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnMpO1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX1gO1xuICAgICAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByb3BOb2RlcyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFbnRpdHlQcm9wTm9kZVtd66GcIFpvZFR5cGVEZWYoc3RyaW5nKeydhCDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgYm9keSA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7Ym9keS5yZXBsYWNlKC8sJC8sIFwiXCIpfTtgLFxuICAgICAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRNYXBwaW5nID0ge2AsXG4gICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiBgICAke3N1YnNldEtleX06ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX07YCksXG4gICAgICBcIn07XCIsXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmVudW0oWyR7c3Vic2V0S2V5c1xuICAgICAgICAubWFwKChrKSA9PiBgXCIke2t9XCJgKVxuICAgICAgICAuam9pbihcIixcIil9XSk7YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleT47YCxcbiAgICAgIFwiXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYFN1YnNldHM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBsaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShpbXBvcnRLZXlzKSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwidW5pcXVlIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiaXNWaXJ0dWFsUHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJwcm9wTm9kZVRvWm9kVHlwZURlZiIsInpvZFR5cGVUb1pvZENvZGUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsImRpciIsImNvbmZpZyIsImFwaSIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdGllcyIsIm1hcCIsImlkIiwiZ2V0Iiwic291cmNlQ29kZXMiLCJmbGF0TWFwIiwiZW50aXR5IiwiZ2V0RW51bXNTb3VyY2VDb2RlIiwiZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUiLCJnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUiLCJnZXRTdWJzZXRTb3VyY2VDb2RlIiwiZmlsdGVyIiwidCIsIkxBQkVMX0tFWV9PUkRFUiIsInNvcnQiLCJhIiwiYiIsImFLZXkiLCJsYWJlbCIsInNwbGl0IiwiYktleSIsImFJbmRleCIsImluZGV4T2YiLCJiSW5kZXgiLCJzb3VyY2VDb2RlIiwicmVkdWNlIiwicmVzdWx0IiwidHMiLCJsaW5lcyIsImltcG9ydEtleXMiLCJhbGxUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlcyIsImNkSW1wb3J0S2V5cyIsImltcG9ydEtleSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiY3VzdG9tU2NhbGFyTGluZXMiLCJmaW5kIiwiRXJyb3IiLCJ6b2RUeXBlIiwiYm9keSIsImpvaW4iLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInNjaGVtYU5hbWUiLCJuYW1lcyIsIm1vZHVsZSIsInByb3BOb2RlIiwibm9kZVR5cGUiLCJjaGlsZHJlbiIsInByb3BzIiwicHJvcCIsInNjaGVtYUJvZHkiLCJlbmRzV2l0aCIsInNsaWNlIiwiZnVsbHRleHRDb2x1bW5zIiwidmlydHVhbFByb3BzIiwibmFtZSIsImhhc0RlZmF1bHRDb2x1bW5zIiwidHlwZSIsIm51bGxhYmxlIiwiZGJEZWZhdWx0IiwidW5kZWZpbmVkIiwiY29uY2F0IiwiZ2VuZXJhdGVkQ29sdW1ucyIsImdlbmVyYXRlZCIsImhhc01ldGFkYXRhIiwiY29sIiwicGFyZW50SWQiLCJmaWx0ZXJQcm9wcyIsInRvRmlsdGVyIiwicHJvcE5vZGVzIiwiZmlsdGVyQm9keSIsInRyaW0iLCJzdWJzZXRzIiwic3Vic2V0S2V5cyIsInN1YnNldEtleSIsImZpZWxkRXhwcnMiLCJmaWVsZEV4cHJzVG9Qcm9wTm9kZXMiLCJyZXBsYWNlIiwiayJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLE1BQU0sUUFBUSxVQUFVO0FBQ2pDLFNBQVNDLE1BQU0sUUFB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
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvZ2VuZXJhdGVkLnRlbXBsYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi8uLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHlcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi8uLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgdHlwZSBFbnRpdHlJbmRleCwgdHlwZSBFbnRpdHlQcm9wTm9kZSwgaXNWaXJ0dWFsUHJvcCB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSBcIi4uL3RlbXBsYXRlXCI7XG5pbXBvcnQgeyBwcm9wTm9kZVRvWm9kVHlwZURlZiwgem9kVHlwZVRvWm9kQ29kZSB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCB0eXBlIFNvdXJjZUNvZGUgPSB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGxpbmVzOiBzdHJpbmdbXTtcbiAgaW1wb3J0S2V5czogc3RyaW5nW107XG59O1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWQgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiZ2VuZXJhdGVkXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogYCR7ZGlyfS9zcmMvYXBwbGljYXRpb25gLFxuICAgICAgcGF0aDogYHNvbmFtdS5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgY29uc3QgZW50aXRpZXMgPSBlbnRpdHlJZHMubWFwKChpZCkgPT4gRW50aXR5TWFuYWdlci5nZXQoaWQpKTtcblxuICAgIC8vIOyghOyytCBTb3VyY2VDb2RlIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzID0gZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB0aGlzLmdldEVudW1zU291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgICB0aGlzLmdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0QmFzZUxpc3RQYXJhbXNTb3VyY2VDb2RlKGVudGl0eSksXG4gICAgICAgIHRoaXMuZ2V0U3Vic2V0U291cmNlQ29kZShlbnRpdHkpLFxuICAgICAgXS5maWx0ZXIobm9uTnVsbGFibGUpO1xuICAgIH0pO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOnNvdXJjZUNvZGVzXCIsIHNvdXJjZUNvZGVzKTtcblxuICAgIC8vIFNvcnRcbiAgICBjb25zdCBMQUJFTF9LRVlfT1JERVIgPSBbXCJFbnVtc1wiLCBcIkJhc2VTY2hlbWFcIiwgXCJCYXNlTGlzdFBhcmFtc1wiLCBcIlN1YnNldHNcIiwgXCJTdWJzZXRRdWVyaWVzXCJdO1xuICAgIHNvdXJjZUNvZGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IFthS2V5XSA9IGEubGFiZWwuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgW2JLZXldID0gYi5sYWJlbC5zcGxpdChcIjpcIik7XG4gICAgICBjb25zdCBhSW5kZXggPSBMQUJFTF9LRVlfT1JERVIuaW5kZXhPZihhS2V5KTtcbiAgICAgIGNvbnN0IGJJbmRleCA9IExBQkVMX0tFWV9PUkRFUi5pbmRleE9mKGJLZXkpO1xuICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0gZWxzZSBpZiAoYUluZGV4IDwgYkluZGV4KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZSA9IHNvdXJjZUNvZGVzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIHRzKSA9PiB7XG4gICAgICAgIGlmICh0cyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lczogWy4uLnJlc3VsdC5saW5lcywgYC8vICR7dHMubGFiZWx9YCwgLi4udHMubGluZXMsIFwiXCJdLFxuICAgICAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShbLi4ucmVzdWx0LmltcG9ydEtleXMsIC4uLnRzLmltcG9ydEtleXNdLnNvcnQoKSksXG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIC8vIC50eXBlcy50c+ydmCDtg4DsnoXsnYQg7LC47KGw7ZWY64qUIOqyveyasCDsiJztmZjssLjsobAo7IOB7Zi47LC47KGwKeqwgCDrsJzsg53tlZjrr4DroZwg7YOA7J6F7J2EIOqwgOyguOyZgCDsnbjrnbzsnbgg7LKY66asXG4gICAgY29uc3QgYWxsVHlwZUtleXMgPSBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IE9iamVjdC5rZXlzKGVudGl0eS50eXBlcykpO1xuICAgIGNvbnN0IGNkSW1wb3J0S2V5cyA9IHNvdXJjZUNvZGUuaW1wb3J0S2V5cy5maWx0ZXIoKGltcG9ydEtleSkgPT5cbiAgICAgIGFsbFR5cGVLZXlzLmluY2x1ZGVzKGltcG9ydEtleSksXG4gICAgKTtcbiAgICBpZiAoY2RJbXBvcnRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1c3RvbVNjYWxhckxpbmVzID0gY2RJbXBvcnRLZXlzLmZsYXRNYXAoKGltcG9ydEtleSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBlbnRpdGllcy5maW5kKChlbnRpdHkpID0+IGVudGl0eS50eXBlc1tpbXBvcnRLZXldKTtcbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFpvZFR5cGUgbm90IGZvdW5kICR7aW1wb3J0S2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHpvZFR5cGUgPSBlbnRpdHkudHlwZXNbaW1wb3J0S2V5XTtcbiAgICAgICAgYXNzZXJ0KHpvZFR5cGUpO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgYC8vIEN1c3RvbVNjYWxhcjogJHtpbXBvcnRLZXl9YCxcbiAgICAgICAgICBgY29uc3QgJHtpbXBvcnRLZXl9ID0gJHt6b2RUeXBlVG9ab2RDb2RlKHpvZFR5cGUpfTtgLFxuICAgICAgICAgIGB0eXBlICR7aW1wb3J0S2V5fSA9IHouaW5mZXI8dHlwZW9mICR7aW1wb3J0S2V5fT5gLFxuICAgICAgICAgIFwiXCIsXG4gICAgICAgIF07XG4gICAgICB9KTtcbiAgICAgIHNvdXJjZUNvZGUubGluZXMgPSBbLi4uY3VzdG9tU2NhbGFyTGluZXMsIC4uLnNvdXJjZUNvZGUubGluZXNdO1xuICAgICAgc291cmNlQ29kZS5pbXBvcnRLZXlzID0gc291cmNlQ29kZS5pbXBvcnRLZXlzLmZpbHRlcihcbiAgICAgICAgKGltcG9ydEtleSkgPT4gIWNkSW1wb3J0S2V5cy5pbmNsdWRlcyhpbXBvcnRLZXkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBib2R5ID0gc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIE5haXRlLnQoXCJUZW1wbGF0ZV9fZ2VuZXJhdGVkOmJvZHlcIiwgYm9keSk7XG5cbiAgICAvLyBpbXBvcnRcbiAgICBjb25zdCBzb25hbXVJbXBvcnRzID0gW1xuICAgICAgXCJ6QXJyYXlhYmxlXCIsXG4gICAgICBcIlNRTERhdGVUaW1lU3RyaW5nXCIsXG4gICAgICBcIlN1YnNldFF1ZXJ5XCIsXG4gICAgICBcIlNvbmFtdVF1ZXJ5TW9kZVwiLFxuICAgIF0uZmlsdGVyKChtb2QpID0+IGJvZHkuaW5jbHVkZXMobW9kKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKCksXG4gICAgICBib2R5LFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1xuICAgICAgICBcIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCIvKiogYmlvbWUtaWdub3JlLWFsbCBhc3Npc3Q6IGdlbmVyYXRlZOuKlCDrrLTsi5wgKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgYGltcG9ydCB7IHogfSBmcm9tICd6b2QnO2AsXG4gICAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHMuam9pbihcIixcIil9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cblxuICBnZXRFbnVtc1NvdXJjZUNvZGUoZW50aXR5OiBFbnRpdHkpOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBFbnVtczogJHtlbnRpdHkuaWR9YCxcbiAgICAgIGxpbmVzOiBbXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKGVudGl0eS5lbnVtTGFiZWxzKVxuICAgICAgICAgIC5maWx0ZXIoKFtfLCBlbnVtTGFiZWxdKSA9PiBPYmplY3Qua2V5cyhlbnVtTGFiZWwpLmxlbmd0aCA+IDApXG4gICAgICAgICAgLmZsYXRNYXAoKFtlbnVtSWQsIGVudW1MYWJlbF0pID0+IFtcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9ID0gei5lbnVtKFske09iamVjdC5rZXlzKGVudW1MYWJlbCkubWFwKFxuICAgICAgICAgICAgICAoZWwpID0+IGBcIiR7ZWx9XCJgLFxuICAgICAgICAgICAgKX1dKS5kZXNjcmliZShcIiR7ZW51bUlkfVwiKTtgLFxuICAgICAgICAgICAgYGV4cG9ydCB0eXBlICR7ZW51bUlkfSA9IHouaW5mZXI8dHlwZW9mICR7ZW51bUlkfT47YCxcbiAgICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnVtSWR9TGFiZWwgPSAke0pTT04uc3RyaW5naWZ5KGVudW1MYWJlbCl9O2AsXG4gICAgICAgICAgXSksXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5LCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogU291cmNlQ29kZSB7XG4gICAgY29uc3Qgc2NoZW1hTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9QmFzZVNjaGVtYWA7XG4gICAgY29uc3QgcHJvcE5vZGU6IEVudGl0eVByb3BOb2RlID0ge1xuICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbjogZW50aXR5LnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIsXG4gICAgICAgICAgcHJvcCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBjb25zdCBzY2hlbWFCb2R5ID0gKCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcbiAgICAgIGlmIChyZXN1bHQuZW5kc1dpdGgoXCIsXCIpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQuc2xpY2UoMCwgLTEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG5cbiAgICAvLyBmdWxsdGV4dCBpbmRleOyXkCDtj6ztlajrkJwg7Lus65+865OkIOy2lOy2nFxuICAgIC8vIFRPRE86IEdJTi9HaVNUIOyduOuNseyKpCDsg53shLHrkJwg7Lus65+8IOy2lOy2nFxuICAgIGNvbnN0IGZ1bGx0ZXh0Q29sdW1uczogRW50aXR5SW5kZXhbXCJjb2x1bW5zXCJdW10gPSBbXTtcblxuICAgIC8vIHZpcnR1YWwgcHJvcHNcbiAgICBjb25zdCB2aXJ0dWFsUHJvcHMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IGlzVmlydHVhbFByb3AocHJvcCkpXG4gICAgICAubWFwKChwcm9wKSA9PiBwcm9wLm5hbWUpO1xuXG4gICAgLyoqXG4gICAgICogaGFzRGVmYXVsdCBwcm9wc1xuICAgICAqIC0gbnVsbGFibGUg65iQ64qUIGRiRGVmYXVsdOqwgCDsnojripQg7Lus65+8IChpZCDtj6ztlagpXG4gICAgICogLSByZWxhdGlvbuydtCDslYTri4jqsbDrgpgsIHJlbGF0aW9u7J207Ja064+EIG51bGxhYmxl7J2066m0IO2PrO2VqFxuICAgICAqL1xuICAgIGNvbnN0IGhhc0RlZmF1bHRDb2x1bW5zID0gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocHJvcCkgPT5cbiAgICAgICAgICAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgfHwgcHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSkgJiZcbiAgICAgICAgICAocHJvcC5udWxsYWJsZSA9PT0gdHJ1ZSB8fCAocHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5kYkRlZmF1bHQgIT09IHVuZGVmaW5lZCkpLFxuICAgICAgKVxuICAgICAgLm1hcCgocHJvcCkgPT4gKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gYCR7cHJvcC5uYW1lfV9pZGAgOiBwcm9wLm5hbWUpKVxuICAgICAgLmNvbmNhdChcImlkXCIpO1xuXG4gICAgLyoqXG4gICAgICogaGFzVmVjdG9yIHByb3BzXG4gICAgICogLSB2ZWN0b3Ig7YOA7J6F7J24IOy7rOufvFxuICAgICAqL1xuICAgIGNvbnN0IGhhc1ZlY3RvckNvbHVtbnMgPSBlbnRpdHkucHJvcHNcbiAgICAgIC5maWx0ZXIoKHByb3ApID0+IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIilcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICAvKipcbiAgICAgKiBnZW5lcmF0ZWQgcHJvcHNcbiAgICAgKiAtIGdlbmVyYXRlZCDsho3shLHsnbQg7J6I64qUIOy7rOufvCAoSU5TRVJUL1VQREFURSDsi5wg6rCSIOygnOqztSDrtojqsIApXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4gcHJvcC50eXBlICE9PSBcInJlbGF0aW9uXCIgJiYgcHJvcC5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZClcbiAgICAgIC5tYXAoKHByb3ApID0+IHByb3AubmFtZSk7XG5cbiAgICBjb25zdCBoYXNNZXRhZGF0YSA9XG4gICAgICBmdWxsdGV4dENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgdmlydHVhbFByb3BzLmxlbmd0aCA+IDAgfHxcbiAgICAgIGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDAgfHxcbiAgICAgIGdlbmVyYXRlZENvbHVtbnMubGVuZ3RoID4gMCB8fFxuICAgICAgaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwO1xuXG4gICAgY29uc3QgbGluZXMgPSBbXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7c2NoZW1hTmFtZX0gPSAke3NjaGVtYUJvZHl9O2AsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+YCArXG4gICAgICAgIChoYXNNZXRhZGF0YVxuICAgICAgICAgID8gYCAmIHske1xuICAgICAgICAgICAgICAoZnVsbHRleHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2Z1bGx0ZXh0X186IHJlYWRvbmx5IFske2Z1bGx0ZXh0Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKHZpcnR1YWxQcm9wcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192aXJ0dWFsX186IHJlYWRvbmx5IFske3ZpcnR1YWxQcm9wcy5tYXAoKHByb3ApID0+IGBcIiR7cHJvcH1cImApLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgICAgICAgKGhhc0RlZmF1bHRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGByZWFkb25seSBfX2hhc0RlZmF1bHRfXzogcmVhZG9ubHkgWyR7aGFzRGVmYXVsdENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9XSxgXG4gICAgICAgICAgICAgICAgOiBcIlwiKSArXG4gICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW5zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gYHJlYWRvbmx5IF9fZ2VuZXJhdGVkX186IHJlYWRvbmx5IFske2dlbmVyYXRlZENvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfV0sYFxuICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAoaGFzVmVjdG9yQ29sdW1ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBgcmVhZG9ubHkgX192ZWN0b3JfXzogcmVhZG9ubHkgWyR7aGFzVmVjdG9yQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKX1dLGBcbiAgICAgICAgICAgICAgICA6IFwiXCIpXG4gICAgICAgICAgICB9fWBcbiAgICAgICAgICA6IFwiXCIpICtcbiAgICAgICAgXCI7XCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VTY2hlbWE6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBpbXBvcnRLZXlzLFxuICAgICAgbGluZXMsXG4gICAgfTtcbiAgfVxuXG4gIGdldEJhc2VMaXN0UGFyYW1zU291cmNlQ29kZShlbnRpdHk6IEVudGl0eSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICAvLyBQcm9wIOyXhuuKlCBNROyduCDqsr3smrAg7IOd7ISxIOygnOyZuFxuICAgIGlmIChlbnRpdHkucHJvcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1CYXNlTGlzdFBhcmFtc2A7XG5cbiAgICBjb25zdCBmaWx0ZXJQcm9wcyA9IGVudGl0eS5wcm9wcy5maWx0ZXIoKHByb3ApID0+IHByb3AudG9GaWx0ZXIgPT09IHRydWUpO1xuXG4gICAgY29uc3QgcHJvcE5vZGVzOiBFbnRpdHlQcm9wTm9kZVtdID0gZmlsdGVyUHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBmaWx0ZXJCb2R5ID0gcHJvcE5vZGVzXG4gICAgICAubWFwKChwcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYocHJvcE5vZGUsIGltcG9ydEtleXMpKVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3Qgc2NoZW1hQm9keSA9IGBcbnoub2JqZWN0KHtcbiAgbnVtOiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gIHBhZ2U6IHoubnVtYmVyKCkuaW50KCkubWluKDEpLFxuICBzZWFyY2g6ICR7ZW50aXR5LmlkfVNlYXJjaEZpZWxkLFxuICBrZXl3b3JkOiB6LnN0cmluZygpLFxuICBvcmRlckJ5OiAke2VudGl0eS5pZH1PcmRlckJ5LFxuICBxdWVyeU1vZGU6IFNvbmFtdVF1ZXJ5TW9kZSxcbiAgaWQ6IHpBcnJheWFibGUoei5udW1iZXIoKS5pbnQoKS5wb3NpdGl2ZSgpKSwke2ZpbHRlckJvZHl9XG59KS5wYXJ0aWFsKCk7XG5gLnRyaW0oKTtcblxuICAgIGNvbnN0IGxpbmVzID0gW1xuICAgICAgYGV4cG9ydCBjb25zdCAke3NjaGVtYU5hbWV9ID0gJHtzY2hlbWFCb2R5fWAsXG4gICAgICBgZXhwb3J0IHR5cGUgJHtzY2hlbWFOYW1lfSA9IHouaW5mZXI8dHlwZW9mICR7c2NoZW1hTmFtZX0+O2AsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYEJhc2VMaXN0UGFyYW1zOiAke2VudGl0eS5pZH1gLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICAgIGxpbmVzLFxuICAgIH07XG4gIH1cblxuICBnZXRTdWJzZXRTb3VyY2VDb2RlKGVudGl0eTogRW50aXR5KTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGVudGl0eS5wYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW1xuICAgICAgLi4uc3Vic2V0S2V5cy5mbGF0TWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgLy8g7ISc67iM7IWL7JeQ7IScIEZpZWxkRXhwcltdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBmaWVsZEV4cHJzID0gZW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAvLyBGaWVsZEV4cHJbXeuhnCBFbnRpdHlQcm9wTm9kZVtdIOqwgOyguOyYtFxuICAgICAgICBjb25zdCBwcm9wTm9kZXMgPSBlbnRpdHkuZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnMpO1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX1gO1xuICAgICAgICBjb25zdCBwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUgPSB7XG4gICAgICAgICAgbm9kZVR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgY2hpbGRyZW46IHByb3BOb2RlcyxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBFbnRpdHlQcm9wTm9kZVtd66GcIFpvZFR5cGVEZWYoc3RyaW5nKeydhCDqsIDsoLjsmLRcbiAgICAgICAgY29uc3QgYm9keSA9IHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlLCBpbXBvcnRLZXlzKTtcblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtzY2hlbWFOYW1lfSA9ICR7Ym9keS5yZXBsYWNlKC8sJC8sIFwiXCIpfTtgLFxuICAgICAgICAgIGBleHBvcnQgdHlwZSAke3NjaGVtYU5hbWV9ID0gei5pbmZlcjx0eXBlb2YgJHtzY2hlbWFOYW1lfT47YCxcbiAgICAgICAgXTtcbiAgICAgIH0pLFxuICAgICAgYGV4cG9ydCB0eXBlICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRNYXBwaW5nID0ge2AsXG4gICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiBgICAke3N1YnNldEtleX06ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXQke3N1YnNldEtleX07YCksXG4gICAgICBcIn07XCIsXG4gICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXkgPSB6LmVudW0oWyR7c3Vic2V0S2V5c1xuICAgICAgICAubWFwKChrKSA9PiBgXCIke2t9XCJgKVxuICAgICAgICAuam9pbihcIixcIil9XSk7YCxcbiAgICAgIGBleHBvcnQgdHlwZSAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5ID0gei5pbmZlcjx0eXBlb2YgJHtlbnRpdHkubmFtZXMubW9kdWxlfVN1YnNldEtleT47YCxcbiAgICAgIFwiXCIsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogYFN1YnNldHM6ICR7ZW50aXR5LmlkfWAsXG4gICAgICBsaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IHVuaXF1ZShpbXBvcnRLZXlzKSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiYXNzZXJ0IiwidW5pcXVlIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiaXNWaXJ0dWFsUHJvcCIsIm5vbk51bGxhYmxlIiwiVGVtcGxhdGUiLCJwcm9wTm9kZVRvWm9kVHlwZURlZiIsInpvZFR5cGVUb1pvZENvZGUiLCJUZW1wbGF0ZV9fZ2VuZXJhdGVkIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsImRpciIsImNvbmZpZyIsImFwaSIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJlbnRpdHlJZHMiLCJnZXRBbGxJZHMiLCJlbnRpdGllcyIsIm1hcCIsImlkIiwiZ2V0Iiwic291cmNlQ29kZXMiLCJmbGF0TWFwIiwiZW50aXR5IiwiZ2V0RW51bXNTb3VyY2VDb2RlIiwiZ2V0QmFzZVNjaGVtYVNvdXJjZUNvZGUiLCJnZXRCYXNlTGlzdFBhcmFtc1NvdXJjZUNvZGUiLCJnZXRTdWJzZXRTb3VyY2VDb2RlIiwiZmlsdGVyIiwidCIsIkxBQkVMX0tFWV9PUkRFUiIsInNvcnQiLCJhIiwiYiIsImFLZXkiLCJsYWJlbCIsInNwbGl0IiwiYktleSIsImFJbmRleCIsImluZGV4T2YiLCJiSW5kZXgiLCJzb3VyY2VDb2RlIiwicmVkdWNlIiwicmVzdWx0IiwidHMiLCJsaW5lcyIsImltcG9ydEtleXMiLCJhbGxUeXBlS2V5cyIsIk9iamVjdCIsImtleXMiLCJ0eXBlcyIsImNkSW1wb3J0S2V5cyIsImltcG9ydEtleSIsImluY2x1ZGVzIiwibGVuZ3RoIiwiY3VzdG9tU2NhbGFyTGluZXMiLCJmaW5kIiwiRXJyb3IiLCJ6b2RUeXBlIiwiYm9keSIsImpvaW4iLCJzb25hbXVJbXBvcnRzIiwibW9kIiwiY3VzdG9tSGVhZGVycyIsImVudW1MYWJlbHMiLCJlbnRyaWVzIiwiXyIsImVudW1MYWJlbCIsImVudW1JZCIsImVsIiwiSlNPTiIsInN0cmluZ2lmeSIsInNjaGVtYU5hbWUiLCJuYW1lcyIsIm1vZHVsZSIsInByb3BOb2RlIiwibm9kZVR5cGUiLCJjaGlsZHJlbiIsInByb3BzIiwicHJvcCIsInNjaGVtYUJvZHkiLCJlbmRzV2l0aCIsInNsaWNlIiwiZnVsbHRleHRDb2x1bW5zIiwidmlydHVhbFByb3BzIiwibmFtZSIsImhhc0RlZmF1bHRDb2x1bW5zIiwidHlwZSIsIm51bGxhYmxlIiwiZGJEZWZhdWx0IiwidW5kZWZpbmVkIiwiY29uY2F0IiwiaGFzVmVjdG9yQ29sdW1ucyIsImdlbmVyYXRlZENvbHVtbnMiLCJnZW5lcmF0ZWQiLCJoYXNNZXRhZGF0YSIsImNvbCIsInBhcmVudElkIiwiZmlsdGVyUHJvcHMiLCJ0b0ZpbHRlciIsInByb3BOb2RlcyIsImZpbHRlckJvZHkiLCJ0cmltIiwic3Vic2V0cyIsInN1YnNldEtleXMiLCJzdWJzZXRLZXkiLCJmaWVsZEV4cHJzIiwiZmllbGRFeHByc1RvUHJvcE5vZGVzIiwicmVwbGFjZSIsImsiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFlBQVksU0FBUztBQUM1QixTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEscUJBQVk7QUFFbkMsU0FBU0MsYUFBYSxRQUFRLGlDQUE4QjtBQUM1RCxTQUFTQyxLQUFLLFFBQVEsdUJBQW9CO0FBQzFDLFNBQWdEQyxhQUFhLFFBQVEsdUJBQW9CO0FBQ3pGLFNBQVNDLFdBQVcsUUFBUSx1QkFBb0I7QUFDaEQsU0FBU0MsUUFBUSxRQUFRLGlCQUFjO0FBQ3ZDLFNBQVNDLG9CQUFvQixFQUFFQyxnQkFBZ0IsUUFBUSxzQkFBbUI7QUFPMUUsT0FBTyxNQUFNQyw0QkFBNEJIO0lBQ3ZDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBSSxtQkFBbUI7UUFDakIsTUFBTSxFQUFFQyxHQUFHLEVBQUUsR0FBR1YsT0FBT1csTUFBTSxDQUFDQyxHQUFHO1FBQ2pDLE9BQU87WUFDTEMsUUFBUSxHQUFHSCxJQUFJLGdCQUFnQixDQUFDO1lBQ2hDSSxNQUFNLENB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
|