sonamu 0.7.17 → 0.7.18

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.
@@ -1 +1 @@
1
- {"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,qBAAa,kBAAmB,SAAQ,QAAQ;;IAK9C,gBAAgB;;;;IAOhB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;;;;;;;CAuMvC"}
1
+ {"version":3,"file":"services.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/services.template.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,kBAAmB,SAAQ,QAAQ;;IAK9C,gBAAgB;;;;IAOhB,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,UAAU,CAAC;;;;;;;CA6OvC"}
@@ -5,6 +5,7 @@ import { Sonamu } from "../../api/sonamu.js";
5
5
  import { ApiParamType } from "../../types/types.js";
6
6
  import { assertDefined } from "../../utils/utils.js";
7
7
  import { Template } from "../template.js";
8
+ import { zodTypeToTsTypeDef } from "../zod-converter.js";
8
9
  export class Template__services extends Template {
9
10
  constructor(){
10
11
  super("services");
@@ -32,6 +33,26 @@ export class Template__services extends Template {
32
33
  for (const [modelName, modelApis] of apisByModel){
33
34
  const functions = [];
34
35
  for (const api of modelApis){
36
+ // @stream 데코레이터가 있으면 SSE 스트림 함수 생성
37
+ if (api.streamOptions) {
38
+ const paramsWithoutContext = api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_")));
39
+ const paramsDef = apiParamToTsCode(paramsWithoutContext, importKeys);
40
+ const apiBaseUrl = `${Sonamu.config.api.route.prefix}${api.path}`;
41
+ const methodNameStream = api.options.resourceName ? `use${inflection.camelize(api.options.resourceName)}` : `use${inflection.camelize(api.methodName)}`;
42
+ const methodNameStreamCamelized = inflection.camelize(methodNameStream, true);
43
+ const eventsTypeDef = zodTypeToTsTypeDef(api.streamOptions.events);
44
+ const paramsDefAsObject = paramsWithoutContext.length > 0 ? `{ ${paramsWithoutContext.map((p)=>p.name).join(", ")} }` : "{}";
45
+ functions.push(`
46
+ export function ${methodNameStreamCamelized}(
47
+ params: ${paramsDef ? `{ ${paramsWithoutContext.map((p)=>`${p.name}: ${apiParamTypeToTsType(p.type, importKeys)}`).join(", ")} }` : "{}"},
48
+ handlers: EventHandlers<${eventsTypeDef} & { end?: () => void }>,
49
+ options: SSEStreamOptions
50
+ ) {
51
+ return useSSEStream<${eventsTypeDef}>(\`${apiBaseUrl}\`, ${paramsDefAsObject}, handlers, options);
52
+ }
53
+ `.trim());
54
+ continue;
55
+ }
35
56
  // Context 제외한 파라미터
36
57
  const paramsWithoutContext = api.parameters.filter((param)=>!ApiParamType.isContext(param.type) && !ApiParamType.isRefKnex(param.type) && !(param.optional === true && param.name.startsWith("_")));
37
58
  // 타입 파라미터 정의
@@ -150,10 +171,10 @@ ${functions.join("\n\n")}
150
171
  `import { queryOptions, useQuery, useMutation } from '@tanstack/react-query';`,
151
172
  `import type { AxiosProgressEvent } from 'axios';`,
152
173
  `import qs from 'qs';`,
153
- `import { type ListResult, fetch } from './sonamu.shared';`
174
+ `import { type ListResult, fetch, type EventHandlers, type SSEStreamOptions, useSSEStream } from './sonamu.shared';`
154
175
  ]
155
176
  };
156
177
  }
157
178
  }
158
179
 
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZXJ2aWNlcyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZXJ2aWNlc1wiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhcmdldDogXCI6dGFyZ2V0L3NyYy9zZXJ2aWNlc1wiLFxuICAgICAgcGF0aDogYHNlcnZpY2VzLmdlbmVyYXRlZC50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcih7fTogVGVtcGxhdGVPcHRpb25zW1wic2VydmljZXNcIl0pIHtcbiAgICBjb25zdCB7IGFwaXMgfSA9IFNvbmFtdS5zeW5jZXI7XG5cbiAgICAvLyDrqqjrjbjrs4TroZwg6re466O57ZmUXG4gICAgY29uc3QgYXBpc0J5TW9kZWwgPSBuZXcgTWFwPHN0cmluZywgRXh0ZW5kZWRBcGlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiBhcGlzKSB7XG4gICAgICBjb25zdCBtb2RlbE5hbWUgPSBhcGkubW9kZWxOYW1lLnJlcGxhY2UoL01vZGVsJC8sIFwiXCIpLnJlcGxhY2UoL0ZyYW1lJC8sIFwiXCIpO1xuICAgICAgaWYgKCFhcGlzQnlNb2RlbC5oYXMobW9kZWxOYW1lKSkge1xuICAgICAgICBhcGlzQnlNb2RlbC5zZXQobW9kZWxOYW1lLCBbXSk7XG4gICAgICB9XG4gICAgICBhcGlzQnlNb2RlbC5nZXQobW9kZWxOYW1lKT8ucHVzaChhcGkpO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbmFtZXNwYWNlczogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgdHlwZVBhcmFtTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFttb2RlbE5hbWUsIG1vZGVsQXBpc10gb2YgYXBpc0J5TW9kZWwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBhcGkgb2YgbW9kZWxBcGlzKSB7XG4gICAgICAgIC8vIENvbnRleHQg7KCc7Jm47ZWcIO2MjOudvOuvuO2EsFxuICAgICAgICBjb25zdCBwYXJhbXNXaXRob3V0Q29udGV4dCA9IGFwaS5wYXJhbWV0ZXJzLmZpbHRlcihcbiAgICAgICAgICAocGFyYW0pID0+XG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIUFwaVBhcmFtVHlwZS5pc1JlZktuZXgocGFyYW0udHlwZSkgJiZcbiAgICAgICAgICAgICEocGFyYW0ub3B0aW9uYWwgPT09IHRydWUgJiYgcGFyYW0ubmFtZS5zdGFydHNXaXRoKFwiX1wiKSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g7YOA7J6FIO2MjOudvOuvuO2EsCDsoJXsnZhcbiAgICAgICAgY29uc3QgdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA9IGFwaS50eXBlUGFyYW1ldGVyc1xuICAgICAgICAgIC5tYXAoKHR5cGVQYXJhbSkgPT4gYXBpUGFyYW1UeXBlVG9Uc1R5cGUodHlwZVBhcmFtLCBpbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgICBjb25zdCB0eXBlUGFyYW1zRGVmID0gdHlwZVBhcmFtZXRlcnNBc1RzVHlwZSA/IGA8JHt0eXBlUGFyYW1ldGVyc0FzVHNUeXBlfT5gIDogXCJcIjtcbiAgICAgICAgdHlwZVBhcmFtTmFtZXMgPSB0eXBlUGFyYW1OYW1lcy5jb25jYXQoYXBpLnR5cGVQYXJhbWV0ZXJzLm1hcCgodHApID0+IHRwLmlkKSk7XG5cbiAgICAgICAgLy8g7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcbiAgICAgICAgY29uc3QgcGFyYW1OYW1lcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cbiAgICAgICAgLy8g66as7YS0IO2DgOyehSDsoJXsnZhcbiAgICAgICAgY29uc3QgcmV0dXJuVHlwZURlZiA9IGFwaVBhcmFtVHlwZVRvVHNUeXBlKFxuICAgICAgICAgIGFzc2VydERlZmluZWQodW53cmFwUHJvbWlzZU9uY2UoYXBpLnJldHVyblR5cGUpKSxcbiAgICAgICAgICBpbXBvcnRLZXlzLFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIOq4sOuzuCBVUkxcbiAgICAgICAgY29uc3QgYXBpQmFzZVVybCA9IGAke1NvbmFtdS5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0ke2FwaS5wYXRofWA7XG5cbiAgICAgICAgY29uc3QgY2xpZW50cyA9IGFwaS5vcHRpb25zLmNsaWVudHMgfHwgW107XG5cbiAgICAgICAgLy8gMS4gYXhpb3Mg7ZWo7IiYIOyDneyEsVxuICAgICAgICAvLyByZXNvdXJjZU5hbWXsnbQg7J6I7Jy866m0IGdldCArIHJlc291cmNlTmFtZSDtmJXtg5zroZwg7ZWo7IiY66qFIOyDneyEsVxuICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgPyBgZ2V0JHtpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5vcHRpb25zLnJlc291cmNlTmFtZSl9YFxuICAgICAgICAgIDogYXBpLm1ldGhvZE5hbWU7XG5cbiAgICAgICAgLy8gYXhpb3MtbXVsdGlwYXJ0IOyymOumrCAo7YyM7J28IOyXheuhnOuTnClcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJheGlvcy1tdWx0aXBhcnRcIikpIHtcbiAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gYXBpLnVwbG9hZE9wdGlvbnM/Lm1vZGUgPT09IFwibXVsdGlwbGVcIjtcbiAgICAgICAgICBjb25zdCBmaWxlUGFyYW1OYW1lID0gaXNNdWx0aXBsZSA/IFwiZmlsZXNcIiA6IFwiZmlsZVwiO1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXJhbVR5cGUgPSBpc011bHRpcGxlID8gXCJGaWxlW11cIiA6IFwiRmlsZVwiO1xuXG4gICAgICAgICAgY29uc3QgZm9ybURhdGFBcHBlbmQgPSBpc011bHRpcGxlXG4gICAgICAgICAgICA/IGAke2ZpbGVQYXJhbU5hbWV9LmZvckVhY2goZiA9PiB7IGZvcm1EYXRhLmFwcGVuZChcIiR7ZmlsZVBhcmFtTmFtZX1cIiwgZik7IH0pO2BcbiAgICAgICAgICAgIDogYGZvcm1EYXRhLmFwcGVuZChcIiR7ZmlsZVBhcmFtTmFtZX1cIiwgJHtmaWxlUGFyYW1OYW1lfSk7YDtcblxuICAgICAgICAgIGNvbnN0IG90aGVyUGFyYW1zQXBwZW5kID0gcGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgIC5tYXAoKHBhcmFtKSA9PiBgZm9ybURhdGEuYXBwZW5kKCcke3BhcmFtLm5hbWV9JywgU3RyaW5nKCR7cGFyYW0ubmFtZX0pKTtgKVxuICAgICAgICAgICAgLmpvaW4oXCJcXG4gICAgXCIpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zRGVmQ29tbWEgPSBwYXJhbXNEZWYgIT09IFwiXCIgPyBcIiwgXCIgOiBcIlwiO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KFxuICAke3BhcmFtc0RlZn0ke3BhcmFtc0RlZkNvbW1hfVxuICAke2ZpbGVQYXJhbU5hbWV9OiAke2ZpbGVQYXJhbVR5cGV9LFxuICBvblVwbG9hZFByb2dyZXNzPzogKHBlOiBBeGlvc1Byb2dyZXNzRXZlbnQpID0+IHZvaWRcbik6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAke2Zvcm1EYXRhQXBwZW5kfVxuICAke290aGVyUGFyYW1zQXBwZW5kfVxuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcIm11bHRpcGFydC9mb3JtLWRhdGFcIixcbiAgICB9LFxuICAgIG9uVXBsb2FkUHJvZ3Jlc3MsXG4gICAgZGF0YTogZm9ybURhdGEsXG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgY29uc3QgaGFzUGFyYW1zID0gcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMDtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9JHtoYXNQYXJhbXMgPyBgP1xcJHtxcy5zdHJpbmdpZnkoeyAke3BhcmFtTmFtZXN9IH0pfWAgOiBcIlwifVxcYCxcbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGhhc1BhcmFtcyA9IHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiBcIiR7YXBpLm9wdGlvbnMuaHR0cE1ldGhvZH1cIixcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH1cXGAsXG4gICAgJHtoYXNQYXJhbXMgPyBgZGF0YTogeyAke3BhcmFtTmFtZXN9IH0sYCA6IFwiXCJ9XG4gICAgJHthcGkub3B0aW9ucy50aW1lb3V0ID8gYHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgke2FwaS5vcHRpb25zLnRpbWVvdXR9KSxgIDogXCJcIn1cbiAgfSk7XG59XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDIuIHF1ZXJ5T3B0aW9ucyArIHVzZVF1ZXJ5ICh0YW5zdGFjay1xdWVyeSlcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1xdWVyeVwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lXG4gICAgICAgICAgICA/IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lLCB0cnVlKVxuICAgICAgICAgICAgOiBpbmZsZWN0aW9uLmNhbWVsaXplKGFwaS5tZXRob2ROYW1lLCB0cnVlKTtcblxuICAgICAgICAgIC8vIHF1ZXJ5T3B0aW9uc1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0ICR7bWV0aG9kTmFtZX1RdWVyeU9wdGlvbnMgPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSkgPT4gcXVlcnlPcHRpb25zKHtcbiAgcXVlcnlLZXk6IFsnJHttb2RlbE5hbWV9JywgJyR7bWV0aG9kTmFtZX0nJHtwYXJhbU5hbWVzID8gYCwgJHtwYXJhbU5hbWVzfWAgOiBcIlwifV0sXG4gIHF1ZXJ5Rm46ICgpID0+ICR7bWV0aG9kTmFtZX0oJHtwYXJhbU5hbWVzfSlcbn0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyB1c2VRdWVyeSBob29rXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgdXNlJHtpbmZsZWN0aW9uLmNhbWVsaXplKGhvb2tOYW1lKX0gPSAke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSR7XG4gICAgICAgICAgICAgIHBhcmFtc0RlZiA/IFwiLCBcIiA6IFwiXCJcbiAgICAgICAgICAgIH1vcHRpb25zPzogeyBlbmFibGVkPzogYm9vbGVhbiB9KSA9PlxuICB1c2VRdWVyeSh7XG4gICAgLi4uJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucygke3BhcmFtTmFtZXN9KSxcbiAgICAuLi5vcHRpb25zXG4gIH0pO1xuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiB1c2VNdXRhdGlvbiAodGFuc3RhY2stbXV0YXRpb24pXG4gICAgICAgIGlmIChjbGllbnRzLmluY2x1ZGVzKFwidGFuc3RhY2stbXV0YXRpb25cIikpIHtcbiAgICAgICAgICBjb25zdCBob29rTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUpO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1UeXBlID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0XG4gICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHAudHlwZSwgW10pfWApXG4gICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpfSB9YFxuICAgICAgICAgICAgICA6IFwidm9pZFwiO1xuICAgICAgICAgIGNvbnN0IG11dGF0aW9uUGFyYW1OYW1lcyA9XG4gICAgICAgICAgICBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBgcGFyYW1zLiR7cC5uYW1lfWApLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICA6IFwiXCI7XG5cbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2hvb2tOYW1lfU11dGF0aW9uID0gJHt0eXBlUGFyYW1zRGVmfSgpID0+IHVzZU11dGF0aW9uKHtcbiAgbXV0YXRpb25GbjogKHBhcmFtczogJHttdXRhdGlvblBhcmFtVHlwZX0pID0+ICR7bWV0aG9kTmFtZX0oJHttdXRhdGlvblBhcmFtTmFtZXN9KVxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuYW1lc3BhY2VzLnB1c2goXG4gICAgICAgIGBcbmV4cG9ydCBuYW1lc3BhY2UgJHttb2RlbE5hbWV9U2VydmljZSB7XG4ke2Z1bmN0aW9ucy5qb2luKFwiXFxuXFxuXCIpfVxufVxuICAgICAgYC50cmltKCksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgoKSxcbiAgICAgIGJvZHk6IG5hbWVzcGFjZXMuam9pbihcIlxcblxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IGRpZmYodW5pcXVlKGltcG9ydEtleXMpLCBbLi4udHlwZVBhcmFtTmFtZXMsIFwiTGlzdFJlc3VsdFwiXSksXG4gICAgICBjdXN0b21IZWFkZXJzOiBbXG4gICAgICAgIGBpbXBvcnQgeyBxdWVyeU9wdGlvbnMsIHVzZVF1ZXJ5LCB1c2VNdXRhdGlvbiB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7YCxcbiAgICAgICAgYGltcG9ydCB0eXBlIHsgQXhpb3NQcm9ncmVzc0V2ZW50IH0gZnJvbSAnYXhpb3MnO2AsXG4gICAgICAgIGBpbXBvcnQgcXMgZnJvbSAncXMnO2AsXG4gICAgICAgIGBpbXBvcnQgeyB0eXBlIExpc3RSZXN1bHQsIGZldGNoIH0gZnJvbSAnLi9zb25hbXUuc2hhcmVkJztgLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsImRpZmYiLCJ1bmlxdWUiLCJhcGlQYXJhbVRvVHNDb2RlIiwiYXBpUGFyYW1UeXBlVG9Uc1R5cGUiLCJ1bndyYXBQcm9taXNlT25jZSIsIlNvbmFtdSIsIkFwaVBhcmFtVHlwZSIsImFzc2VydERlZmluZWQiLCJUZW1wbGF0ZSIsIlRlbXBsYXRlX19zZXJ2aWNlcyIsImdldFRhcmdldEFuZFBhdGgiLCJ0YXJnZXQiLCJwYXRoIiwicmVuZGVyIiwiYXBpcyIsInN5bmNlciIsImFwaXNCeU1vZGVsIiwiTWFwIiwiYXBpIiwibW9kZWxOYW1lIiwicmVwbGFjZSIsImhhcyIsInNldCIsImdldCIsInB1c2giLCJpbXBvcnRLZXlzIiwibmFtZXNwYWNlcyIsInR5cGVQYXJhbU5hbWVzIiwibW9kZWxBcGlzIiwiZnVuY3Rpb25zIiwicGFyYW1zV2l0aG91dENvbnRleHQiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwicGFyYW0iLCJpc0NvbnRleHQiLCJ0eXBlIiwiaXNSZWZLbmV4Iiwib3B0aW9uYWwiLCJuYW1lIiwic3RhcnRzV2l0aCIsInR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUiLCJ0eXBlUGFyYW1ldGVycyIsIm1hcCIsInR5cGVQYXJhbSIsImpvaW4iLCJ0eXBlUGFyYW1zRGVmIiwiY29uY2F0IiwidHAiLCJpZCIsInBhcmFtc0RlZiIsInBhcmFtTmFtZXMiLCJwIiwicmV0dXJuVHlwZURlZiIsInJldHVyblR5cGUiLCJhcGlCYXNlVXJsIiwiY29uZmlnIiwicm91dGUiLCJwcmVmaXgiLCJjbGllbnRzIiwib3B0aW9ucyIsIm1ldGhvZE5hbWUiLCJyZXNvdXJjZU5hbWUiLCJjYW1lbGl6ZSIsImluY2x1ZGVzIiwiaXNNdWx0aXBsZSIsInVwbG9hZE9wdGlvbnMiLCJtb2RlIiwiZmlsZVBhcmFtTmFtZSIsImZpbGVQYXJhbVR5cGUiLCJmb3JtRGF0YUFwcGVuZCIsIm90aGVyUGFyYW1zQXBwZW5kIiwicGFyYW1zRGVmQ29tbWEiLCJ0aW1lb3V0IiwidHJpbSIsImh0dHBNZXRob2QiLCJoYXNQYXJhbXMiLCJsZW5ndGgiLCJob29rTmFtZSIsIm11dGF0aW9uUGFyYW1UeXBlIiwibXV0YXRpb25QYXJhbU5hbWVzIiwiYm9keSIsImN1c3RvbUhlYWRlcnMiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGdCQUFnQixhQUFhO0FBQ3BDLFNBQVNDLElBQUksRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDdkMsU0FDRUMsZ0JBQWdCLEVBQ2hCQyxvQkFBb0IsRUFDcEJDLGlCQUFpQixRQUNaLCtCQUE0QjtBQUVuQyxTQUFTQyxNQUFNLFFBQVEsc0JBQW1CO0FBRTFDLFNBQVNDLFlBQVksUUFBUSx1QkFBb0I7QUFDakQsU0FBU0MsYUFBYSxRQUFRLHVCQUFvQjtBQUNsRCxTQUFTQyxRQUFRLFFBQVEsaUJBQWM7QUFFdkMsT0FBTyxNQUFNQywyQkFBMkJEO0lBQ3RDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRSxtQkFBbUI7UUFDakIsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUMvQjtJQUNGO0lBRUFDLE9BQU8sRUFBK0IsRUFBRTtRQUN0QyxNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHVCxPQUFPVSxNQUFNO1FBRTlCLFdBQVc7UUFDWCxNQUFNQyxjQUFjLElBQUlDO1FBQ3hCLEtBQUssTUFBTUMsT0FBT0osS0FBTTtZQUN0QixNQUFNSyxZQUFZRCxJQUFJQyxTQUFTLENBQUNDLE9BQU8sQ0FBQyxVQUFVLElBQUlBLE9BQU8sQ0FBQyxVQUFVO1lBQ3hFLElBQUksQ0FBQ0osWUFBWUssR0FBRyxDQUFDRixZQUFZO2dCQUMvQkgsWUFBWU0sR0FBRyxDQUFDSCxXQUFXLEVBQUU7WUFDL0I7WUFDQUgsWUFBWU8sR0FBRyxDQUFDSixZQUFZSyxLQUFLTjtRQUNuQztRQUVBLE1BQU1PLGFBQXVCLEVBQUU7UUFDL0IsTUFBTUMsYUFBdUIsRUFBRTtRQUMvQixJQUFJQyxpQkFBMkIsRUFBRTtRQUVqQyxLQUFLLE1BQU0sQ0FBQ1IsV0FBV1MsVUFBVSxJQUFJWixZQUFhO1lBQ2hELE1BQU1h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
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90ZW1wbGF0ZS9pbXBsZW1lbnRhdGlvbnMvc2VydmljZXMudGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCB7IGRpZmYsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQge1xuICBhcGlQYXJhbVRvVHNDb2RlLFxuICBhcGlQYXJhbVR5cGVUb1RzVHlwZSxcbiAgdW53cmFwUHJvbWlzZU9uY2UsXG59IGZyb20gXCIuLi8uLi9hcGkvY29kZS1jb252ZXJ0ZXJzXCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4uLy4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IEFwaVBhcmFtVHlwZSB9IGZyb20gXCIuLi8uLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCB9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiLi4vdGVtcGxhdGVcIjtcbmltcG9ydCB7IHpvZFR5cGVUb1RzVHlwZURlZiB9IGZyb20gXCIuLi96b2QtY29udmVydGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fc2VydmljZXMgZXh0ZW5kcyBUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwic2VydmljZXNcIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IFwiOnRhcmdldC9zcmMvc2VydmljZXNcIixcbiAgICAgIHBhdGg6IGBzZXJ2aWNlcy5nZW5lcmF0ZWQudHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoe306IFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VzXCJdKSB7XG4gICAgY29uc3QgeyBhcGlzIH0gPSBTb25hbXUuc3luY2VyO1xuXG4gICAgLy8g66qo642467OE66GcIOq3uOujue2ZlFxuICAgIGNvbnN0IGFwaXNCeU1vZGVsID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuZGVkQXBpW10+KCk7XG4gICAgZm9yIChjb25zdCBhcGkgb2YgYXBpcykge1xuICAgICAgY29uc3QgbW9kZWxOYW1lID0gYXBpLm1vZGVsTmFtZS5yZXBsYWNlKC9Nb2RlbCQvLCBcIlwiKS5yZXBsYWNlKC9GcmFtZSQvLCBcIlwiKTtcbiAgICAgIGlmICghYXBpc0J5TW9kZWwuaGFzKG1vZGVsTmFtZSkpIHtcbiAgICAgICAgYXBpc0J5TW9kZWwuc2V0KG1vZGVsTmFtZSwgW10pO1xuICAgICAgfVxuICAgICAgYXBpc0J5TW9kZWwuZ2V0KG1vZGVsTmFtZSk/LnB1c2goYXBpKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG5hbWVzcGFjZXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHR5cGVQYXJhbU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbbW9kZWxOYW1lLCBtb2RlbEFwaXNdIG9mIGFwaXNCeU1vZGVsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvbnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIG1vZGVsQXBpcykge1xuICAgICAgICAvLyBAc3RyZWFtIOuNsOy9lOugiOydtO2EsOqwgCDsnojsnLzrqbQgU1NFIOyKpO2KuOumvCDtlajsiJgg7IOd7ISxXG4gICAgICAgIGlmIChhcGkuc3RyZWFtT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhcmFtKSA9PlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgICAhKHBhcmFtLm9wdGlvbmFsID09PSB0cnVlICYmIHBhcmFtLm5hbWUuc3RhcnRzV2l0aChcIl9cIikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWYgPSBhcGlQYXJhbVRvVHNDb2RlKHBhcmFtc1dpdGhvdXRDb250ZXh0LCBpbXBvcnRLZXlzKTtcbiAgICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICAgIGNvbnN0IG1ldGhvZE5hbWVTdHJlYW0gPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUpfWBcbiAgICAgICAgICAgIDogYHVzZSR7aW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSl9YDtcbiAgICAgICAgICBjb25zdCBtZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShtZXRob2ROYW1lU3RyZWFtLCB0cnVlKTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50c1R5cGVEZWYgPSB6b2RUeXBlVG9Uc1R5cGVEZWYoYXBpLnN0cmVhbU9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtc0RlZkFzT2JqZWN0ID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBgeyAke3BhcmFtc1dpdGhvdXRDb250ZXh0Lm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ7fVwiO1xuXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgZnVuY3Rpb24gJHttZXRob2ROYW1lU3RyZWFtQ2FtZWxpemVkfShcbiAgcGFyYW1zOiAke3BhcmFtc0RlZiA/IGB7ICR7cGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBgJHtwLm5hbWV9OiAke2FwaVBhcmFtVHlwZVRvVHNUeXBlKHAudHlwZSwgaW1wb3J0S2V5cyl9YCkuam9pbihcIiwgXCIpfSB9YCA6IFwie31cIn0sXG4gIGhhbmRsZXJzOiBFdmVudEhhbmRsZXJzPCR7ZXZlbnRzVHlwZURlZn0gJiB7IGVuZD86ICgpID0+IHZvaWQgfT4sXG4gIG9wdGlvbnM6IFNTRVN0cmVhbU9wdGlvbnNcbikge1xuICByZXR1cm4gdXNlU1NFU3RyZWFtPCR7ZXZlbnRzVHlwZURlZn0+KFxcYCR7YXBpQmFzZVVybH1cXGAsICR7cGFyYW1zRGVmQXNPYmplY3R9LCBoYW5kbGVycywgb3B0aW9ucyk7XG59XG4gICAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGV4dCDsoJzsmbjtlZwg7YyM652866+47YSwXG4gICAgICAgIGNvbnN0IHBhcmFtc1dpdGhvdXRDb250ZXh0ID0gYXBpLnBhcmFtZXRlcnMuZmlsdGVyKFxuICAgICAgICAgIChwYXJhbSkgPT5cbiAgICAgICAgICAgICFBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpICYmXG4gICAgICAgICAgICAhQXBpUGFyYW1UeXBlLmlzUmVmS25leChwYXJhbS50eXBlKSAmJlxuICAgICAgICAgICAgIShwYXJhbS5vcHRpb25hbCA9PT0gdHJ1ZSAmJiBwYXJhbS5uYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSxcbiAgICAgICAgKTtcblxuICAgICAgICAvLyDtg4DsnoUg7YyM652866+47YSwIOygleydmFxuICAgICAgICBjb25zdCB0eXBlUGFyYW1ldGVyc0FzVHNUeXBlID0gYXBpLnR5cGVQYXJhbWV0ZXJzXG4gICAgICAgICAgLm1hcCgodHlwZVBhcmFtKSA9PiBhcGlQYXJhbVR5cGVUb1RzVHlwZSh0eXBlUGFyYW0sIGltcG9ydEtleXMpKVxuICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICAgIGNvbnN0IHR5cGVQYXJhbXNEZWYgPSB0eXBlUGFyYW1ldGVyc0FzVHNUeXBlID8gYDwke3R5cGVQYXJhbWV0ZXJzQXNUc1R5cGV9PmAgOiBcIlwiO1xuICAgICAgICB0eXBlUGFyYW1OYW1lcyA9IHR5cGVQYXJhbU5hbWVzLmNvbmNhdChhcGkudHlwZVBhcmFtZXRlcnMubWFwKCh0cCkgPT4gdHAuaWQpKTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV7J2YXG4gICAgICAgIGNvbnN0IHBhcmFtc0RlZiA9IGFwaVBhcmFtVG9Uc0NvZGUocGFyYW1zV2l0aG91dENvbnRleHQsIGltcG9ydEtleXMpO1xuICAgICAgICBjb25zdCBwYXJhbU5hbWVzID0gcGFyYW1zV2l0aG91dENvbnRleHQubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKTtcblxuICAgICAgICAvLyDrpqzthLQg7YOA7J6FIOygleydmFxuICAgICAgICBjb25zdCByZXR1cm5UeXBlRGVmID0gYXBpUGFyYW1UeXBlVG9Uc1R5cGUoXG4gICAgICAgICAgYXNzZXJ0RGVmaW5lZCh1bndyYXBQcm9taXNlT25jZShhcGkucmV0dXJuVHlwZSkpLFxuICAgICAgICAgIGltcG9ydEtleXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g6riw67O4IFVSTFxuICAgICAgICBjb25zdCBhcGlCYXNlVXJsID0gYCR7U29uYW11LmNvbmZpZy5hcGkucm91dGUucHJlZml4fSR7YXBpLnBhdGh9YDtcblxuICAgICAgICBjb25zdCBjbGllbnRzID0gYXBpLm9wdGlvbnMuY2xpZW50cyB8fCBbXTtcblxuICAgICAgICAvLyAxLiBheGlvcyDtlajsiJgg7IOd7ISxXG4gICAgICAgIC8vIHJlc291cmNlTmFtZeydtCDsnojsnLzrqbQgZ2V0ICsgcmVzb3VyY2VOYW1lIO2Yle2DnOuhnCDtlajsiJjrqoUg7IOd7ISxXG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICA/IGBnZXQke2luZmxlY3Rpb24uY2FtZWxpemUoYXBpLm9wdGlvbnMucmVzb3VyY2VOYW1lKX1gXG4gICAgICAgICAgOiBhcGkubWV0aG9kTmFtZTtcblxuICAgICAgICAvLyBheGlvcy1tdWx0aXBhcnQg7LKY66asICjtjIzsnbwg7JeF66Gc65OcKVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcImF4aW9zLW11bHRpcGFydFwiKSkge1xuICAgICAgICAgIGNvbnN0IGlzTXVsdGlwbGUgPSBhcGkudXBsb2FkT3B0aW9ucz8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiO1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXJhbU5hbWUgPSBpc011bHRpcGxlID8gXCJmaWxlc1wiIDogXCJmaWxlXCI7XG4gICAgICAgICAgY29uc3QgZmlsZVBhcmFtVHlwZSA9IGlzTXVsdGlwbGUgPyBcIkZpbGVbXVwiIDogXCJGaWxlXCI7XG5cbiAgICAgICAgICBjb25zdCBmb3JtRGF0YUFwcGVuZCA9IGlzTXVsdGlwbGVcbiAgICAgICAgICAgID8gYCR7ZmlsZVBhcmFtTmFtZX0uZm9yRWFjaChmID0+IHsgZm9ybURhdGEuYXBwZW5kKFwiJHtmaWxlUGFyYW1OYW1lfVwiLCBmKTsgfSk7YFxuICAgICAgICAgICAgOiBgZm9ybURhdGEuYXBwZW5kKFwiJHtmaWxlUGFyYW1OYW1lfVwiLCAke2ZpbGVQYXJhbU5hbWV9KTtgO1xuXG4gICAgICAgICAgY29uc3Qgb3RoZXJQYXJhbXNBcHBlbmQgPSBwYXJhbXNXaXRob3V0Q29udGV4dFxuICAgICAgICAgICAgLm1hcCgocGFyYW0pID0+IGBmb3JtRGF0YS5hcHBlbmQoJyR7cGFyYW0ubmFtZX0nLCBTdHJpbmcoJHtwYXJhbS5uYW1lfSkpO2ApXG4gICAgICAgICAgICAuam9pbihcIlxcbiAgICBcIik7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbXNEZWZDb21tYSA9IHBhcmFtc0RlZiAhPT0gXCJcIiA/IFwiLCBcIiA6IFwiXCI7XG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gJHttZXRob2ROYW1lfSR7dHlwZVBhcmFtc0RlZn0oXG4gICR7cGFyYW1zRGVmfSR7cGFyYW1zRGVmQ29tbWF9XG4gICR7ZmlsZVBhcmFtTmFtZX06ICR7ZmlsZVBhcmFtVHlwZX0sXG4gIG9uVXBsb2FkUHJvZ3Jlc3M/OiAocGU6IEF4aW9zUHJvZ3Jlc3NFdmVudCkgPT4gdm9pZFxuKTogUHJvbWlzZTwke3JldHVyblR5cGVEZWZ9PiB7XG4gIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICR7Zm9ybURhdGFBcHBlbmR9XG4gICR7b3RoZXJQYXJhbXNBcHBlbmR9XG4gIHJldHVybiBmZXRjaCh7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgdXJsOiBcXGAke2FwaUJhc2VVcmx9XFxgLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiLFxuICAgIH0sXG4gICAgb25VcGxvYWRQcm9ncmVzcyxcbiAgICBkYXRhOiBmb3JtRGF0YSxcbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgICAgICBjb25zdCBoYXNQYXJhbXMgPSBwYXJhbXNXaXRob3V0Q29udGV4dC5sZW5ndGggPiAwO1xuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uICR7bWV0aG9kTmFtZX0ke3R5cGVQYXJhbXNEZWZ9KCR7cGFyYW1zRGVmfSk6IFByb21pc2U8JHtyZXR1cm5UeXBlRGVmfT4ge1xuICByZXR1cm4gZmV0Y2goe1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICB1cmw6IFxcYCR7YXBpQmFzZVVybH0ke2hhc1BhcmFtcyA/IGA/XFwke3FzLnN0cmluZ2lmeSh7ICR7cGFyYW1OYW1lc30gfSl9YCA6IFwiXCJ9XFxgLFxuICAgICR7YXBpLm9wdGlvbnMudGltZW91dCA/IGBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoJHthcGkub3B0aW9ucy50aW1lb3V0fSksYCA6IFwiXCJ9XG4gIH0pO1xufVxuICAgICAgICAgIGAudHJpbSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgaGFzUGFyYW1zID0gcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMDtcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiAke21ldGhvZE5hbWV9JHt0eXBlUGFyYW1zRGVmfSgke3BhcmFtc0RlZn0pOiBQcm9taXNlPCR7cmV0dXJuVHlwZURlZn0+IHtcbiAgcmV0dXJuIGZldGNoKHtcbiAgICBtZXRob2Q6IFwiJHthcGkub3B0aW9ucy5odHRwTWV0aG9kfVwiLFxuICAgIHVybDogXFxgJHthcGlCYXNlVXJsfVxcYCxcbiAgICAke2hhc1BhcmFtcyA/IGBkYXRhOiB7ICR7cGFyYW1OYW1lc30gfSxgIDogXCJcIn1cbiAgICAke2FwaS5vcHRpb25zLnRpbWVvdXQgPyBgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KCR7YXBpLm9wdGlvbnMudGltZW91dH0pLGAgOiBcIlwifVxuICB9KTtcbn1cbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gcXVlcnlPcHRpb25zICsgdXNlUXVlcnkgKHRhbnN0YWNrLXF1ZXJ5KVxuICAgICAgICBpZiAoY2xpZW50cy5pbmNsdWRlcyhcInRhbnN0YWNrLXF1ZXJ5XCIpKSB7XG4gICAgICAgICAgY29uc3QgaG9va05hbWUgPSBhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWVcbiAgICAgICAgICAgID8gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkub3B0aW9ucy5yZXNvdXJjZU5hbWUsIHRydWUpXG4gICAgICAgICAgICA6IGluZmxlY3Rpb24uY2FtZWxpemUoYXBpLm1ldGhvZE5hbWUsIHRydWUpO1xuXG4gICAgICAgICAgLy8gcXVlcnlPcHRpb25zXG4gICAgICAgICAgZnVuY3Rpb25zLnB1c2goXG4gICAgICAgICAgICBgXG5leHBvcnQgY29uc3QgJHttZXRob2ROYW1lfVF1ZXJ5T3B0aW9ucyA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9KSA9PiBxdWVyeU9wdGlvbnMoe1xuICBxdWVyeUtleTogWycke21vZGVsTmFtZX0nLCAnJHttZXRob2ROYW1lfScke3BhcmFtTmFtZXMgPyBgLCAke3BhcmFtTmFtZXN9YCA6IFwiXCJ9XSxcbiAgcXVlcnlGbjogKCkgPT4gJHttZXRob2ROYW1lfSgke3BhcmFtTmFtZXN9KVxufSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8vIHVzZVF1ZXJ5IGhvb2tcbiAgICAgICAgICBmdW5jdGlvbnMucHVzaChcbiAgICAgICAgICAgIGBcbmV4cG9ydCBjb25zdCB1c2Uke2luZmxlY3Rpb24uY2FtZWxpemUoaG9va05hbWUpfSA9ICR7dHlwZVBhcmFtc0RlZn0oJHtwYXJhbXNEZWZ9JHtcbiAgICAgICAgICAgICAgcGFyYW1zRGVmID8gXCIsIFwiIDogXCJcIlxuICAgICAgICAgICAgfW9wdGlvbnM/OiB7IGVuYWJsZWQ/OiBib29sZWFuIH0pID0+XG4gIHVzZVF1ZXJ5KHtcbiAgICAuLi4ke21ldGhvZE5hbWV9UXVlcnlPcHRpb25zKCR7cGFyYW1OYW1lc30pLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG4gICAgICAgICAgYC50cmltKCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDMuIHVzZU11dGF0aW9uICh0YW5zdGFjay1tdXRhdGlvbilcbiAgICAgICAgaWYgKGNsaWVudHMuaW5jbHVkZXMoXCJ0YW5zdGFjay1tdXRhdGlvblwiKSkge1xuICAgICAgICAgIGNvbnN0IGhvb2tOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShhcGkubWV0aG9kTmFtZSk7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbVR5cGUgPVxuICAgICAgICAgICAgcGFyYW1zV2l0aG91dENvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IGB7ICR7cGFyYW1zV2l0aG91dENvbnRleHRcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHApID0+IGAke3AubmFtZX06ICR7YXBpUGFyYW1UeXBlVG9Uc1R5cGUocC50eXBlLCBbXSl9YClcbiAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIil9IH1gXG4gICAgICAgICAgICAgIDogXCJ2b2lkXCI7XG4gICAgICAgICAgY29uc3QgbXV0YXRpb25QYXJhbU5hbWVzID1cbiAgICAgICAgICAgIHBhcmFtc1dpdGhvdXRDb250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJhbXNXaXRob3V0Q29udGV4dC5tYXAoKHApID0+IGBwYXJhbXMuJHtwLm5hbWV9YCkuam9pbihcIiwgXCIpXG4gICAgICAgICAgICAgIDogXCJcIjtcblxuICAgICAgICAgIGZ1bmN0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYFxuZXhwb3J0IGNvbnN0IHVzZSR7aG9va05hbWV9TXV0YXRpb24gPSAke3R5cGVQYXJhbXNEZWZ9KCkgPT4gdXNlTXV0YXRpb24oe1xuICBtdXRhdGlvbkZuOiAocGFyYW1zOiAke211dGF0aW9uUGFyYW1UeXBlfSkgPT4gJHttZXRob2ROYW1lfSgke211dGF0aW9uUGFyYW1OYW1lc30pXG59KTtcbiAgICAgICAgICBgLnRyaW0oKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG5hbWVzcGFjZXMucHVzaChcbiAgICAgICAgYFxuZXhwb3J0IG5hbWVzcGFjZSAke21vZGVsTmFtZX1TZXJ2aWNlIHtcbiR7ZnVuY3Rpb25zLmpvaW4oXCJcXG5cXG5cIil9XG59XG4gICAgICBgLnRyaW0oKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogbmFtZXNwYWNlcy5qb2luKFwiXFxuXFxuXCIpLFxuICAgICAgaW1wb3J0S2V5czogZGlmZih1bmlxdWUoaW1wb3J0S2V5cyksIFsuLi50eXBlUGFyYW1OYW1lcywgXCJMaXN0UmVzdWx0XCJdKSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgYGltcG9ydCB7IHF1ZXJ5T3B0aW9ucywgdXNlUXVlcnksIHVzZU11dGF0aW9uIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztgLFxuICAgICAgICBgaW1wb3J0IHR5cGUgeyBBeGlvc1Byb2dyZXNzRXZlbnQgfSBmcm9tICdheGlvcyc7YCxcbiAgICAgICAgYGltcG9ydCBxcyBmcm9tICdxcyc7YCxcbiAgICAgICAgYGltcG9ydCB7IHR5cGUgTGlzdFJlc3VsdCwgZmV0Y2gsIHR5cGUgRXZlbnRIYW5kbGVycywgdHlwZSBTU0VTdHJlYW1PcHRpb25zLCB1c2VTU0VTdHJlYW0gfSBmcm9tICcuL3NvbmFtdS5zaGFyZWQnO2AsXG4gICAgICBdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJpbmZsZWN0aW9uIiwiZGlmZiIsInVuaXF1ZSIsImFwaVBhcmFtVG9Uc0NvZGUiLCJhcGlQYXJhbVR5cGVUb1RzVHlwZSIsInVud3JhcFByb21pc2VPbmNlIiwiU29uYW11IiwiQXBpUGFyYW1UeXBlIiwiYXNzZXJ0RGVmaW5lZCIsIlRlbXBsYXRlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwiVGVtcGxhdGVfX3NlcnZpY2VzIiwiZ2V0VGFyZ2V0QW5kUGF0aCIsInRhcmdldCIsInBhdGgiLCJyZW5kZXIiLCJhcGlzIiwic3luY2VyIiwiYXBpc0J5TW9kZWwiLCJNYXAiLCJhcGkiLCJtb2RlbE5hbWUiLCJyZXBsYWNlIiwiaGFzIiwic2V0IiwiZ2V0IiwicHVzaCIsImltcG9ydEtleXMiLCJuYW1lc3BhY2VzIiwidHlwZVBhcmFtTmFtZXMiLCJtb2RlbEFwaXMiLCJmdW5jdGlvbnMiLCJzdHJlYW1PcHRpb25zIiwicGFyYW1zV2l0aG91dENvbnRleHQiLCJwYXJhbWV0ZXJzIiwiZmlsdGVyIiwicGFyYW0iLCJpc0NvbnRleHQiLCJ0eXBlIiwiaXNSZWZLbmV4Iiwib3B0aW9uYWwiLCJuYW1lIiwic3RhcnRzV2l0aCIsInBhcmFtc0RlZiIsImFwaUJhc2VVcmwiLCJjb25maWciLCJyb3V0ZSIsInByZWZpeCIsIm1ldGhvZE5hbWVTdHJlYW0iLCJvcHRpb25zIiwicmVzb3VyY2VOYW1lIiwiY2FtZWxpemUiLCJtZXRob2ROYW1lIiwibWV0aG9kTmFtZVN0cmVhbUNhbWVsaXplZCIsImV2ZW50c1R5cGVEZWYiLCJldmVudHMiLCJwYXJhbXNEZWZBc09iamVjdCIsImxlbmd0aCIsIm1hcCIsInAiLCJqb2luIiwidHJpbSIsInR5cGVQYXJhbWV0ZXJzQXNUc1R5cGUiLCJ0eXBlUGFyYW1ldGVycyIsInR5cGVQYXJhbSIsInR5cGVQYXJhbXNEZWYiLCJjb25jYXQiLCJ0cCIsImlkIiwicGFyYW1OYW1lcyIsInJldHVyblR5cGVEZWYiLCJyZXR1cm5UeXBlIiwiY2xpZW50cyIsImluY2x1ZGVzIiwiaXNNdWx0aXBsZSIsInVwbG9hZE9wdGlvbnMiLCJtb2RlIiwiZmlsZVBhcmFtTmFtZSIsImZpbGVQYXJhbVR5cGUiLCJmb3JtRGF0YUFwcGVuZCIsIm90aGVyUGFyYW1zQXBwZW5kIiwicGFyYW1zRGVmQ29tbWEiLCJ0aW1lb3V0IiwiaHR0cE1ldGhvZCIsImhhc1BhcmFtcyIsImhvb2tOYW1lIiwibXV0YXRpb25QYXJhbVR5cGUiLCJtdXRhdGlvblBhcmFtTmFtZXMiLCJib2R5IiwiY3VzdG9tSGVhZGVycyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsU0FBU0MsSUFBSSxFQUFFQyxNQUFNLFFBQVEsVUFBVTtBQUN2QyxTQUNFQyxnQkFBZ0IsRUFDaEJDLG9CQUFvQixFQUNwQkMsaUJBQWlCLFFBQ1osK0JBQTRCO0FBRW5DLFNBQVNDLE1BQU0sUUFBUSxzQkFBbUI7QUFFMUMsU0FBU0MsWUFBWSxRQUFRLHVCQUFvQjtBQUNqRCxTQUFTQyxhQUFhLFFBQVEsdUJBQW9CO0FBQ2xELFNBQVNDLFFBQVEsUUFBUSxpQkFBYztBQUN2QyxTQUFTQyxrQkFBa0IsUUFBUSxzQkFBbUI7QUFFdEQsT0FBTyxNQUFNQywyQkFBMkJGO0lBQ3RDLGFBQWM7UUFDWixLQUFLLENBQUM7SUFDUjtJQUVBRyxtQkFBbUI7UUFDakIsT0FBTztZQUNMQyxRQUFRO1lBQ1JDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztRQUMvQjtJQUNGO0lBRUFDLE9BQU8sRUFBK0IsRUFBRTtRQUN0QyxNQUFNLEVBQUVDLElBQUksRUFBRSxHQUFHVixPQUFPVyxNQUFNO1FBRTlCLFdBQVc7UUFDWCxNQUFNQyxjQUFjLElBQUlDO1FBQ3hCLEtBQUssTUFBTUMsT0FBT0osS0FBTTtZQUN0QixNQUFNSyxZQUFZRCxJQUFJQyxTQUFTLENBQUNDLE9BQU8sQ0FBQyxVQUFVLElBQUlBLE9BQU8sQ0FBQyxVQUFVO1lBQ3hFLElBQUksQ0FBQ0osWUFBWUssR0FBRyxDQUFDRixZQUFZO2dCQUMvQkgsWUFBWU0sR0FBRyxDQUFDSCxXQUFXLEVBQUU7WUFDL0I7WUFDQUgsWUFBWU8sR0FBRyxDQUFDSixZQUFZSyxLQUFLTjtRQUNuQztRQUVBLE1BQU1PLGFBQXVCLEVBQUU7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
@@ -68,7 +68,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
68
68
  `;break}case-3:{i=`\r
69
69
  `;break}case-2:{i=t?" ":" ";break}case-1:{if(!t&&o)continue;i=" ";break}default:i=String.fromCharCode(a)}o=a===-2,r.push(i)}return r.join("")}function xqe(e){const r={constructs:NHe([Sqe,...(e||{}).extensions||[]]),content:o(jHe),defined:[],document:o(BHe),flow:o(iqe),lazy:{},string:o(uqe),text:o(cqe)};return r;function o(a){return i;function i(s){return Eqe(r,a,s)}}}function Tqe(e){for(;!ane(e););return e}const t6=/[\0\t\n\r]/g;function Aqe(){let e=1,t="",n=!0,r;return o;function o(a,i,s){const l=[];let u,d,p,h,m;for(a=t+(typeof a=="string"?a.toString():new TextDecoder(i||void 0).decode(a)),p=0,t="",n&&(a.charCodeAt(0)===65279&&p++,n=void 0);p<a.length;){if(t6.lastIndex=p,u=t6.exec(a),h=u&&u.index!==void 0?u.index:a.length,m=a.charCodeAt(h),!u){t=a.slice(p);break}if(m===10&&p===h&&r)l.push(-3),r=void 0;else switch(r&&(l.push(-5),r=void 0),p<h&&(l.push(a.slice(p,h)),e+=h-p),m){case 0:{l.push(65533),e++;break}case 9:{for(d=Math.ceil(e/4)*4,l.push(-2);e++<d;)l.push(-1);break}case 10:{l.push(-4),e=1;break}default:r=!0,e=1}p=h+1}return s&&(r&&l.push(-5),t&&l.push(t),l.push(null)),l}}const Cqe=/\\([!-/:-@[-`{-~])|&(#(?:\d{1,7}|x[\da-f]{1,6})|[\da-z]{1,31});/gi;function Oqe(e){return e.replace(Cqe,Iqe)}function Iqe(e,t,n){if(t)return t;if(n.charCodeAt(0)===35){const o=n.charCodeAt(1),a=o===120||o===88;return tne(n.slice(a?2:1),a?16:10)}return A$(n)||e}const dne={}.hasOwnProperty;function Rqe(e,t,n){return typeof t!="string"&&(n=t,t=void 0),Nqe(n)(Tqe(xqe(n).document().write(Aqe()(e,t,!0))))}function Nqe(e){const t={transforms:[],canContainEols:["emphasis","fragment","heading","paragraph","strong"],enter:{autolink:a(Bn),autolinkProtocol:R,autolinkEmail:R,atxHeading:a(ft),blockQuote:a(pe),characterEscape:R,characterReference:R,codeFenced:a(be),codeFencedFenceInfo:i,codeFencedFenceMeta:i,codeIndented:a(be,i),codeText:a(xe,i),codeTextData:R,data:R,codeFlowValue:R,definition:a(Ie),definitionDestinationString:i,definitionLabelString:i,definitionTitleString:i,emphasis:a(rt),hardBreakEscape:a(nt),hardBreakTrailing:a(nt),htmlFlow:a(Nt,i),htmlFlowData:R,htmlText:a(Nt,i),htmlTextData:R,image:a(an),label:i,link:a(Bn),listItem:a(yn),listItemValue:h,listOrdered:a(Mt,p),listUnordered:a(Mt),paragraph:a(xn),reference:P,referenceString:i,resourceDestinationString:i,resourceTitleString:i,setextHeading:a(ft),strong:a(sr),thematicBreak:a(Gt)},exit:{atxHeading:l(),atxHeadingSequence:C,autolink:l(),autolinkEmail:ae,autolinkProtocol:te,blockQuote:l(),characterEscapeValue:$,characterReferenceMarkerHexadecimal:L,characterReferenceMarkerNumeric:L,characterReferenceValue:X,characterReference:ne,codeFenced:l(v),codeFencedFence:y,codeFencedFenceInfo:m,codeFencedFenceMeta:b,codeFlowValue:$,codeIndented:l(k),codeText:l(H),codeTextData:$,data:$,definition:l(),definitionDestinationString:T,definitionLabelString:_,definitionTitleString:S,emphasis:l(),hardBreakEscape:l(M),hardBreakTrailing:l(M),htmlFlow:l(V),htmlFlowData:$,htmlText:l(z),htmlTextData:$,image:l(G),label:Q,labelText:q,lineEnding:N,link:l(W),listItem:l(),listOrdered:l(),listUnordered:l(),paragraph:l(),referenceString:Z,resourceDestinationString:F,resourceTitleString:U,resource:K,setextHeading:l(O),setextHeadingLineSequence:A,setextHeadingText:w,strong:l(),thematicBreak:l()}};fne(t,(e||{}).mdastExtensions||[]);const n={};return r;function r(he){let ye={type:"root",children:[]};const Pe={stack:[ye],tokenStack:[],config:t,enter:s,exit:u,buffer:i,resume:d,data:n},Ke=[];let at=-1;for(;++at<he.length;)if(he[at][1].type==="listOrdered"||he[at][1].type==="listUnordered")if(he[at][0]==="enter")Ke.push(at);else{const fn=Ke.pop();at=o(he,fn,at)}for(at=-1;++at<he.length;){const fn=t[he[at][0]];dne.call(fn,he[at][1].type)&&fn[he[at][1].type].call(Object.assign({sliceSerialize:he[at][2].sliceSerialize},Pe),he[at][1])}if(Pe.tokenStack.length>0){const fn=Pe.tokenStack[Pe.tokenStack.length-1];(fn[1]||n6).call(Pe,void 0,fn[0])}for(ye.position={start:is(he.length>0?he[0][1].start:{line:1,column:1,offset:0}),end:is(he.length>0?he[he.length-2][1].end:{line:1,column:1,offset:0})},at=-1;++at<t.transforms.length;)ye=t.transforms[at](ye)||ye;return ye}function o(he,ye,Pe){let Ke=ye-1,at=-1,fn=!1,Hn,$n,Xn,qn;for(;++Ke<=Pe;){const vn=he[Ke];switch(vn[1].type){case"listUnordered":case"listOrdered":case"blockQuote":{vn[0]==="enter"?at++:at--,qn=void 0;break}case"lineEndingBlank":{vn[0]==="enter"&&(Hn&&!qn&&!at&&!Xn&&(Xn=Ke),qn=void 0);break}case"linePrefix":case"listItemValue":case"listItemMarker":case"listItemPrefix":case"listItemPrefixWhitespace":break;default:qn=void 0}if(!at&&vn[0]==="enter"&&vn[1].type==="listItemPrefix"||at===-1&&vn[0]==="exit"&&(vn[1].type==="listUnordered"||vn[1].type==="listOrdered")){if(Hn){let Qn=Ke;for($n=void 0;Qn--;){const Mn=he[Qn];if(Mn[1].type==="lineEnding"||Mn[1].type==="lineEndingBlank"){if(Mn[0]==="exit")continue;$n&&(he[$n][1].type="lineEndingBlank",fn=!0),Mn[1].type="lineEnding",$n=Qn}else if(!(Mn[1].type==="linePrefix"||Mn[1].type==="blockQuotePrefix"||Mn[1].type==="blockQuotePrefixWhitespace"||Mn[1].type==="blockQuoteMarker"||Mn[1].type==="listItemIndent"))break}Xn&&(!$n||Xn<$n)&&(Hn._spread=!0),Hn.end=Object.assign({},$n?he[$n][1].start:vn[1].end),he.splice($n||Ke,0,["exit",Hn,vn[2]]),Ke++,Pe++}if(vn[1].type==="listItemPrefix"){const Qn={type:"listItem",_spread:!1,start:Object.assign({},vn[1].start),end:void 0};Hn=Qn,he.splice(Ke,0,["enter",Qn,vn[2]]),Ke++,Pe++,Xn=void 0,qn=!0}}}return he[ye][1]._spread=fn,Pe}function a(he,ye){return Pe;function Pe(Ke){s.call(this,he(Ke),Ke),ye&&ye.call(this,Ke)}}function i(){this.stack.push({type:"fragment",children:[]})}function s(he,ye,Pe){this.stack[this.stack.length-1].children.push(he),this.stack.push(he),this.tokenStack.push([ye,Pe||void 0]),he.position={start:is(ye.start),end:void 0}}function l(he){return ye;function ye(Pe){he&&he.call(this,Pe),u.call(this,Pe)}}function u(he,ye){const Pe=this.stack.pop(),Ke=this.tokenStack.pop();if(Ke)Ke[0].type!==he.type&&(ye?ye.call(this,he,Ke[0]):(Ke[1]||n6).call(this,he,Ke[0]));else throw new Error("Cannot close `"+he.type+"` ("+fp({start:he.start,end:he.end})+"): it’s not open");Pe.position.end=is(he.end)}function d(){return IHe(this.stack.pop())}function p(){this.data.expectingFirstListItemValue=!0}function h(he){if(this.data.expectingFirstListItemValue){const ye=this.stack[this.stack.length-2];ye.start=Number.parseInt(this.sliceSerialize(he),10),this.data.expectingFirstListItemValue=void 0}}function m(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.lang=he}function b(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.meta=he}function y(){this.data.flowCodeInside||(this.buffer(),this.data.flowCodeInside=!0)}function v(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.value=he.replace(/^(\r?\n|\r)|(\r?\n|\r)$/g,""),this.data.flowCodeInside=void 0}function k(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.value=he.replace(/(\r?\n|\r)$/g,"")}function _(he){const ye=this.resume(),Pe=this.stack[this.stack.length-1];Pe.label=ye,Pe.identifier=hc(this.sliceSerialize(he)).toLowerCase()}function S(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.title=he}function T(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.url=he}function C(he){const ye=this.stack[this.stack.length-1];if(!ye.depth){const Pe=this.sliceSerialize(he).length;ye.depth=Pe}}function w(){this.data.setextHeadingSlurpLineEnding=!0}function A(he){const ye=this.stack[this.stack.length-1];ye.depth=this.sliceSerialize(he).codePointAt(0)===61?1:2}function O(){this.data.setextHeadingSlurpLineEnding=void 0}function R(he){const Pe=this.stack[this.stack.length-1].children;let Ke=Pe[Pe.length-1];(!Ke||Ke.type!=="text")&&(Ke=Pn(),Ke.position={start:is(he.start),end:void 0},Pe.push(Ke)),this.stack.push(Ke)}function $(he){const ye=this.stack.pop();ye.value+=this.sliceSerialize(he),ye.position.end=is(he.end)}function N(he){const ye=this.stack[this.stack.length-1];if(this.data.atHardBreak){const Pe=ye.children[ye.children.length-1];Pe.position.end=is(he.end),this.data.atHardBreak=void 0;return}!this.data.setextHeadingSlurpLineEnding&&t.canContainEols.includes(ye.type)&&(R.call(this,he),$.call(this,he))}function M(){this.data.atHardBreak=!0}function V(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.value=he}function z(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.value=he}function H(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.value=he}function W(){const he=this.stack[this.stack.length-1];if(this.data.inReference){const ye=this.data.referenceType||"shortcut";he.type+="Reference",he.referenceType=ye,delete he.url,delete he.title}else delete he.identifier,delete he.label;this.data.referenceType=void 0}function G(){const he=this.stack[this.stack.length-1];if(this.data.inReference){const ye=this.data.referenceType||"shortcut";he.type+="Reference",he.referenceType=ye,delete he.url,delete he.title}else delete he.identifier,delete he.label;this.data.referenceType=void 0}function q(he){const ye=this.sliceSerialize(he),Pe=this.stack[this.stack.length-2];Pe.label=Oqe(ye),Pe.identifier=hc(ye).toLowerCase()}function Q(){const he=this.stack[this.stack.length-1],ye=this.resume(),Pe=this.stack[this.stack.length-1];if(this.data.inReference=!0,Pe.type==="link"){const Ke=he.children;Pe.children=Ke}else Pe.alt=ye}function F(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.url=he}function U(){const he=this.resume(),ye=this.stack[this.stack.length-1];ye.title=he}function K(){this.data.inReference=void 0}function P(){this.data.referenceType="collapsed"}function Z(he){const ye=this.resume(),Pe=this.stack[this.stack.length-1];Pe.label=ye,Pe.identifier=hc(this.sliceSerialize(he)).toLowerCase(),this.data.referenceType="full"}function L(he){this.data.characterReferenceType=he.type}function X(he){const ye=this.sliceSerialize(he),Pe=this.data.characterReferenceType;let Ke;Pe?(Ke=tne(ye,Pe==="characterReferenceMarkerNumeric"?10:16),this.data.characterReferenceType=void 0):Ke=A$(ye);const at=this.stack[this.stack.length-1];at.value+=Ke}function ne(he){const ye=this.stack.pop();ye.position.end=is(he.end)}function te(he){$.call(this,he);const ye=this.stack[this.stack.length-1];ye.url=this.sliceSerialize(he)}function ae(he){$.call(this,he);const ye=this.stack[this.stack.length-1];ye.url="mailto:"+this.sliceSerialize(he)}function pe(){return{type:"blockquote",children:[]}}function be(){return{type:"code",lang:null,meta:null,value:""}}function xe(){return{type:"inlineCode",value:""}}function Ie(){return{type:"definition",identifier:"",label:null,title:null,url:""}}function rt(){return{type:"emphasis",children:[]}}function ft(){return{type:"heading",depth:0,children:[]}}function nt(){return{type:"break"}}function Nt(){return{type:"html",value:""}}function an(){return{type:"image",title:null,url:"",alt:null}}function Bn(){return{type:"link",title:null,url:"",children:[]}}function Mt(he){return{type:"list",ordered:he.type==="listOrdered",start:null,spread:he._spread,children:[]}}function yn(he){return{type:"listItem",spread:he._spread,checked:null,children:[]}}function xn(){return{type:"paragraph",children:[]}}function sr(){return{type:"strong",children:[]}}function Pn(){return{type:"text",value:""}}function Gt(){return{type:"thematicBreak"}}}function is(e){return{line:e.line,column:e.column,offset:e.offset}}function fne(e,t){let n=-1;for(;++n<t.length;){const r=t[n];Array.isArray(r)?fne(e,r):Dqe(e,r)}}function Dqe(e,t){let n;for(n in t)if(dne.call(t,n))switch(n){case"canContainEols":{const r=t[n];r&&e[n].push(...r);break}case"transforms":{const r=t[n];r&&e[n].push(...r);break}case"enter":case"exit":{const r=t[n];r&&Object.assign(e[n],r);break}}}function n6(e,t){throw e?new Error("Cannot close `"+e.type+"` ("+fp({start:e.start,end:e.end})+"): a different token (`"+t.type+"`, "+fp({start:t.start,end:t.end})+") is open"):new Error("Cannot close document, a token (`"+t.type+"`, "+fp({start:t.start,end:t.end})+") is still open")}function Pqe(e){const t=this;t.parser=n;function n(r){return Rqe(r,{...t.data("settings"),...e,extensions:t.data("micromarkExtensions")||[],mdastExtensions:t.data("fromMarkdownExtensions")||[]})}}function $qe(e,t){const n={type:"element",tagName:"blockquote",properties:{},children:e.wrap(e.all(t),!0)};return e.patch(t,n),e.applyData(t,n)}function Mqe(e,t){const n={type:"element",tagName:"br",properties:{},children:[]};return e.patch(t,n),[e.applyData(t,n),{type:"text",value:`
70
70
  `}]}function Lqe(e,t){const n=t.value?t.value+`
71
- `:"",r={};t.lang&&(r.className=["language-"+t.lang]);let o={type:"element",tagName:"code",properties:r,children:[{type:"text",value:n}]};return t.meta&&(o.data={meta:t.meta}),e.patch(t,o),o=e.applyData(t,o),o={type:"element",tagName:"pre",properties:{},children:[o]},e.patch(t,o),o}function zqe(e,t){const n={type:"element",tagName:"del",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Fqe(e,t){const n={type:"element",tagName:"em",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function jqe(e,t){const n=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=String(t.identifier).toUpperCase(),o=$d(r.toLowerCase()),a=e.footnoteOrder.indexOf(r);let i,s=e.footnoteCounts.get(r);s===void 0?(s=0,e.footnoteOrder.push(r),i=e.footnoteOrder.length):i=a+1,s+=1,e.footnoteCounts.set(r,s);const l={type:"element",tagName:"a",properties:{href:"#"+n+"fn-"+o,id:n+"fnref-"+o+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(i)}]};e.patch(t,l);const u={type:"element",tagName:"sup",properties:{},children:[l]};return e.patch(t,u),e.applyData(t,u)}function Uqe(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Bqe(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function pne(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const o=e.all(t),a=o[0];a&&a.type==="text"?a.value="["+a.value:o.unshift({type:"text",value:"["});const i=o[o.length-1];return i&&i.type==="text"?i.value+=r:o.push({type:"text",value:r}),o}function Hqe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return pne(e,t);const o={src:$d(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(o.title=r.title);const a={type:"element",tagName:"img",properties:o,children:[]};return e.patch(t,a),e.applyData(t,a)}function qqe(e,t){const n={src:$d(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function Gqe(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function Wqe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return pne(e,t);const o={href:$d(r.url||"")};r.title!==null&&r.title!==void 0&&(o.title=r.title);const a={type:"element",tagName:"a",properties:o,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function Vqe(e,t){const n={href:$d(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function Zqe(e,t,n){const r=e.all(t),o=n?Yqe(n):hne(t),a={},i=[];if(typeof t.checked=="boolean"){const d=r[0];let p;d&&d.type==="element"&&d.tagName==="p"?p=d:(p={type:"element",tagName:"p",properties:{},children:[]},r.unshift(p)),p.children.length>0&&p.children.unshift({type:"text",value:" "}),p.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),a.className=["task-list-item"]}let s=-1;for(;++s<r.length;){const d=r[s];(o||s!==0||d.type!=="element"||d.tagName!=="p")&&i.push({type:"text",value:`
71
+ `:"",r={},o=t.lang?t.lang.split(/\s+/):[];o.length>0&&(r.className=["language-"+o[0]]);let a={type:"element",tagName:"code",properties:r,children:[{type:"text",value:n}]};return t.meta&&(a.data={meta:t.meta}),e.patch(t,a),a=e.applyData(t,a),a={type:"element",tagName:"pre",properties:{},children:[a]},e.patch(t,a),a}function zqe(e,t){const n={type:"element",tagName:"del",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Fqe(e,t){const n={type:"element",tagName:"em",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function jqe(e,t){const n=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",r=String(t.identifier).toUpperCase(),o=$d(r.toLowerCase()),a=e.footnoteOrder.indexOf(r);let i,s=e.footnoteCounts.get(r);s===void 0?(s=0,e.footnoteOrder.push(r),i=e.footnoteOrder.length):i=a+1,s+=1,e.footnoteCounts.set(r,s);const l={type:"element",tagName:"a",properties:{href:"#"+n+"fn-"+o,id:n+"fnref-"+o+(s>1?"-"+s:""),dataFootnoteRef:!0,ariaDescribedBy:["footnote-label"]},children:[{type:"text",value:String(i)}]};e.patch(t,l);const u={type:"element",tagName:"sup",properties:{},children:[l]};return e.patch(t,u),e.applyData(t,u)}function Uqe(e,t){const n={type:"element",tagName:"h"+t.depth,properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Bqe(e,t){if(e.options.allowDangerousHtml){const n={type:"raw",value:t.value};return e.patch(t,n),e.applyData(t,n)}}function pne(e,t){const n=t.referenceType;let r="]";if(n==="collapsed"?r+="[]":n==="full"&&(r+="["+(t.label||t.identifier)+"]"),t.type==="imageReference")return[{type:"text",value:"!["+t.alt+r}];const o=e.all(t),a=o[0];a&&a.type==="text"?a.value="["+a.value:o.unshift({type:"text",value:"["});const i=o[o.length-1];return i&&i.type==="text"?i.value+=r:o.push({type:"text",value:r}),o}function Hqe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return pne(e,t);const o={src:$d(r.url||""),alt:t.alt};r.title!==null&&r.title!==void 0&&(o.title=r.title);const a={type:"element",tagName:"img",properties:o,children:[]};return e.patch(t,a),e.applyData(t,a)}function qqe(e,t){const n={src:$d(t.url)};t.alt!==null&&t.alt!==void 0&&(n.alt=t.alt),t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"img",properties:n,children:[]};return e.patch(t,r),e.applyData(t,r)}function Gqe(e,t){const n={type:"text",value:t.value.replace(/\r?\n|\r/g," ")};e.patch(t,n);const r={type:"element",tagName:"code",properties:{},children:[n]};return e.patch(t,r),e.applyData(t,r)}function Wqe(e,t){const n=String(t.identifier).toUpperCase(),r=e.definitionById.get(n);if(!r)return pne(e,t);const o={href:$d(r.url||"")};r.title!==null&&r.title!==void 0&&(o.title=r.title);const a={type:"element",tagName:"a",properties:o,children:e.all(t)};return e.patch(t,a),e.applyData(t,a)}function Vqe(e,t){const n={href:$d(t.url)};t.title!==null&&t.title!==void 0&&(n.title=t.title);const r={type:"element",tagName:"a",properties:n,children:e.all(t)};return e.patch(t,r),e.applyData(t,r)}function Zqe(e,t,n){const r=e.all(t),o=n?Yqe(n):hne(t),a={},i=[];if(typeof t.checked=="boolean"){const d=r[0];let p;d&&d.type==="element"&&d.tagName==="p"?p=d:(p={type:"element",tagName:"p",properties:{},children:[]},r.unshift(p)),p.children.length>0&&p.children.unshift({type:"text",value:" "}),p.children.unshift({type:"element",tagName:"input",properties:{type:"checkbox",checked:t.checked,disabled:!0},children:[]}),a.className=["task-list-item"]}let s=-1;for(;++s<r.length;){const d=r[s];(o||s!==0||d.type!=="element"||d.tagName!=="p")&&i.push({type:"text",value:`
72
72
  `}),d.type==="element"&&d.tagName==="p"&&!o?i.push(...d.children):i.push(d)}const l=r[r.length-1];l&&(o||l.type!=="element"||l.tagName!=="p")&&i.push({type:"text",value:`
73
73
  `});const u={type:"element",tagName:"li",properties:a,children:i};return e.patch(t,u),e.applyData(t,u)}function Yqe(e){let t=!1;if(e.type==="list"){t=e.spread||!1;const n=e.children;let r=-1;for(;!t&&++r<n.length;)t=hne(n[r])}return t}function hne(e){const t=e.spread;return t??e.children.length>1}function Kqe(e,t){const n={},r=e.all(t);let o=-1;for(typeof t.start=="number"&&t.start!==1&&(n.start=t.start);++o<r.length;){const i=r[o];if(i.type==="element"&&i.tagName==="li"&&i.properties&&Array.isArray(i.properties.className)&&i.properties.className.includes("task-list-item")){n.className=["contains-task-list"];break}}const a={type:"element",tagName:t.ordered?"ol":"ul",properties:n,children:e.wrap(r,!0)};return e.patch(t,a),e.applyData(t,a)}function Xqe(e,t){const n={type:"element",tagName:"p",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function Qqe(e,t){const n={type:"root",children:e.wrap(e.all(t))};return e.patch(t,n),e.applyData(t,n)}function Jqe(e,t){const n={type:"element",tagName:"strong",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}function e8e(e,t){const n=e.all(t),r=n.shift(),o=[];if(r){const i={type:"element",tagName:"thead",properties:{},children:e.wrap([r],!0)};e.patch(t.children[0],i),o.push(i)}if(n.length>0){const i={type:"element",tagName:"tbody",properties:{},children:e.wrap(n,!0)},s=k$(t.children[1]),l=Zte(t.children[t.children.length-1]);s&&l&&(i.position={start:s,end:l}),o.push(i)}const a={type:"element",tagName:"table",properties:{},children:e.wrap(o,!0)};return e.patch(t,a),e.applyData(t,a)}function t8e(e,t,n){const r=n?n.children:void 0,a=(r?r.indexOf(t):1)===0?"th":"td",i=n&&n.type==="table"?n.align:void 0,s=i?i.length:t.children.length;let l=-1;const u=[];for(;++l<s;){const p=t.children[l],h={},m=i?i[l]:void 0;m&&(h.align=m);let b={type:"element",tagName:a,properties:h,children:[]};p&&(b.children=e.all(p),e.patch(p,b),b=e.applyData(p,b)),u.push(b)}const d={type:"element",tagName:"tr",properties:{},children:e.wrap(u,!0)};return e.patch(t,d),e.applyData(t,d)}function n8e(e,t){const n={type:"element",tagName:"td",properties:{},children:e.all(t)};return e.patch(t,n),e.applyData(t,n)}const r6=9,o6=32;function r8e(e){const t=String(e),n=/\r?\n|\r/g;let r=n.exec(t),o=0;const a=[];for(;r;)a.push(a6(t.slice(o,r.index),o>0,!0),r[0]),o=r.index+r[0].length,r=n.exec(t);return a.push(a6(t.slice(o),o>0,!1)),a.join("")}function a6(e,t,n){let r=0,o=e.length;if(t){let a=e.codePointAt(r);for(;a===r6||a===o6;)r++,a=e.codePointAt(r)}if(n){let a=e.codePointAt(o-1);for(;a===r6||a===o6;)o--,a=e.codePointAt(o-1)}return o>r?e.slice(r,o):""}function o8e(e,t){const n={type:"text",value:r8e(String(t.value))};return e.patch(t,n),e.applyData(t,n)}function a8e(e,t){const n={type:"element",tagName:"hr",properties:{},children:[]};return e.patch(t,n),e.applyData(t,n)}const i8e={blockquote:$qe,break:Mqe,code:Lqe,delete:zqe,emphasis:Fqe,footnoteReference:jqe,heading:Uqe,html:Bqe,imageReference:Hqe,image:qqe,inlineCode:Gqe,linkReference:Wqe,link:Vqe,listItem:Zqe,list:Kqe,paragraph:Xqe,root:Qqe,strong:Jqe,table:e8e,tableCell:n8e,tableRow:t8e,text:o8e,thematicBreak:a8e,toml:Kg,yaml:Kg,definition:Kg,footnoteDefinition:Kg};function Kg(){}const mne=-1,rS=0,hp=1,Lv=2,I$=3,R$=4,N$=5,D$=6,gne=7,bne=8,i6=typeof self=="object"?self:globalThis,s8e=(e,t)=>{const n=(o,a)=>(e.set(a,o),o),r=o=>{if(e.has(o))return e.get(o);const[a,i]=t[o];switch(a){case rS:case mne:return n(i,o);case hp:{const s=n([],o);for(const l of i)s.push(r(l));return s}case Lv:{const s=n({},o);for(const[l,u]of i)s[r(l)]=r(u);return s}case I$:return n(new Date(i),o);case R$:{const{source:s,flags:l}=i;return n(new RegExp(s,l),o)}case N$:{const s=n(new Map,o);for(const[l,u]of i)s.set(r(l),r(u));return s}case D$:{const s=n(new Set,o);for(const l of i)s.add(r(l));return s}case gne:{const{name:s,message:l}=i;return n(new i6[s](l),o)}case bne:return n(BigInt(i),o);case"BigInt":return n(Object(BigInt(i)),o);case"ArrayBuffer":return n(new Uint8Array(i).buffer,i);case"DataView":{const{buffer:s}=new Uint8Array(i);return n(new DataView(s),i)}}return n(new i6[a](i),o)};return r},s6=e=>s8e(new Map,e)(0),Ku="",{toString:l8e}={},{keys:u8e}=Object,Uf=e=>{const t=typeof e;if(t!=="object"||!e)return[rS,t];const n=l8e.call(e).slice(8,-1);switch(n){case"Array":return[hp,Ku];case"Object":return[Lv,Ku];case"Date":return[I$,Ku];case"RegExp":return[R$,Ku];case"Map":return[N$,Ku];case"Set":return[D$,Ku];case"DataView":return[hp,n]}return n.includes("Array")?[hp,n]:n.includes("Error")?[gne,n]:[Lv,n]},Xg=([e,t])=>e===rS&&(t==="function"||t==="symbol"),c8e=(e,t,n,r)=>{const o=(i,s)=>{const l=r.push(i)-1;return n.set(s,l),l},a=i=>{if(n.has(i))return n.get(i);let[s,l]=Uf(i);switch(s){case rS:{let d=i;switch(l){case"bigint":s=bne,d=i.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+l);d=null;break;case"undefined":return o([mne],i)}return o([s,d],i)}case hp:{if(l){let h=i;return l==="DataView"?h=new Uint8Array(i.buffer):l==="ArrayBuffer"&&(h=new Uint8Array(i)),o([l,[...h]],i)}const d=[],p=o([s,d],i);for(const h of i)d.push(a(h));return p}case Lv:{if(l)switch(l){case"BigInt":return o([l,i.toString()],i);case"Boolean":case"Number":case"String":return o([l,i.valueOf()],i)}if(t&&"toJSON"in i)return a(i.toJSON());const d=[],p=o([s,d],i);for(const h of u8e(i))(e||!Xg(Uf(i[h])))&&d.push([a(h),a(i[h])]);return p}case I$:return o([s,i.toISOString()],i);case R$:{const{source:d,flags:p}=i;return o([s,{source:d,flags:p}],i)}case N$:{const d=[],p=o([s,d],i);for(const[h,m]of i)(e||!(Xg(Uf(h))||Xg(Uf(m))))&&d.push([a(h),a(m)]);return p}case D$:{const d=[],p=o([s,d],i);for(const h of i)(e||!Xg(Uf(h)))&&d.push(a(h));return p}}const{message:u}=i;return o([s,{name:l,message:u}],i)};return a},l6=(e,{json:t,lossy:n}={})=>{const r=[];return c8e(!(t||n),!!t,new Map,r)(e),r},zv=typeof structuredClone=="function"?(e,t)=>t&&("json"in t||"lossy"in t)?s6(l6(e,t)):structuredClone(e):(e,t)=>s6(l6(e,t));function d8e(e,t){const n=[{type:"text",value:"↩"}];return t>1&&n.push({type:"element",tagName:"sup",properties:{},children:[{type:"text",value:String(t)}]}),n}function f8e(e,t){return"Back to reference "+(e+1)+(t>1?"-"+t:"")}function p8e(e){const t=typeof e.options.clobberPrefix=="string"?e.options.clobberPrefix:"user-content-",n=e.options.footnoteBackContent||d8e,r=e.options.footnoteBackLabel||f8e,o=e.options.footnoteLabel||"Footnotes",a=e.options.footnoteLabelTagName||"h2",i=e.options.footnoteLabelProperties||{className:["sr-only"]},s=[];let l=-1;for(;++l<e.footnoteOrder.length;){const u=e.footnoteById.get(e.footnoteOrder[l]);if(!u)continue;const d=e.all(u),p=String(u.identifier).toUpperCase(),h=$d(p.toLowerCase());let m=0;const b=[],y=e.footnoteCounts.get(p);for(;y!==void 0&&++m<=y;){b.length>0&&b.push({type:"text",value:" "});let _=typeof n=="string"?n:n(l,m);typeof _=="string"&&(_={type:"text",value:_}),b.push({type:"element",tagName:"a",properties:{href:"#"+t+"fnref-"+h+(m>1?"-"+m:""),dataFootnoteBackref:"",ariaLabel:typeof r=="string"?r:r(l,m),className:["data-footnote-backref"]},children:Array.isArray(_)?_:[_]})}const v=d[d.length-1];if(v&&v.type==="element"&&v.tagName==="p"){const _=v.children[v.children.length-1];_&&_.type==="text"?_.value+=" ":v.children.push({type:"text",value:" "}),v.children.push(...b)}else d.push(...b);const k={type:"element",tagName:"li",properties:{id:t+"fn-"+h},children:e.wrap(d,!0)};e.patch(u,k),s.push(k)}if(s.length!==0)return{type:"element",tagName:"section",properties:{dataFootnotes:!0,className:["footnotes"]},children:[{type:"element",tagName:a,properties:{...zv(i),id:"footnote-label"},children:[{type:"text",value:o}]},{type:"text",value:`
74
74
  `},{type:"element",tagName:"ol",properties:{},children:e.wrap(s,!0)},{type:"text",value:`
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>{{projectName}}: Sonamu UI</title>
7
- <script type="module" crossorigin src="/sonamu-ui/assets/index-DzqUrTB-.js"></script>
7
+ <script type="module" crossorigin src="/sonamu-ui/assets/index-DFqVuxOB.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/sonamu-ui/assets/index-CpaB9P6g.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.17",
3
+ "version": "0.7.18",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -81,10 +81,10 @@
81
81
  "tsicli": "^1.0.5",
82
82
  "vitest": "^4.0.10",
83
83
  "zod": "^4.1.12",
84
+ "@sonamu-kit/hmr-hook": "^0.4.1",
84
85
  "@sonamu-kit/hmr-runner": "^0.1.1",
85
- "@sonamu-kit/tasks": "^0.1.1",
86
86
  "@sonamu-kit/ts-loader": "^2.1.3",
87
- "@sonamu-kit/hmr-hook": "^0.4.1"
87
+ "@sonamu-kit/tasks": "^0.1.1"
88
88
  },
