sonamu 0.11.7 → 0.11.9
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/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +2 -6
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +4 -5
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +38 -76
- package/package.json +1 -1
- package/src/bin/build-config.ts +2 -5
- package/src/template/implementations/generated_sso.template.ts +3 -9
- package/src/template/implementations/sd.template.ts +44 -76
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAajE,MAAM,MAAM,aAAa,CAAC,gBAAgB,GAAG,EAAE,IAAI;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAED,KAAK,wBAAwB,GAAG,CAAC,cAAc,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEpF,MAAM,WAAW,+BAA+B;IAC9C,kBAAkB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAQD,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,oBAAoB,EACnF,UAAU,EAAE,CAAC,EACb,OAAO,EAAE;IACP,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,YAAY,GAAE,+BAAiE,GAC9E,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CA6BnC;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,IAAI,CASN;AAED,eAAO,MAAM,mCAAmC,mDAAmD,CAAC;AACpG,eAAO,MAAM,kCAAkC,oDAAoD,CAAC;AAEpG,wBAAsB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqElB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/bin/build-config.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,eAAe,CAAC;AAajE,MAAM,MAAM,aAAa,CAAC,gBAAgB,GAAG,EAAE,IAAI;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IAC/B,YAAY,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACjD,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC,CAAC;AAEzE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGxD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAQlD;AAED,KAAK,wBAAwB,GAAG,CAAC,cAAc,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAEpF,MAAM,WAAW,+BAA+B;IAC9C,kBAAkB,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC7D;AAQD,wBAAsB,gCAAgC,CAAC,CAAC,SAAS,oBAAoB,EACnF,UAAU,EAAE,CAAC,EACb,OAAO,EAAE;IACP,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,YAAY,GAAE,+BAAiE,GAC9E,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CA6BnC;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjD,IAAI,CASN;AAED,eAAO,MAAM,mCAAmC,mDAAmD,CAAC;AACpG,eAAO,MAAM,kCAAkC,oDAAoD,CAAC;AAEpG,wBAAsB,kCAAkC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5F;AAED,wBAAsB,gCAAgC,CAAC,OAAO,EAAE;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,2BAA2B,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqElB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC;IAAE,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,EASpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,aAAa,EAmBxC,CAAC;AAEF,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE;IACZ,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;CAInB,GACA,OAAO,CAAC,MAAM,CAAC,CAajB;AA2BD,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCrD;AAED,wBAAsB,eAAe,CAAC,EACpC,aAAqB,GACtB,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlD"}
|
package/dist/bin/build-config.js
CHANGED
|
@@ -126,11 +126,7 @@ const API_ARTIFACTS = [{
|
|
|
126
126
|
description: "API 프로젝트 빌드 산출물",
|
|
127
127
|
projectPath: "api",
|
|
128
128
|
preBuildCommand: () => "rm -rf dist",
|
|
129
|
-
buildCommand: ({ configFilePath }) => {
|
|
130
|
-
const configExtension = path.extname(configFilePath);
|
|
131
|
-
const configLoader = [".ts", ".tsx"].includes(configExtension) ? " --config-loader tsx" : "";
|
|
132
|
-
return `tsc --noEmit && pnpm exec tsdown --config ${JSON.stringify(configFilePath)}${configLoader}`;
|
|
133
|
-
}
|
|
129
|
+
buildCommand: ({ configFilePath }) => `tsc --noEmit && pnpm exec tsdown --config ${JSON.stringify(configFilePath)}`
|
|
134
130
|
}];
|
|
135
131
|
/**
|
|
136
132
|
* 웹 프로젝트 빌드 산출물에 대한 규칙들.
|
|
@@ -258,4 +254,4 @@ async function buildWebCommand({ skipIfMissing = false } = {}) {
|
|
|
258
254
|
//#endregion
|
|
259
255
|
export { API_ARTIFACTS, HTTP_VALIDATOR_REGISTRY_BUILD_PATH, HTTP_VALIDATOR_REGISTRY_SOURCE_PATH, WEB_ARTIFACTS, assertApiZodCompilerBuildOutput, assertApiZodCompilerSourceRegistry, buildApiCommand, buildWebCommand, composeApiZodCompilerBuildConfig, createApiZodCompilerBuildWrapper, createWebTypecheckCommand, quoteShellArgument, resolveApiBuildConfigPath };
|
|
260
256
|
|
|
261
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgVXNlckNvbmZpZyB9IGZyb20gXCJ0c2Rvd25cIjtcblxuaW1wb3J0IHsgdHlwZSBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2FkQnVpbGRDb21waWxlclBvbGljeSB9IGZyb20gXCIuL2NvbXBpbGVyLXBvbGljeVwiO1xuXG5leHBvcnQgdHlwZSBCdWlsZEFydGlmYWN0PEJ1aWxkQ29tbWFuZEFyZ3MgPSB7fT4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHJvamVjdFBhdGg6IHN0cmluZztcbiAgcHJlQnVpbGRDb21tYW5kPzogKCkgPT4gc3RyaW5nO1xuICBidWlsZENvbW1hbmQ6IChhcmdzOiBCdWlsZENvbW1hbmRBcmdzKSA9PiBzdHJpbmc7XG4gIHBvc3RCdWlsZENvbW1hbmQ/OiAoKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcGlUc2Rvd25CdWlsZENvbmZpZyA9IFBpY2s8VXNlckNvbmZpZywgXCJlbnRyeVwiIHwgXCJwbHVnaW5zXCI+O1xuXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVTaGVsbEFyZ3VtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDsnpHsnYDrlLDsmLTtkZwg7J6Q7LK066eMIOyFuCDqsr3qs4Trpbwg64ur7KeAIOuqu+2VmOuPhOuhnSDrtoTrpqztlbQg66as7YSw65+0IOyduOyImOulvCDrs7TsobTtlanri4jri6QuXG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTogc3RyaW5nIHtcbiAgY29uc3QgaXNTb3VyY2VNb2R1bGUgPSBwYXRoLmV4dG5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUpID09PSBcIi50c1wiO1xuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKFxuICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgYHR5cGVjaGVjay13ZWIuJHtpc1NvdXJjZU1vZHVsZSA/IFwidHNcIiA6IFwianNcIn1gLFxuICApO1xuICBjb25zdCBydW5uZXIgPSBpc1NvdXJjZU1vZHVsZSA/IFwicG5wbSBleGVjIHRzeFwiIDogcXVvdGVTaGVsbEFyZ3VtZW50KHByb2Nlc3MuZXhlY1BhdGgpO1xuICByZXR1cm4gYCR7cnVubmVyfSAke3F1b3RlU2hlbGxBcmd1bWVudChzY3JpcHRQYXRoKX1gO1xufVxuXG50eXBlIFpvZENvbXBpbGVyUGx1Z2luRmFjdG9yeSA9ICh0eXBlb2YgaW1wb3J0KFwiem9kLWNvbXBpbGVyL3JvbGxkb3duXCIpKVtcImRlZmF1bHRcIl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyB7XG4gIGxvYWRDb21waWxlclBsdWdpbjogKCkgPT4gUHJvbWlzZTxab2RDb21waWxlclBsdWdpbkZhY3Rvcnk+O1xufVxuXG5jb25zdCBhcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0ge1xuICBhc3luYyBsb2FkQ29tcGlsZXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIikpLmRlZmF1bHQ7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZUFwaVpvZENvbXBpbGVyQnVpbGRDb25maWc8VCBleHRlbmRzIEFwaVRzZG93bkJ1aWxkQ29uZmlnPihcbiAgYmFzZUNvbmZpZzogVCxcbiAgb3B0aW9uczoge1xuICAgIHBvbGljeTogTm9ybWFsaXplZFpvZENvbXBpbGVyUG9saWN5O1xuICAgIHJlZ2lzdHJ5UGF0aD86IHN0cmluZztcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0gYXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8VCAmIEFwaVRzZG93bkJ1aWxkQ29uZmlnPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gYmFzZUNvbmZpZztcbiAgfVxuICBpZiAob3B0aW9ucy5yZWdpc3RyeVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIuYXBpIHJlcXVpcmVzIHRoZSBnZW5lcmF0ZWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnlcIik7XG4gIH1cblxuICBjb25zdCB6b2RDb21waWxlciA9IGF3YWl0IGRlcGVuZGVuY2llcy5sb2FkQ29tcGlsZXJQbHVnaW4oKTtcbiAgY29uc3QgY29tcGlsZXJQbHVnaW4gPSB6b2RDb21waWxlcih7XG4gICAgY29kZWdlbk1vZGU6IFwiaW5saW5lXCIsXG4gICAgaW5jbHVkZTogW29wdGlvbnMucmVnaXN0cnlQYXRoXSxcbiAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgIHNjaGVtYXM6IFwiZXhwbGljaXRcIixcbiAgfSk7XG5cbiAgbGV0IGNvbmZpZ3VyZWRQbHVnaW5zOiBFeGNsdWRlPFVzZXJDb25maWdbXCJwbHVnaW5zXCJdLCB1bmRlZmluZWQ+W107XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VDb25maWcucGx1Z2lucykpIHtcbiAgICBjb25maWd1cmVkUGx1Z2lucyA9IGJhc2VDb25maWcucGx1Z2lucztcbiAgfSBlbHNlIGlmIChiYXNlQ29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZ3VyZWRQbHVnaW5zID0gW107XG4gIH0gZWxzZSB7XG4gICAgY29uZmlndXJlZFBsdWdpbnMgPSBbYmFzZUNvbmZpZy5wbHVnaW5zXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbmZpZyxcbiAgICBwbHVnaW5zOiBbLi4uY29uZmlndXJlZFBsdWdpbnMsIGNvbXBpbGVyUGx1Z2luXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoXG4gIG91dHB1dHM6IHJlYWRvbmx5IHsgY29kZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfVtdLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICBpZiAoL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KG91dHB1dC5jb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB6b2QtY29tcGlsZXIgY29tcGlsZSBib3VuZGFyeSByZW1haW5zIGluICR7b3V0cHV0LnBhdGh9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuY29kZS5pbmNsdWRlcyhcInZpcnR1YWw6em9kLWNvbXBpbGVyL3J1bnRpbWVcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgem9kLWNvbXBpbGVyIHZpcnR1YWwgcnVudGltZSBpbXBvcnQgcmVtYWlucyBpbiAke291dHB1dC5wYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEggPSBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQudHNcIjtcbmV4cG9ydCBjb25zdCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIID0gXCJkaXN0L2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC5qc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0QXBpWm9kQ29tcGlsZXJTb3VyY2VSZWdpc3RyeShyZWdpc3RyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHJlZ2lzdHJ5UGF0aCwgXCJ1dGY4XCIpO1xuICBpZiAoIS9maW5nZXJwcmludFxccyo9XFxzKltcIiddW2EtZjAtOV17NjR9W1wiJ10vLnRlc3Qoc291cmNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGZpbmdlcnByaW50IGlzIGludmFsaWQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IGRlY2xhcmVzWmVyb1JvdXRlcyA9IC9cXGJyb3V0ZUlkc1xccyo9XFxzKlxce1xccypcXH1cXHMqOy8udGVzdChzb3VyY2UpO1xuICBpZiAoIWRlY2xhcmVzWmVyb1JvdXRlcyAmJiAhL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KHNvdXJjZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBoYXMgbm8gY29tcGlsZSBib3VuZGFyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKG9wdGlvbnM6IHtcbiAgYXBpUm9vdFBhdGg6IHN0cmluZztcbiAgYmFzZUNvbmZpZ1BhdGg6IHN0cmluZztcbiAgcG9saWN5OiBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3k7XG4gIHJlZ2lzdHJ5UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iYXNlQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGF3YWl0IGFzc2VydEFwaVpvZENvbXBpbGVyU291cmNlUmVnaXN0cnkob3B0aW9ucy5yZWdpc3RyeVBhdGgpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IHBhdGguam9pbihcbiAgICBvcHRpb25zLmFwaVJvb3RQYXRoLFxuICAgIGAuc29uYW11LXpvZC1jb21waWxlci0ke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9Lm1qc2AsXG4gICk7XG4gIGNvbnN0IGJhc2VDb25maWdVcmwgPSBwYXRoVG9GaWxlVVJMKG9wdGlvbnMuYmFzZUNvbmZpZ1BhdGgpLmhyZWY7XG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBgaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO2AsXG4gICAgYGltcG9ydCBiYXNlQ29uZmlnIGZyb20gJHtKU09OLnN0cmluZ2lmeShiYXNlQ29uZmlnVXJsKX07YCxcbiAgICBgaW1wb3J0IHpvZENvbXBpbGVyIGZyb20gXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnN0IGNvbXBpbGVyUGx1Z2luID0gem9kQ29tcGlsZXIoJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjb2RlZ2VuTW9kZTogXCJpbmxpbmVcIixcbiAgICAgIGluY2x1ZGU6IFtvcHRpb25zLnJlZ2lzdHJ5UGF0aF0sXG4gICAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgICAgc2NoZW1hczogXCJleHBsaWNpdFwiLFxuICAgIH0pfSk7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLnJlZ2lzdHJ5UGF0aCl9O2AsXG4gICAgYGNvbnN0IGFwaVJvb3RQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLmFwaVJvb3RQYXRoKX07YCxcbiAgICBgY29uc3QgY2Fub25pY2FsT3V0RGlyID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcImRpc3RcIik7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlFbnRyeU5hbWUgPSBcImFwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZFwiO2AsXG4gICAgYGNvbnN0IGRlZmF1bHRFbnRyeSA9IHsgaW5kZXg6IFwic3JjL2luZGV4LnRzXCIgfTtgLFxuICAgIFwiY29uc3QgcmVzb2x2ZXNUb1JlZ2lzdHJ5ID0gKGVudHJ5KSA9PlwiLFxuICAgICcgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiBwYXRoLnJlc29sdmUoYXBpUm9vdFBhdGgsIGVudHJ5KSA9PT0gcmVnaXN0cnlQYXRoOycsXG4gICAgXCJjb25zdCBhcHBlbmRSZWdpc3RyeUVudHJ5ID0gKGVudHJ5KSA9PiB7XCIsXG4gICAgXCIgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1wiLFxuICAgIFwiICAgIHJldHVybiBlbnRyeS5zb21lKHJlc29sdmVzVG9SZWdpc3RyeSkgPyBlbnRyeSA6IFsuLi5lbnRyeSwgcmVnaXN0cnlQYXRoXTtcIixcbiAgICBcIiAgfVwiLFxuICAgICcgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHsnLFxuICAgIFwiICAgIHJldHVybiByZXNvbHZlc1RvUmVnaXN0cnkoZW50cnkpID8gZW50cnkgOiBbZW50cnksIHJlZ2lzdHJ5UGF0aF07XCIsXG4gICAgXCIgIH1cIixcbiAgICAnICBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmIGVudHJ5ICE9PSBudWxsKSB7JyxcbiAgICBcIiAgICBpZiAoT2JqZWN0LnZhbHVlcyhlbnRyeSkuc29tZShyZXNvbHZlc1RvUmVnaXN0cnkpKSByZXR1cm4gZW50cnk7XCIsXG4gICAgXCIgICAgaWYgKHJlZ2lzdHJ5RW50cnlOYW1lIGluIGVudHJ5KSB7XCIsXG4gICAgXCIgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRzZG93biBlbnRyeSBjb2xsaXNpb246ICR7cmVnaXN0cnlFbnRyeU5hbWV9YCk7XCIsXG4gICAgXCIgICAgfVwiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmVudHJ5LCBbcmVnaXN0cnlFbnRyeU5hbWVdOiByZWdpc3RyeVBhdGggfTtcIixcbiAgICBcIiAgfVwiLFxuICAgIFwiICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1wiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmRlZmF1bHRFbnRyeSwgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCIgIH1cIixcbiAgICBcIiAgcmV0dXJuIHsgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCJ9O1wiLFxuICAgIFwiY29uc3QgYXBwZW5kUGx1Z2luID0gKGNvbmZpZykgPT4gKHtcIixcbiAgICBcIiAgLi4uY29uZmlnLFwiLFxuICAgIFwiICAvLyDrn7Dtg4DsnoQgbG9hZGVy6rCAIOywuOyhsO2VmOuKlCByZWdpc3RyeSDqsr3roZzrpbwg67mM65OcIOyEpOygleqzvCDsnbzsuZjsi5ztgrXri4jri6QuXCIsXG4gICAgXCIgIG91dERpcjogY2Fub25pY2FsT3V0RGlyLFwiLFxuICAgIFwiICBmaXhlZEV4dGVuc2lvbjogZmFsc2UsXCIsXG4gICAgXCIgIGVudHJ5OiBhcHBlbmRSZWdpc3RyeUVudHJ5KGNvbmZpZy5lbnRyeSksXCIsXG4gICAgXCIgIHBsdWdpbnM6IFsuLi4oY29uZmlnLnBsdWdpbnMgPz8gW10pLCBjb21waWxlclBsdWdpbl0sXCIsXG4gICAgXCJ9KTtcIixcbiAgICBcImNvbnN0IGFwcGVuZFRvUmVzb2x2ZWRDb25maWcgPSAoY29uZmlnKSA9PlwiLFxuICAgIFwiICBBcnJheS5pc0FycmF5KGNvbmZpZykgPyBjb25maWcubWFwKGFwcGVuZFBsdWdpbikgOiBhcHBlbmRQbHVnaW4oY29uZmlnKTtcIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKC4uLmFyZ3MpID0+IHtcIixcbiAgICAnICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBiYXNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCInLFxuICAgIFwiICAgID8gYXdhaXQgYmFzZUNvbmZpZyguLi5hcmdzKVwiLFxuICAgIFwiICAgIDogYXdhaXQgYmFzZUNvbmZpZztcIixcbiAgICBcIiAgcmV0dXJuIGFwcGVuZFRvUmVzb2x2ZWRDb25maWcocmVzb2x2ZWQpO1wiLFxuICAgIFwifTtcIixcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZSh3cmFwcGVyUGF0aCwgc291cmNlLCBcInV0ZjhcIik7XG4gIHJldHVybiB3cmFwcGVyUGF0aDtcbn1cblxuLyoqXG4gKiBBUEkg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF9hcGkg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQSV9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3Q8eyBjb25maWdGaWxlUGF0aDogc3RyaW5nIH0+W10gPSBbXG4gIHtcbiAgICBuYW1lOiBcIkFQSVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFQSSDtlITroZzsoJ3tirgg67mM65OcIOyCsOy2nOusvFwiLFxuICAgIHByb2plY3RQYXRoOiBcImFwaVwiLFxuICAgIHByZUJ1aWxkQ29tbWFuZDogKCkgPT4gXCJybSAtcmYgZGlzdFwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKHsgY29uZmlnRmlsZVBhdGggfSkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnRXh0ZW5zaW9uID0gcGF0aC5leHRuYW1lKGNvbmZpZ0ZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0xvYWRlciA9IFtcIi50c1wiLCBcIi50c3hcIl0uaW5jbHVkZXMoY29uZmlnRXh0ZW5zaW9uKSA/IFwiIC0tY29uZmlnLWxvYWRlciB0c3hcIiA6IFwiXCI7XG4gICAgICByZXR1cm4gYHRzYyAtLW5vRW1pdCAmJiBwbnBtIGV4ZWMgdHNkb3duIC0tY29uZmlnICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnRmlsZVBhdGgpfSR7Y29uZmlnTG9hZGVyfWA7XG4gICAgfSxcbiAgfSxcbl07XG5cbi8qKlxuICog7Ju5IO2UhOuhnOygne2KuCDruYzrk5wg7IKw7Lac66y87JeQIOuMgO2VnCDqt5zsuZnrk6QuXG4gKiBjbGkudHPsnZggYnVpbGRfd2ViIO2VqOyImOqwgCDsnbTqsoPsnYQg67O06rOgIOq3uOuMgOuhnCDsi6Ttlontlanri4jri6QuXG4gKi9cbmV4cG9ydCBjb25zdCBXRUJfQVJUSUZBQ1RTOiBCdWlsZEFydGlmYWN0W10gPSBbXG4gIHtcbiAgICBuYW1lOiBcIldlYiBDbGllbnRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJXZWIg7ZSE66Gc7KCd7Yq4IO2BtOudvOydtOyWuO2KuCDruYzrk5wg7IKw7Lac66y8XCIsXG4gICAgcHJvamVjdFBhdGg6IFwid2ViXCIsXG4gICAgcHJlQnVpbGRDb21tYW5kOiAoKSA9PiBcInJtIC1yZiBkaXN0L2NsaWVudFwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKCkgPT5cbiAgICAgIGAke2NyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKX0gJiYgdml0ZSBidWlsZCAtLWNvbmZpZyB2aXRlLmNvbmZpZy50cyAtLW91dERpciBkaXN0L2NsaWVudGAsXG4gIH0sXG4gIHtcbiAgICBuYW1lOiBcIldlYiBTZXJ2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJXZWIg7ZSE66Gc7KCd7Yq4IOyEnOuyhCDruYzrk5wg7IKw7Lac66y8XCIsXG4gICAgcHJvamVjdFBhdGg6IFwid2ViXCIsXG4gICAgcHJlQnVpbGRDb21tYW5kOiAoKSA9PiBcInJtIC1yZiBkaXN0L3NlcnZlclwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKCkgPT5cbiAgICAgIGAke2NyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKX0gJiYgdml0ZSBidWlsZCAtLWNvbmZpZyB2aXRlLmNvbmZpZy50cyAtLXNzciBzcmMvZW50cnktc2VydmVyLmdlbmVyYXRlZC50c3ggLS1vdXREaXIgZGlzdC9zZXJ2ZXJgLFxuICAgIHBvc3RCdWlsZENvbW1hbmQ6ICgpID0+XG4gICAgICBcInJtIC1yZiAuLi9hcGkvd2ViLWRpc3QgJiYgbWtkaXIgLXAgLi4vYXBpL3dlYi1kaXN0ICYmIGNwIC1yIGRpc3QvKiAuLi9hcGkvd2ViLWRpc3RcIixcbiAgfSxcbl07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpQnVpbGRDb25maWdQYXRoKFxuICBhcGlSb290UGF0aDogc3RyaW5nLFxuICBkZXBlbmRlbmNpZXM6IHtcbiAgICBleGlzdHM6IChjYW5kaWRhdGVQYXRoOiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gICAgbW9kdWxlRGlyOiBzdHJpbmc7XG4gIH0gPSB7XG4gICAgZXhpc3RzLFxuICAgIG1vZHVsZURpcjogaW1wb3J0Lm1ldGEuZGlybmFtZSxcbiAgfSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxvY2FsQ29uZmlnUGF0aCA9IHBhdGguam9pbihhcGlSb290UGF0aCwgXCJ0c2Rvd24uY29uZmlnLnRzXCIpO1xuICBpZiAoYXdhaXQgZGVwZW5kZW5jaWVzLmV4aXN0cyhsb2NhbENvbmZpZ1BhdGgpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgdHNkb3duLmNvbmZpZy50cyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgcmV0dXJuIGxvY2FsQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgdHNkb3duIEFQSSBjb25maWcgZnJvbSBzb25hbXUgcGFja2FnZS4uLlwiKSk7XG4gIGNvbnN0IGNvbXBpbGVkQ29uZmlnUGF0aCA9IHBhdGguam9pbihkZXBlbmRlbmNpZXMubW9kdWxlRGlyLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcuanNcIik7XG4gIGlmIChhd2FpdCBkZXBlbmRlbmNpZXMuZXhpc3RzKGNvbXBpbGVkQ29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4gY29tcGlsZWRDb25maWdQYXRoO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oZGVwZW5kZW5jaWVzLm1vZHVsZURpciwgXCIuLlwiLCBcIi4uXCIsIFwidHNkb3duLmFwaS5jb25maWcudHNcIik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkJ1aWxkU3RlcHM8VD4oXG4gIGFydGlmYWN0OiBCdWlsZEFydGlmYWN0PFQ+LFxuICBvcHRpb25zOiB7IGN3ZDogc3RyaW5nOyBidWlsZENvbW1hbmRBcmdzOiBUIH0sXG4pIHtcbiAgY29uc3Qgc3RlcHMgPSBbXG4gICAgeyBuYW1lOiBcInByZS1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnByZUJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgICB7IG5hbWU6IFwiYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5idWlsZENvbW1hbmQob3B0aW9ucy5idWlsZENvbW1hbmRBcmdzKSB9LFxuICAgIHsgbmFtZTogXCJwb3N0LWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucG9zdEJ1aWxkQ29tbWFuZD8uKCkgfSxcbiAgXS5maWx0ZXIoKHN0ZXApID0+IHN0ZXAuY21kICE9PSB1bmRlZmluZWQpO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdGVwcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaW5kZXhdO1xuICAgIGNvbnN0IGlzTGFzdCA9IGluZGV4ID09PSBzdGVwcy5sZW5ndGggLSAxO1xuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHByaW50VGFza0ZhaWxlZChzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RlcC5uYW1lfSBmYWlsZWRgLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBpQ29tbWFuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXBpUm9vdFBhdGggPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgYmFzZUNvbmZpZ1BhdGggPSBhd2FpdCByZXNvbHZlQXBpQnVpbGRDb25maWdQYXRoKGFwaVJvb3RQYXRoKTtcbiAgY29uc3QgcG9saWN5ID0gYXdhaXQgbG9hZEJ1aWxkQ29tcGlsZXJQb2xpY3koYXBpUm9vdFBhdGgpO1xuICBjb25zdCByZWdpc3RyeVBhdGggPSBwYXRoLmpvaW4oYXBpUm9vdFBhdGgsIEhUVFBfVkFMSURBVE9SX1JFR0lTVFJZX1NPVVJDRV9QQVRIKTtcbiAgY29uc3QgY29uZmlnRmlsZVBhdGggPSBhd2FpdCBjcmVhdGVBcGlab2RDb21waWxlckJ1aWxkV3JhcHBlcih7XG4gICAgYXBpUm9vdFBhdGgsXG4gICAgYmFzZUNvbmZpZ1BhdGgsXG4gICAgcG9saWN5LFxuICAgIHJlZ2lzdHJ5UGF0aCxcbiAgfSk7XG4gIGNvbnN0IHRlbXBvcmFyeUNvbmZpZ1BhdGggPSBjb25maWdGaWxlUGF0aCA9PT0gYmFzZUNvbmZpZ1BhdGggPyB1bmRlZmluZWQgOiBjb25maWdGaWxlUGF0aDtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcblxuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBhcGlSb290UGF0aCk7XG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7XG4gICAgICAgIGN3ZDogYXBpUm9vdFBhdGgsXG4gICAgICAgIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGggfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAocG9saWN5LmFwaSA9PT0gXCJhb3RcIikge1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihhcGlSb290UGF0aCwgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfQlVJTERfUEFUSCk7XG4gICAgICBpZiAoIShhd2FpdCBleGlzdHMob3V0cHV0UGF0aCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVpbHQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnkgbm90IGZvdW5kOiAke291dHB1dFBhdGh9YCk7XG4gICAgICB9XG4gICAgICBhc3NlcnRBcGlab2RDb21waWxlckJ1aWxkT3V0cHV0KFtcbiAgICAgICAgeyBjb2RlOiBhd2FpdCByZWFkRmlsZShvdXRwdXRQYXRoLCBcInV0ZjhcIiksIHBhdGg6IG91dHB1dFBhdGggfSxcbiAgICAgIF0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCB0cnVlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRlbXBvcmFyeUNvbmZpZ1BhdGggIT09IHVuZGVmaW5lZCkgYXdhaXQgcm0odGVtcG9yYXJ5Q29uZmlnUGF0aCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRXZWJDb21tYW5kKHtcbiAgc2tpcElmTWlzc2luZyA9IGZhbHNlLFxufTogeyBza2lwSWZNaXNzaW5nPzogYm9vbGVhbiB9ID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXBwUm9vdFBhdGggPSBmaW5kQXBwUm9vdFBhdGgoKTtcbiAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbihhcHBSb290UGF0aCwgXCJ3ZWJcIik7XG4gIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJQYXRoKSkpIHtcbiAgICBpZiAoc2tpcElmTWlzc2luZykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShcIldlYiDrlJTroInthqDrpqzqsIAg7JeG7Jy866+A66GcIFdlYiDruYzrk5zrpbwg6rG064SI65yB64uI64ukLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgd2ViIOuUlOugie2GoOumrOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHt3ZWJQYXRofWApO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIFdFQl9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290UGF0aCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHt9IH0pO1xuICAgIH1cbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCB0cnVlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztrQkFnQjhCO2NBQ1k7V0FDdUI7QUFjakUsU0FBZ0IsbUJBQW1CLE9BQXVCO0NBRXhELE9BQU8sSUFBSSxNQUFNLFdBQVcsS0FBSyxPQUFPLEVBQUU7QUFDNUM7QUFFQSxTQUFnQiw0QkFBb0M7Q0FDbEQsTUFBTSxpQkFBaUIsS0FBSyxRQUFRLE9BQU8sS0FBSyxRQUFRLE1BQU07Q0FDOUQsTUFBTSxhQUFhLEtBQUssS0FDdEIsT0FBTyxLQUFLLFNBQ1osaUJBQWlCLGlCQUFpQixPQUFPLE1BQzNDO0NBRUEsT0FBTyxHQURRLGlCQUFpQixrQkFBa0IsbUJBQW1CLFFBQVEsUUFBUSxFQUNwRSxHQUFHLG1CQUFtQixVQUFVO0FBQ25EO0FBUUEsTUFBTSxrQ0FBbUUsRUFDdkUsTUFBTSxxQkFBcUI7Q0FDekIsUUFBUSxNQUFNLE9BQU8seUJBQUEsQ0FBMEI7QUFDakQsRUFDRjtBQUVBLGVBQXNCLGlDQUNwQixZQUNBLFNBSUEsZUFBZ0QsaUNBQ2I7Q0FDbkMsSUFBSSxRQUFRLE9BQU8sUUFBUSxPQUN6QixPQUFPO0NBRVQsSUFBSSxRQUFRLGlCQUFpQixR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
|
|
257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29uZmlnLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vYnVpbGQtY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcIm5vZGU6YXNzZXJ0XCI7XG5pbXBvcnQgeyByZWFkRmlsZSwgcm0sIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHR5cGUgVXNlckNvbmZpZyB9IGZyb20gXCJ0c2Rvd25cIjtcblxuaW1wb3J0IHsgdHlwZSBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBsb2FkQnVpbGRDb21waWxlclBvbGljeSB9IGZyb20gXCIuL2NvbXBpbGVyLXBvbGljeVwiO1xuXG5leHBvcnQgdHlwZSBCdWlsZEFydGlmYWN0PEJ1aWxkQ29tbWFuZEFyZ3MgPSB7fT4gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHJvamVjdFBhdGg6IHN0cmluZztcbiAgcHJlQnVpbGRDb21tYW5kPzogKCkgPT4gc3RyaW5nO1xuICBidWlsZENvbW1hbmQ6IChhcmdzOiBCdWlsZENvbW1hbmRBcmdzKSA9PiBzdHJpbmc7XG4gIHBvc3RCdWlsZENvbW1hbmQ/OiAoKSA9PiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBcGlUc2Rvd25CdWlsZENvbmZpZyA9IFBpY2s8VXNlckNvbmZpZywgXCJlbnRyeVwiIHwgXCJwbHVnaW5zXCI+O1xuXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVTaGVsbEFyZ3VtZW50KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyDsnpHsnYDrlLDsmLTtkZwg7J6Q7LK066eMIOyFuCDqsr3qs4Trpbwg64ur7KeAIOuqu+2VmOuPhOuhnSDrtoTrpqztlbQg66as7YSw65+0IOyduOyImOulvCDrs7TsobTtlanri4jri6QuXG4gIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZUFsbChcIidcIiwgYCdcIidcIidgKX0nYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlR5cGVjaGVja0NvbW1hbmQoKTogc3RyaW5nIHtcbiAgY29uc3QgaXNTb3VyY2VNb2R1bGUgPSBwYXRoLmV4dG5hbWUoaW1wb3J0Lm1ldGEuZmlsZW5hbWUpID09PSBcIi50c1wiO1xuICBjb25zdCBzY3JpcHRQYXRoID0gcGF0aC5qb2luKFxuICAgIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gICAgYHR5cGVjaGVjay13ZWIuJHtpc1NvdXJjZU1vZHVsZSA/IFwidHNcIiA6IFwianNcIn1gLFxuICApO1xuICBjb25zdCBydW5uZXIgPSBpc1NvdXJjZU1vZHVsZSA/IFwicG5wbSBleGVjIHRzeFwiIDogcXVvdGVTaGVsbEFyZ3VtZW50KHByb2Nlc3MuZXhlY1BhdGgpO1xuICByZXR1cm4gYCR7cnVubmVyfSAke3F1b3RlU2hlbGxBcmd1bWVudChzY3JpcHRQYXRoKX1gO1xufVxuXG50eXBlIFpvZENvbXBpbGVyUGx1Z2luRmFjdG9yeSA9ICh0eXBlb2YgaW1wb3J0KFwiem9kLWNvbXBpbGVyL3JvbGxkb3duXCIpKVtcImRlZmF1bHRcIl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyB7XG4gIGxvYWRDb21waWxlclBsdWdpbjogKCkgPT4gUHJvbWlzZTxab2RDb21waWxlclBsdWdpbkZhY3Rvcnk+O1xufVxuXG5jb25zdCBhcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0ge1xuICBhc3luYyBsb2FkQ29tcGlsZXJQbHVnaW4oKSB7XG4gICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIikpLmRlZmF1bHQ7XG4gIH0sXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29tcG9zZUFwaVpvZENvbXBpbGVyQnVpbGRDb25maWc8VCBleHRlbmRzIEFwaVRzZG93bkJ1aWxkQ29uZmlnPihcbiAgYmFzZUNvbmZpZzogVCxcbiAgb3B0aW9uczoge1xuICAgIHBvbGljeTogTm9ybWFsaXplZFpvZENvbXBpbGVyUG9saWN5O1xuICAgIHJlZ2lzdHJ5UGF0aD86IHN0cmluZztcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiBBcGlab2RDb21waWxlckJ1aWxkRGVwZW5kZW5jaWVzID0gYXBpWm9kQ29tcGlsZXJCdWlsZERlcGVuZGVuY2llcyxcbik6IFByb21pc2U8VCAmIEFwaVRzZG93bkJ1aWxkQ29uZmlnPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gYmFzZUNvbmZpZztcbiAgfVxuICBpZiAob3B0aW9ucy5yZWdpc3RyeVBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInZhbGlkYXRpb24uem9kQ29tcGlsZXIuYXBpIHJlcXVpcmVzIHRoZSBnZW5lcmF0ZWQgSFRUUCB2YWxpZGF0b3IgcmVnaXN0cnlcIik7XG4gIH1cblxuICBjb25zdCB6b2RDb21waWxlciA9IGF3YWl0IGRlcGVuZGVuY2llcy5sb2FkQ29tcGlsZXJQbHVnaW4oKTtcbiAgY29uc3QgY29tcGlsZXJQbHVnaW4gPSB6b2RDb21waWxlcih7XG4gICAgY29kZWdlbk1vZGU6IFwiaW5saW5lXCIsXG4gICAgaW5jbHVkZTogW29wdGlvbnMucmVnaXN0cnlQYXRoXSxcbiAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgIHNjaGVtYXM6IFwiZXhwbGljaXRcIixcbiAgfSk7XG5cbiAgbGV0IGNvbmZpZ3VyZWRQbHVnaW5zOiBFeGNsdWRlPFVzZXJDb25maWdbXCJwbHVnaW5zXCJdLCB1bmRlZmluZWQ+W107XG4gIGlmIChBcnJheS5pc0FycmF5KGJhc2VDb25maWcucGx1Z2lucykpIHtcbiAgICBjb25maWd1cmVkUGx1Z2lucyA9IGJhc2VDb25maWcucGx1Z2lucztcbiAgfSBlbHNlIGlmIChiYXNlQ29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZ3VyZWRQbHVnaW5zID0gW107XG4gIH0gZWxzZSB7XG4gICAgY29uZmlndXJlZFBsdWdpbnMgPSBbYmFzZUNvbmZpZy5wbHVnaW5zXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uYmFzZUNvbmZpZyxcbiAgICBwbHVnaW5zOiBbLi4uY29uZmlndXJlZFBsdWdpbnMsIGNvbXBpbGVyUGx1Z2luXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoXG4gIG91dHB1dHM6IHJlYWRvbmx5IHsgY29kZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfVtdLFxuKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgb3V0cHV0IG9mIG91dHB1dHMpIHtcbiAgICBpZiAoL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KG91dHB1dC5jb2RlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB6b2QtY29tcGlsZXIgY29tcGlsZSBib3VuZGFyeSByZW1haW5zIGluICR7b3V0cHV0LnBhdGh9YCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQuY29kZS5pbmNsdWRlcyhcInZpcnR1YWw6em9kLWNvbXBpbGVyL3J1bnRpbWVcIikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgem9kLWNvbXBpbGVyIHZpcnR1YWwgcnVudGltZSBpbXBvcnQgcmVtYWlucyBpbiAke291dHB1dC5wYXRofWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEggPSBcInNyYy9hcHBsaWNhdGlvbi9zb25hbXUudmFsaWRhdG9ycy5nZW5lcmF0ZWQudHNcIjtcbmV4cG9ydCBjb25zdCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIID0gXCJkaXN0L2FwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZC5qc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0QXBpWm9kQ29tcGlsZXJTb3VyY2VSZWdpc3RyeShyZWdpc3RyeVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIShhd2FpdCBleGlzdHMocmVnaXN0cnlQYXRoKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHJlZ2lzdHJ5UGF0aCwgXCJ1dGY4XCIpO1xuICBpZiAoIS9maW5nZXJwcmludFxccyo9XFxzKltcIiddW2EtZjAtOV17NjR9W1wiJ10vLnRlc3Qoc291cmNlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR2VuZXJhdGVkIEhUVFAgdmFsaWRhdG9yIHJlZ2lzdHJ5IGZpbmdlcnByaW50IGlzIGludmFsaWQ6ICR7cmVnaXN0cnlQYXRofWApO1xuICB9XG4gIGNvbnN0IGRlY2xhcmVzWmVyb1JvdXRlcyA9IC9cXGJyb3V0ZUlkc1xccyo9XFxzKlxce1xccypcXH1cXHMqOy8udGVzdChzb3VyY2UpO1xuICBpZiAoIWRlY2xhcmVzWmVyb1JvdXRlcyAmJiAhL1xcYmNvbXBpbGVcXHMqXFwoLy50ZXN0KHNvdXJjZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBoYXMgbm8gY29tcGlsZSBib3VuZGFyeTogJHtyZWdpc3RyeVBhdGh9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKG9wdGlvbnM6IHtcbiAgYXBpUm9vdFBhdGg6IHN0cmluZztcbiAgYmFzZUNvbmZpZ1BhdGg6IHN0cmluZztcbiAgcG9saWN5OiBOb3JtYWxpemVkWm9kQ29tcGlsZXJQb2xpY3k7XG4gIHJlZ2lzdHJ5UGF0aDogc3RyaW5nO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zLnBvbGljeS5hcGkgIT09IFwiYW90XCIpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5iYXNlQ29uZmlnUGF0aDtcbiAgfVxuXG4gIGF3YWl0IGFzc2VydEFwaVpvZENvbXBpbGVyU291cmNlUmVnaXN0cnkob3B0aW9ucy5yZWdpc3RyeVBhdGgpO1xuICBjb25zdCB3cmFwcGVyUGF0aCA9IHBhdGguam9pbihcbiAgICBvcHRpb25zLmFwaVJvb3RQYXRoLFxuICAgIGAuc29uYW11LXpvZC1jb21waWxlci0ke3Byb2Nlc3MucGlkfS0ke0RhdGUubm93KCl9Lm1qc2AsXG4gICk7XG4gIGNvbnN0IGJhc2VDb25maWdVcmwgPSBwYXRoVG9GaWxlVVJMKG9wdGlvbnMuYmFzZUNvbmZpZ1BhdGgpLmhyZWY7XG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBgaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO2AsXG4gICAgYGltcG9ydCBiYXNlQ29uZmlnIGZyb20gJHtKU09OLnN0cmluZ2lmeShiYXNlQ29uZmlnVXJsKX07YCxcbiAgICBgaW1wb3J0IHpvZENvbXBpbGVyIGZyb20gXCJ6b2QtY29tcGlsZXIvcm9sbGRvd25cIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnN0IGNvbXBpbGVyUGx1Z2luID0gem9kQ29tcGlsZXIoJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjb2RlZ2VuTW9kZTogXCJpbmxpbmVcIixcbiAgICAgIGluY2x1ZGU6IFtvcHRpb25zLnJlZ2lzdHJ5UGF0aF0sXG4gICAgICBvdXRwdXQ6IFwiY29tcGFjdFwiLFxuICAgICAgc2NoZW1hczogXCJleHBsaWNpdFwiLFxuICAgIH0pfSk7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLnJlZ2lzdHJ5UGF0aCl9O2AsXG4gICAgYGNvbnN0IGFwaVJvb3RQYXRoID0gJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLmFwaVJvb3RQYXRoKX07YCxcbiAgICBgY29uc3QgY2Fub25pY2FsT3V0RGlyID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcImRpc3RcIik7YCxcbiAgICBgY29uc3QgcmVnaXN0cnlFbnRyeU5hbWUgPSBcImFwcGxpY2F0aW9uL3NvbmFtdS52YWxpZGF0b3JzLmdlbmVyYXRlZFwiO2AsXG4gICAgYGNvbnN0IGRlZmF1bHRFbnRyeSA9IHsgaW5kZXg6IFwic3JjL2luZGV4LnRzXCIgfTtgLFxuICAgIFwiY29uc3QgcmVzb2x2ZXNUb1JlZ2lzdHJ5ID0gKGVudHJ5KSA9PlwiLFxuICAgICcgIHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIiAmJiBwYXRoLnJlc29sdmUoYXBpUm9vdFBhdGgsIGVudHJ5KSA9PT0gcmVnaXN0cnlQYXRoOycsXG4gICAgXCJjb25zdCBhcHBlbmRSZWdpc3RyeUVudHJ5ID0gKGVudHJ5KSA9PiB7XCIsXG4gICAgXCIgIGlmIChBcnJheS5pc0FycmF5KGVudHJ5KSkge1wiLFxuICAgIFwiICAgIHJldHVybiBlbnRyeS5zb21lKHJlc29sdmVzVG9SZWdpc3RyeSkgPyBlbnRyeSA6IFsuLi5lbnRyeSwgcmVnaXN0cnlQYXRoXTtcIixcbiAgICBcIiAgfVwiLFxuICAgICcgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHsnLFxuICAgIFwiICAgIHJldHVybiByZXNvbHZlc1RvUmVnaXN0cnkoZW50cnkpID8gZW50cnkgOiBbZW50cnksIHJlZ2lzdHJ5UGF0aF07XCIsXG4gICAgXCIgIH1cIixcbiAgICAnICBpZiAodHlwZW9mIGVudHJ5ID09PSBcIm9iamVjdFwiICYmIGVudHJ5ICE9PSBudWxsKSB7JyxcbiAgICBcIiAgICBpZiAoT2JqZWN0LnZhbHVlcyhlbnRyeSkuc29tZShyZXNvbHZlc1RvUmVnaXN0cnkpKSByZXR1cm4gZW50cnk7XCIsXG4gICAgXCIgICAgaWYgKHJlZ2lzdHJ5RW50cnlOYW1lIGluIGVudHJ5KSB7XCIsXG4gICAgXCIgICAgICB0aHJvdyBuZXcgRXJyb3IoYHRzZG93biBlbnRyeSBjb2xsaXNpb246ICR7cmVnaXN0cnlFbnRyeU5hbWV9YCk7XCIsXG4gICAgXCIgICAgfVwiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmVudHJ5LCBbcmVnaXN0cnlFbnRyeU5hbWVdOiByZWdpc3RyeVBhdGggfTtcIixcbiAgICBcIiAgfVwiLFxuICAgIFwiICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1wiLFxuICAgIFwiICAgIHJldHVybiB7IC4uLmRlZmF1bHRFbnRyeSwgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCIgIH1cIixcbiAgICBcIiAgcmV0dXJuIHsgW3JlZ2lzdHJ5RW50cnlOYW1lXTogcmVnaXN0cnlQYXRoIH07XCIsXG4gICAgXCJ9O1wiLFxuICAgIFwiY29uc3QgYXBwZW5kUGx1Z2luID0gKGNvbmZpZykgPT4gKHtcIixcbiAgICBcIiAgLi4uY29uZmlnLFwiLFxuICAgIFwiICAvLyDrn7Dtg4DsnoQgbG9hZGVy6rCAIOywuOyhsO2VmOuKlCByZWdpc3RyeSDqsr3roZzrpbwg67mM65OcIOyEpOygleqzvCDsnbzsuZjsi5ztgrXri4jri6QuXCIsXG4gICAgXCIgIG91dERpcjogY2Fub25pY2FsT3V0RGlyLFwiLFxuICAgIFwiICBmaXhlZEV4dGVuc2lvbjogZmFsc2UsXCIsXG4gICAgXCIgIGVudHJ5OiBhcHBlbmRSZWdpc3RyeUVudHJ5KGNvbmZpZy5lbnRyeSksXCIsXG4gICAgXCIgIHBsdWdpbnM6IFsuLi4oY29uZmlnLnBsdWdpbnMgPz8gW10pLCBjb21waWxlclBsdWdpbl0sXCIsXG4gICAgXCJ9KTtcIixcbiAgICBcImNvbnN0IGFwcGVuZFRvUmVzb2x2ZWRDb25maWcgPSAoY29uZmlnKSA9PlwiLFxuICAgIFwiICBBcnJheS5pc0FycmF5KGNvbmZpZykgPyBjb25maWcubWFwKGFwcGVuZFBsdWdpbikgOiBhcHBlbmRQbHVnaW4oY29uZmlnKTtcIixcbiAgICBcIlwiLFxuICAgIFwiZXhwb3J0IGRlZmF1bHQgYXN5bmMgKC4uLmFyZ3MpID0+IHtcIixcbiAgICAnICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiBiYXNlQ29uZmlnID09PSBcImZ1bmN0aW9uXCInLFxuICAgIFwiICAgID8gYXdhaXQgYmFzZUNvbmZpZyguLi5hcmdzKVwiLFxuICAgIFwiICAgIDogYXdhaXQgYmFzZUNvbmZpZztcIixcbiAgICBcIiAgcmV0dXJuIGFwcGVuZFRvUmVzb2x2ZWRDb25maWcocmVzb2x2ZWQpO1wiLFxuICAgIFwifTtcIixcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZSh3cmFwcGVyUGF0aCwgc291cmNlLCBcInV0ZjhcIik7XG4gIHJldHVybiB3cmFwcGVyUGF0aDtcbn1cblxuLyoqXG4gKiBBUEkg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF9hcGkg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQSV9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3Q8eyBjb25maWdGaWxlUGF0aDogc3RyaW5nIH0+W10gPSBbXG4gIHtcbiAgICBuYW1lOiBcIkFQSVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFQSSDtlITroZzsoJ3tirgg67mM65OcIOyCsOy2nOusvFwiLFxuICAgIHByb2plY3RQYXRoOiBcImFwaVwiLFxuICAgIHByZUJ1aWxkQ29tbWFuZDogKCkgPT4gXCJybSAtcmYgZGlzdFwiLFxuICAgIGJ1aWxkQ29tbWFuZDogKHsgY29uZmlnRmlsZVBhdGggfSkgPT5cbiAgICAgIGB0c2MgLS1ub0VtaXQgJiYgcG5wbSBleGVjIHRzZG93biAtLWNvbmZpZyAke0pTT04uc3RyaW5naWZ5KGNvbmZpZ0ZpbGVQYXRoKX1gLFxuICB9LFxuXTtcblxuLyoqXG4gKiDsm7kg7ZSE66Gc7KCd7Yq4IOu5jOuTnCDsgrDstpzrrLzsl5Ag64yA7ZWcIOq3nOy5meuTpC5cbiAqIGNsaS50c+ydmCBidWlsZF93ZWIg7ZWo7IiY6rCAIOydtOqyg+ydhCDrs7Tqs6Ag6re464yA66GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdFQl9BUlRJRkFDVFM6IEJ1aWxkQXJ0aWZhY3RbXSA9IFtcbiAge1xuICAgIG5hbWU6IFwiV2ViIENsaWVudFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7YG065287J207Ja47Yq4IOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3QvY2xpZW50XCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PlxuICAgICAgYCR7Y3JlYXRlV2ViVHlwZWNoZWNrQ29tbWFuZCgpfSAmJiB2aXRlIGJ1aWxkIC0tY29uZmlnIHZpdGUuY29uZmlnLnRzIC0tb3V0RGlyIGRpc3QvY2xpZW50YCxcbiAgfSxcbiAge1xuICAgIG5hbWU6IFwiV2ViIFNlcnZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIldlYiDtlITroZzsoJ3tirgg7ISc67KEIOu5jOuTnCDsgrDstpzrrLxcIixcbiAgICBwcm9qZWN0UGF0aDogXCJ3ZWJcIixcbiAgICBwcmVCdWlsZENvbW1hbmQ6ICgpID0+IFwicm0gLXJmIGRpc3Qvc2VydmVyXCIsXG4gICAgYnVpbGRDb21tYW5kOiAoKSA9PlxuICAgICAgYCR7Y3JlYXRlV2ViVHlwZWNoZWNrQ29tbWFuZCgpfSAmJiB2aXRlIGJ1aWxkIC0tY29uZmlnIHZpdGUuY29uZmlnLnRzIC0tc3NyIHNyYy9lbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLnRzeCAtLW91dERpciBkaXN0L3NlcnZlcmAsXG4gICAgcG9zdEJ1aWxkQ29tbWFuZDogKCkgPT5cbiAgICAgIFwicm0gLXJmIC4uL2FwaS93ZWItZGlzdCAmJiBta2RpciAtcCAuLi9hcGkvd2ViLWRpc3QgJiYgY3AgLXIgZGlzdC8qIC4uL2FwaS93ZWItZGlzdFwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoXG4gIGFwaVJvb3RQYXRoOiBzdHJpbmcsXG4gIGRlcGVuZGVuY2llczoge1xuICAgIGV4aXN0czogKGNhbmRpZGF0ZVBhdGg6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgICBtb2R1bGVEaXI6IHN0cmluZztcbiAgfSA9IHtcbiAgICBleGlzdHMsXG4gICAgbW9kdWxlRGlyOiBpbXBvcnQubWV0YS5kaXJuYW1lLFxuICB9LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgbG9jYWxDb25maWdQYXRoID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBcInRzZG93bi5jb25maWcudHNcIik7XG4gIGlmIChhd2FpdCBkZXBlbmRlbmNpZXMuZXhpc3RzKGxvY2FsQ29uZmlnUGF0aCkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyB0c2Rvd24uY29uZmlnLnRzIGZyb20gcHJvamVjdCByb290Li4uXCIpKTtcbiAgICByZXR1cm4gbG9jYWxDb25maWdQYXRoO1xuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsuZGltKFwiVXNpbmcgZGVmYXVsdCB0c2Rvd24gQVBJIGNvbmZpZyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgY29uc3QgY29tcGlsZWRDb25maWdQYXRoID0gcGF0aC5qb2luKGRlcGVuZGVuY2llcy5tb2R1bGVEaXIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy5qc1wiKTtcbiAgaWYgKGF3YWl0IGRlcGVuZGVuY2llcy5leGlzdHMoY29tcGlsZWRDb25maWdQYXRoKSkge1xuICAgIHJldHVybiBjb21waWxlZENvbmZpZ1BhdGg7XG4gIH1cbiAgcmV0dXJuIHBhdGguam9pbihkZXBlbmRlbmNpZXMubW9kdWxlRGlyLCBcIi4uXCIsIFwiLi5cIiwgXCJ0c2Rvd24uYXBpLmNvbmZpZy50c1wiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQgIT09IHVuZGVmaW5lZCk7XG5cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHN0ZXBzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1tpbmRleF07XG4gICAgY29uc3QgaXNMYXN0ID0gaW5kZXggPT09IHN0ZXBzLmxlbmd0aCAtIDE7XG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydChzdGVwLmNtZCk7XG4gICAgICBwcmludFRhc2tTdGFydChzdGVwLm5hbWUsIHN0ZXAuY21kLCBpc0xhc3QpO1xuICAgICAgYXdhaXQgZXhlY1dpdGhMaW5lUHJlZml4KHN0ZXAuY21kLCB7IGN3ZDogb3B0aW9ucy5jd2QgfSk7XG4gICAgICBwcmludFRhc2tTdWNjZXNzKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcHJpbnRUYXNrRmFpbGVkKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzdGVwLm5hbWV9IGZhaWxlZGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRBcGlDb21tYW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICBjb25zdCBiYXNlQ29uZmlnUGF0aCA9IGF3YWl0IHJlc29sdmVBcGlCdWlsZENvbmZpZ1BhdGgoYXBpUm9vdFBhdGgpO1xuICBjb25zdCBwb2xpY3kgPSBhd2FpdCBsb2FkQnVpbGRDb21waWxlclBvbGljeShhcGlSb290UGF0aCk7XG4gIGNvbnN0IHJlZ2lzdHJ5UGF0aCA9IHBhdGguam9pbihhcGlSb290UGF0aCwgSFRUUF9WQUxJREFUT1JfUkVHSVNUUllfU09VUkNFX1BBVEgpO1xuICBjb25zdCBjb25maWdGaWxlUGF0aCA9IGF3YWl0IGNyZWF0ZUFwaVpvZENvbXBpbGVyQnVpbGRXcmFwcGVyKHtcbiAgICBhcGlSb290UGF0aCxcbiAgICBiYXNlQ29uZmlnUGF0aCxcbiAgICBwb2xpY3ksXG4gICAgcmVnaXN0cnlQYXRoLFxuICB9KTtcbiAgY29uc3QgdGVtcG9yYXJ5Q29uZmlnUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoID09PSBiYXNlQ29uZmlnUGF0aCA/IHVuZGVmaW5lZCA6IGNvbmZpZ0ZpbGVQYXRoO1xuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGFwaVJvb3RQYXRoKTtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHtcbiAgICAgICAgY3dkOiBhcGlSb290UGF0aCxcbiAgICAgICAgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aCB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChwb2xpY3kuYXBpID09PSBcImFvdFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5qb2luKGFwaVJvb3RQYXRoLCBIVFRQX1ZBTElEQVRPUl9SRUdJU1RSWV9CVUlMRF9QQVRIKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhvdXRwdXRQYXRoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWlsdCBIVFRQIHZhbGlkYXRvciByZWdpc3RyeSBub3QgZm91bmQ6ICR7b3V0cHV0UGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydEFwaVpvZENvbXBpbGVyQnVpbGRPdXRwdXQoW1xuICAgICAgICB7IGNvZGU6IGF3YWl0IHJlYWRGaWxlKG91dHB1dFBhdGgsIFwidXRmOFwiKSwgcGF0aDogb3V0cHV0UGF0aCB9LFxuICAgICAgXSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIHRydWUsIERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcG9yYXJ5Q29uZmlnUGF0aCAhPT0gdW5kZWZpbmVkKSBhd2FpdCBybSh0ZW1wb3JhcnlDb25maWdQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZFdlYkNvbW1hbmQoe1xuICBza2lwSWZNaXNzaW5nID0gZmFsc2UsXG59OiB7IHNraXBJZk1pc3Npbmc/OiBib29sZWFuIH0gPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcHBSb290UGF0aCA9IGZpbmRBcHBSb290UGF0aCgpO1xuICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHdlYlBhdGgpKSkge1xuICAgIGlmIChza2lwSWZNaXNzaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KFwiV2ViIOuUlOugie2GoOumrOqwgCDsl4bsnLzrr4DroZwgV2ViIOu5jOuTnOulvCDqsbTrhIjrnIHri4jri6QuXCIpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGB3ZWIg65SU66CJ7Yag66as66W8IOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke3dlYlBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgV0VCX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3RQYXRoLCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSBzdGFydGVkQXQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gc3RhcnRlZEF0KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O2tCQWdCOEI7Y0FDWTtXQUN1QjtBQWNqRSxTQUFnQixtQkFBbUIsT0FBdUI7Q0FFeEQsT0FBTyxJQUFJLE1BQU0sV0FBVyxLQUFLLE9BQU8sRUFBRTtBQUM1QztBQUVBLFNBQWdCLDRCQUFvQztDQUNsRCxNQUFNLGlCQUFpQixLQUFLLFFBQVEsT0FBTyxLQUFLLFFBQVEsTUFBTTtDQUM5RCxNQUFNLGFBQWEsS0FBSyxLQUN0QixPQUFPLEtBQUssU0FDWixpQkFBaUIsaUJBQWlCLE9BQU8sTUFDM0M7Q0FFQSxPQUFPLEdBRFEsaUJBQWlCLGtCQUFrQixtQkFBbUIsUUFBUSxRQUFRLEVBQ3BFLEdBQUcsbUJBQW1CLFVBQVU7QUFDbkQ7QUFRQSxNQUFNLGtDQUFtRSxFQUN2RSxNQUFNLHFCQUFxQjtDQUN6QixRQUFRLE1BQU0sT0FBTyx5QkFBQSxDQUEwQjtBQUNqRCxFQUNGO0FBRUEsZUFBc0IsaUNBQ3BCLFlBQ0EsU0FJQSxlQUFnRCxpQ0FDYjtDQUNuQyxJQUFJLFFBQVEsT0FBTyxRQUFRLE9BQ3pCLE9BQU87Q0FFVCxJQUFJLFFBQVEsaUJBQWlCLFFBQzNCLE1BQU0sSUFBSSxNQUFNLDJFQUEyRTtDQUk3RixNQUFNLGtCQUFpQixNQURHLGFBQWEsbUJBQW1CLEVBQ25DLENBQVk7RUFDakMsYUFBYTtFQUNiLFNBQVMsQ0FBQyxRQUFRLFlBQVk7RUFDOUIsUUFBUTtFQUNSLFNBQVM7Q0FDWCxDQUFDO0NBRUQsSUFBSTtDQUNKLElBQUksTUFBTSxRQUFRLFdBQVcsT0FBTyxHQUNsQyxvQkFBb0IsV0FBVztNQUMx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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generated_sso.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated_sso.template.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"generated_sso.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/generated_sso.template.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyBvC,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,cAEC;IAED,gBAAgB;QAIZ,MAAM;QACN,IAAI;MAEP;IAED,MAAM;;;;;;MAqHL;IAKD,OAAO,CAAC,2BAA2B;IAwEnC,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,2BAA2B;IA4BnC;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAgDjC;;OAEG;IACH,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -25,9 +25,6 @@ function mapBetterAuthFieldType(type) {
|
|
|
25
25
|
default: return "unknown";
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
function addLoaderIdTypeSafetyComments(query) {
|
|
29
|
-
return query.replaceAll(/fromIds as (?:number|string)\[\]/g, "/* SAFETY: 로더가 전달하는 ID는 소스 엔티티의 기본 키 타입과 일치한다. */ $&");
|
|
30
|
-
}
|
|
31
28
|
var Template__generated_sso = class extends Template {
|
|
32
29
|
constructor() {
|
|
33
30
|
super("generated_sso");
|
|
@@ -61,7 +58,7 @@ var Template__generated_sso = class extends Template {
|
|
|
61
58
|
lines: [
|
|
62
59
|
`export const ${entityCamelName}LoaderQueries = {`,
|
|
63
60
|
...subsetKeys.map((subsetKey) => {
|
|
64
|
-
return `${subsetKey}: ${
|
|
61
|
+
return `${subsetKey}: ${entity.getPuriLoaderQuery(subsetKey)},`;
|
|
65
62
|
}),
|
|
66
63
|
`} as const satisfies PuriLoaderQueries<${subsetKeyTypeName}>;`,
|
|
67
64
|
""
|
|
@@ -96,6 +93,8 @@ var Template__generated_sso = class extends Template {
|
|
|
96
93
|
" * @generated",
|
|
97
94
|
" * 직접 수정하지 마세요.",
|
|
98
95
|
" */",
|
|
96
|
+
"// Sonamu 생성 코드의 타입 계약을 유지하기 위해 anti-slop 검사만 제외합니다.",
|
|
97
|
+
"/* oxlint-disable anti-slop/no-chained-type-assertions, anti-slop/no-conditional-empty-object-spread, anti-slop/no-known-value-widening, anti-slop/no-module-mocking, anti-slop/no-object-parameters, anti-slop/no-reflect-apply, anti-slop/no-reflect-get, anti-slop/no-runtime-typeof, anti-slop/no-shape-in-symbol-names, anti-slop/no-unknown-parameters, anti-slop/no-unknown-returns, anti-slop/no-unknown-type-aliases, anti-slop/no-unsafe-dictionary-type, anti-slop/no-widen-then-assert, anti-slop/require-safety-comment-for-type-assertion */",
|
|
99
98
|
"",
|
|
100
99
|
`import { ${[
|
|
101
100
|
"PuriWrapper",
|
|
@@ -217,4 +216,4 @@ var Template__generated_sso = class extends Template {
|
|
|
217
216
|
//#endregion
|
|
218
217
|
export { Template__generated_sso };
|
|
219
218
|
|
|
220
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL2dlbmVyYXRlZF9zc28udGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgdHlwZSBTb3VyY2VDb2RlIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLnRlbXBsYXRlXCI7XG5cbi8qKlxuICogYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkc+ydmCB0eXBlIOqwkuydhCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtYXBCZXR0ZXJBdXRoRmllbGRUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcIkRhdGVcIjtcbiAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1tdXCI7XG4gICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJbXVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWRkTG9hZGVySWRUeXBlU2FmZXR5Q29tbWVudHMocXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBxdWVyeS5yZXBsYWNlQWxsKFxuICAgIC9mcm9tSWRzIGFzICg/Om51bWJlcnxzdHJpbmcpXFxbXFxdL2csXG4gICAgXCIvKiBTQUZFVFk6IOuhnOuNlOqwgCDsoITri6ztlZjripQgSUTripQg7IaM7IqkIOyXlO2LsO2LsOydmCDquLDrs7gg7YKkIO2DgOyeheqzvCDsnbzsuZjtlZzri6QuICovICQmXCIsXG4gICk7XG59XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZV9fZ2VuZXJhdGVkX3NzbyBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJnZW5lcmF0ZWRfc3NvXCIpO1xuICB9XG5cbiAgZ2V0VGFyZ2V0QW5kUGF0aCgpIHtcbiAgICBjb25zdCB7IGRpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9hcHBsaWNhdGlvbmAsXG4gICAgICBwYXRoOiBgc29uYW11LmdlbmVyYXRlZC5zc28udHNgLFxuICAgIH07XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBjb25zdCBlbnRpdGllcyA9IGVudGl0eUlkcy5tYXAoKGlkKSA9PiBFbnRpdHlNYW5hZ2VyLmdldChpZCkpO1xuXG4gICAgLy8gU3Vic2V0UXVlcmllcyDsg53shLEg64yA7IOBOiDrtoDrqqgg7JeU7Yuw7Yuw6rCAIOyXhuqzoCDshJzruIzshYvsnbQg7KG07J6sXG4gICAgY29uc3QgdGFyZ2V0RW50aXRpZXMgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiBlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cykubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgLy8gU3Vic2V0UXVlcmllcyDsg53shLFcbiAgICBjb25zdCBzb3VyY2VDb2RlczogU291cmNlQ29kZVtdID0gdGFyZ2V0RW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCBzdWJzZXRLZXlzID0gT2JqZWN0LmtleXMoZW50aXR5LnN1YnNldHMpO1xuXG4gICAgICBjb25zdCBzdWJzZXRLZXlUeXBlTmFtZSA9IGAke2VudGl0eS5uYW1lcy5tb2R1bGV9U3Vic2V0S2V5YDtcbiAgICAgIGNvbnN0IGVudGl0eUNhbWVsTmFtZSA9IGluZmxlY3Rpb24uY2FtZWxpemUoZW50aXR5LmlkLCB0cnVlKTtcblxuICAgICAgLy8gUHVyaSDquLDrsJggU3Vic2V0UXVlcnlcbiAgICAgIGNvbnN0IHB1cmlTdWJzZXRRdWVyeTogU291cmNlQ29kZSA9IHtcbiAgICAgICAgbGFiZWw6IGBTdWJzZXRRdWVyeTogJHtlbnRpdHkuaWR9YCxcbiAgICAgICAgbGluZXM6IFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Q2FtZWxOYW1lfVN1YnNldFF1ZXJpZXMgPSB7YCxcbiAgICAgICAgICAuLi5zdWJzZXRLZXlzLm1hcChcbiAgICAgICAgICAgIChzdWJzZXRLZXkpID0+IGAke3N1YnNldEtleX06IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgICAgICAgICAgJHtlbnRpdHkuZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleSl9O1xuICAgICAgICAgIH0sYCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGB9O2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9O1xuXG4gICAgICAvLyBQdXJpIOq4sOuwmCBTdWJzZXRMb2FkZXJzUXVlcnlcbiAgICAgIGNvbnN0IHB1cmlMb2FkZXJRdWVyeTogU291cmNlQ29kZSA9IHtcbiAgICAgICAgbGFiZWw6IGBMb2FkZXJRdWVyeTogJHtlbnRpdHkuaWR9YCxcbiAgICAgICAgbGluZXM6IFtcbiAgICAgICAgICBgZXhwb3J0IGNvbnN0ICR7ZW50aXR5Q2FtZWxOYW1lfUxvYWRlclF1ZXJpZXMgPSB7YCxcbiAgICAgICAgICAuLi5zdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdWVyeSA9IGVudGl0eS5nZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5KTtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdWJzZXRLZXl9OiAke2FkZExvYWRlcklkVHlwZVNhZmV0eUNvbW1lbnRzKHF1ZXJ5KX0sYDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUHVyaUxvYWRlclF1ZXJpZXM8JHtzdWJzZXRLZXlUeXBlTmFtZX0+O2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXSxcbiAgICAgICAgaW1wb3J0S2V5czogW3N1YnNldEtleVR5cGVOYW1lXSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbcHVyaVN1YnNldFF1ZXJ5LCBwdXJpTG9hZGVyUXVlcnldO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yZWlnbktleSDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgZmtUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0Rm9yZWlnbktleVR5cGVTb3VyY2VDb2RlKGVudGl0aWVzKTtcbiAgICBpZiAoZmtUeXBlU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChma1R5cGVTb3VyY2VDb2RlKTtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYSDsg53shLFcbiAgICBjb25zdCBkYlNjaGVtYVNvdXJjZUNvZGUgPSB0aGlzLmdldERhdGFiYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdGllcyk7XG4gICAgaWYgKGRiU2NoZW1hU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChkYlNjaGVtYVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIC8vIEF1dGggVXNlciDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgYXV0aFVzZXJUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0QXV0aFVzZXJUeXBlU291cmNlQ29kZSgpO1xuICAgIGlmIChhdXRoVXNlclR5cGVTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmVzOiBbLi4ucmVzdWx0LmxpbmVzLCBgLy8gJHt0cy5sYWJlbH1gLCAuLi50cy5saW5lcywgXCJcIl0sXG4gICAgICAgICAgaW1wb3J0S2V5czogdW5pcXVlKFsuLi5yZXN1bHQuaW1wb3J0S2V5cywgLi4udHMuaW1wb3J0S2V5c10pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIC8qIFNBRkVUWTogcmVkdWNlIOuIhOyCsOq4sOuKlCBsYWJlbOydhCDsoJzsmbjtlZwgU291cmNlQ29kZeydmCDrkZAg67Cw7Je066GcIOy0iOq4sO2ZlOuQnOuLpC4gKi8ge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgaXNVc2luZ01hbnlUb01hbnlCYXNlU2NoZW1hID0gYm9keS5pbmNsdWRlcyhcIk1hbnlUb01hbnlCYXNlU2NoZW1hXCIpO1xuXG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiUHVyaVdyYXBwZXJcIixcbiAgICAgIFwiRGF0YWJhc2VTY2hlbWFFeHRlbmRcIixcbiAgICAgIFwiUHVyaUxvYWRlclF1ZXJpZXNcIixcbiAgICAgIGlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSA/IFwiTWFueVRvTWFueUJhc2VTY2hlbWFcIiA6IFwiXCIsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGN1c3RvbUhlYWRlcnMg6rWs7ISxXG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICBcIiAqL1wiLFxuICAgICAgXCJcIixcbiAgICAgIGBpbXBvcnQgeyAke3NvbmFtdUltcG9ydHN9IH0gZnJvbSBcInNvbmFtdVwiO2AsXG4gICAgXTtcbiAgICBpZiAodGhpcy5oYXNBdXRoQ29uZmlnKCkpIHtcbiAgICAgIGN1c3RvbUhlYWRlcnMucHVzaChgaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSBcImJldHRlci1hdXRoXCI7YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuZ2V0VGFyZ2V0QW5kUGF0aCgpLFxuICAgICAgYm9keTogc291cmNlQ29kZS5saW5lcy5qb2luKFwiXFxuXCIpLFxuICAgICAgaW1wb3J0S2V5czogc291cmNlQ29kZS5pbXBvcnRLZXlzLFxuICAgICAgY3VzdG9tSGVhZGVycyxcbiAgICB9O1xuICB9XG5cbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcHJpdmF0ZSBnZXREYXRhYmFzZVNjaGVtYVNvdXJjZUNvZGUoZW50aXRpZXM6IEVudGl0eVtdKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIERhdGFiYXNlU2NoZW1hRXh0ZW5kIC0g7YWM7J2067iUIOyKpO2CpOuniCDtg4DsnoUg7KCV7J2YXG4gICAgY29uc3QgZW50aXR5U2NoZW1hTGluZXMgPSBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gYCR7ZW50aXR5LnRhYmxlfTogJHtlbnRpdHkuaWR9QmFzZVNjaGVtYTtgKTtcblxuICAgIGNvbnN0IGpvaW5UYWJsZXMgPSB1bmlxdWUoXG4gICAgICBlbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+XG4gICAgICAgIGVudGl0eS5wcm9wcy5maWx0ZXIoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKS5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGVLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKGVudGl0eS50YWJsZSk7XG4gICAgICAgICAgY29uc3QgdG9FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIGNvbnN0IHRvVGFibGVLZXkgPSBpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRvRW50aXR5LnRhYmxlKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFibGU6IHByb3Auam9pblRhYmxlLFxuICAgICAgICAgICAgZnJvbVRhYmxlS2V5LFxuICAgICAgICAgICAgdG9UYWJsZUtleSxcbiAgICAgICAgICAgIGZyb21FbnRpdHlJZDogZW50aXR5LmlkLFxuICAgICAgICAgICAgdG9FbnRpdHlJZDogdG9FbnRpdHkuaWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICAgKGpvaW5UYWJsZSkgPT4gam9pblRhYmxlLnRhYmxlLFxuICAgICk7XG5cbiAgICAvLyBEYXRhYmFzZUZvcmVpZ25LZXlzIC0gRksg7Lus65+87J2EIOqwgOynhCDthYzsnbTruJTrp4wg7KCV7J2YXG4gICAgY29uc3QgZW50aXRpZXNXaXRoRmsgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eSkubGVuZ3RoID4gMCxcbiAgICApO1xuICAgIGNvbnN0IGZrTWV0YWRhdGFMaW5lcyA9IGVudGl0aWVzV2l0aEZrLm1hcChcbiAgICAgIChlbnRpdHkpID0+IGAke2VudGl0eS50YWJsZX06ICR7ZW50aXR5LmlkfUZvcmVpZ25LZXlzO2AsXG4gICAgKTtcblxuICAgIC8vIENvbnRleHRFeHRlbmQgLSBhdXRoIOyEpOygleydtCDsnojsnYQg65WM66eMIHVzZXIg7YOA7J6FIOy2lOqwgFxuICAgIGNvbnN0IGNvbnRleHRFeHRlbmRMaW5lczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5oYXNBdXRoQ29uZmlnKCkpIHtcbiAgICAgIGNvbnRleHRFeHRlbmRMaW5lcy5wdXNoKFxuICAgICAgICBgYCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBDb250ZXh0RXh0ZW5kIHtgLFxuICAgICAgICBgICAgIHVzZXI6IFNvbmFtdVVzZXIgfCBudWxsO2AsXG4gICAgICAgIGAgIH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBEYXRhYmFzZVNjaGVtYWAsXG4gICAgICBsaW5lczogW1xuICAgICAgICBgZGVjbGFyZSBtb2R1bGUgXCJzb25hbXVcIiB7YCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7YCxcbiAgICAgICAgLi4uZW50aXR5U2NoZW1hTGluZXMsXG4gICAgICAgIC4uLmpvaW5UYWJsZXMubWFwKChqb2luVGFibGUpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoam9pblRhYmxlLmZyb21FbnRpdHlJZCk7XG4gICAgICAgICAgY29uc3QgdG9FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChqb2luVGFibGUudG9FbnRpdHlJZCk7XG4gICAgICAgICAgY29uc3QgZnJvbVBrVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtUeXBlKCkgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJcIiA6IFwic3RyaW5nXCI7XG4gICAgICAgICAgY29uc3QgdG9Qa1R5cGUgPSB0b0VudGl0eS5nZXRQa1R5cGUoKSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlclwiIDogXCJzdHJpbmdcIjtcblxuICAgICAgICAgIHJldHVybiBgJHtqb2luVGFibGUudGFibGV9OiBNYW55VG9NYW55QmFzZVNjaGVtYTxcIiR7am9pblRhYmxlLmZyb21UYWJsZUtleX1cIiwgXCIke2pvaW5UYWJsZS50b1RhYmxlS2V5fVwiLCAke2Zyb21Qa1R5cGV9LCAke3RvUGtUeXBlfT47YDtcbiAgICAgICAgfSksXG4gICAgICAgIGAgIH1gLFxuICAgICAgICBgYCxcbiAgICAgICAgYCAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUZvcmVpZ25LZXlzIHtgLFxuICAgICAgICAuLi5ma01ldGFkYXRhTGluZXMsXG4gICAgICAgIGAgIH1gLFxuICAgICAgICAuLi5jb250ZXh0RXh0ZW5kTGluZXMsXG4gICAgICAgIGB9YCxcbiAgICAgIF0sXG4gICAgICBpbXBvcnRLZXlzOiBlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gYCR7ZW50aXR5LmlkfUJhc2VTY2hlbWFgKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gRksg6rSA6rOE66W8IOy7rOufvOuqheycvOuhnCDrs4DtmZggKOyYiDogY29tcGFueSDihpIgY29tcGFueV9pZClcbiAgcHJpdmF0ZSBnZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHk6IEVudGl0eSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gZW50aXR5LnByb3BzXG4gICAgICAuZmlsdGVyKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pXG4gICAgICAubWFwKChwcm9wKSA9PiBgJHtwcm9wLm5hbWV9X2lkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldEZvcmVpZ25LZXlUeXBlU291cmNlQ29kZShlbnRpdGllczogRW50aXR5W10pOiBTb3VyY2VDb2RlIHwgbnVsbCB7XG4gICAgaWYgKGVudGl0aWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gRkvqsIAg7J6I64qUIOyXlO2LsO2LsOunjCDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgZW50aXRpZXNXaXRoRmsgPSBlbnRpdGllcy5maWx0ZXIoXG4gICAgICAoZW50aXR5KSA9PiB0aGlzLmdldEZvcmVpZ25LZXlDb2x1bW5zKGVudGl0eSkubGVuZ3RoID4gMCxcbiAgICApO1xuXG4gICAgaWYgKGVudGl0aWVzV2l0aEZrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZmtUeXBlTGluZXMgPSBlbnRpdGllc1dpdGhGay5tYXAoKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpO1xuICAgICAgY29uc3QgZmtUeXBlVmFsdWUgPSBma0NvbHVtbnMubWFwKChjb2wpID0+IGBcIiR7Y29sfVwiYCkuam9pbihcIiB8IFwiKTtcblxuICAgICAgcmV0dXJuIGBleHBvcnQgdHlwZSAke2VudGl0eS5pZH1Gb3JlaWduS2V5cyA9ICR7ZmtUeXBlVmFsdWV9O2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IGBGb3JlaWduS2V5IFR5cGVzYCxcbiAgICAgIGxpbmVzOiBma1R5cGVMaW5lcyxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogc29uYW11LmNvbmZpZy50c+ydmCBhdXRoLnVzZXIuYWRkaXRpb25hbEZpZWxkc+yXkOyEnCBTb25hbXVVc2VyIO2DgOyeheydhCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIFNvdXJjZUNvZGUgfCBudWxsIC0gYXV0aCDshKTsoJXsnbQg7JeG7Jy866m0IG51bGwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGdldEF1dGhVc2VyVHlwZVNvdXJjZUNvZGUoKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGNvbnN0IGF1dGhDb25maWcgPSBTb25hbXUuY29uZmlnLnNlcnZlcj8uYXV0aDtcbiAgICBpZiAoIWF1dGhDb25maWcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG94bGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55IC0tIGFkZGl0aW9uYWxGaWVsZHMg7YOA7J6F7J20IOuPmeyggeyehFxuICAgIGNvbnN0IGFkZGl0aW9uYWxGaWVsZHMgPVxuICAgICAgLyogU0FGRVRZOiBiZXR0ZXItYXV0aCDshKTsoJXsnZggdXNlci5hZGRpdGlvbmFsRmllbGRz64qUIOuPmeyggSDtlYTrk5wg66e17J2064ukLiAqLyAoYXV0aENvbmZpZyBhcyBhbnkpXG4gICAgICAgID8udXNlcj8uYWRkaXRpb25hbEZpZWxkcztcbiAgICBpZiAoIWFkZGl0aW9uYWxGaWVsZHMgfHwgT2JqZWN0LmtleXMoYWRkaXRpb25hbEZpZWxkcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBhZGRpdGlvbmFsRmllbGRz6rCAIOyXhuycvOuptCDquLDrs7ggVXNlciDtg4DsnoXrp4wg7IKs7JqpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogXCJBdXRoIFVzZXIgVHlwZVwiLFxuICAgICAgICBsaW5lczogW1wiZXhwb3J0IHR5cGUgU29uYW11VXNlciA9IFVzZXI7XCJdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0S2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGFkZGl0aW9uYWxGaWVsZHPrpbwgVHlwZVNjcmlwdCDtg4DsnoXsnLzroZwg67OA7ZmYXG4gICAgY29uc3QgZmllbGRMaW5lcyA9IE9iamVjdC5lbnRyaWVzKGFkZGl0aW9uYWxGaWVsZHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBiZXR0ZXItYXV0aCBhZGRpdGlvbmFsRmllbGRzIOq1rOyhsFxuICAgICAgY29uc3QgZmllbGRDb25maWcgPVxuICAgICAgICAvKiBTQUZFVFk6IGFkZGl0aW9uYWxGaWVsZHPsnZgg6rCBIOqwkuydgCBiZXR0ZXItYXV0aCDtlYTrk5wg7ISk7KCVIOqwneyytOydtOuLpC4gKi8gdmFsdWUgYXMgYW55O1xuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGZpZWxkQ29uZmlnLnJlcXVpcmVkICE9PSBmYWxzZTtcblxuICAgICAgbGV0IGZpZWxkVHlwZTogc3RyaW5nO1xuXG4gICAgICAvLyBzb25hbXVUeXBl7J20IOyeiOycvOuptCBkZXNjcmlwdGlvbuydhCDtg4DsnoXrqoXsnLzroZwg7IKs7JqpXG4gICAgICBpZiAoZmllbGRDb25maWcuc29uYW11VHlwZSkge1xuICAgICAgICBmaWVsZFR5cGUgPSBmaWVsZENvbmZpZy5zb25hbXVUeXBlO1xuICAgICAgICBpbXBvcnRLZXlzLnB1c2goZmllbGRUeXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkVHlwZSA9IG1hcEJldHRlckF1dGhGaWVsZFR5cGUoZmllbGRDb25maWcudHlwZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgICAke2tleX0ke2lzUmVxdWlyZWQgPyBcIlwiIDogXCI/XCJ9OiAke2ZpZWxkVHlwZX07YDtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbDogXCJBdXRoIFVzZXIgVHlwZVwiLFxuICAgICAgbGluZXM6IFtcImV4cG9ydCB0eXBlIFNvbmFtdVVzZXIgPSBVc2VyICYge1wiLCAuLi5maWVsZExpbmVzLCBcIn07XCJdLFxuICAgICAgaW1wb3J0S2V5cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGF1dGgg7ISk7KCV7J20IOyeiOuKlOyngCDtmZXsnbjtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGhhc0F1dGhDb25maWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O1NBS2tDO29CQUV5QjtXQUtqQztjQUNZOzs7O0FBTXRDLFNBQVMsdUJBQXVCLE1BQXNCO0NBQ3BELFFBQVEsTUFBUjtFQUNFLEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxV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
|
|
219
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVkX3Nzby50ZW1wbGF0ZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGVtcGxhdGUvaW1wbGVtZW50YXRpb25zL2dlbmVyYXRlZF9zc28udGVtcGxhdGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5cbmltcG9ydCBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCI7XG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vLi4vYXBpXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eSB9IGZyb20gXCIuLi8uLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbn0gZnJvbSBcIi4uLy4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuaW1wb3J0IHsgdHlwZSBTb3VyY2VDb2RlIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLnRlbXBsYXRlXCI7XG5cbi8qKlxuICogYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkc+ydmCB0eXBlIOqwkuydhCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiBtYXBCZXR0ZXJBdXRoRmllbGRUeXBlKHR5cGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcIkRhdGVcIjtcbiAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgIHJldHVybiBcInN0cmluZ1tdXCI7XG4gICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICByZXR1cm4gXCJudW1iZXJbXVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19nZW5lcmF0ZWRfc3NvIGV4dGVuZHMgVGVtcGxhdGUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcImdlbmVyYXRlZF9zc29cIik7XG4gIH1cblxuICBnZXRUYXJnZXRBbmRQYXRoKCkge1xuICAgIGNvbnN0IHsgZGlyIH0gPSBTb25hbXUuY29uZmlnLmFwaTtcblxuICAgIHJldHVybiB7XG4gICAgICB0YXJnZXQ6IGAke2Rpcn0vc3JjL2FwcGxpY2F0aW9uYCxcbiAgICAgIHBhdGg6IGBzb25hbXUuZ2VuZXJhdGVkLnNzby50c2AsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBlbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGNvbnN0IGVudGl0aWVzID0gZW50aXR5SWRzLm1hcCgoaWQpID0+IEVudGl0eU1hbmFnZXIuZ2V0KGlkKSk7XG5cbiAgICAvLyBTdWJzZXRRdWVyaWVzIOyDneyEsSDrjIDsg4E6IOu2gOuqqCDsl5Tti7Dti7DqsIAg7JeG6rOgIOyEnOu4jOyFi+ydtCDsobTsnqxcbiAgICBjb25zdCB0YXJnZXRFbnRpdGllcyA9IGVudGl0aWVzLmZpbHRlcihcbiAgICAgIChlbnRpdHkpID0+IGVudGl0eS5wYXJlbnRJZCA9PT0gdW5kZWZpbmVkICYmIE9iamVjdC5rZXlzKGVudGl0eS5zdWJzZXRzKS5sZW5ndGggPiAwLFxuICAgICk7XG5cbiAgICAvLyBTdWJzZXRRdWVyaWVzIOyDneyEsVxuICAgIGNvbnN0IHNvdXJjZUNvZGVzOiBTb3VyY2VDb2RlW10gPSB0YXJnZXRFbnRpdGllcy5mbGF0TWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhlbnRpdHkuc3Vic2V0cyk7XG5cbiAgICAgIGNvbnN0IHN1YnNldEtleVR5cGVOYW1lID0gYCR7ZW50aXR5Lm5hbWVzLm1vZHVsZX1TdWJzZXRLZXlgO1xuICAgICAgY29uc3QgZW50aXR5Q2FtZWxOYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShlbnRpdHkuaWQsIHRydWUpO1xuXG4gICAgICAvLyBQdXJpIOq4sOuwmCBTdWJzZXRRdWVyeVxuICAgICAgY29uc3QgcHVyaVN1YnNldFF1ZXJ5OiBTb3VyY2VDb2RlID0ge1xuICAgICAgICBsYWJlbDogYFN1YnNldFF1ZXJ5OiAke2VudGl0eS5pZH1gLFxuICAgICAgICBsaW5lczogW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHlDYW1lbE5hbWV9U3Vic2V0UXVlcmllcyA9IHtgLFxuICAgICAgICAgIC4uLnN1YnNldEtleXMubWFwKFxuICAgICAgICAgICAgKHN1YnNldEtleSkgPT4gYCR7c3Vic2V0S2V5fTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgICAgICAgICAke2VudGl0eS5nZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5KX07XG4gICAgICAgICAgfSxgLFxuICAgICAgICAgICksXG4gICAgICAgICAgYH07YCxcbiAgICAgICAgICBcIlwiLFxuICAgICAgICBdLFxuICAgICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFB1cmkg6riw67CYIFN1YnNldExvYWRlcnNRdWVyeVxuICAgICAgY29uc3QgcHVyaUxvYWRlclF1ZXJ5OiBTb3VyY2VDb2RlID0ge1xuICAgICAgICBsYWJlbDogYExvYWRlclF1ZXJ5OiAke2VudGl0eS5pZH1gLFxuICAgICAgICBsaW5lczogW1xuICAgICAgICAgIGBleHBvcnQgY29uc3QgJHtlbnRpdHlDYW1lbE5hbWV9TG9hZGVyUXVlcmllcyA9IHtgLFxuICAgICAgICAgIC4uLnN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgJHtzdWJzZXRLZXl9OiAke2VudGl0eS5nZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5KX0sYDtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBgfSBhcyBjb25zdCBzYXRpc2ZpZXMgUHVyaUxvYWRlclF1ZXJpZXM8JHtzdWJzZXRLZXlUeXBlTmFtZX0+O2AsXG4gICAgICAgICAgXCJcIixcbiAgICAgICAgXSxcbiAgICAgICAgaW1wb3J0S2V5czogW3N1YnNldEtleVR5cGVOYW1lXSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBbcHVyaVN1YnNldFF1ZXJ5LCBwdXJpTG9hZGVyUXVlcnldO1xuICAgIH0pO1xuXG4gICAgLy8gRm9yZWlnbktleSDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgZmtUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0Rm9yZWlnbktleVR5cGVTb3VyY2VDb2RlKGVudGl0aWVzKTtcbiAgICBpZiAoZmtUeXBlU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChma1R5cGVTb3VyY2VDb2RlKTtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYSDsg53shLFcbiAgICBjb25zdCBkYlNjaGVtYVNvdXJjZUNvZGUgPSB0aGlzLmdldERhdGFiYXNlU2NoZW1hU291cmNlQ29kZShlbnRpdGllcyk7XG4gICAgaWYgKGRiU2NoZW1hU291cmNlQ29kZSkge1xuICAgICAgc291cmNlQ29kZXMucHVzaChkYlNjaGVtYVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIC8vIEF1dGggVXNlciDtg4DsnoUg7IOd7ISxXG4gICAgY29uc3QgYXV0aFVzZXJUeXBlU291cmNlQ29kZSA9IHRoaXMuZ2V0QXV0aFVzZXJUeXBlU291cmNlQ29kZSgpO1xuICAgIGlmIChhdXRoVXNlclR5cGVTb3VyY2VDb2RlKSB7XG4gICAgICBzb3VyY2VDb2Rlcy5wdXNoKGF1dGhVc2VyVHlwZVNvdXJjZUNvZGUpO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzb3VyY2VDb2Rlcy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCB0cykgPT4ge1xuICAgICAgICBpZiAodHMgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChyZXN1bHQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmVzOiBbLi4ucmVzdWx0LmxpbmVzLCBgLy8gJHt0cy5sYWJlbH1gLCAuLi50cy5saW5lcywgXCJcIl0sXG4gICAgICAgICAgaW1wb3J0S2V5czogdW5pcXVlKFsuLi5yZXN1bHQuaW1wb3J0S2V5cywgLi4udHMuaW1wb3J0S2V5c10pLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIC8qIFNBRkVUWTogcmVkdWNlIOuIhOyCsOq4sOuKlCBsYWJlbOydhCDsoJzsmbjtlZwgU291cmNlQ29kZeydmCDrkZAg67Cw7Je066GcIOy0iOq4sO2ZlOuQnOuLpC4gKi8ge1xuICAgICAgICBsaW5lczogW10sXG4gICAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgfSBhcyBPbWl0PFNvdXJjZUNvZGUsIFwibGFiZWxcIj4sXG4gICAgKTtcblxuICAgIGNvbnN0IGJvZHkgPSBzb3VyY2VDb2RlLmxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgY29uc3QgaXNVc2luZ01hbnlUb01hbnlCYXNlU2NoZW1hID0gYm9keS5pbmNsdWRlcyhcIk1hbnlUb01hbnlCYXNlU2NoZW1hXCIpO1xuXG4gICAgY29uc3Qgc29uYW11SW1wb3J0cyA9IFtcbiAgICAgIFwiUHVyaVdyYXBwZXJcIixcbiAgICAgIFwiRGF0YWJhc2VTY2hlbWFFeHRlbmRcIixcbiAgICAgIFwiUHVyaUxvYWRlclF1ZXJpZXNcIixcbiAgICAgIGlzVXNpbmdNYW55VG9NYW55QmFzZVNjaGVtYSA/IFwiTWFueVRvTWFueUJhc2VTY2hlbWFcIiA6IFwiXCIsXG4gICAgXVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcblxuICAgIC8vIGN1c3RvbUhlYWRlcnMg6rWs7ISxXG4gICAgY29uc3QgY3VzdG9tSGVhZGVycyA9IFtcbiAgICAgIFwiLyoqXCIsXG4gICAgICBcIiAqIEBnZW5lcmF0ZWRcIixcbiAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICBcIiAqL1wiLFxuICAgICAgXCIvLyBTb25hbXUg7IOd7ISxIOy9lOuTnOydmCDtg4DsnoUg6rOE7JW97J2EIOycoOyngO2VmOq4sCDsnITtlbQgYW50aS1zbG9wIOqygOyCrOunjCDsoJzsmbjtlanri4jri6QuXCIsXG4gICAgICBcIi8qIG94bGludC1kaXNhYmxlIGFudGktc2xvcC9uby1jaGFpbmVkLXR5cGUtYXNzZXJ0aW9ucywgYW50aS1zbG9wL25vLWNvbmRpdGlvbmFsLWVtcHR5LW9iamVjdC1zcHJlYWQsIGFudGktc2xvcC9uby1rbm93bi12YWx1ZS13aWRlbmluZywgYW50aS1zbG9wL25vLW1vZHVsZS1tb2NraW5nLCBhbnRpLXNsb3Avbm8tb2JqZWN0LXBhcmFtZXRlcnMsIGFudGktc2xvcC9uby1yZWZsZWN0LWFwcGx5LCBhbnRpLXNsb3Avbm8tcmVmbGVjdC1nZXQsIGFudGktc2xvcC9uby1ydW50aW1lLXR5cGVvZiwgYW50aS1zbG9wL25vLXNoYXBlLWluLXN5bWJvbC1uYW1lcywgYW50aS1zbG9wL25vLXVua25vd24tcGFyYW1ldGVycywgYW50aS1zbG9wL25vLXVua25vd24tcmV0dXJucywgYW50aS1zbG9wL25vLXVua25vd24tdHlwZS1hbGlhc2VzLCBhbnRpLXNsb3Avbm8tdW5zYWZlLWRpY3Rpb25hcnktdHlwZSwgYW50aS1zbG9wL25vLXdpZGVuLXRoZW4tYXNzZXJ0LCBhbnRpLXNsb3AvcmVxdWlyZS1zYWZldHktY29tbWVudC1mb3ItdHlwZS1hc3NlcnRpb24gKi9cIixcbiAgICAgIFwiXCIsXG4gICAgICBgaW1wb3J0IHsgJHtzb25hbXVJbXBvcnRzfSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIF07XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjdXN0b21IZWFkZXJzLnB1c2goYGltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO2ApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgoKSxcbiAgICAgIGJvZHk6IHNvdXJjZUNvZGUubGluZXMuam9pbihcIlxcblwiKSxcbiAgICAgIGltcG9ydEtleXM6IHNvdXJjZUNvZGUuaW1wb3J0S2V5cyxcbiAgICAgIGN1c3RvbUhlYWRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHJpdmF0ZSBIZWxwZXIgTWV0aG9kc1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHByaXZhdGUgZ2V0RGF0YWJhc2VTY2hlbWFTb3VyY2VDb2RlKGVudGl0aWVzOiBFbnRpdHlbXSk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBpZiAoZW50aXRpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBEYXRhYmFzZVNjaGVtYUV4dGVuZCAtIO2FjOydtOu4lCDsiqTtgqTrp4gg7YOA7J6FIOygleydmFxuICAgIGNvbnN0IGVudGl0eVNjaGVtYUxpbmVzID0gZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS50YWJsZX06ICR7ZW50aXR5LmlkfUJhc2VTY2hlbWE7YCk7XG5cbiAgICBjb25zdCBqb2luVGFibGVzID0gdW5pcXVlKFxuICAgICAgZW50aXRpZXMuZmxhdE1hcCgoZW50aXR5KSA9PlxuICAgICAgICBlbnRpdHkucHJvcHMuZmlsdGVyKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCkubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZShlbnRpdHkudGFibGUpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICBjb25zdCB0b1RhYmxlS2V5ID0gaW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0b0VudGl0eS50YWJsZSk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRhYmxlOiBwcm9wLmpvaW5UYWJsZSxcbiAgICAgICAgICAgIGZyb21UYWJsZUtleSxcbiAgICAgICAgICAgIHRvVGFibGVLZXksXG4gICAgICAgICAgICBmcm9tRW50aXR5SWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgIHRvRW50aXR5SWQ6IHRvRW50aXR5LmlkLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIChqb2luVGFibGUpID0+IGpvaW5UYWJsZS50YWJsZSxcbiAgICApO1xuXG4gICAgLy8gRGF0YWJhc2VGb3JlaWduS2V5cyAtIEZLIOy7rOufvOydhCDqsIDsp4Qg7YWM7J2067iU66eMIOygleydmFxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcbiAgICBjb25zdCBma01ldGFkYXRhTGluZXMgPSBlbnRpdGllc1dpdGhGay5tYXAoXG4gICAgICAoZW50aXR5KSA9PiBgJHtlbnRpdHkudGFibGV9OiAke2VudGl0eS5pZH1Gb3JlaWduS2V5cztgLFxuICAgICk7XG5cbiAgICAvLyBDb250ZXh0RXh0ZW5kIC0gYXV0aCDshKTsoJXsnbQg7J6I7J2EIOuVjOunjCB1c2VyIO2DgOyehSDstpTqsIBcbiAgICBjb25zdCBjb250ZXh0RXh0ZW5kTGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuaGFzQXV0aENvbmZpZygpKSB7XG4gICAgICBjb250ZXh0RXh0ZW5kTGluZXMucHVzaChcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dEV4dGVuZCB7YCxcbiAgICAgICAgYCAgICB1c2VyOiBTb25hbXVVc2VyIHwgbnVsbDtgLFxuICAgICAgICBgICB9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRGF0YWJhc2VTY2hlbWFgLFxuICAgICAgbGluZXM6IFtcbiAgICAgICAgYGRlY2xhcmUgbW9kdWxlIFwic29uYW11XCIge2AsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VTY2hlbWFFeHRlbmQge2AsXG4gICAgICAgIC4uLmVudGl0eVNjaGVtYUxpbmVzLFxuICAgICAgICAuLi5qb2luVGFibGVzLm1hcCgoam9pblRhYmxlKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KGpvaW5UYWJsZS5mcm9tRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IHRvRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoam9pblRhYmxlLnRvRW50aXR5SWQpO1xuICAgICAgICAgIGNvbnN0IGZyb21Qa1R5cGUgPSBmcm9tRW50aXR5LmdldFBrVHlwZSgpID09PSBcImludGVnZXJcIiA/IFwibnVtYmVyXCIgOiBcInN0cmluZ1wiO1xuICAgICAgICAgIGNvbnN0IHRvUGtUeXBlID0gdG9FbnRpdHkuZ2V0UGtUeXBlKCkgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJcIiA6IFwic3RyaW5nXCI7XG5cbiAgICAgICAgICByZXR1cm4gYCR7am9pblRhYmxlLnRhYmxlfTogTWFueVRvTWFueUJhc2VTY2hlbWE8XCIke2pvaW5UYWJsZS5mcm9tVGFibGVLZXl9XCIsIFwiJHtqb2luVGFibGUudG9UYWJsZUtleX1cIiwgJHtmcm9tUGtUeXBlfSwgJHt0b1BrVHlwZX0+O2A7XG4gICAgICAgIH0pLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgYGAsXG4gICAgICAgIGAgIGV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2VGb3JlaWduS2V5cyB7YCxcbiAgICAgICAgLi4uZmtNZXRhZGF0YUxpbmVzLFxuICAgICAgICBgICB9YCxcbiAgICAgICAgLi4uY29udGV4dEV4dGVuZExpbmVzLFxuICAgICAgICBgfWAsXG4gICAgICBdLFxuICAgICAgaW1wb3J0S2V5czogZW50aXRpZXMubWFwKChlbnRpdHkpID0+IGAke2VudGl0eS5pZH1CYXNlU2NoZW1hYCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEZLIOq0gOqzhOulvCDsu6zrn7zrqoXsnLzroZwg67OA7ZmYICjsmIg6IGNvbXBhbnkg4oaSIGNvbXBhbnlfaWQpXG4gIHByaXZhdGUgZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5OiBFbnRpdHkpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGVudGl0eS5wcm9wc1xuICAgICAgLmZpbHRlcigocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KVxuICAgICAgLm1hcCgocHJvcCkgPT4gYCR7cHJvcC5uYW1lfV9pZGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGb3JlaWduS2V5VHlwZVNvdXJjZUNvZGUoZW50aXRpZXM6IEVudGl0eVtdKTogU291cmNlQ29kZSB8IG51bGwge1xuICAgIGlmIChlbnRpdGllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEZL6rCAIOyeiOuKlCDsl5Tti7Dti7Drp4wg7YOA7J6FIOyDneyEsVxuICAgIGNvbnN0IGVudGl0aWVzV2l0aEZrID0gZW50aXRpZXMuZmlsdGVyKFxuICAgICAgKGVudGl0eSkgPT4gdGhpcy5nZXRGb3JlaWduS2V5Q29sdW1ucyhlbnRpdHkpLmxlbmd0aCA+IDAsXG4gICAgKTtcblxuICAgIGlmIChlbnRpdGllc1dpdGhGay5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZrVHlwZUxpbmVzID0gZW50aXRpZXNXaXRoRmsubWFwKChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGZrQ29sdW1ucyA9IHRoaXMuZ2V0Rm9yZWlnbktleUNvbHVtbnMoZW50aXR5KTtcbiAgICAgIGNvbnN0IGZrVHlwZVZhbHVlID0gZmtDb2x1bW5zLm1hcCgoY29sKSA9PiBgXCIke2NvbH1cImApLmpvaW4oXCIgfCBcIik7XG5cbiAgICAgIHJldHVybiBgZXhwb3J0IHR5cGUgJHtlbnRpdHkuaWR9Rm9yZWlnbktleXMgPSAke2ZrVHlwZVZhbHVlfTtgO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiBgRm9yZWlnbktleSBUeXBlc2AsXG4gICAgICBsaW5lczogZmtUeXBlTGluZXMsXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5jb25maWcudHPsnZggYXV0aC51c2VyLmFkZGl0aW9uYWxGaWVsZHPsl5DshJwgU29uYW11VXNlciDtg4DsnoXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBAcmV0dXJucyBTb3VyY2VDb2RlIHwgbnVsbCAtIGF1dGgg7ISk7KCV7J20IOyXhuycvOuptCBudWxsIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBdXRoVXNlclR5cGVTb3VyY2VDb2RlKCk6IFNvdXJjZUNvZGUgfCBudWxsIHtcbiAgICBjb25zdCBhdXRoQ29uZmlnID0gU29uYW11LmNvbmZpZy5zZXJ2ZXI/LmF1dGg7XG4gICAgaWYgKCFhdXRoQ29uZmlnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAtLSBhZGRpdGlvbmFsRmllbGRzIO2DgOyeheydtCDrj5nsoIHsnoRcbiAgICBjb25zdCBhZGRpdGlvbmFsRmllbGRzID1cbiAgICAgIC8qIFNBRkVUWTogYmV0dGVyLWF1dGgg7ISk7KCV7J2YIHVzZXIuYWRkaXRpb25hbEZpZWxkc+uKlCDrj5nsoIEg7ZWE65OcIOunteydtOuLpC4gKi8gKGF1dGhDb25maWcgYXMgYW55KVxuICAgICAgICA/LnVzZXI/LmFkZGl0aW9uYWxGaWVsZHM7XG4gICAgaWYgKCFhZGRpdGlvbmFsRmllbGRzIHx8IE9iamVjdC5rZXlzKGFkZGl0aW9uYWxGaWVsZHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gYWRkaXRpb25hbEZpZWxkc+qwgCDsl4bsnLzrqbQg6riw67O4IFVzZXIg7YOA7J6F66eMIOyCrOyaqVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGFiZWw6IFwiQXV0aCBVc2VyIFR5cGVcIixcbiAgICAgICAgbGluZXM6IFtcImV4cG9ydCB0eXBlIFNvbmFtdVVzZXIgPSBVc2VyO1wiXSxcbiAgICAgICAgaW1wb3J0S2V5czogW10sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydEtleXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBhZGRpdGlvbmFsRmllbGRz66W8IFR5cGVTY3JpcHQg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICAgIGNvbnN0IGZpZWxkTGluZXMgPSBPYmplY3QuZW50cmllcyhhZGRpdGlvbmFsRmllbGRzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgLS0gYmV0dGVyLWF1dGggYWRkaXRpb25hbEZpZWxkcyDqtazsobBcbiAgICAgIGNvbnN0IGZpZWxkQ29uZmlnID1cbiAgICAgICAgLyogU0FGRVRZOiBhZGRpdGlvbmFsRmllbGRz7J2YIOqwgSDqsJLsnYAgYmV0dGVyLWF1dGgg7ZWE65OcIOyEpOyglSDqsJ3ssrTsnbTri6QuICovIHZhbHVlIGFzIGFueTtcbiAgICAgIGNvbnN0IGlzUmVxdWlyZWQgPSBmaWVsZENvbmZpZy5yZXF1aXJlZCAhPT0gZmFsc2U7XG5cbiAgICAgIGxldCBmaWVsZFR5cGU6IHN0cmluZztcblxuICAgICAgLy8gc29uYW11VHlwZeydtCDsnojsnLzrqbQgZGVzY3JpcHRpb27snYQg7YOA7J6F66qF7Jy866GcIOyCrOyaqVxuICAgICAgaWYgKGZpZWxkQ29uZmlnLnNvbmFtdVR5cGUpIHtcbiAgICAgICAgZmllbGRUeXBlID0gZmllbGRDb25maWcuc29uYW11VHlwZTtcbiAgICAgICAgaW1wb3J0S2V5cy5wdXNoKGZpZWxkVHlwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZFR5cGUgPSBtYXBCZXR0ZXJBdXRoRmllbGRUeXBlKGZpZWxkQ29uZmlnLnR5cGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCAgJHtrZXl9JHtpc1JlcXVpcmVkID8gXCJcIiA6IFwiP1wifTogJHtmaWVsZFR5cGV9O2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWw6IFwiQXV0aCBVc2VyIFR5cGVcIixcbiAgICAgIGxpbmVzOiBbXCJleHBvcnQgdHlwZSBTb25hbXVVc2VyID0gVXNlciAmIHtcIiwgLi4uZmllbGRMaW5lcywgXCJ9O1wiXSxcbiAgICAgIGltcG9ydEtleXMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBhdXRoIOyEpOygleydtCDsnojripTsp4Ag7ZmV7J247ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBoYXNBdXRoQ29uZmlnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIVNvbmFtdS5jb25maWcuc2VydmVyPy5hdXRoO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztTQUtrQztvQkFFeUI7V0FLakM7Y0FDWTs7OztBQU10QyxTQUFTLHVCQUF1QixNQUFzQjtDQUNwRCxRQUFRLE1BQVI7RUFDRSxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFFBQ0gsT0FBTztFQUNULEtBQUssWUFDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU87RUFDVCxTQUNFLE9BQU87Q0FDWDtBQUNGO0FBRUEsSUFBYSwwQkFBYixjQUE2QyxTQUFTO0NBQ3BELGNBQWM7RUFDWixNQUFNLGVBQWU7Q0FDdkI7Q0FFQSxtQkFBbUI7RUFDakIsTUFBTSxFQUFFLFFBQVEsT0FBTyxPQUFPO0VBRTlCLE9BQU87R0FDTCxRQUFRLEdBQUcsSUFBSTtHQUNmLE1BQU07RUFDUjtDQUNGO0NBRUEsU0FBUztFQUVQLE1BQU0sV0FEWSxjQUFjLFVBQ2YsQ0FBQSxDQUFVLEtBQUssT0FBTyxjQUFjLElBQUksRUFBRSxDQUFDO0VBUTVELE1BQU0sY0FMaUIsU0FBUyxRQUM3QixXQUFXLE9BQU8sYUFBYSxVQUFhLE9BQU8sS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FJbEQsQ0FBQSxDQUFlLFNBQVMsV0FBVztHQUNuRSxNQUFNLGFBQWEsT0FBTyxLQUFLLE9BQU8sT0FBTztHQUU3QyxNQUFNLG9CQUFvQixHQUFHLE9BQU8sTUFBTSxPQUFPO0dBQ2pELE1BQU0sa0JBQWtCLFdBQVcsU0FBUyxPQUFPLElB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/sd.template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC,cAEC;IAED,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK;QAMzE,MAAM;QACN,IAAI;MAEP;IAED,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"sd.template.d.ts","sourceRoot":"","sources":["../../../src/template/implementations/sd.template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;GAGG;AACH,qBAAa,YAAa,SAAQ,QAAQ;IACxC,cAEC;IAED,gBAAgB,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK;QAMzE,MAAM;QACN,IAAI;MAEP;IAED,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC;;;;;;MAmSpC;IAED;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoC/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAiC3B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -38,23 +38,22 @@ const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
|
38
38
|
function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
39
39
|
try {
|
|
40
40
|
const ctx = Sonamu.getContext();
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} catch {
|
|
41
|
+
return ctx.locale as (typeof SUPPORTED_LOCALES)[number] ?? DEFAULT_LOCALE;
|
|
42
|
+
} catch (_) {
|
|
44
43
|
return DEFAULT_LOCALE;
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
`.trim() : `
|
|
48
47
|
const DEFAULT_LOCALE = "${defaultLocale}" as const;
|
|
49
48
|
export const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
50
|
-
let
|
|
49
|
+
let _currentLocale: (typeof SUPPORTED_LOCALES)[number] = DEFAULT_LOCALE;
|
|
51
50
|
|
|
52
51
|
export function setLocale(locale: (typeof SUPPORTED_LOCALES)[number]) {
|
|
53
|
-
|
|
52
|
+
_currentLocale = locale;
|
|
54
53
|
}
|
|
55
54
|
|
|
56
55
|
export function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
57
|
-
return
|
|
56
|
+
return _currentLocale;
|
|
58
57
|
}
|
|
59
58
|
`.trim();
|
|
60
59
|
const localeImports = supportedLocales.map((locale) => `import ${locale} from "./${locale}";`).join("\n");
|
|
@@ -98,10 +97,7 @@ export function defineLocale(dict: Partial<MergedDictionary>) {
|
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
// 각 locale별로 rc-keys + entity labels + 프로젝트 dict 합침
|
|
101
|
-
|
|
102
|
-
[L in (typeof SUPPORTED_LOCALES)[number]]: Partial<MergedDictionary>;
|
|
103
|
-
};
|
|
104
|
-
const dictionaries: DictionaryRegistry = {
|
|
100
|
+
const dictionaries: Record<string, Partial<MergedDictionary>> = {
|
|
105
101
|
${defaultLocale}: { ...${getRCKeysVarName(defaultLocale)}, ...entityLabels, ...${defaultLocale} },
|
|
106
102
|
${supportedLocales.filter((locale) => locale !== defaultLocale).map((locale) => ` ${locale}: { ...${getRCKeysVarName(locale)}, ...${locale} },`).join("\n")}
|
|
107
103
|
};
|
|
@@ -110,33 +106,29 @@ type SDReturnType<K extends DictKey> = MergedDictionary[K] extends (...args: inf
|
|
|
110
106
|
? (...args: P) => LocalizedString
|
|
111
107
|
: LocalizedString;
|
|
112
108
|
|
|
113
|
-
function getDictValue<K extends DictKey>(key: K, locale:
|
|
109
|
+
function getDictValue<K extends DictKey>(key: K, locale: string): SDReturnType<K> {
|
|
114
110
|
// 1. 지정된 locale에서 조회
|
|
115
111
|
const dict = dictionaries[locale];
|
|
116
112
|
if (dict?.[key] !== undefined) {
|
|
117
|
-
|
|
118
|
-
return dict[key] as SDReturnType<K>;
|
|
113
|
+
return dict[key] as unknown as SDReturnType<K>;
|
|
119
114
|
}
|
|
120
115
|
|
|
121
116
|
// 2. default locale에서 조회
|
|
122
117
|
if (locale !== DEFAULT_LOCALE && dictionaries[DEFAULT_LOCALE]?.[key] !== undefined) {
|
|
123
|
-
|
|
124
|
-
return dictionaries[DEFAULT_LOCALE][key] as SDReturnType<K>;
|
|
118
|
+
return dictionaries[DEFAULT_LOCALE][key] as unknown as SDReturnType<K>;
|
|
125
119
|
}
|
|
126
120
|
|
|
127
121
|
// 3. supported locales 순회
|
|
128
122
|
for (const supportedLocale of SUPPORTED_LOCALES) {
|
|
129
123
|
if (supportedLocale !== locale && supportedLocale !== DEFAULT_LOCALE) {
|
|
130
124
|
if (dictionaries[supportedLocale]?.[key] !== undefined) {
|
|
131
|
-
|
|
132
|
-
return dictionaries[supportedLocale][key] as SDReturnType<K>;
|
|
125
|
+
return dictionaries[supportedLocale][key] as unknown as SDReturnType<K>;
|
|
133
126
|
}
|
|
134
127
|
}
|
|
135
128
|
}
|
|
136
129
|
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
return String(key) as SDReturnType<K>;
|
|
130
|
+
// 4. 모두 실패 시 key 반환
|
|
131
|
+
return key as unknown as SDReturnType<K>;
|
|
140
132
|
}
|
|
141
133
|
|
|
142
134
|
/**
|
|
@@ -202,85 +194,58 @@ type LocalizedColumnCandidate<T, K extends string> =
|
|
|
202
194
|
type LocalizedColumnReturn<T, K extends string> =
|
|
203
195
|
| LocalizedColumnValueFrom<LocalizedColumnCandidate<T, K>>
|
|
204
196
|
| undefined;
|
|
205
|
-
type LocaleValueMap =
|
|
206
|
-
[L in (typeof SUPPORTED_LOCALES)[number]]?: LocalizedColumnValue;
|
|
207
|
-
};
|
|
208
|
-
function isString<V>(value: V): value is V & string {
|
|
209
|
-
return Object.prototype.toString.call(value) === "[object String]";
|
|
210
|
-
}
|
|
197
|
+
type LocaleValueMap = Partial<Record<(typeof SUPPORTED_LOCALES)[number], unknown>>;
|
|
211
198
|
|
|
212
|
-
function isLocalizedColumnValue
|
|
213
|
-
return
|
|
199
|
+
function isLocalizedColumnValue(value: unknown): value is LocalizedColumnValue {
|
|
200
|
+
return typeof value === "string" || (Array.isArray(value) && value.every((item) => typeof item === "string"));
|
|
214
201
|
}
|
|
215
202
|
|
|
216
|
-
function isLocalizedColumnScalarValue
|
|
217
|
-
return ["
|
|
218
|
-
Object.prototype.toString.call(value),
|
|
219
|
-
);
|
|
203
|
+
function isLocalizedColumnScalarValue(value: unknown): value is LocalizedColumnScalarValue {
|
|
204
|
+
return ["string", "number", "boolean", "bigint"].includes(typeof value);
|
|
220
205
|
}
|
|
221
206
|
|
|
222
|
-
function isEmptyLocalizedColumnValue
|
|
207
|
+
function isEmptyLocalizedColumnValue(value: unknown): value is null | undefined | "" {
|
|
223
208
|
return value === null || value === undefined || value === "";
|
|
224
209
|
}
|
|
225
210
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
function getProperty<T extends object, K extends PropertyKey>(row: T, key: K): PropertyValue<T, K> {
|
|
229
|
-
if (!(key in row)) {
|
|
230
|
-
// SAFETY: 존재하지 않는 후보 키는 조건부 속성 타입에서도 undefined입니다.
|
|
231
|
-
return undefined as PropertyValue<T, K>;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// SAFETY: own/inherited 키 존재를 확인했으므로 해당 키의 조건부 속성 타입으로 좁힐 수 있습니다.
|
|
235
|
-
return (row as T & Record<K, PropertyValue<T, K>>)[key];
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
function getNestedLocaleValue<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
211
|
+
function getNestedLocaleValue<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
|
|
239
212
|
row: T,
|
|
240
213
|
column: K,
|
|
241
214
|
locale: (typeof SUPPORTED_LOCALES)[number],
|
|
242
|
-
):
|
|
243
|
-
const columnValue =
|
|
244
|
-
if (columnValue === null ||
|
|
215
|
+
): unknown {
|
|
216
|
+
const columnValue = row[column];
|
|
217
|
+
if (columnValue === null || typeof columnValue !== "object" || Array.isArray(columnValue)) {
|
|
245
218
|
return undefined;
|
|
246
219
|
}
|
|
247
220
|
|
|
248
|
-
// SAFETY: 일반 객체 검사를 통과한 값만 locale별 값 맵으로 조회합니다.
|
|
249
221
|
return (columnValue as LocaleValueMap)[locale];
|
|
250
222
|
}
|
|
251
223
|
|
|
252
|
-
function
|
|
253
|
-
return \`\${columnName}_\${localeName}\`;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
export function localizedColumn<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
224
|
+
export function localizedColumn<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
|
|
257
225
|
row: T,
|
|
258
226
|
column: K,
|
|
259
227
|
): LocalizedColumnReturn<T, K> {
|
|
260
|
-
const
|
|
261
|
-
const locale = SUPPORTED_LOCALES.includes(
|
|
262
|
-
const otherLocales = SUPPORTED_LOCALES.filter(
|
|
263
|
-
|
|
264
|
-
);
|
|
228
|
+
const currentLocale = getCurrentLocale();
|
|
229
|
+
const locale = SUPPORTED_LOCALES.includes(currentLocale) ? currentLocale : DEFAULT_LOCALE;
|
|
230
|
+
const otherLocales = SUPPORTED_LOCALES.filter((l: string) => l !== locale && l !== DEFAULT_LOCALE);
|
|
231
|
+
const localizedKey = (column: K, locale: (typeof SUPPORTED_LOCALES)[number]) => \`\${column}_\${locale}\`;
|
|
265
232
|
const values = [
|
|
266
|
-
{ value:
|
|
233
|
+
{ value: row[localizedKey(column, locale)], source: "direct" },
|
|
267
234
|
{ value: getNestedLocaleValue(row, column, locale), source: "nested" },
|
|
268
|
-
{ value:
|
|
269
|
-
{ value:
|
|
235
|
+
{ value: row[column], source: "direct" },
|
|
236
|
+
{ value: row[localizedKey(column, DEFAULT_LOCALE)], source: "direct" },
|
|
270
237
|
{ value: getNestedLocaleValue(row, column, DEFAULT_LOCALE), source: "nested" },
|
|
271
238
|
...otherLocales.flatMap((l) => [
|
|
272
|
-
{ value:
|
|
239
|
+
{ value: row[localizedKey(column, l)], source: "direct" },
|
|
273
240
|
{ value: getNestedLocaleValue(row, column, l), source: "nested" },
|
|
274
241
|
]),
|
|
275
242
|
];
|
|
276
243
|
|
|
277
244
|
for (const { value, source } of values) {
|
|
278
245
|
if (!isEmptyLocalizedColumnValue(value) && isLocalizedColumnValue(value)) {
|
|
279
|
-
// SAFETY: 값 가드가 선택한 컬럼의 문자열 또는 문자열 배열임을 확인했습니다.
|
|
280
246
|
return value as LocalizedColumnReturn<T, K>;
|
|
281
247
|
}
|
|
282
248
|
if (source === "direct" && !isEmptyLocalizedColumnValue(value) && isLocalizedColumnScalarValue(value)) {
|
|
283
|
-
// SAFETY: 직접 컬럼의 스칼라 값은 문자열로 변환해 지역화 반환 타입을 충족합니다.
|
|
284
249
|
return String(value) as LocalizedColumnReturn<T, K>;
|
|
285
250
|
}
|
|
286
251
|
}
|
|
@@ -295,19 +260,14 @@ export function localizedColumn<T extends object, K extends LocalizedBaseColumn<
|
|
|
295
260
|
* @example
|
|
296
261
|
* SD.enumLabels("TagOrderBy")[key] // → 현재 locale의 라벨
|
|
297
262
|
*/
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
SD.enumLabels = (enumName: string): EnumLabels => {
|
|
303
|
-
return new Proxy<EnumLabels>({}, {
|
|
263
|
+
SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
264
|
+
return new Proxy({} as Record<string, LocalizedString>, {
|
|
304
265
|
get(_, key: string | symbol) {
|
|
305
|
-
if (
|
|
266
|
+
if (typeof key === "symbol") {
|
|
306
267
|
return undefined;
|
|
307
268
|
}
|
|
308
269
|
|
|
309
|
-
|
|
310
|
-
const dictKey = \`enum.\${enumName}.\${String(key)}\` as DictKey;
|
|
270
|
+
const dictKey = \`enum.\${enumName}.\${key}\` as DictKey;
|
|
311
271
|
return getDictValue(dictKey, getCurrentLocale());
|
|
312
272
|
}
|
|
313
273
|
});
|
|
@@ -322,6 +282,8 @@ SD.enumLabels = (enumName: string): EnumLabels => {
|
|
|
322
282
|
" * @generated",
|
|
323
283
|
" * 직접 수정하지 마세요.",
|
|
324
284
|
" */",
|
|
285
|
+
"// Sonamu 생성 코드의 타입 계약을 유지하기 위해 anti-slop 검사만 제외합니다.",
|
|
286
|
+
"/* oxlint-disable anti-slop/no-chained-type-assertions, anti-slop/no-conditional-empty-object-spread, anti-slop/no-known-value-widening, anti-slop/no-module-mocking, anti-slop/no-object-parameters, anti-slop/no-reflect-apply, anti-slop/no-reflect-get, anti-slop/no-runtime-typeof, anti-slop/no-shape-in-symbol-names, anti-slop/no-unknown-parameters, anti-slop/no-unknown-returns, anti-slop/no-unknown-type-aliases, anti-slop/no-unsafe-dictionary-type, anti-slop/no-widen-then-assert, anti-slop/require-safety-comment-for-type-assertion */",
|
|
325
287
|
""
|
|
326
288
|
]
|
|
327
289
|
};
|
|
@@ -395,4 +357,4 @@ ${labels.map(({ key, value }) => ` "${key}": "${this.escapeString(value)}",`).j
|
|
|
395
357
|
//#endregion
|
|
396
358
|
export { Template__sd };
|
|
397
359
|
|
|
398
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IGN0eC5sb2NhbGU7XG4gICAgcmV0dXJuIFNVUFBPUlRFRF9MT0NBTEVTLmZpbmQoKHN1cHBvcnRlZExvY2FsZSkgPT4gc3VwcG9ydGVkTG9jYWxlID09PSBsb2NhbGUpID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IGN1cnJlbnRMb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPSBERUZBVUxUX0xPQ0FMRTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvY2FsZShsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pIHtcbiAgY3VycmVudExvY2FsZSA9IGxvY2FsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRMb2NhbGUoKTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSB7XG4gIHJldHVybiBjdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG50eXBlIERpY3Rpb25hcnlSZWdpc3RyeSA9IHtcbiAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT47XG59O1xuY29uc3QgZGljdGlvbmFyaWVzOiBEaWN0aW9uYXJ5UmVnaXN0cnkgPSB7XG4gICR7ZGVmYXVsdExvY2FsZX06IHsgLi4uJHtnZXRSQ0tleXNWYXJOYW1lKGRlZmF1bHRMb2NhbGUpfSwgLi4uZW50aXR5TGFiZWxzLCAuLi4ke2RlZmF1bHRMb2NhbGV9IH0sXG4gICR7c3VwcG9ydGVkTG9jYWxlc1xuICAgIC5maWx0ZXIoKGxvY2FsZSkgPT4gbG9jYWxlICE9PSBkZWZhdWx0TG9jYWxlKVxuICAgIC5tYXAoKGxvY2FsZSkgPT4gYCAgJHtsb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShsb2NhbGUpfSwgLi4uJHtsb2NhbGV9IH0sYClcbiAgICAuam9pbihcIlxcblwiKX1cbn07XG5cbnR5cGUgU0RSZXR1cm5UeXBlPEsgZXh0ZW5kcyBEaWN0S2V5PiA9IE1lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gID8gKC4uLmFyZ3M6IFApID0+IExvY2FsaXplZFN0cmluZ1xuICA6IExvY2FsaXplZFN0cmluZztcblxuZnVuY3Rpb24gZ2V0RGljdFZhbHVlPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBTQUZFVFk6IOyalOyyrSBsb2NhbGXsnZgg6rCZ7J2AIO2CpOuKlCBNZXJnZWREaWN0aW9uYXJ56rCAIOygle2VnCDrsJjtmZgg7KKF66WY66W8IOycoOyngO2VqeuLiOuLpC5cbiAgICByZXR1cm4gZGljdFtrZXldIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDIuIGRlZmF1bHQgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBpZiAobG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSAmJiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gU0FGRVRZOiDquLDrs7ggbG9jYWxl7J2YIOqwmeydgCDtgqTripQgTWVyZ2VkRGljdGlvbmFyeeqwgCDsoJXtlZwg67CY7ZmYIOyiheulmOulvCDsnKDsp4Dtlanri4jri6QuXG4gICAgcmV0dXJuIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV1ba2V5XSBhcyBTRFJldHVyblR5cGU8Sz47XG4gIH1cblxuICAvLyAzLiBzdXBwb3J0ZWQgbG9jYWxlcyDsiJztmoxcbiAgZm9yIChjb25zdCBzdXBwb3J0ZWRMb2NhbGUgb2YgU1VQUE9SVEVEX0xPQ0FMRVMpIHtcbiAgICBpZiAoc3VwcG9ydGVkTG9jYWxlICE9PSBsb2NhbGUgJiYgc3VwcG9ydGVkTG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSkge1xuICAgICAgaWYgKGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFNBRkVUWTog64yA7LK0IGxvY2FsZeydmCDqsJnsnYAg7YKk64qUIE1lcmdlZERpY3Rpb25hcnnqsIAg7KCV7ZWcIOuwmO2ZmCDsooXrpZjrpbwg7Jyg7KeA7ZWp64uI64ukLlxuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyBTRFJldHVyblR5cGU8Sz47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8g66qo65OgIGxvY2FsZeyXkCDqsJLsnbQg7JeG7Jy866m0IOuPmeyggeycvOuhnCDsobDtlanrkJwg7YKk66W8IOq3uOuMgOuhnCDrhbjstpztlanri4jri6QuXG4gIC8vIFNBRkVUWTog64iE652965CcIOyCrOyghCDtgqTsnZgg66y47J6Q7Je0IO2RnO2YhOydgCBMb2NhbGl6ZWRTdHJpbmcgZmFsbGJhY2sg6rec7JW97J2EIOuUsOumheuLiOuLpC5cbiAgcmV0dXJuIFN0cmluZyhrZXkpIGFzIFNEUmV0dXJuVHlwZTxLPjtcbn1cblxuLyoqXG4gKiBTb25hbXUgRGljdGlvbmFyeSDtlajsiJhcbiAqIGxvY2FsZeyXkCDrp57ripQg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNEKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIuyggOyepVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKiBTRChcInVzZXIubm90Rm91bmRcIikoMSkgIC8vIOKGkiBcIuyhtOyerO2VmOyngCDslYrripQgVXNlciBJRCAxXCIgKExvY2FsaXplZFN0cmluZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNEPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4ge1xuICBjb25zdCBsb2NhbGUgPSBnZXRDdXJyZW50TG9jYWxlKCk7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufVxuXG4vKipcbiAqIO2KueyglSBsb2NhbGXsnZgg67KI7JetIO2FjeyKpO2KuOulvCDrsJjtmZjtlZjripQg7ZWo7IiY66W8IOyDneyEse2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgRU4gPSBTRC5sb2NhbGUoXCJlblwiKTtcbiAqIEVOKFwiY29tbW9uLnNhdmVcIikgIC8vIOKGkiBcIlNhdmVcIlxuICovXG5TRC5sb2NhbGUgPSAobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PiA8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiA9PiB7XG4gIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xufTtcblxuLy8gTG9jYWxpemVkIOqwgOuKpe2VnCBDb2x1bW4g7YOA7J6FIOqzhOyCsFxudHlwZSBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogSyBleHRlbmRzIFxcYFxcJHtpbmZlciBCYXNlfV9cXCR7KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXX1cXGAgPyBCYXNlIDogSztcbn1ba2V5b2YgVCAmIHN0cmluZ107XG5cbi8qKlxuICogbG9jYWxl7JeQIOuUsOudvCDsoIHsoIjtlZwg7Lus65+8IOqwkuydhCDrsJjtmZjtlanri4jri6QuXG4gKiBEQuyXkCBuYW1lLCBuYW1lX2tvLCBuYW1lX2Vu7LKY65+8IGxvY2FsaXplZCBjb2x1bW7snbQg7J6I7J2EIOuVjCDsgqzsmqntlanri4jri6QuXG4gKlxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBrbywg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBqcOydvCDrlYwpOiBjb2x1bW5fanAg4oaSIGNvbHVtbiDihpIgY29sdW1uX2tvIOKGkiBjb2x1bW5fZW5cbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAgZW4sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAga2/snbwg65WMKTogY29sdW1uX2tvIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9lbiDihpIgY29sdW1uX2pwXG4gKlxuICogQGV4YW1wbGVcbiAqIGxvY2FsaXplZENvbHVtbih0YWcsIFwibmFtZVwiKVxuICovXG50eXBlIExvY2FsaXplZENvbHVtblNjYWxhclZhbHVlID0gc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludDtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWUgPSBzdHJpbmcgfCBzdHJpbmdbXTtcbnR5cGUgTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IG5ldmVyO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogViBleHRlbmRzIG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnRcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFYgZXh0ZW5kcyBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCBpbmZlciBMVj4+XG4gICAgICAgID8gTmVzdGVkTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExWPlxuICAgICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCAoSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogbmV2ZXIpXG4gIHwge1xuICAgICAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IFxcYFxcJHtLfV9cXCR7TH1cXGAgZXh0ZW5kcyBrZXlvZiBUID8gVFtcXGBcXCR7S31fXFwke0x9XFxgXSA6IG5ldmVyO1xuICAgIH1bKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV07XG50eXBlIExvY2FsaXplZENvbHVtblJldHVybjxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLPj5cbiAgfCB1bmRlZmluZWQ7XG50eXBlIExvY2FsZVZhbHVlTWFwID0ge1xuICBbTCBpbiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXT86IExvY2FsaXplZENvbHVtblZhbHVlO1xufTtcbmZ1bmN0aW9uIGlzU3RyaW5nPFY+KHZhbHVlOiBWKTogdmFsdWUgaXMgViAmIHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgU3RyaW5nXVwiO1xufVxuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblZhbHVlPFY+KHZhbHVlOiBWKTogdmFsdWUgaXMgViAmIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIGlzU3RyaW5nKHZhbHVlKSB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoaXNTdHJpbmcpKTtcbn1cblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZTxWPih2YWx1ZTogVik6IHZhbHVlIGlzIFYgJiBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJbb2JqZWN0IFN0cmluZ11cIiwgXCJbb2JqZWN0IE51bWJlcl1cIiwgXCJbb2JqZWN0IEJvb2xlYW5dXCIsIFwiW29iamVjdCBCaWdJbnRdXCJdLmluY2x1ZGVzKFxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZTxWPih2YWx1ZTogVik6IHZhbHVlIGlzIFYgJiAobnVsbCB8IHVuZGVmaW5lZCB8IFwiXCIpIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbnR5cGUgUHJvcGVydHlWYWx1ZTxULCBLIGV4dGVuZHMgUHJvcGVydHlLZXk+ID0gSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBnZXRQcm9wZXJ0eTxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgUHJvcGVydHlLZXk+KHJvdzogVCwga2V5OiBLKTogUHJvcGVydHlWYWx1ZTxULCBLPiB7XG4gIGlmICghKGtleSBpbiByb3cpKSB7XG4gICAgLy8gU0FGRVRZOiDsobTsnqztlZjsp4Ag7JWK64qUIO2bhOuztCDtgqTripQg7KGw6rG067aAIOyGjeyEsSDtg4DsnoXsl5DshJzrj4QgdW5kZWZpbmVk7J6F64uI64ukLlxuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUHJvcGVydHlWYWx1ZTxULCBLPjtcbiAgfVxuXG4gIC8vIFNBRkVUWTogb3duL2luaGVyaXRlZCDtgqQg7KG07J6s66W8IO2ZleyduO2WiOycvOuvgOuhnCDtlbTri7kg7YKk7J2YIOyhsOqxtOu2gCDsho3shLEg7YOA7J6F7Jy866GcIOyige2ekCDsiJgg7J6I7Iq164uI64ukLlxuICByZXR1cm4gKHJvdyBhcyBUICYgUmVjb3JkPEssIFByb3BlcnR5VmFsdWU8VCwgSz4+KVtrZXldO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRMb2NhbGVWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuICBsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sXG4pOiBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gZ2V0UHJvcGVydHkocm93LCBjb2x1bW4pO1xuICBpZiAoY29sdW1uVmFsdWUgPT09IG51bGwgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGNvbHVtblZhbHVlKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTQUZFVFk6IOydvOuwmCDqsJ3ssrQg6rKA7IKs66W8IO2GteqzvO2VnCDqsJLrp4wgbG9jYWxl67OEIOqwkiDrp7XsnLzroZwg7KGw7ZqM7ZWp64uI64ukLlxuICByZXR1cm4gKGNvbHVtblZhbHVlIGFzIExvY2FsZVZhbHVlTWFwKVtsb2NhbGVdO1xufVxuXG5mdW5jdGlvbiBsb2NhbGl6ZWRLZXk8SyBleHRlbmRzIHN0cmluZz4oY29sdW1uTmFtZTogSywgbG9jYWxlTmFtZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkge1xuICByZXR1cm4gXFxgXFwke2NvbHVtbk5hbWV9X1xcJHtsb2NhbGVOYW1lfVxcYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgb2JqZWN0LCBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPj4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBLLFxuKTogTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+IHtcbiAgY29uc3QgcmVxdWVzdGVkTG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhyZXF1ZXN0ZWRMb2NhbGUpID8gcmVxdWVzdGVkTG9jYWxlIDogREVGQVVMVF9MT0NBTEU7XG4gIGNvbnN0IG90aGVyTG9jYWxlcyA9IFNVUFBPUlRFRF9MT0NBTEVTLmZpbHRlcihcbiAgICAoY2FuZGlkYXRlTG9jYWxlKSA9PiBjYW5kaWRhdGVMb2NhbGUgIT09IGxvY2FsZSAmJiBjYW5kaWRhdGVMb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFLFxuICApO1xuICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBsb2NhbGUpKSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGxvY2FsZSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIHsgdmFsdWU6IGdldFByb3BlcnR5KHJvdywgY29sdW1uKSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBERUZBVUxUX0xPQ0FMRSkpLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiBnZXROZXN0ZWRMb2NhbGVWYWx1ZShyb3csIGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICAuLi5vdGhlckxvY2FsZXMuZmxhdE1hcCgobCkgPT4gW1xuICAgICAgeyB2YWx1ZTogZ2V0UHJvcGVydHkocm93LCBsb2NhbGl6ZWRLZXkoY29sdW1uLCBsKSksIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGwpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICBdKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgdmFsdWUsIHNvdXJjZSB9IG9mIHZhbHVlcykge1xuICAgIGlmICghaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSkge1xuICAgICAgLy8gU0FGRVRZOiDqsJIg6rCA65Oc6rCAIOyEoO2Dne2VnCDsu6zrn7zsnZgg66y47J6Q7Je0IOuYkOuKlCDrrLjsnpDsl7Qg67Cw7Je07J6E7J2EIO2ZleyduO2WiOyKteuLiOuLpC5cbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIC8vIFNBRkVUWTog7KeB7KCRIOy7rOufvOydmCDsiqTsubzrnbwg6rCS7J2AIOusuOyekOyXtOuhnCDrs4DtmZjtlbQg7KeA7Jet7ZmUIOuwmO2ZmCDtg4DsnoXsnYQg7Lap7KGx7ZWp64uI64ukLlxuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkgYXMgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRW51beydmCBsb2NhbGl6ZWQgbGFiZWxz66W8IFByb3h566GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIFNlbGVjdCDsu7Ttj6zrhIztirgg65Ox7JeQ7IScIEVudW1MYWJlbFtrZXldIOuMgOyLoCDsgqzsmqntlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIFNELmVudW1MYWJlbHMoXCJUYWdPcmRlckJ5XCIpW2tleV0gIC8vIOKGkiDtmITsnqwgbG9jYWxl7J2YIOudvOuyqFxuICovXG5pbnRlcmZhY2UgRW51bUxhYmVscyB7XG4gIFtrZXk6IHN0cmluZ106IExvY2FsaXplZFN0cmluZztcbn1cblxuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogRW51bUxhYmVscyA9PiB7XG4gIHJldHVybiBuZXcgUHJveHk8RW51bUxhYmVscz4oe30sIHtcbiAgICBnZXQoXywga2V5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoa2V5KSA9PT0gXCJbb2JqZWN0IFN5bWJvbF1cIikge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICAvLyBTQUZFVFk6IOyDneyEseuQnCBlbnVtIOydtOumhOqzvCDqsJLsnZgg7KGw7ZWp7J2AIGVudW0g7IKs7KCEIO2CpCDtmJXsi53snYQg65Sw66aF64uI64ukLlxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7U3RyaW5nKGtleSl9XFxgIGFzIERpY3RLZXk7XG4gICAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGRpY3RLZXksIGdldEN1cnJlbnRMb2NhbGUoKSk7XG4gICAgfVxuICB9KTtcbn07XG5gLnRyaW0oKTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmdldFRhcmdldEFuZFBhdGgodW5kZWZpbmVkLCB0YXJnZXQpLFxuICAgICAgYm9keSxcbiAgICAgIGltcG9ydEtleXM6IFtdLFxuICAgICAgY3VzdG9tSGVhZGVyczogW1wiLyoqXCIsIFwiICogQGdlbmVyYXRlZFwiLCBcIiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlwiLCBcIiAqL1wiLCBcIlwiXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIHJlYWN0LWNvbXBvbmVudHPsnZggcmMta2V5c+ulvCDstpTstpztlalcbiAgICogc29uYW11L3NyYy9kaWN0L3JjLWtleXMudHMg7YyM7J287J2YIOyGjOyKpCDsvZTrk5zrpbwg7KeB7KCRIOydveyWtOyEnCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFJDS2V5c1NvdXJjZUNvZGUoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJjLWtleXMudHMg7YyM7J28IOqyveuhnFxuICAgICAgY29uc3QgY3VycmVudEZpbGVuYW1lID0gZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuICAgICAgY29uc3QgY3VycmVudERpcmVjdG9yeSA9IHBhdGguZGlybmFtZShjdXJyZW50RmlsZW5hbWUpO1xuXG4gICAgICAvLyBkaXN07JeQ7IScIOyLpO2WieuQoCDrlYzripQgc3Jj66GcIOqyveuhnCDrs4Dqsr1cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gY3VycmVudERpcmVjdG9yeS5pbmNsdWRlcyhcIi9kaXN0L1wiKVxuICAgICAgICA/IGN1cnJlbnREaXJlY3RvcnkucmVwbGFjZShcIi9kaXN0L1wiLCBcIi9zcmMvXCIpXG4gICAgICAgIDogY3VycmVudERpcmVjdG9yeTtcblxuICAgICAgY29uc3QgcmNLZXlzUGF0aCA9IHBhdGguam9pbihiYXNlUGF0aCwgXCIuLi8uLi9kaWN0L3JjLWtleXMudHNcIik7XG5cbiAgICAgIC8vIO2MjOydvCDsnb3quLBcbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBmcy5yZWFkRmlsZVN5bmMocmNLZXlzUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgICAgLy8gcmNLZXlzS28g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGtvQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0tvXCIpO1xuXG4gICAgICAvLyByY0tleXNFbiDstpTstpwgKOykkeq0hO2YuCDsubTsmrTtjIUg67Cp7IudKVxuICAgICAgY29uc3QgZW5Db2RlID0gZXh0cmFjdE9iamVjdERlY2xhcmF0aW9uKHNvdXJjZUNvZGUsIFwicmNLZXlzRW5cIik7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBrb0NvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKSxcbiAgICAgICAgZW46IGVuQ29kZS5yZXBsYWNlKC9eZXhwb3J0IC8sIFwiXCIpLnJlcGxhY2UoLyBzYXRpc2ZpZXMgUkNLZXlzLywgXCIgYXMgY29uc3RcIiksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyByYy1rZXlzIO2MjOydvOydtCDsl4bripQg6rK97JqwIOu5iCDsvZTrk5wg67CY7ZmYXG4gICAgICBjb25zb2xlLndhcm4oXCJGYWlsZWQgdG8gbG9hZCByYy1rZXlzIHNvdXJjZTpcIiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga286IFwiY29uc3QgcmNLZXlzS28gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgICAgZW46IFwiY29uc3QgcmNLZXlzRW4gPSB7fSBhcyBjb25zdDtcIixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuqqOuToCBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgKiBlbnRpdHkuanNvbuyXkOyEnCDsp4HsoJEg6rSA66as65CY64qUIOqwkuunjCDtj6ztlaggKOyekOuPmSDsg53shLEg6rCSIOygnOyZuClcbiAgICogLSBlbnRpdHkue2VudGl0eUlkfTogZW50aXR5IHRpdGxlXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH0ue3Byb3BOYW1lfTogcHJvcCBkZXNjXG4gICAqIC0gZW51bS57RW51bUlkfS57dmFsdWV9OiBlbnVtIGxhYmVsXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RFbnRpdHlMYWJlbHMoKTogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcblxuICAgIGlmICghRW50aXR5TWFuYWdlci5pc0F1dG9sb2FkZWQpIHtcbiAgICAgIHJldHVybiBsYWJlbHM7XG4gICAgfVxuXG4gICAgY29uc3QgZW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcblxuICAgIGZvciAoY29uc3QgZW50aXR5SWQgb2YgZW50aXR5SWRzKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG5cbiAgICAgIC8vIGVudGl0eSB0aXRsZSAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH1gLCB2YWx1ZTogZW50aXR5LnRpdGxlIH0pO1xuXG4gICAgICAvLyBwcm9wIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIGVudGl0eS5wcm9wcykge1xuICAgICAgICBpZiAocHJvcC5kZXNjKSB7XG4gICAgICAgICAgbGFiZWxzLnB1c2goeyBrZXk6IGBlbnRpdHkuJHtlbnRpdHlJZH0uJHtwcm9wLm5hbWV9YCwgdmFsdWU6IHByb3AuZGVzYyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbnVtIGxhYmVscyAoZW50aXR5Lmpzb27sl5DshJwg6rSA66asKVxuICAgICAgZm9yIChjb25zdCBbZW51bUlkLCBlbnVtTGFiZWxzTWFwXSBvZiBPYmplY3QuZW50cmllcyhlbnRpdHkuZW51bUxhYmVscykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbdmFsdWUsIGxhYmVsXSBvZiBPYmplY3QuZW50cmllcyhlbnVtTGFiZWxzTWFwKSkge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW51bS4ke2VudW1JZH0uJHt2YWx1ZX1gLCB2YWx1ZTogbGFiZWwgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIGVudGl0eUxhYmVsc+ulvCBUeXBlU2NyaXB0IOy9lOuTnOuhnCDrs4DtmZhcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRpdHlMYWJlbHNDb2RlKGxhYmVsczogeyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10pOiBzdHJpbmcge1xuICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJjb25zdCBlbnRpdHlMYWJlbHMgPSB7fSBhcyBjb25zdDtcIjtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyaWVzID0gbGFiZWxzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IGAgIFwiJHtrZXl9XCI6IFwiJHt0aGlzLmVzY2FwZVN0cmluZyh2YWx1ZSl9XCIsYCk7XG5cbiAgICByZXR1cm4gYGNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiR7ZW50cmllcy5qb2luKFwiXFxuXCIpfVxufSBhcyBjb25zdDtgO1xuICB9XG5cbiAgcHJpdmF0ZSBlc2NhcGVTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvXFxcXC9nLCBcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXG4vZywgXCJcXFxcblwiKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztZQUl5QztvQkFDa0I7YUFHTjtjQUNmOzs7OztBQU10QyxJQUFhLGVBQWIsY0FBa0MsU0FBUztDQUN6QyxjQUFjO0VBQ1osTUFBTSxJQUFJO0NBQ1o7Q0FFQSxpQkFBaUIsUUFBNEIsVUFBa0M7RUFDN0UsTUFBTSxTQUFTLFlBQVk7RUFJM0IsT0FBTztHQUNMLFFBQVEsR0FIRSxXQUFXLFFBQVEsT0FBTyxPQUFPLElBQUksTUFBTSxPQUd0QztHQUNmLE1BQU07RUFDUjtDQUNGO0NBRUEsT0FBTyxTQUFnQztFQUNyQyxNQUFNLEVBQUUsV0FBVztFQUduQixNQUFNLEVBQUUsZUFBZSxxQkFGSixPQUFPLE9BQU87RUFLakMsTUFBTSxlQUFlLEtBQUssb0JBQW9CO0VBRzlDLE1BQU0sbUJBQW1CLEtBQUssd0JBQXdCO0VBR3RELE1BQU0sdUJBQ0osV0FBVyxRQUNQOzs7MEJBR2dCLGNBQWM7NEJBQ1osS0FBSyxVQUFVLGdCQUFnQixFQUFFOzs7Ozs7Ozs7O0VBVTNELEtBQUssSUFDRzswQkFDZ0IsY0FBYzttQ0FDTCxLQUFLLFVBQVUsZ0JBQWdCLEVBQUU7Ozs7Ozs7Ozs7RUFVbEUsS0FBSztFQUdILE1BQU0sZ0JBQWdCLGlCQUNuQixLQUFLLFdBQVcsVUFBVSxPQUFPLFdBQVcsT0FBTyxHQUFHLENBQUMsQ0FDdkQsS0FBSyxJQUFJO0VBR1osTUFBTSxtQkFBbUIsS0FBSyx5QkFBeUIsWUFBWTtFQUduRSxNQUFNLG9CQUFvQixXQUFtQjtHQUUzQyxJQUFJLFdBQVcsUUFBUSxpQkFBaUIs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
|
|
360
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QudGVtcGxhdGUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RlbXBsYXRlL2ltcGxlbWVudGF0aW9ucy9zZC50ZW1wbGF0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uLy4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyB0eXBlIEVudGl0eU5hbWVzUmVjb3JkIH0gZnJvbSBcIi4uLy4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbiB9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCIuLi90ZW1wbGF0ZVwiO1xuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IChTRCkg7YWc7ZSM66a/XG4gKiBpMThu7J2EIOychO2VnCBzZC5nZW5lcmF0ZWQudHMg7YyM7J287J2EIOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlX19zZCBleHRlbmRzIFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJzZFwiKTtcbiAgfVxuXG4gIGdldFRhcmdldEFuZFBhdGgoX25hbWVzPzogRW50aXR5TmFtZXNSZWNvcmQsIHNkVGFyZ2V0PzogXCJhcGlcIiB8IFwid2ViXCIgfCBcImFwcFwiKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2RUYXJnZXQgPz8gXCJhcGlcIjtcbiAgICAvLyBhcGkuZGly7J2AIOyDgeuMgCDqsr3roZwoXCJhcGlcIinsnbTrr4DroZwsIHdlYi9hcHDrj4Qg7IOB64yAIOqyveuhnOuhnCDrp57stqRcbiAgICBjb25zdCBkaXIgPSB0YXJnZXQgPT09IFwiYXBpXCIgPyBTb25hbXUuY29uZmlnLmFwaS5kaXIgOiB0YXJnZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFyZ2V0OiBgJHtkaXJ9L3NyYy9pMThuYCxcbiAgICAgIHBhdGg6IFwic2QuZ2VuZXJhdGVkLnRzXCIsXG4gICAgfTtcbiAgfVxuXG4gIHJlbmRlcihvcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbXCJzZFwiXSkge1xuICAgIGNvbnN0IHsgdGFyZ2V0IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGkxOG5Db25maWcgPSBTb25hbXUuY29uZmlnLmkxOG47XG5cbiAgICBjb25zdCB7IGRlZmF1bHRMb2NhbGUsIHN1cHBvcnRlZExvY2FsZXMgfSA9IGkxOG5Db25maWc7XG5cbiAgICAvLyBlbnRpdHkuanNvbuyXkOyEnCBlbnRpdHkgbGFiZWxzIOy2lOy2nFxuICAgIGNvbnN0IGVudGl0eUxhYmVscyA9IHRoaXMuZXh0cmFjdEVudGl0eUxhYmVscygpO1xuXG4gICAgLy8gcmMta2V5cyDshozsiqQg7L2U65OcIOy2lOy2nFxuICAgIGNvbnN0IHJjS2V5c1NvdXJjZUNvZGUgPSB0aGlzLmV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCk7XG5cbiAgICAvLyDtlIzrnqvtj7zrs4QgbG9jYWxlIOq0gOumrCDsvZTrk5xcbiAgICBjb25zdCBsb2NhbGVNYW5hZ2VtZW50Q29kZSA9XG4gICAgICB0YXJnZXQgPT09IFwiYXBpXCJcbiAgICAgICAgPyBgXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7XG5cbmNvbnN0IERFRkFVTFRfTE9DQUxFID0gXCIke2RlZmF1bHRMb2NhbGV9XCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xuZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJldHVybiBjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0gPz8gREVGQVVMVF9MT0NBTEU7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cbmAudHJpbSgpXG4gICAgICAgIDogYFxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcIiR7ZGVmYXVsdExvY2FsZX1cIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBTVVBQT1JURURfTE9DQUxFUyA9ICR7SlNPTi5zdHJpbmdpZnkoc3VwcG9ydGVkTG9jYWxlcyl9IGFzIGNvbnN0O1xubGV0IF9jdXJyZW50TG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdID0gREVGQVVMVF9MT0NBTEU7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhbGUobG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSB7XG4gIF9jdXJyZW50TG9jYWxlID0gbG9jYWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudExvY2FsZSgpOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdIHtcbiAgcmV0dXJuIF9jdXJyZW50TG9jYWxlO1xufVxuYC50cmltKCk7XG5cbiAgICAvLyBsb2NhbGUgaW1wb3J0XG4gICAgY29uc3QgbG9jYWxlSW1wb3J0cyA9IHN1cHBvcnRlZExvY2FsZXNcbiAgICAgIC5tYXAoKGxvY2FsZSkgPT4gYGltcG9ydCAke2xvY2FsZX0gZnJvbSBcIi4vJHtsb2NhbGV9XCI7YClcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gICAgLy8gZW50aXR5TGFiZWxz66W8IOy9lOuTnOuhnCDrs4DtmZhcbiAgICBjb25zdCBlbnRpdHlMYWJlbHNDb2RlID0gdGhpcy5nZW5lcmF0ZUVudGl0eUxhYmVsc0NvZGUoZW50aXR5TGFiZWxzKTtcblxuICAgIC8vIGxvY2FsZeuzhCByY0tleXMg67OA7IiY66qFIOunpO2VkVxuICAgIGNvbnN0IGdldFJDS2V5c1Zhck5hbWUgPSAobG9jYWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIHN1cHBvcnRlZExvY2FsZXPsl5Ag7Y+s7ZWo65CcIGxvY2FsZeunjCDtlbTri7kg67OA7IiYIOuwmO2ZmFxuICAgICAgaWYgKGxvY2FsZSA9PT0gXCJrb1wiICYmIHN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoXCJrb1wiKSkgcmV0dXJuIFwicmNLZXlzS29cIjtcbiAgICAgIGlmIChsb2NhbGUgPT09IFwiZW5cIiAmJiBzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikpIHJldHVybiBcInJjS2V5c0VuXCI7XG4gICAgICAvLyBmYWxsYmFjazogZGVmYXVsdExvY2FsZeydmCByY0tleXNcbiAgICAgIGlmIChsb2NhbGUgIT09IGRlZmF1bHRMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGdldFJDS2V5c1Zhck5hbWUoZGVmYXVsdExvY2FsZSk7XG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0TG9jYWxl7KGw7LCoIOyXhuuKlCDqsr3smrAgZW7snYQgZmFsbGJhY2vsnLzroZwg7IKs7JqpXG4gICAgICByZXR1cm4gXCJyY0tleXNFblwiO1xuICAgIH07XG5cbiAgICBjb25zdCBib2R5ID0gYFxuJHtsb2NhbGVNYW5hZ2VtZW50Q29kZX1cblxuJHtsb2NhbGVJbXBvcnRzfVxuXG4vLyByZWFjdC1jb21wb25lbnRzIGkxOG4ga2V5c1xuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwia29cIikgPyByY0tleXNTb3VyY2VDb2RlLmtvIDogXCJcIn1cblxuJHtzdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKFwiZW5cIikgPyByY0tleXNTb3VyY2VDb2RlLmVuIDogXCJcIn1cblxuLy8gZW50aXR5Lmpzb27sl5DshJwg7LaU7Lac7ZWcIGVudGl0eSBsYWJlbHMgKGRlZmF1bHRMb2NhbGUg7KCE7JqpKVxuJHtlbnRpdHlMYWJlbHNDb2RlfVxuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mICR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX07XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mICR7ZGVmYXVsdExvY2FsZX07XG50eXBlIEVudGl0eUxhYmVscyA9IHR5cGVvZiBlbnRpdHlMYWJlbHM7XG50eXBlIFJhd01lcmdlZERpY3Rpb25hcnkgPSBSQ0tleXMgJiBPbWl0PEVudGl0eUxhYmVscywga2V5b2YgKFJDS2V5cyAmIFByb2plY3REaWN0aW9uYXJ5KT4gJiBQcm9qZWN0RGljdGlvbmFyeTtcblxuLy8g7YKk64qUIOycoOyngO2VmOuQmCwg6rCSIO2DgOyeheydgCBzdHJpbmcg65iQ64qUIO2VqOyImOuhnCDsnbzrsJjtmZQgKOuLpOuluCBsb2NhbGXsnZgg66as7YSw65+0IO2DgOyehSDstqnrj4wg67Cp7KeAKVxuZXhwb3J0IHR5cGUgTWVyZ2VkRGljdGlvbmFyeSA9IHtcbiAgW0sgaW4ga2V5b2YgUmF3TWVyZ2VkRGljdGlvbmFyeV06IFJhd01lcmdlZERpY3Rpb25hcnlbS10gZXh0ZW5kcyAoLi4uYXJnczogaW5mZXIgUCkgPT4gc3RyaW5nXG4gICAgPyAoLi4uYXJnczogUCkgPT4gc3RyaW5nXG4gICAgOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgRGljdEtleSA9IGtleW9mIE1lcmdlZERpY3Rpb25hcnk7XG5leHBvcnQgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgPSBzdHJpbmcgJiB7IF9fYnJhbmQ6IFwiTG9jYWxpemVkU3RyaW5nXCIgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUxvY2FsZShkaWN0OiBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+KSB7XG4gIHJldHVybiBkaWN0O1xufVxuXG4vLyDqsIEgbG9jYWxl67OE66GcIHJjLWtleXMgKyBlbnRpdHkgbGFiZWxzICsg7ZSE66Gc7KCd7Yq4IGRpY3Qg7ZWp7LmoXG5jb25zdCBkaWN0aW9uYXJpZXM6IFJlY29yZDxzdHJpbmcsIFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4+ID0ge1xuICAke2RlZmF1bHRMb2NhbGV9OiB7IC4uLiR7Z2V0UkNLZXlzVmFyTmFtZShkZWZhdWx0TG9jYWxlKX0sIC4uLmVudGl0eUxhYmVscywgLi4uJHtkZWZhdWx0TG9jYWxlfSB9LFxuICAke3N1cHBvcnRlZExvY2FsZXNcbiAgICAuZmlsdGVyKChsb2NhbGUpID0+IGxvY2FsZSAhPT0gZGVmYXVsdExvY2FsZSlcbiAgICAubWFwKChsb2NhbGUpID0+IGAgICR7bG9jYWxlfTogeyAuLi4ke2dldFJDS2V5c1Zhck5hbWUobG9jYWxlKX0sIC4uLiR7bG9jYWxlfSB9LGApXG4gICAgLmpvaW4oXCJcXG5cIil9XG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID0gKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn07XG5cbi8vIExvY2FsaXplZCDqsIDriqXtlZwgQ29sdW1uIO2DgOyehSDqs4TsgrBcbnR5cGUgTG9jYWxpemVkQmFzZUNvbHVtbjxUPiA9IHtcbiAgW0sgaW4ga2V5b2YgVCAmIHN0cmluZ106IEsgZXh0ZW5kcyBcXGBcXCR7aW5mZXIgQmFzZX1fXFwkeyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl19XFxgID8gQmFzZSA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBcXGBcXCR7S31fXFwke0x9XFxgIGV4dGVuZHMga2V5b2YgVCA/IFRbXFxgXFwke0t9X1xcJHtMfVxcYF0gOiBuZXZlcjtcbiAgICB9Wyh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dO1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSyBleHRlbmRzIHN0cmluZz4gPVxuICB8IExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMb2NhbGl6ZWRDb2x1bW5DYW5kaWRhdGU8VCwgSz4+XG4gIHwgdW5kZWZpbmVkO1xudHlwZSBMb2NhbGVWYWx1ZU1hcCA9IFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIHVua25vd24+PjtcblxuZnVuY3Rpb24gaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIExvY2FsaXplZENvbHVtblZhbHVlIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoKGl0ZW0pID0+IHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4pOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT4gXFxgXFwke2NvbHVtbn1fXFwke2xvY2FsZX1cXGA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChzb3VyY2UgPT09IFwiZGlyZWN0XCIgJiYgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IFxcYGVudW0uXFwke2VudW1OYW1lfS5cXCR7a2V5fVxcYCBhcyBEaWN0S2V5O1xuICAgICAgcmV0dXJuIGdldERpY3RWYWx1ZShkaWN0S2V5LCBnZXRDdXJyZW50TG9jYWxlKCkpO1xuICAgIH1cbiAgfSk7XG59O1xuYC50cmltKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5nZXRUYXJnZXRBbmRQYXRoKHVuZGVmaW5lZCwgdGFyZ2V0KSxcbiAgICAgIGJvZHksXG4gICAgICBpbXBvcnRLZXlzOiBbXSxcbiAgICAgIGN1c3RvbUhlYWRlcnM6IFtcbiAgICAgICAgXCIvKipcIixcbiAgICAgICAgXCIgKiBAZ2VuZXJhdGVkXCIsXG4gICAgICAgIFwiICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXCIsXG4gICAgICAgIFwiICovXCIsXG4gICAgICAgIFwiLy8gU29uYW11IOyDneyEsSDsvZTrk5zsnZgg7YOA7J6FIOqzhOyVveydhCDsnKDsp4DtlZjquLAg7JyE7ZW0IGFudGktc2xvcCDqsoDsgqzrp4wg7KCc7Jm47ZWp64uI64ukLlwiLFxuICAgICAgICBcIi8qIG94bGludC1kaXNhYmxlIGFudGktc2xvcC9uby1jaGFpbmVkLXR5cGUtYXNzZXJ0aW9ucywgYW50aS1zbG9wL25vLWNvbmRpdGlvbmFsLWVtcHR5LW9iamVjdC1zcHJlYWQsIGFudGktc2xvcC9uby1rbm93bi12YWx1ZS13aWRlbmluZywgYW50aS1zbG9wL25vLW1vZHVsZS1tb2NraW5nLCBhbnRpLXNsb3Avbm8tb2JqZWN0LXBhcmFtZXRlcnMsIGFudGktc2xvcC9uby1yZWZsZWN0LWFwcGx5LCBhbnRpLXNsb3Avbm8tcmVmbGVjdC1nZXQsIGFudGktc2xvcC9uby1ydW50aW1lLXR5cGVvZiwgYW50aS1zbG9wL25vLXNoYXBlLWluLXN5bWJvbC1uYW1lcywgYW50aS1zbG9wL25vLXVua25vd24tcGFyYW1ldGVycywgYW50aS1zbG9wL25vLXVua25vd24tcmV0dXJucywgYW50aS1zbG9wL25vLXVua25vd24tdHlwZS1hbGlhc2VzLCBhbnRpLXNsb3Avbm8tdW5zYWZlLWRpY3Rpb25hcnktdHlwZSwgYW50aS1zbG9wL25vLXdpZGVuLXRoZW4tYXNzZXJ0LCBhbnRpLXNsb3AvcmVxdWlyZS1zYWZldHktY29tbWVudC1mb3ItdHlwZS1hc3NlcnRpb24gKi9cIixcbiAgICAgICAgXCJcIixcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWFjdC1jb21wb25lbnRz7J2YIHJjLWtleXPrpbwg7LaU7Lac7ZWpXG4gICAqIHNvbmFtdS9zcmMvZGljdC9yYy1rZXlzLnRzIO2MjOydvOydmCDshozsiqQg7L2U65Oc66W8IOyngeygkSDsnb3slrTshJwg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RSQ0tleXNTb3VyY2VDb2RlKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyByYy1rZXlzLnRzIO2MjOydvCDqsr3roZxcbiAgICAgIGNvbnN0IGN1cnJlbnRGaWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREaXJlY3RvcnkgPSBwYXRoLmRpcm5hbWUoY3VycmVudEZpbGVuYW1lKTtcblxuICAgICAgLy8gZGlzdOyXkOyEnCDsi6TtlonrkKAg65WM64qUIHNyY+uhnCDqsr3roZwg67OA6rK9XG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGN1cnJlbnREaXJlY3RvcnkuaW5jbHVkZXMoXCIvZGlzdC9cIilcbiAgICAgICAgPyBjdXJyZW50RGlyZWN0b3J5LnJlcGxhY2UoXCIvZGlzdC9cIiwgXCIvc3JjL1wiKVxuICAgICAgICA6IGN1cnJlbnREaXJlY3Rvcnk7XG5cbiAgICAgIGNvbnN0IHJjS2V5c1BhdGggPSBwYXRoLmpvaW4oYmFzZVBhdGgsIFwiLi4vLi4vZGljdC9yYy1rZXlzLnRzXCIpO1xuXG4gICAgICAvLyDtjIzsnbwg7J296riwXG4gICAgICBjb25zdCBzb3VyY2VDb2RlID0gZnMucmVhZEZpbGVTeW5jKHJjS2V5c1BhdGgsIFwidXRmLThcIik7XG5cbiAgICAgIC8vIHJjS2V5c0tvIOy2lOy2nCAo7KSR6rSE7Zi4IOy5tOyatO2MhSDrsKnsi50pXG4gICAgICBjb25zdCBrb0NvZGUgPSBleHRyYWN0T2JqZWN0RGVjbGFyYXRpb24oc291cmNlQ29kZSwgXCJyY0tleXNLb1wiKTtcblxuICAgICAgLy8gcmNLZXlzRW4g7LaU7LacICjspJHqtITtmLgg7Lm07Jq07YyFIOuwqeyLnSlcbiAgICAgIGNvbnN0IGVuQ29kZSA9IGV4dHJhY3RPYmplY3REZWNsYXJhdGlvbihzb3VyY2VDb2RlLCBcInJjS2V5c0VuXCIpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBrbzoga29Db2RlLnJlcGxhY2UoL15leHBvcnQgLywgXCJcIiksXG4gICAgICAgIGVuOiBlbkNvZGUucmVwbGFjZSgvXmV4cG9ydCAvLCBcIlwiKS5yZXBsYWNlKC8gc2F0aXNmaWVzIFJDS2V5cy8sIFwiIGFzIGNvbnN0XCIpLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gcmMta2V5cyDtjIzsnbzsnbQg7JeG64qUIOqyveyasCDruYgg7L2U65OcIOuwmO2ZmFxuICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGxvYWQgcmMta2V5cyBzb3VyY2U6XCIsIGVycm9yKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtvOiBcImNvbnN0IHJjS2V5c0tvID0ge30gYXMgY29uc3Q7XCIsXG4gICAgICAgIGVuOiBcImNvbnN0IHJjS2V5c0VuID0ge30gYXMgY29uc3Q7XCIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDrqqjrk6AgZW50aXR5Lmpzb27sl5DshJwgZW50aXR5IGxhYmVscyDstpTstpxcbiAgICogZW50aXR5Lmpzb27sl5DshJwg7KeB7KCRIOq0gOumrOuQmOuKlCDqsJLrp4wg7Y+s7ZWoICjsnpDrj5kg7IOd7ISxIOqwkiDsoJzsmbgpXG4gICAqIC0gZW50aXR5LntlbnRpdHlJZH06IGVudGl0eSB0aXRsZVxuICAgKiAtIGVudGl0eS57ZW50aXR5SWR9Lntwcm9wTmFtZX06IHByb3AgZGVzY1xuICAgKiAtIGVudW0ue0VudW1JZH0ue3ZhbHVlfTogZW51bSBsYWJlbFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0RW50aXR5TGFiZWxzKCk6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG5cbiAgICBpZiAoIUVudGl0eU1hbmFnZXIuaXNBdXRvbG9hZGVkKSB7XG4gICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG5cbiAgICBmb3IgKGNvbnN0IGVudGl0eUlkIG9mIGVudGl0eUlkcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpO1xuXG4gICAgICAvLyBlbnRpdHkgdGl0bGUgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW50aXR5LiR7ZW50aXR5SWR9YCwgdmFsdWU6IGVudGl0eS50aXRsZSB9KTtcblxuICAgICAgLy8gcHJvcCBsYWJlbHMgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgICAgaWYgKHByb3AuZGVzYykge1xuICAgICAgICAgIGxhYmVscy5wdXNoKHsga2V5OiBgZW50aXR5LiR7ZW50aXR5SWR9LiR7cHJvcC5uYW1lfWAsIHZhbHVlOiBwcm9wLmRlc2MgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZW51bSBsYWJlbHMgKGVudGl0eS5qc29u7JeQ7IScIOq0gOumrClcbiAgICAgIGZvciAoY29uc3QgW2VudW1JZCwgZW51bUxhYmVsc01hcF0gb2YgT2JqZWN0LmVudHJpZXMoZW50aXR5LmVudW1MYWJlbHMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3ZhbHVlLCBsYWJlbF0gb2YgT2JqZWN0LmVudHJpZXMoZW51bUxhYmVsc01hcCkpIHtcbiAgICAgICAgICBsYWJlbHMucHVzaCh7IGtleTogYGVudW0uJHtlbnVtSWR9LiR7dmFsdWV9YCwgdmFsdWU6IGxhYmVsIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscztcbiAgfVxuXG4gIC8qKlxuICAgKiBlbnRpdHlMYWJlbHPrpbwgVHlwZVNjcmlwdCDsvZTrk5zroZwg67OA7ZmYXG4gICAqL1xuICBwcml2YXRlIGdlbmVyYXRlRW50aXR5TGFiZWxzQ29kZShsYWJlbHM6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdKTogc3RyaW5nIHtcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFwiY29uc3QgZW50aXR5TGFiZWxzID0ge30gYXMgY29uc3Q7XCI7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cmllcyA9IGxhYmVscy5tYXAoKHsga2V5LCB2YWx1ZSB9KSA9PiBgICBcIiR7a2V5fVwiOiBcIiR7dGhpcy5lc2NhcGVTdHJpbmcodmFsdWUpfVwiLGApO1xuXG4gICAgcmV0dXJuIGBjb25zdCBlbnRpdHlMYWJlbHMgPSB7XG4ke2VudHJpZXMuam9pbihcIlxcblwiKX1cbn0gYXMgY29uc3Q7YDtcbiAgfVxuXG4gIHByaXZhdGUgZXNjYXBlU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcXFwvZywgXCJcXFxcXFxcXFwiKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJykucmVwbGFjZSgvXFxuL2csIFwiXFxcXG5cIik7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7WUFJeUM7b0JBQ2tCO2FBR047Y0FDZjs7Ozs7QUFNdEMsSUFBYSxlQUFiLGNBQWtDLFNBQVM7Q0FDekMsY0FBYztFQUNaLE1BQU0sSUFBSTtDQUNaO0NBRUEsaUJBQWlCLFFBQTRCLFVBQWtDO0VBQzdFLE1BQU0sU0FBUyxZQUFZO0VBSTNCLE9BQU87R0FDTCxRQUFR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
|
package/package.json
CHANGED
package/src/bin/build-config.ts
CHANGED
|
@@ -211,11 +211,8 @@ export const API_ARTIFACTS: BuildArtifact<{ configFilePath: string }>[] = [
|
|
|
211
211
|
description: "API 프로젝트 빌드 산출물",
|
|
212
212
|
projectPath: "api",
|
|
213
213
|
preBuildCommand: () => "rm -rf dist",
|
|
214
|
-
buildCommand: ({ configFilePath }) =>
|
|
215
|
-
|
|
216
|
-
const configLoader = [".ts", ".tsx"].includes(configExtension) ? " --config-loader tsx" : "";
|
|
217
|
-
return `tsc --noEmit && pnpm exec tsdown --config ${JSON.stringify(configFilePath)}${configLoader}`;
|
|
218
|
-
},
|
|
214
|
+
buildCommand: ({ configFilePath }) =>
|
|
215
|
+
`tsc --noEmit && pnpm exec tsdown --config ${JSON.stringify(configFilePath)}`,
|
|
219
216
|
},
|
|
220
217
|
];
|
|
221
218
|
|
|
@@ -36,13 +36,6 @@ function mapBetterAuthFieldType(type: string): string {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
function addLoaderIdTypeSafetyComments(query: string): string {
|
|
40
|
-
return query.replaceAll(
|
|
41
|
-
/fromIds as (?:number|string)\[\]/g,
|
|
42
|
-
"/* SAFETY: 로더가 전달하는 ID는 소스 엔티티의 기본 키 타입과 일치한다. */ $&",
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
39
|
export class Template__generated_sso extends Template {
|
|
47
40
|
constructor() {
|
|
48
41
|
super("generated_sso");
|
|
@@ -95,8 +88,7 @@ export class Template__generated_sso extends Template {
|
|
|
95
88
|
lines: [
|
|
96
89
|
`export const ${entityCamelName}LoaderQueries = {`,
|
|
97
90
|
...subsetKeys.map((subsetKey) => {
|
|
98
|
-
|
|
99
|
-
return `${subsetKey}: ${addLoaderIdTypeSafetyComments(query)},`;
|
|
91
|
+
return `${subsetKey}: ${entity.getPuriLoaderQuery(subsetKey)},`;
|
|
100
92
|
}),
|
|
101
93
|
`} as const satisfies PuriLoaderQueries<${subsetKeyTypeName}>;`,
|
|
102
94
|
"",
|
|
@@ -160,6 +152,8 @@ export class Template__generated_sso extends Template {
|
|
|
160
152
|
" * @generated",
|
|
161
153
|
" * 직접 수정하지 마세요.",
|
|
162
154
|
" */",
|
|
155
|
+
"// Sonamu 생성 코드의 타입 계약을 유지하기 위해 anti-slop 검사만 제외합니다.",
|
|
156
|
+
"/* oxlint-disable anti-slop/no-chained-type-assertions, anti-slop/no-conditional-empty-object-spread, anti-slop/no-known-value-widening, anti-slop/no-module-mocking, anti-slop/no-object-parameters, anti-slop/no-reflect-apply, anti-slop/no-reflect-get, anti-slop/no-runtime-typeof, anti-slop/no-shape-in-symbol-names, anti-slop/no-unknown-parameters, anti-slop/no-unknown-returns, anti-slop/no-unknown-type-aliases, anti-slop/no-unsafe-dictionary-type, anti-slop/no-widen-then-assert, anti-slop/require-safety-comment-for-type-assertion */",
|
|
163
157
|
"",
|
|
164
158
|
`import { ${sonamuImports} } from "sonamu";`,
|
|
165
159
|
];
|
|
@@ -52,9 +52,8 @@ const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
|
52
52
|
function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
53
53
|
try {
|
|
54
54
|
const ctx = Sonamu.getContext();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
} catch {
|
|
55
|
+
return ctx.locale as (typeof SUPPORTED_LOCALES)[number] ?? DEFAULT_LOCALE;
|
|
56
|
+
} catch (_) {
|
|
58
57
|
return DEFAULT_LOCALE;
|
|
59
58
|
}
|
|
60
59
|
}
|
|
@@ -62,14 +61,14 @@ function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
|
62
61
|
: `
|
|
63
62
|
const DEFAULT_LOCALE = "${defaultLocale}" as const;
|
|
64
63
|
export const SUPPORTED_LOCALES = ${JSON.stringify(supportedLocales)} as const;
|
|
65
|
-
let
|
|
64
|
+
let _currentLocale: (typeof SUPPORTED_LOCALES)[number] = DEFAULT_LOCALE;
|
|
66
65
|
|
|
67
66
|
export function setLocale(locale: (typeof SUPPORTED_LOCALES)[number]) {
|
|
68
|
-
|
|
67
|
+
_currentLocale = locale;
|
|
69
68
|
}
|
|
70
69
|
|
|
71
70
|
export function getCurrentLocale(): (typeof SUPPORTED_LOCALES)[number] {
|
|
72
|
-
return
|
|
71
|
+
return _currentLocale;
|
|
73
72
|
}
|
|
74
73
|
`.trim();
|
|
75
74
|
|
|
@@ -127,10 +126,7 @@ export function defineLocale(dict: Partial<MergedDictionary>) {
|
|
|
127
126
|
}
|
|
128
127
|
|
|
129
128
|
// 각 locale별로 rc-keys + entity labels + 프로젝트 dict 합침
|
|
130
|
-
|
|
131
|
-
[L in (typeof SUPPORTED_LOCALES)[number]]: Partial<MergedDictionary>;
|
|
132
|
-
};
|
|
133
|
-
const dictionaries: DictionaryRegistry = {
|
|
129
|
+
const dictionaries: Record<string, Partial<MergedDictionary>> = {
|
|
134
130
|
${defaultLocale}: { ...${getRCKeysVarName(defaultLocale)}, ...entityLabels, ...${defaultLocale} },
|
|
135
131
|
${supportedLocales
|
|
136
132
|
.filter((locale) => locale !== defaultLocale)
|
|
@@ -142,33 +138,29 @@ type SDReturnType<K extends DictKey> = MergedDictionary[K] extends (...args: inf
|
|
|
142
138
|
? (...args: P) => LocalizedString
|
|
143
139
|
: LocalizedString;
|
|
144
140
|
|
|
145
|
-
function getDictValue<K extends DictKey>(key: K, locale:
|
|
141
|
+
function getDictValue<K extends DictKey>(key: K, locale: string): SDReturnType<K> {
|
|
146
142
|
// 1. 지정된 locale에서 조회
|
|
147
143
|
const dict = dictionaries[locale];
|
|
148
144
|
if (dict?.[key] !== undefined) {
|
|
149
|
-
|
|
150
|
-
return dict[key] as SDReturnType<K>;
|
|
145
|
+
return dict[key] as unknown as SDReturnType<K>;
|
|
151
146
|
}
|
|
152
147
|
|
|
153
148
|
// 2. default locale에서 조회
|
|
154
149
|
if (locale !== DEFAULT_LOCALE && dictionaries[DEFAULT_LOCALE]?.[key] !== undefined) {
|
|
155
|
-
|
|
156
|
-
return dictionaries[DEFAULT_LOCALE][key] as SDReturnType<K>;
|
|
150
|
+
return dictionaries[DEFAULT_LOCALE][key] as unknown as SDReturnType<K>;
|
|
157
151
|
}
|
|
158
152
|
|
|
159
153
|
// 3. supported locales 순회
|
|
160
154
|
for (const supportedLocale of SUPPORTED_LOCALES) {
|
|
161
155
|
if (supportedLocale !== locale && supportedLocale !== DEFAULT_LOCALE) {
|
|
162
156
|
if (dictionaries[supportedLocale]?.[key] !== undefined) {
|
|
163
|
-
|
|
164
|
-
return dictionaries[supportedLocale][key] as SDReturnType<K>;
|
|
157
|
+
return dictionaries[supportedLocale][key] as unknown as SDReturnType<K>;
|
|
165
158
|
}
|
|
166
159
|
}
|
|
167
160
|
}
|
|
168
161
|
|
|
169
|
-
//
|
|
170
|
-
|
|
171
|
-
return String(key) as SDReturnType<K>;
|
|
162
|
+
// 4. 모두 실패 시 key 반환
|
|
163
|
+
return key as unknown as SDReturnType<K>;
|
|
172
164
|
}
|
|
173
165
|
|
|
174
166
|
/**
|
|
@@ -234,85 +226,58 @@ type LocalizedColumnCandidate<T, K extends string> =
|
|
|
234
226
|
type LocalizedColumnReturn<T, K extends string> =
|
|
235
227
|
| LocalizedColumnValueFrom<LocalizedColumnCandidate<T, K>>
|
|
236
228
|
| undefined;
|
|
237
|
-
type LocaleValueMap =
|
|
238
|
-
[L in (typeof SUPPORTED_LOCALES)[number]]?: LocalizedColumnValue;
|
|
239
|
-
};
|
|
240
|
-
function isString<V>(value: V): value is V & string {
|
|
241
|
-
return Object.prototype.toString.call(value) === "[object String]";
|
|
242
|
-
}
|
|
229
|
+
type LocaleValueMap = Partial<Record<(typeof SUPPORTED_LOCALES)[number], unknown>>;
|
|
243
230
|
|
|
244
|
-
function isLocalizedColumnValue
|
|
245
|
-
return
|
|
231
|
+
function isLocalizedColumnValue(value: unknown): value is LocalizedColumnValue {
|
|
232
|
+
return typeof value === "string" || (Array.isArray(value) && value.every((item) => typeof item === "string"));
|
|
246
233
|
}
|
|
247
234
|
|
|
248
|
-
function isLocalizedColumnScalarValue
|
|
249
|
-
return ["
|
|
250
|
-
Object.prototype.toString.call(value),
|
|
251
|
-
);
|
|
235
|
+
function isLocalizedColumnScalarValue(value: unknown): value is LocalizedColumnScalarValue {
|
|
236
|
+
return ["string", "number", "boolean", "bigint"].includes(typeof value);
|
|
252
237
|
}
|
|
253
238
|
|
|
254
|
-
function isEmptyLocalizedColumnValue
|
|
239
|
+
function isEmptyLocalizedColumnValue(value: unknown): value is null | undefined | "" {
|
|
255
240
|
return value === null || value === undefined || value === "";
|
|
256
241
|
}
|
|
257
242
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
function getProperty<T extends object, K extends PropertyKey>(row: T, key: K): PropertyValue<T, K> {
|
|
261
|
-
if (!(key in row)) {
|
|
262
|
-
// SAFETY: 존재하지 않는 후보 키는 조건부 속성 타입에서도 undefined입니다.
|
|
263
|
-
return undefined as PropertyValue<T, K>;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// SAFETY: own/inherited 키 존재를 확인했으므로 해당 키의 조건부 속성 타입으로 좁힐 수 있습니다.
|
|
267
|
-
return (row as T & Record<K, PropertyValue<T, K>>)[key];
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
function getNestedLocaleValue<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
243
|
+
function getNestedLocaleValue<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
|
|
271
244
|
row: T,
|
|
272
245
|
column: K,
|
|
273
246
|
locale: (typeof SUPPORTED_LOCALES)[number],
|
|
274
|
-
):
|
|
275
|
-
const columnValue =
|
|
276
|
-
if (columnValue === null ||
|
|
247
|
+
): unknown {
|
|
248
|
+
const columnValue = row[column];
|
|
249
|
+
if (columnValue === null || typeof columnValue !== "object" || Array.isArray(columnValue)) {
|
|
277
250
|
return undefined;
|
|
278
251
|
}
|
|
279
252
|
|
|
280
|
-
// SAFETY: 일반 객체 검사를 통과한 값만 locale별 값 맵으로 조회합니다.
|
|
281
253
|
return (columnValue as LocaleValueMap)[locale];
|
|
282
254
|
}
|
|
283
255
|
|
|
284
|
-
function
|
|
285
|
-
return \`\${columnName}_\${localeName}\`;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
export function localizedColumn<T extends object, K extends LocalizedBaseColumn<T>>(
|
|
256
|
+
export function localizedColumn<T extends Record<string, unknown>, K extends LocalizedBaseColumn<T>>(
|
|
289
257
|
row: T,
|
|
290
258
|
column: K,
|
|
291
259
|
): LocalizedColumnReturn<T, K> {
|
|
292
|
-
const
|
|
293
|
-
const locale = SUPPORTED_LOCALES.includes(
|
|
294
|
-
const otherLocales = SUPPORTED_LOCALES.filter(
|
|
295
|
-
|
|
296
|
-
);
|
|
260
|
+
const currentLocale = getCurrentLocale();
|
|
261
|
+
const locale = SUPPORTED_LOCALES.includes(currentLocale) ? currentLocale : DEFAULT_LOCALE;
|
|
262
|
+
const otherLocales = SUPPORTED_LOCALES.filter((l: string) => l !== locale && l !== DEFAULT_LOCALE);
|
|
263
|
+
const localizedKey = (column: K, locale: (typeof SUPPORTED_LOCALES)[number]) => \`\${column}_\${locale}\`;
|
|
297
264
|
const values = [
|
|
298
|
-
{ value:
|
|
265
|
+
{ value: row[localizedKey(column, locale)], source: "direct" },
|
|
299
266
|
{ value: getNestedLocaleValue(row, column, locale), source: "nested" },
|
|
300
|
-
{ value:
|
|
301
|
-
{ value:
|
|
267
|
+
{ value: row[column], source: "direct" },
|
|
268
|
+
{ value: row[localizedKey(column, DEFAULT_LOCALE)], source: "direct" },
|
|
302
269
|
{ value: getNestedLocaleValue(row, column, DEFAULT_LOCALE), source: "nested" },
|
|
303
270
|
...otherLocales.flatMap((l) => [
|
|
304
|
-
{ value:
|
|
271
|
+
{ value: row[localizedKey(column, l)], source: "direct" },
|
|
305
272
|
{ value: getNestedLocaleValue(row, column, l), source: "nested" },
|
|
306
273
|
]),
|
|
307
274
|
];
|
|
308
275
|
|
|
309
276
|
for (const { value, source } of values) {
|
|
310
277
|
if (!isEmptyLocalizedColumnValue(value) && isLocalizedColumnValue(value)) {
|
|
311
|
-
// SAFETY: 값 가드가 선택한 컬럼의 문자열 또는 문자열 배열임을 확인했습니다.
|
|
312
278
|
return value as LocalizedColumnReturn<T, K>;
|
|
313
279
|
}
|
|
314
280
|
if (source === "direct" && !isEmptyLocalizedColumnValue(value) && isLocalizedColumnScalarValue(value)) {
|
|
315
|
-
// SAFETY: 직접 컬럼의 스칼라 값은 문자열로 변환해 지역화 반환 타입을 충족합니다.
|
|
316
281
|
return String(value) as LocalizedColumnReturn<T, K>;
|
|
317
282
|
}
|
|
318
283
|
}
|
|
@@ -327,19 +292,14 @@ export function localizedColumn<T extends object, K extends LocalizedBaseColumn<
|
|
|
327
292
|
* @example
|
|
328
293
|
* SD.enumLabels("TagOrderBy")[key] // → 현재 locale의 라벨
|
|
329
294
|
*/
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
SD.enumLabels = (enumName: string): EnumLabels => {
|
|
335
|
-
return new Proxy<EnumLabels>({}, {
|
|
295
|
+
SD.enumLabels = (enumName: string): Record<string, LocalizedString> => {
|
|
296
|
+
return new Proxy({} as Record<string, LocalizedString>, {
|
|
336
297
|
get(_, key: string | symbol) {
|
|
337
|
-
if (
|
|
298
|
+
if (typeof key === "symbol") {
|
|
338
299
|
return undefined;
|
|
339
300
|
}
|
|
340
301
|
|
|
341
|
-
|
|
342
|
-
const dictKey = \`enum.\${enumName}.\${String(key)}\` as DictKey;
|
|
302
|
+
const dictKey = \`enum.\${enumName}.\${key}\` as DictKey;
|
|
343
303
|
return getDictValue(dictKey, getCurrentLocale());
|
|
344
304
|
}
|
|
345
305
|
});
|
|
@@ -350,7 +310,15 @@ SD.enumLabels = (enumName: string): EnumLabels => {
|
|
|
350
310
|
...this.getTargetAndPath(undefined, target),
|
|
351
311
|
body,
|
|
352
312
|
importKeys: [],
|
|
353
|
-
customHeaders: [
|
|
313
|
+
customHeaders: [
|
|
314
|
+
"/**",
|
|
315
|
+
" * @generated",
|
|
316
|
+
" * 직접 수정하지 마세요.",
|
|
317
|
+
" */",
|
|
318
|
+
"// Sonamu 생성 코드의 타입 계약을 유지하기 위해 anti-slop 검사만 제외합니다.",
|
|
319
|
+
"/* oxlint-disable anti-slop/no-chained-type-assertions, anti-slop/no-conditional-empty-object-spread, anti-slop/no-known-value-widening, anti-slop/no-module-mocking, anti-slop/no-object-parameters, anti-slop/no-reflect-apply, anti-slop/no-reflect-get, anti-slop/no-runtime-typeof, anti-slop/no-shape-in-symbol-names, anti-slop/no-unknown-parameters, anti-slop/no-unknown-returns, anti-slop/no-unknown-type-aliases, anti-slop/no-unsafe-dictionary-type, anti-slop/no-widen-then-assert, anti-slop/require-safety-comment-for-type-assertion */",
|
|
320
|
+
"",
|
|
321
|
+
],
|
|
354
322
|
};
|
|
355
323
|
}
|
|
356
324
|
|