89
89
  "devDependencies": {
90
90
  "@biomejs/biome": "^2.3.7",
@@ -11,6 +11,7 @@ import type { TemplateOptions } from "../../types/types";
11
11
  import { ApiParamType } from "../../types/types";
12
12
  import { assertDefined } from "../../utils/utils";
13
13
  import { Template } from "../template";
14
+ import { zodTypeToTsTypeDef } from "../zod-converter";
14
15
 
15
16
  export class Template__services extends Template {
16
17
  constructor() {
@@ -45,6 +46,44 @@ export class Template__services extends Template {
45
46
  const functions: string[] = [];
46
47
 
47
48
  for (const api of modelApis) {
49
+ // @stream 데코레이터가 있으면 SSE 스트림 함수 생성
50
+ if (api.streamOptions) {
51
+ const paramsWithoutContext = api.parameters.filter(
52
+ (param) =>
53
+ !ApiParamType.isContext(param.type) &&
54
+ !ApiParamType.isRefKnex(param.type) &&
55
+ !(param.optional === true && param.name.startsWith("_")),
56
+ );
57
+
58
+ const paramsDef = apiParamToTsCode(paramsWithoutContext, importKeys);
59
+ const apiBaseUrl = `${Sonamu.config.api.route.prefix}${api.path}`;
60
+
61
+ const methodNameStream = api.options.resourceName
62
+ ? `use${inflection.camelize(api.options.resourceName)}`
63
+ : `use${inflection.camelize(api.methodName)}`;
64
+ const methodNameStreamCamelized = inflection.camelize(methodNameStream, true);
65
+
66
+ const eventsTypeDef = zodTypeToTsTypeDef(api.streamOptions.events);
67
+
68
+ const paramsDefAsObject =
69
+ paramsWithoutContext.length > 0
70
+ ? `{ ${paramsWithoutContext.map((p) => p.name).join(", ")} }`
71
+ : "{}";
72
+
73
+ functions.push(
74
+ `
75
+ export function ${methodNameStreamCamelized}(
76
+ params: ${paramsDef ? `{ ${paramsWithoutContext.map((p) => `${p.name}: ${apiParamTypeToTsType(p.type, importKeys)}`).join(", ")} }` : "{}"},
77
+ handlers: EventHandlers<${eventsTypeDef} & { end?: () => void }>,
78
+ options: SSEStreamOptions
79
+ ) {
80
+ return useSSEStream<${eventsTypeDef}>(\`${apiBaseUrl}\`, ${paramsDefAsObject}, handlers, options);
81
+ }
82
+ `.trim(),
83
+ );
84
+ continue;
85
+ }
86
+
48
87
  // Context 제외한 파라미터
49
88
  const paramsWithoutContext = api.parameters.filter(
50
89
  (param) =>
@@ -219,7 +258,7 @@ ${functions.join("\n\n")}
219
258
  `import { queryOptions, useQuery, useMutation } from '@tanstack/react-query';`,
220
259
  `import type { AxiosProgressEvent } from 'axios';`,
221
260
  `import qs from 'qs';`,
222
- `import { type ListResult, fetch } from './sonamu.shared';`,
261
+ `import { type ListResult, fetch, type EventHandlers, type SSEStreamOptions, useSSEStream } from './sonamu.shared';`,
223
262
  ],
224
263
  };
225
264
  }