@cartanova/qgrid-cli 2.7.0 → 2.7.1

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.
Files changed (126) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +20 -1
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +17 -6
  3. package/bundle/dist/application/qgrid/qgrid.frame.js +1 -1
  4. package/bundle/dist/application/qgrid/schema-prompt.js +240 -0
  5. package/bundle/dist/application/qgrid/tool-emulation.js +7 -5
  6. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/2020.js +112 -0
  7. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js +140 -0
  8. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js +676 -0
  9. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  10. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js +104 -0
  11. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/index.js +225 -0
  12. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js +30 -0
  13. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/ref_error.js +20 -0
  14. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/resolve.js +135 -0
  15. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js +63 -0
  16. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js +148 -0
  17. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/applicability.js +25 -0
  18. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  19. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js +174 -0
  20. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/defaults.js +33 -0
  21. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js +435 -0
  22. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/keyword.js +115 -0
  23. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/subschema.js +74 -0
  24. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js +585 -0
  25. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/data.js +20 -0
  26. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +44 -0
  27. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.js +52 -0
  28. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.js +22 -0
  29. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.js +53 -0
  30. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.js +18 -0
  31. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.js +38 -0
  32. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.js +21 -0
  33. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.js +87 -0
  34. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/schema.js +61 -0
  35. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/equal.js +14 -0
  36. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/ucs2length.js +27 -0
  37. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/uri.js +14 -0
  38. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/validation_error.js +18 -0
  39. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +59 -0
  40. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +98 -0
  41. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/allOf.js +31 -0
  42. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +18 -0
  43. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/contains.js +91 -0
  44. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +89 -0
  45. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +18 -0
  46. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/if.js +64 -0
  47. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/index.js +62 -0
  48. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items.js +61 -0
  49. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items2020.js +36 -0
  50. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/not.js +33 -0
  51. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +53 -0
  52. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +63 -0
  53. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +19 -0
  54. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  55. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +43 -0
  56. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +19 -0
  57. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/code.js +132 -0
  58. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/id.js +16 -0
  59. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/index.js +24 -0
  60. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/ref.js +114 -0
  61. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/index.js +103 -0
  62. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/types.js +16 -0
  63. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/draft2020.js +37 -0
  64. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +48 -0
  65. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +47 -0
  66. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/index.js +24 -0
  67. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +22 -0
  68. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +17 -0
  69. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/format.js +94 -0
  70. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/index.js +12 -0
  71. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/metadata.js +25 -0
  72. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/next.js +21 -0
  73. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/index.js +15 -0
  74. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +48 -0
  75. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +61 -0
  76. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/const.js +29 -0
  77. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +19 -0
  78. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/enum.js +51 -0
  79. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/index.js +50 -0
  80. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitContains.js +20 -0
  81. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitItems.js +30 -0
  82. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitLength.js +35 -0
  83. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +49 -0
  84. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +30 -0
  85. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +29 -0
  86. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/pattern.js +40 -0
  87. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/required.js +74 -0
  88. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +72 -0
  89. package/bundle/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +35 -0
  90. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/index.js +238 -0
  91. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/schemes.js +189 -0
  92. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/utils.js +284 -0
  93. package/bundle/dist/node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js +80 -0
  94. package/bundle/dist/testing/schema-bench.js +0 -0
  95. package/bundle/dist/utils/providers/anthropic/fence-strip.js +83 -0
  96. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +3 -5
  97. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +250 -34
  98. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +36 -5
  99. package/bundle/src/application/qgrid/qgrid.frame.test.ts +120 -153
  100. package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
  101. package/bundle/src/application/qgrid/schema-prompt.test.ts +166 -0
  102. package/bundle/src/application/qgrid/schema-prompt.ts +293 -0
  103. package/bundle/src/application/qgrid/tool-emulation.test.ts +36 -0
  104. package/bundle/src/application/qgrid/tool-emulation.ts +19 -7
  105. package/bundle/src/testing/schema-bench.test.ts +358 -0
  106. package/bundle/src/testing/schema-bench.ts +352 -0
  107. package/bundle/src/utils/providers/anthropic/fence-strip.test.ts +122 -0
  108. package/bundle/src/utils/providers/anthropic/fence-strip.ts +105 -0
  109. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +2 -8
  110. package/bundle/web-dist/client/assets/{index-C24D5PiN.js → index-C0594sjh.js} +3 -3
  111. package/bundle/web-dist/client/assets/{logs-CIlZG6A3.js → logs-BotUcOEB.js} +1 -1
  112. package/bundle/web-dist/client/assets/{monit-DZFBMxKl.js → monit-kk3vnGvu.js} +1 -1
  113. package/bundle/web-dist/client/assets/{routes-C3wlSNBL.js → routes-J4bnHVfl.js} +1 -1
  114. package/bundle/web-dist/client/assets/{settings-ClRDWO-8.js → settings-CAAQSIyg.js} +1 -1
  115. package/bundle/web-dist/client/assets/{show-BP7U8yyJ.js → show-BryNvjUT.js} +1 -1
  116. package/bundle/web-dist/client/assets/{tokens-DfQeULnJ.js → tokens-DDrATjGA.js} +1 -1
  117. package/bundle/web-dist/client/assets/{use-oauth-login-flow-CY-ASCfL.js → use-oauth-login-flow-CptleCFM.js} +1 -1
  118. package/bundle/web-dist/client/index.html +1 -1
  119. package/bundle/web-dist/server/entry-server.generated.js +1 -1
  120. package/package.json +1 -1
  121. package/skills/qgrid/references/ai-sdk-provider-contract.md +20 -15
  122. package/skills/qgrid/references/anthropic-claude-code-runtime.md +31 -14
  123. package/skills/qgrid/references/decision-rationale.md +13 -3
  124. package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
  125. package/skills/qgrid/references/provider-runtime-differences.md +3 -3
  126. package/skills/qgrid/references/tool-calling-and-multiturn.md +16 -6
@@ -0,0 +1,435 @@
1
+ import { __commonJSMin } from "../../../../../../../../_virtual/_rolldown/runtime.js";
2
+ import { require_codegen } from "../codegen/index.js";
3
+ import { require_util } from "../util.js";
4
+ import { require_names } from "../names.js";
5
+ import { require_errors } from "../errors.js";
6
+ import { require_boolSchema } from "./boolSchema.js";
7
+ import { require_applicability } from "./applicability.js";
8
+ import { require_dataType } from "./dataType.js";
9
+ import { require_defaults } from "./defaults.js";
10
+ import { require_keyword } from "./keyword.js";
11
+ import { require_subschema } from "./subschema.js";
12
+ import { require_resolve } from "../resolve.js";
13
+ //#region ../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js
14
+ var require_validate = /* @__PURE__ */ __commonJSMin(((exports) => {
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.getData = exports.KeywordCxt = exports.validateFunctionCode = void 0;
17
+ const boolSchema_1 = require_boolSchema();
18
+ const dataType_1 = require_dataType();
19
+ const applicability_1 = require_applicability();
20
+ const dataType_2 = require_dataType();
21
+ const defaults_1 = require_defaults();
22
+ const keyword_1 = require_keyword();
23
+ const subschema_1 = require_subschema();
24
+ const codegen_1 = require_codegen();
25
+ const names_1 = require_names();
26
+ const resolve_1 = require_resolve();
27
+ const util_1 = require_util();
28
+ const errors_1 = require_errors();
29
+ function validateFunctionCode(it) {
30
+ if (isSchemaObj(it)) {
31
+ checkKeywords(it);
32
+ if (schemaCxtHasRules(it)) {
33
+ topSchemaObjCode(it);
34
+ return;
35
+ }
36
+ }
37
+ validateFunction(it, () => (0, boolSchema_1.topBoolOrEmptySchema)(it));
38
+ }
39
+ exports.validateFunctionCode = validateFunctionCode;
40
+ function validateFunction({ gen, validateName, schema, schemaEnv, opts }, body) {
41
+ if (opts.code.es5) gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${names_1.default.valCxt}`, schemaEnv.$async, () => {
42
+ gen.code((0, codegen_1._)`"use strict"; ${funcSourceUrl(schema, opts)}`);
43
+ destructureValCxtES5(gen, opts);
44
+ gen.code(body);
45
+ });
46
+ else gen.func(validateName, (0, codegen_1._)`${names_1.default.data}, ${destructureValCxt(opts)}`, schemaEnv.$async, () => gen.code(funcSourceUrl(schema, opts)).code(body));
47
+ }
48
+ function destructureValCxt(opts) {
49
+ return (0, codegen_1._)`{${names_1.default.instancePath}="", ${names_1.default.parentData}, ${names_1.default.parentDataProperty}, ${names_1.default.rootData}=${names_1.default.data}${opts.dynamicRef ? (0, codegen_1._)`, ${names_1.default.dynamicAnchors}={}` : codegen_1.nil}}={}`;
50
+ }
51
+ function destructureValCxtES5(gen, opts) {
52
+ gen.if(names_1.default.valCxt, () => {
53
+ gen.var(names_1.default.instancePath, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.instancePath}`);
54
+ gen.var(names_1.default.parentData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentData}`);
55
+ gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.parentDataProperty}`);
56
+ gen.var(names_1.default.rootData, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.rootData}`);
57
+ if (opts.dynamicRef) gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`${names_1.default.valCxt}.${names_1.default.dynamicAnchors}`);
58
+ }, () => {
59
+ gen.var(names_1.default.instancePath, (0, codegen_1._)`""`);
60
+ gen.var(names_1.default.parentData, (0, codegen_1._)`undefined`);
61
+ gen.var(names_1.default.parentDataProperty, (0, codegen_1._)`undefined`);
62
+ gen.var(names_1.default.rootData, names_1.default.data);
63
+ if (opts.dynamicRef) gen.var(names_1.default.dynamicAnchors, (0, codegen_1._)`{}`);
64
+ });
65
+ }
66
+ function topSchemaObjCode(it) {
67
+ const { schema, opts, gen } = it;
68
+ validateFunction(it, () => {
69
+ if (opts.$comment && schema.$comment) commentKeyword(it);
70
+ checkNoDefault(it);
71
+ gen.let(names_1.default.vErrors, null);
72
+ gen.let(names_1.default.errors, 0);
73
+ if (opts.unevaluated) resetEvaluated(it);
74
+ typeAndKeywords(it);
75
+ returnResults(it);
76
+ });
77
+ }
78
+ function resetEvaluated(it) {
79
+ const { gen, validateName } = it;
80
+ it.evaluated = gen.const("evaluated", (0, codegen_1._)`${validateName}.evaluated`);
81
+ gen.if((0, codegen_1._)`${it.evaluated}.dynamicProps`, () => gen.assign((0, codegen_1._)`${it.evaluated}.props`, (0, codegen_1._)`undefined`));
82
+ gen.if((0, codegen_1._)`${it.evaluated}.dynamicItems`, () => gen.assign((0, codegen_1._)`${it.evaluated}.items`, (0, codegen_1._)`undefined`));
83
+ }
84
+ function funcSourceUrl(schema, opts) {
85
+ const schId = typeof schema == "object" && schema[opts.schemaId];
86
+ return schId && (opts.code.source || opts.code.process) ? (0, codegen_1._)`/*# sourceURL=${schId} */` : codegen_1.nil;
87
+ }
88
+ function subschemaCode(it, valid) {
89
+ if (isSchemaObj(it)) {
90
+ checkKeywords(it);
91
+ if (schemaCxtHasRules(it)) {
92
+ subSchemaObjCode(it, valid);
93
+ return;
94
+ }
95
+ }
96
+ (0, boolSchema_1.boolOrEmptySchema)(it, valid);
97
+ }
98
+ function schemaCxtHasRules({ schema, self }) {
99
+ if (typeof schema == "boolean") return !schema;
100
+ for (const key in schema) if (self.RULES.all[key]) return true;
101
+ return false;
102
+ }
103
+ function isSchemaObj(it) {
104
+ return typeof it.schema != "boolean";
105
+ }
106
+ function subSchemaObjCode(it, valid) {
107
+ const { schema, gen, opts } = it;
108
+ if (opts.$comment && schema.$comment) commentKeyword(it);
109
+ updateContext(it);
110
+ checkAsyncSchema(it);
111
+ const errsCount = gen.const("_errs", names_1.default.errors);
112
+ typeAndKeywords(it, errsCount);
113
+ gen.var(valid, (0, codegen_1._)`${errsCount} === ${names_1.default.errors}`);
114
+ }
115
+ function checkKeywords(it) {
116
+ (0, util_1.checkUnknownRules)(it);
117
+ checkRefsAndKeywords(it);
118
+ }
119
+ function typeAndKeywords(it, errsCount) {
120
+ if (it.opts.jtd) return schemaKeywords(it, [], false, errsCount);
121
+ const types = (0, dataType_1.getSchemaTypes)(it.schema);
122
+ schemaKeywords(it, types, !(0, dataType_1.coerceAndCheckDataType)(it, types), errsCount);
123
+ }
124
+ function checkRefsAndKeywords(it) {
125
+ const { schema, errSchemaPath, opts, self } = it;
126
+ if (schema.$ref && opts.ignoreKeywordsWithRef && (0, util_1.schemaHasRulesButRef)(schema, self.RULES)) self.logger.warn(`$ref: keywords ignored in schema at path "${errSchemaPath}"`);
127
+ }
128
+ function checkNoDefault(it) {
129
+ const { schema, opts } = it;
130
+ if (schema.default !== void 0 && opts.useDefaults && opts.strictSchema) (0, util_1.checkStrictMode)(it, "default is ignored in the schema root");
131
+ }
132
+ function updateContext(it) {
133
+ const schId = it.schema[it.opts.schemaId];
134
+ if (schId) it.baseId = (0, resolve_1.resolveUrl)(it.opts.uriResolver, it.baseId, schId);
135
+ }
136
+ function checkAsyncSchema(it) {
137
+ if (it.schema.$async && !it.schemaEnv.$async) throw new Error("async schema in sync schema");
138
+ }
139
+ function commentKeyword({ gen, schemaEnv, schema, errSchemaPath, opts }) {
140
+ const msg = schema.$comment;
141
+ if (opts.$comment === true) gen.code((0, codegen_1._)`${names_1.default.self}.logger.log(${msg})`);
142
+ else if (typeof opts.$comment == "function") {
143
+ const schemaPath = (0, codegen_1.str)`${errSchemaPath}/$comment`;
144
+ const rootName = gen.scopeValue("root", { ref: schemaEnv.root });
145
+ gen.code((0, codegen_1._)`${names_1.default.self}.opts.$comment(${msg}, ${schemaPath}, ${rootName}.schema)`);
146
+ }
147
+ }
148
+ function returnResults(it) {
149
+ const { gen, schemaEnv, validateName, ValidationError, opts } = it;
150
+ if (schemaEnv.$async) gen.if((0, codegen_1._)`${names_1.default.errors} === 0`, () => gen.return(names_1.default.data), () => gen.throw((0, codegen_1._)`new ${ValidationError}(${names_1.default.vErrors})`));
151
+ else {
152
+ gen.assign((0, codegen_1._)`${validateName}.errors`, names_1.default.vErrors);
153
+ if (opts.unevaluated) assignEvaluated(it);
154
+ gen.return((0, codegen_1._)`${names_1.default.errors} === 0`);
155
+ }
156
+ }
157
+ function assignEvaluated({ gen, evaluated, props, items }) {
158
+ if (props instanceof codegen_1.Name) gen.assign((0, codegen_1._)`${evaluated}.props`, props);
159
+ if (items instanceof codegen_1.Name) gen.assign((0, codegen_1._)`${evaluated}.items`, items);
160
+ }
161
+ function schemaKeywords(it, types, typeErrors, errsCount) {
162
+ const { gen, schema, data, allErrors, opts, self } = it;
163
+ const { RULES } = self;
164
+ if (schema.$ref && (opts.ignoreKeywordsWithRef || !(0, util_1.schemaHasRulesButRef)(schema, RULES))) {
165
+ gen.block(() => keywordCode(it, "$ref", RULES.all.$ref.definition));
166
+ return;
167
+ }
168
+ if (!opts.jtd) checkStrictTypes(it, types);
169
+ gen.block(() => {
170
+ for (const group of RULES.rules) groupKeywords(group);
171
+ groupKeywords(RULES.post);
172
+ });
173
+ function groupKeywords(group) {
174
+ if (!(0, applicability_1.shouldUseGroup)(schema, group)) return;
175
+ if (group.type) {
176
+ gen.if((0, dataType_2.checkDataType)(group.type, data, opts.strictNumbers));
177
+ iterateKeywords(it, group);
178
+ if (types.length === 1 && types[0] === group.type && typeErrors) {
179
+ gen.else();
180
+ (0, dataType_2.reportTypeError)(it);
181
+ }
182
+ gen.endIf();
183
+ } else iterateKeywords(it, group);
184
+ if (!allErrors) gen.if((0, codegen_1._)`${names_1.default.errors} === ${errsCount || 0}`);
185
+ }
186
+ }
187
+ function iterateKeywords(it, group) {
188
+ const { gen, schema, opts: { useDefaults } } = it;
189
+ if (useDefaults) (0, defaults_1.assignDefaults)(it, group.type);
190
+ gen.block(() => {
191
+ for (const rule of group.rules) if ((0, applicability_1.shouldUseRule)(schema, rule)) keywordCode(it, rule.keyword, rule.definition, group.type);
192
+ });
193
+ }
194
+ function checkStrictTypes(it, types) {
195
+ if (it.schemaEnv.meta || !it.opts.strictTypes) return;
196
+ checkContextTypes(it, types);
197
+ if (!it.opts.allowUnionTypes) checkMultipleTypes(it, types);
198
+ checkKeywordTypes(it, it.dataTypes);
199
+ }
200
+ function checkContextTypes(it, types) {
201
+ if (!types.length) return;
202
+ if (!it.dataTypes.length) {
203
+ it.dataTypes = types;
204
+ return;
205
+ }
206
+ types.forEach((t) => {
207
+ if (!includesType(it.dataTypes, t)) strictTypesError(it, `type "${t}" not allowed by context "${it.dataTypes.join(",")}"`);
208
+ });
209
+ narrowSchemaTypes(it, types);
210
+ }
211
+ function checkMultipleTypes(it, ts) {
212
+ if (ts.length > 1 && !(ts.length === 2 && ts.includes("null"))) strictTypesError(it, "use allowUnionTypes to allow union type keyword");
213
+ }
214
+ function checkKeywordTypes(it, ts) {
215
+ const rules = it.self.RULES.all;
216
+ for (const keyword in rules) {
217
+ const rule = rules[keyword];
218
+ if (typeof rule == "object" && (0, applicability_1.shouldUseRule)(it.schema, rule)) {
219
+ const { type } = rule.definition;
220
+ if (type.length && !type.some((t) => hasApplicableType(ts, t))) strictTypesError(it, `missing type "${type.join(",")}" for keyword "${keyword}"`);
221
+ }
222
+ }
223
+ }
224
+ function hasApplicableType(schTs, kwdT) {
225
+ return schTs.includes(kwdT) || kwdT === "number" && schTs.includes("integer");
226
+ }
227
+ function includesType(ts, t) {
228
+ return ts.includes(t) || t === "integer" && ts.includes("number");
229
+ }
230
+ function narrowSchemaTypes(it, withTypes) {
231
+ const ts = [];
232
+ for (const t of it.dataTypes) if (includesType(withTypes, t)) ts.push(t);
233
+ else if (withTypes.includes("integer") && t === "number") ts.push("integer");
234
+ it.dataTypes = ts;
235
+ }
236
+ function strictTypesError(it, msg) {
237
+ const schemaPath = it.schemaEnv.baseId + it.errSchemaPath;
238
+ msg += ` at "${schemaPath}" (strictTypes)`;
239
+ (0, util_1.checkStrictMode)(it, msg, it.opts.strictTypes);
240
+ }
241
+ var KeywordCxt = class {
242
+ constructor(it, def, keyword) {
243
+ (0, keyword_1.validateKeywordUsage)(it, def, keyword);
244
+ this.gen = it.gen;
245
+ this.allErrors = it.allErrors;
246
+ this.keyword = keyword;
247
+ this.data = it.data;
248
+ this.schema = it.schema[keyword];
249
+ this.$data = def.$data && it.opts.$data && this.schema && this.schema.$data;
250
+ this.schemaValue = (0, util_1.schemaRefOrVal)(it, this.schema, keyword, this.$data);
251
+ this.schemaType = def.schemaType;
252
+ this.parentSchema = it.schema;
253
+ this.params = {};
254
+ this.it = it;
255
+ this.def = def;
256
+ if (this.$data) this.schemaCode = it.gen.const("vSchema", getData(this.$data, it));
257
+ else {
258
+ this.schemaCode = this.schemaValue;
259
+ if (!(0, keyword_1.validSchemaType)(this.schema, def.schemaType, def.allowUndefined)) throw new Error(`${keyword} value must be ${JSON.stringify(def.schemaType)}`);
260
+ }
261
+ if ("code" in def ? def.trackErrors : def.errors !== false) this.errsCount = it.gen.const("_errs", names_1.default.errors);
262
+ }
263
+ result(condition, successAction, failAction) {
264
+ this.failResult((0, codegen_1.not)(condition), successAction, failAction);
265
+ }
266
+ failResult(condition, successAction, failAction) {
267
+ this.gen.if(condition);
268
+ if (failAction) failAction();
269
+ else this.error();
270
+ if (successAction) {
271
+ this.gen.else();
272
+ successAction();
273
+ if (this.allErrors) this.gen.endIf();
274
+ } else if (this.allErrors) this.gen.endIf();
275
+ else this.gen.else();
276
+ }
277
+ pass(condition, failAction) {
278
+ this.failResult((0, codegen_1.not)(condition), void 0, failAction);
279
+ }
280
+ fail(condition) {
281
+ if (condition === void 0) {
282
+ this.error();
283
+ if (!this.allErrors) this.gen.if(false);
284
+ return;
285
+ }
286
+ this.gen.if(condition);
287
+ this.error();
288
+ if (this.allErrors) this.gen.endIf();
289
+ else this.gen.else();
290
+ }
291
+ fail$data(condition) {
292
+ if (!this.$data) return this.fail(condition);
293
+ const { schemaCode } = this;
294
+ this.fail((0, codegen_1._)`${schemaCode} !== undefined && (${(0, codegen_1.or)(this.invalid$data(), condition)})`);
295
+ }
296
+ error(append, errorParams, errorPaths) {
297
+ if (errorParams) {
298
+ this.setParams(errorParams);
299
+ this._error(append, errorPaths);
300
+ this.setParams({});
301
+ return;
302
+ }
303
+ this._error(append, errorPaths);
304
+ }
305
+ _error(append, errorPaths) {
306
+ (append ? errors_1.reportExtraError : errors_1.reportError)(this, this.def.error, errorPaths);
307
+ }
308
+ $dataError() {
309
+ (0, errors_1.reportError)(this, this.def.$dataError || errors_1.keyword$DataError);
310
+ }
311
+ reset() {
312
+ if (this.errsCount === void 0) throw new Error("add \"trackErrors\" to keyword definition");
313
+ (0, errors_1.resetErrorsCount)(this.gen, this.errsCount);
314
+ }
315
+ ok(cond) {
316
+ if (!this.allErrors) this.gen.if(cond);
317
+ }
318
+ setParams(obj, assign) {
319
+ if (assign) Object.assign(this.params, obj);
320
+ else this.params = obj;
321
+ }
322
+ block$data(valid, codeBlock, $dataValid = codegen_1.nil) {
323
+ this.gen.block(() => {
324
+ this.check$data(valid, $dataValid);
325
+ codeBlock();
326
+ });
327
+ }
328
+ check$data(valid = codegen_1.nil, $dataValid = codegen_1.nil) {
329
+ if (!this.$data) return;
330
+ const { gen, schemaCode, schemaType, def } = this;
331
+ gen.if((0, codegen_1.or)((0, codegen_1._)`${schemaCode} === undefined`, $dataValid));
332
+ if (valid !== codegen_1.nil) gen.assign(valid, true);
333
+ if (schemaType.length || def.validateSchema) {
334
+ gen.elseIf(this.invalid$data());
335
+ this.$dataError();
336
+ if (valid !== codegen_1.nil) gen.assign(valid, false);
337
+ }
338
+ gen.else();
339
+ }
340
+ invalid$data() {
341
+ const { gen, schemaCode, schemaType, def, it } = this;
342
+ return (0, codegen_1.or)(wrong$DataType(), invalid$DataSchema());
343
+ function wrong$DataType() {
344
+ if (schemaType.length) {
345
+ /* istanbul ignore if */
346
+ if (!(schemaCode instanceof codegen_1.Name)) throw new Error("ajv implementation error");
347
+ const st = Array.isArray(schemaType) ? schemaType : [schemaType];
348
+ return (0, codegen_1._)`${(0, dataType_2.checkDataTypes)(st, schemaCode, it.opts.strictNumbers, dataType_2.DataType.Wrong)}`;
349
+ }
350
+ return codegen_1.nil;
351
+ }
352
+ function invalid$DataSchema() {
353
+ if (def.validateSchema) {
354
+ const validateSchemaRef = gen.scopeValue("validate$data", { ref: def.validateSchema });
355
+ return (0, codegen_1._)`!${validateSchemaRef}(${schemaCode})`;
356
+ }
357
+ return codegen_1.nil;
358
+ }
359
+ }
360
+ subschema(appl, valid) {
361
+ const subschema = (0, subschema_1.getSubschema)(this.it, appl);
362
+ (0, subschema_1.extendSubschemaData)(subschema, this.it, appl);
363
+ (0, subschema_1.extendSubschemaMode)(subschema, appl);
364
+ const nextContext = {
365
+ ...this.it,
366
+ ...subschema,
367
+ items: void 0,
368
+ props: void 0
369
+ };
370
+ subschemaCode(nextContext, valid);
371
+ return nextContext;
372
+ }
373
+ mergeEvaluated(schemaCxt, toName) {
374
+ const { it, gen } = this;
375
+ if (!it.opts.unevaluated) return;
376
+ if (it.props !== true && schemaCxt.props !== void 0) it.props = util_1.mergeEvaluated.props(gen, schemaCxt.props, it.props, toName);
377
+ if (it.items !== true && schemaCxt.items !== void 0) it.items = util_1.mergeEvaluated.items(gen, schemaCxt.items, it.items, toName);
378
+ }
379
+ mergeValidEvaluated(schemaCxt, valid) {
380
+ const { it, gen } = this;
381
+ if (it.opts.unevaluated && (it.props !== true || it.items !== true)) {
382
+ gen.if(valid, () => this.mergeEvaluated(schemaCxt, codegen_1.Name));
383
+ return true;
384
+ }
385
+ }
386
+ };
387
+ exports.KeywordCxt = KeywordCxt;
388
+ function keywordCode(it, keyword, def, ruleType) {
389
+ const cxt = new KeywordCxt(it, def, keyword);
390
+ if ("code" in def) def.code(cxt, ruleType);
391
+ else if (cxt.$data && def.validate) (0, keyword_1.funcKeywordCode)(cxt, def);
392
+ else if ("macro" in def) (0, keyword_1.macroKeywordCode)(cxt, def);
393
+ else if (def.compile || def.validate) (0, keyword_1.funcKeywordCode)(cxt, def);
394
+ }
395
+ const JSON_POINTER = /^\/(?:[^~]|~0|~1)*$/;
396
+ const RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
397
+ function getData($data, { dataLevel, dataNames, dataPathArr }) {
398
+ let jsonPointer;
399
+ let data;
400
+ if ($data === "") return names_1.default.rootData;
401
+ if ($data[0] === "/") {
402
+ if (!JSON_POINTER.test($data)) throw new Error(`Invalid JSON-pointer: ${$data}`);
403
+ jsonPointer = $data;
404
+ data = names_1.default.rootData;
405
+ } else {
406
+ const matches = RELATIVE_JSON_POINTER.exec($data);
407
+ if (!matches) throw new Error(`Invalid JSON-pointer: ${$data}`);
408
+ const up = +matches[1];
409
+ jsonPointer = matches[2];
410
+ if (jsonPointer === "#") {
411
+ if (up >= dataLevel) throw new Error(errorMsg("property/index", up));
412
+ return dataPathArr[dataLevel - up];
413
+ }
414
+ if (up > dataLevel) throw new Error(errorMsg("data", up));
415
+ data = dataNames[dataLevel - up];
416
+ if (!jsonPointer) return data;
417
+ }
418
+ let expr = data;
419
+ const segments = jsonPointer.split("/");
420
+ for (const segment of segments) if (segment) {
421
+ data = (0, codegen_1._)`${data}${(0, codegen_1.getProperty)((0, util_1.unescapeJsonPointer)(segment))}`;
422
+ expr = (0, codegen_1._)`${expr} && ${data}`;
423
+ }
424
+ return expr;
425
+ function errorMsg(pointerType, up) {
426
+ return `Cannot access ${pointerType} ${up} levels up, current level is ${dataLevel}`;
427
+ }
428
+ }
429
+ exports.getData = getData;
430
+ }));
431
+ //#endregion
432
+ export default require_validate();
433
+ export { require_validate };
434
+
435
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2FqdkA4LjIwLjAvbm9kZV9tb2R1bGVzL2Fqdi9kaXN0L2NvbXBpbGUvdmFsaWRhdGUvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdldERhdGEgPSBleHBvcnRzLktleXdvcmRDeHQgPSBleHBvcnRzLnZhbGlkYXRlRnVuY3Rpb25Db2RlID0gdm9pZCAwO1xuY29uc3QgYm9vbFNjaGVtYV8xID0gcmVxdWlyZShcIi4vYm9vbFNjaGVtYVwiKTtcbmNvbnN0IGRhdGFUeXBlXzEgPSByZXF1aXJlKFwiLi9kYXRhVHlwZVwiKTtcbmNvbnN0IGFwcGxpY2FiaWxpdHlfMSA9IHJlcXVpcmUoXCIuL2FwcGxpY2FiaWxpdHlcIik7XG5jb25zdCBkYXRhVHlwZV8yID0gcmVxdWlyZShcIi4vZGF0YVR5cGVcIik7XG5jb25zdCBkZWZhdWx0c18xID0gcmVxdWlyZShcIi4vZGVmYXVsdHNcIik7XG5jb25zdCBrZXl3b3JkXzEgPSByZXF1aXJlKFwiLi9rZXl3b3JkXCIpO1xuY29uc3Qgc3Vic2NoZW1hXzEgPSByZXF1aXJlKFwiLi9zdWJzY2hlbWFcIik7XG5jb25zdCBjb2RlZ2VuXzEgPSByZXF1aXJlKFwiLi4vY29kZWdlblwiKTtcbmNvbnN0IG5hbWVzXzEgPSByZXF1aXJlKFwiLi4vbmFtZXNcIik7XG5jb25zdCByZXNvbHZlXzEgPSByZXF1aXJlKFwiLi4vcmVzb2x2ZVwiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCIuLi91dGlsXCIpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JzXCIpO1xuLy8gc2NoZW1hIGNvbXBpbGF0aW9uIC0gZ2VuZXJhdGVzIHZhbGlkYXRpb24gZnVuY3Rpb24sIHN1YnNjaGVtYUNvZGUgKGJlbG93KSBpcyB1c2VkIGZvciBzdWJzY2hlbWFzXG5mdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29kZShpdCkge1xuICAgIGlmIChpc1NjaGVtYU9iaihpdCkpIHtcbiAgICAgICAgY2hlY2tLZXl3b3JkcyhpdCk7XG4gICAgICAgIGlmIChzY2hlbWFDeHRIYXNSdWxlcyhpdCkpIHtcbiAgICAgICAgICAgIHRvcFNjaGVtYU9iakNvZGUoaXQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhbGlkYXRlRnVuY3Rpb24oaXQsICgpID0+ICgwLCBib29sU2NoZW1hXzEudG9wQm9vbE9yRW1wdHlTY2hlbWEpKGl0KSk7XG59XG5leHBvcnRzLnZhbGlkYXRlRnVuY3Rpb25Db2RlID0gdmFsaWRhdGVGdW5jdGlvbkNvZGU7XG5mdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uKHsgZ2VuLCB2YWxpZGF0ZU5hbWUsIHNjaGVtYSwgc2NoZW1hRW52LCBvcHRzIH0sIGJvZHkpIHtcbiAgICBpZiAob3B0cy5jb2RlLmVzNSkge1xuICAgICAgICBnZW4uZnVuYyh2YWxpZGF0ZU5hbWUsICgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LmRhdGF9LCAke25hbWVzXzEuZGVmYXVsdC52YWxDeHR9YCwgc2NoZW1hRW52LiRhc3luYywgKCkgPT4ge1xuICAgICAgICAgICAgZ2VuLmNvZGUoKDAsIGNvZGVnZW5fMS5fKSBgXCJ1c2Ugc3RyaWN0XCI7ICR7ZnVuY1NvdXJjZVVybChzY2hlbWEsIG9wdHMpfWApO1xuICAgICAgICAgICAgZGVzdHJ1Y3R1cmVWYWxDeHRFUzUoZ2VuLCBvcHRzKTtcbiAgICAgICAgICAgIGdlbi5jb2RlKGJvZHkpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdlbi5mdW5jKHZhbGlkYXRlTmFtZSwgKDAsIGNvZGVnZW5fMS5fKSBgJHtuYW1lc18xLmRlZmF1bHQuZGF0YX0sICR7ZGVzdHJ1Y3R1cmVWYWxDeHQob3B0cyl9YCwgc2NoZW1hRW52LiRhc3luYywgKCkgPT4gZ2VuLmNvZGUoZnVuY1NvdXJjZVVybChzY2hlbWEsIG9wdHMpKS5jb2RlKGJvZHkpKTtcbiAgICB9XG59XG5mdW5jdGlvbiBkZXN0cnVjdHVyZVZhbEN4dChvcHRzKSB7XG4gICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXykgYHske25hbWVzXzEuZGVmYXVsdC5pbnN0YW5jZVBhdGh9PVwiXCIsICR7bmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGF9LCAke25hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9LCAke25hbWVzXzEuZGVmYXVsdC5yb290RGF0YX09JHtuYW1lc18xLmRlZmF1bHQuZGF0YX0ke29wdHMuZHluYW1pY1JlZiA/ICgwLCBjb2RlZ2VuXzEuXykgYCwgJHtuYW1lc18xLmRlZmF1bHQuZHluYW1pY0FuY2hvcnN9PXt9YCA6IGNvZGVnZW5fMS5uaWx9fT17fWA7XG59XG5mdW5jdGlvbiBkZXN0cnVjdHVyZVZhbEN4dEVTNShnZW4sIG9wdHMpIHtcbiAgICBnZW4uaWYobmFtZXNfMS5kZWZhdWx0LnZhbEN4dCwgKCkgPT4ge1xuICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LnZhbEN4dH0uJHtuYW1lc18xLmRlZmF1bHQuaW5zdGFuY2VQYXRofWApO1xuICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhLCAoMCwgY29kZWdlbl8xLl8pIGAke25hbWVzXzEuZGVmYXVsdC52YWxDeHR9LiR7bmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGF9YCk7XG4gICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eSwgKDAsIGNvZGVnZW5fMS5fKSBgJHtuYW1lc18xLmRlZmF1bHQudmFsQ3h0fS4ke25hbWVzXzEuZGVmYXVsdC5wYXJlbnREYXRhUHJvcGVydHl9YCk7XG4gICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnJvb3REYXRhLCAoMCwgY29kZWdlbl8xLl8pIGAke25hbWVzXzEuZGVmYXVsdC52YWxDeHR9LiR7bmFtZXNfMS5kZWZhdWx0LnJvb3REYXRhfWApO1xuICAgICAgICBpZiAob3B0cy5keW5hbWljUmVmKVxuICAgICAgICAgICAgZ2VuLnZhcihuYW1lc18xLmRlZmF1bHQuZHluYW1pY0FuY2hvcnMsICgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LnZhbEN4dH0uJHtuYW1lc18xLmRlZmF1bHQuZHluYW1pY0FuY2hvcnN9YCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5pbnN0YW5jZVBhdGgsICgwLCBjb2RlZ2VuXzEuXykgYFwiXCJgKTtcbiAgICAgICAgZ2VuLnZhcihuYW1lc18xLmRlZmF1bHQucGFyZW50RGF0YSwgKDAsIGNvZGVnZW5fMS5fKSBgdW5kZWZpbmVkYCk7XG4gICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnBhcmVudERhdGFQcm9wZXJ0eSwgKDAsIGNvZGVnZW5fMS5fKSBgdW5kZWZpbmVkYCk7XG4gICAgICAgIGdlbi52YXIobmFtZXNfMS5kZWZhdWx0LnJvb3REYXRhLCBuYW1lc18xLmRlZmF1bHQuZGF0YSk7XG4gICAgICAgIGlmIChvcHRzLmR5bmFtaWNSZWYpXG4gICAgICAgICAgICBnZW4udmFyKG5hbWVzXzEuZGVmYXVsdC5keW5hbWljQW5jaG9ycywgKDAsIGNvZGVnZW5fMS5fKSBge31gKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHRvcFNjaGVtYU9iakNvZGUoaXQpIHtcbiAgICBjb25zdCB7IHNjaGVtYSwgb3B0cywgZ2VuIH0gPSBpdDtcbiAgICB2YWxpZGF0ZUZ1bmN0aW9uKGl0LCAoKSA9PiB7XG4gICAgICAgIGlmIChvcHRzLiRjb21tZW50ICYmIHNjaGVtYS4kY29tbWVudClcbiAgICAgICAgICAgIGNvbW1lbnRLZXl3b3JkKGl0KTtcbiAgICAgICAgY2hlY2tOb0RlZmF1bHQoaXQpO1xuICAgICAgICBnZW4ubGV0KG5hbWVzXzEuZGVmYXVsdC52RXJyb3JzLCBudWxsKTtcbiAgICAgICAgZ2VuLmxldChuYW1lc18xLmRlZmF1bHQuZXJyb3JzLCAwKTtcbiAgICAgICAgaWYgKG9wdHMudW5ldmFsdWF0ZWQpXG4gICAgICAgICAgICByZXNldEV2YWx1YXRlZChpdCk7XG4gICAgICAgIHR5cGVBbmRLZXl3b3JkcyhpdCk7XG4gICAgICAgIHJldHVyblJlc3VsdHMoaXQpO1xuICAgIH0pO1xuICAgIHJldHVybjtcbn1cbmZ1bmN0aW9uIHJlc2V0RXZhbHVhdGVkKGl0KSB7XG4gICAgLy8gVE9ETyBtYXliZSBzb21lIGhvb2sgdG8gZXhlY3V0ZSBpdCBpbiB0aGUgZW5kIHRvIGNoZWNrIHdoZXRoZXIgcHJvcHMvaXRlbXMgYXJlIE5hbWUsIGFzIGluIGFzc2lnbkV2YWx1YXRlZFxuICAgIGNvbnN0IHsgZ2VuLCB2YWxpZGF0ZU5hbWUgfSA9IGl0O1xuICAgIGl0LmV2YWx1YXRlZCA9IGdlbi5jb25zdChcImV2YWx1YXRlZFwiLCAoMCwgY29kZWdlbl8xLl8pIGAke3ZhbGlkYXRlTmFtZX0uZXZhbHVhdGVkYCk7XG4gICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXykgYCR7aXQuZXZhbHVhdGVkfS5keW5hbWljUHJvcHNgLCAoKSA9PiBnZW4uYXNzaWduKCgwLCBjb2RlZ2VuXzEuXykgYCR7aXQuZXZhbHVhdGVkfS5wcm9wc2AsICgwLCBjb2RlZ2VuXzEuXykgYHVuZGVmaW5lZGApKTtcbiAgICBnZW4uaWYoKDAsIGNvZGVnZW5fMS5fKSBgJHtpdC5ldmFsdWF0ZWR9LmR5bmFtaWNJdGVtc2AsICgpID0+IGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKSBgJHtpdC5ldmFsdWF0ZWR9Lml0ZW1zYCwgKDAsIGNvZGVnZW5fMS5fKSBgdW5kZWZpbmVkYCkpO1xufVxuZnVuY3Rpb24gZnVuY1NvdXJjZVVybChzY2hlbWEsIG9wdHMpIHtcbiAgICBjb25zdCBzY2hJZCA9IHR5cGVvZiBzY2hlbWEgPT0gXCJvYmplY3RcIiAmJiBzY2hlbWFbb3B0cy5zY2hlbWFJZF07XG4gICAgcmV0dXJuIHNjaElkICYmIChvcHRzLmNvZGUuc291cmNlIHx8IG9wdHMuY29kZS5wcm9jZXNzKSA/ICgwLCBjb2RlZ2VuXzEuXykgYC8qIyBzb3VyY2VVUkw9JHtzY2hJZH0gKi9gIDogY29kZWdlbl8xLm5pbDtcbn1cbi8vIHNjaGVtYSBjb21waWxhdGlvbiAtIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSB0byBnZW5lcmF0ZSBjb2RlIGZvciBzdWItc2NoZW1hc1xuZnVuY3Rpb24gc3Vic2NoZW1hQ29kZShpdCwgdmFsaWQpIHtcbiAgICBpZiAoaXNTY2hlbWFPYmooaXQpKSB7XG4gICAgICAgIGNoZWNrS2V5d29yZHMoaXQpO1xuICAgICAgICBpZiAoc2NoZW1hQ3h0SGFzUnVsZXMoaXQpKSB7XG4gICAgICAgICAgICBzdWJTY2hlbWFPYmpDb2RlKGl0LCB2YWxpZCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgKDAsIGJvb2xTY2hlbWFfMS5ib29sT3JFbXB0eVNjaGVtYSkoaXQsIHZhbGlkKTtcbn1cbmZ1bmN0aW9uIHNjaGVtYUN4dEhhc1J1bGVzKHsgc2NoZW1hLCBzZWxmIH0pIHtcbiAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSBcImJvb2xlYW5cIilcbiAgICAgICAgcmV0dXJuICFzY2hlbWE7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hKVxuICAgICAgICBpZiAoc2VsZi5SVUxFUy5hbGxba2V5XSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGlzU2NoZW1hT2JqKGl0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpdC5zY2hlbWEgIT0gXCJib29sZWFuXCI7XG59XG5mdW5jdGlvbiBzdWJTY2hlbWFPYmpDb2RlKGl0LCB2YWxpZCkge1xuICAgIGNvbnN0IHsgc2NoZW1hLCBnZW4sIG9wdHMgfSA9IGl0O1xuICAgIGlmIChvcHRzLiRjb21tZW50ICYmIHNjaGVtYS4kY29tbWVudClcbiAgICAgICAgY29tbWVudEtleXdvcmQoaXQpO1xuICAgIHVwZGF0ZUNvbnRleHQoaXQpO1xuICAgIGNoZWNrQXN5bmNTY2hlbWEoaXQpO1xuICAgIGNvbnN0IGVycnNDb3VudCA9IGdlbi5jb25zdChcIl9lcnJzXCIsIG5hbWVzXzEuZGVmYXVsdC5lcnJvcnMpO1xuICAgIHR5cGVBbmRLZXl3b3JkcyhpdCwgZXJyc0NvdW50KTtcbiAgICAvLyBUT0RPIHZhclxuICAgIGdlbi52YXIodmFsaWQsICgwLCBjb2RlZ2VuXzEuXykgYCR7ZXJyc0NvdW50fSA9PT0gJHtuYW1lc18xLmRlZmF1bHQuZXJyb3JzfWApO1xufVxuZnVuY3Rpb24gY2hlY2tLZXl3b3JkcyhpdCkge1xuICAgICgwLCB1dGlsXzEuY2hlY2tVbmtub3duUnVsZXMpKGl0KTtcbiAgICBjaGVja1JlZnNBbmRLZXl3b3JkcyhpdCk7XG59XG5mdW5jdGlvbiB0eXBlQW5kS2V5d29yZHMoaXQsIGVycnNDb3VudCkge1xuICAgIGlmIChpdC5vcHRzLmp0ZClcbiAgICAgICAgcmV0dXJuIHNjaGVtYUtleXdvcmRzKGl0LCBbXSwgZmFsc2UsIGVycnNDb3VudCk7XG4gICAgY29uc3QgdHlwZXMgPSAoMCwgZGF0YVR5cGVfMS5nZXRTY2hlbWFUeXBlcykoaXQuc2NoZW1hKTtcbiAgICBjb25zdCBjaGVja2VkVHlwZXMgPSAoMCwgZGF0YVR5cGVfMS5jb2VyY2VBbmRDaGVja0RhdGFUeXBlKShpdCwgdHlwZXMpO1xuICAgIHNjaGVtYUtleXdvcmRzKGl0LCB0eXBlcywgIWNoZWNrZWRUeXBlcywgZXJyc0NvdW50KTtcbn1cbmZ1bmN0aW9uIGNoZWNrUmVmc0FuZEtleXdvcmRzKGl0KSB7XG4gICAgY29uc3QgeyBzY2hlbWEsIGVyclNjaGVtYVBhdGgsIG9wdHMsIHNlbGYgfSA9IGl0O1xuICAgIGlmIChzY2hlbWEuJHJlZiAmJiBvcHRzLmlnbm9yZUtleXdvcmRzV2l0aFJlZiAmJiAoMCwgdXRpbF8xLnNjaGVtYUhhc1J1bGVzQnV0UmVmKShzY2hlbWEsIHNlbGYuUlVMRVMpKSB7XG4gICAgICAgIHNlbGYubG9nZ2VyLndhcm4oYCRyZWY6IGtleXdvcmRzIGlnbm9yZWQgaW4gc2NoZW1hIGF0IHBhdGggXCIke2VyclNjaGVtYVBhdGh9XCJgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBjaGVja05vRGVmYXVsdChpdCkge1xuICAgIGNvbnN0IHsgc2NoZW1hLCBvcHRzIH0gPSBpdDtcbiAgICBpZiAoc2NoZW1hLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnVzZURlZmF1bHRzICYmIG9wdHMuc3RyaWN0U2NoZW1hKSB7XG4gICAgICAgICgwLCB1dGlsXzEuY2hlY2tTdHJpY3RNb2RlKShpdCwgXCJkZWZhdWx0IGlzIGlnbm9yZWQgaW4gdGhlIHNjaGVtYSByb290XCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHVwZGF0ZUNvbnRleHQoaXQpIHtcbiAgICBjb25zdCBzY2hJZCA9IGl0LnNjaGVtYVtpdC5vcHRzLnNjaGVtYUlkXTtcbiAgICBpZiAoc2NoSWQpXG4gICAgICAgIGl0LmJhc2VJZCA9ICgwLCByZXNvbHZlXzEucmVzb2x2ZVVybCkoaXQub3B0cy51cmlSZXNvbHZlciwgaXQuYmFzZUlkLCBzY2hJZCk7XG59XG5mdW5jdGlvbiBjaGVja0FzeW5jU2NoZW1hKGl0KSB7XG4gICAgaWYgKGl0LnNjaGVtYS4kYXN5bmMgJiYgIWl0LnNjaGVtYUVudi4kYXN5bmMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImFzeW5jIHNjaGVtYSBpbiBzeW5jIHNjaGVtYVwiKTtcbn1cbmZ1bmN0aW9uIGNvbW1lbnRLZXl3b3JkKHsgZ2VuLCBzY2hlbWFFbnYsIHNjaGVtYSwgZXJyU2NoZW1hUGF0aCwgb3B0cyB9KSB7XG4gICAgY29uc3QgbXNnID0gc2NoZW1hLiRjb21tZW50O1xuICAgIGlmIChvcHRzLiRjb21tZW50ID09PSB0cnVlKSB7XG4gICAgICAgIGdlbi5jb2RlKCgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LnNlbGZ9LmxvZ2dlci5sb2coJHttc2d9KWApO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygb3B0cy4kY29tbWVudCA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUGF0aCA9ICgwLCBjb2RlZ2VuXzEuc3RyKSBgJHtlcnJTY2hlbWFQYXRofS8kY29tbWVudGA7XG4gICAgICAgIGNvbnN0IHJvb3ROYW1lID0gZ2VuLnNjb3BlVmFsdWUoXCJyb290XCIsIHsgcmVmOiBzY2hlbWFFbnYucm9vdCB9KTtcbiAgICAgICAgZ2VuLmNvZGUoKDAsIGNvZGVnZW5fMS5fKSBgJHtuYW1lc18xLmRlZmF1bHQuc2VsZn0ub3B0cy4kY29tbWVudCgke21zZ30sICR7c2NoZW1hUGF0aH0sICR7cm9vdE5hbWV9LnNjaGVtYSlgKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZXR1cm5SZXN1bHRzKGl0KSB7XG4gICAgY29uc3QgeyBnZW4sIHNjaGVtYUVudiwgdmFsaWRhdGVOYW1lLCBWYWxpZGF0aW9uRXJyb3IsIG9wdHMgfSA9IGl0O1xuICAgIGlmIChzY2hlbWFFbnYuJGFzeW5jKSB7XG4gICAgICAgIC8vIFRPRE8gYXNzaWduIHVuZXZhbHVhdGVkXG4gICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLl8pIGAke25hbWVzXzEuZGVmYXVsdC5lcnJvcnN9ID09PSAwYCwgKCkgPT4gZ2VuLnJldHVybihuYW1lc18xLmRlZmF1bHQuZGF0YSksICgpID0+IGdlbi50aHJvdygoMCwgY29kZWdlbl8xLl8pIGBuZXcgJHtWYWxpZGF0aW9uRXJyb3J9KCR7bmFtZXNfMS5kZWZhdWx0LnZFcnJvcnN9KWApKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKSBgJHt2YWxpZGF0ZU5hbWV9LmVycm9yc2AsIG5hbWVzXzEuZGVmYXVsdC52RXJyb3JzKTtcbiAgICAgICAgaWYgKG9wdHMudW5ldmFsdWF0ZWQpXG4gICAgICAgICAgICBhc3NpZ25FdmFsdWF0ZWQoaXQpO1xuICAgICAgICBnZW4ucmV0dXJuKCgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LmVycm9yc30gPT09IDBgKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhc3NpZ25FdmFsdWF0ZWQoeyBnZW4sIGV2YWx1YXRlZCwgcHJvcHMsIGl0ZW1zIH0pIHtcbiAgICBpZiAocHJvcHMgaW5zdGFuY2VvZiBjb2RlZ2VuXzEuTmFtZSlcbiAgICAgICAgZ2VuLmFzc2lnbigoMCwgY29kZWdlbl8xLl8pIGAke2V2YWx1YXRlZH0ucHJvcHNgLCBwcm9wcyk7XG4gICAgaWYgKGl0ZW1zIGluc3RhbmNlb2YgY29kZWdlbl8xLk5hbWUpXG4gICAgICAgIGdlbi5hc3NpZ24oKDAsIGNvZGVnZW5fMS5fKSBgJHtldmFsdWF0ZWR9Lml0ZW1zYCwgaXRlbXMpO1xufVxuZnVuY3Rpb24gc2NoZW1hS2V5d29yZHMoaXQsIHR5cGVzLCB0eXBlRXJyb3JzLCBlcnJzQ291bnQpIHtcbiAgICBjb25zdCB7IGdlbiwgc2NoZW1hLCBkYXRhLCBhbGxFcnJvcnMsIG9wdHMsIHNlbGYgfSA9IGl0O1xuICAgIGNvbnN0IHsgUlVMRVMgfSA9IHNlbGY7XG4gICAgaWYgKHNjaGVtYS4kcmVmICYmIChvcHRzLmlnbm9yZUtleXdvcmRzV2l0aFJlZiB8fCAhKDAsIHV0aWxfMS5zY2hlbWFIYXNSdWxlc0J1dFJlZikoc2NoZW1hLCBSVUxFUykpKSB7XG4gICAgICAgIGdlbi5ibG9jaygoKSA9PiBrZXl3b3JkQ29kZShpdCwgXCIkcmVmXCIsIFJVTEVTLmFsbC4kcmVmLmRlZmluaXRpb24pKTsgLy8gVE9ETyB0eXBlY2FzdFxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghb3B0cy5qdGQpXG4gICAgICAgIGNoZWNrU3RyaWN0VHlwZXMoaXQsIHR5cGVzKTtcbiAgICBnZW4uYmxvY2soKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIFJVTEVTLnJ1bGVzKVxuICAgICAgICAgICAgZ3JvdXBLZXl3b3Jkcyhncm91cCk7XG4gICAgICAgIGdyb3VwS2V5d29yZHMoUlVMRVMucG9zdCk7XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gZ3JvdXBLZXl3b3Jkcyhncm91cCkge1xuICAgICAgICBpZiAoISgwLCBhcHBsaWNhYmlsaXR5XzEuc2hvdWxkVXNlR3JvdXApKHNjaGVtYSwgZ3JvdXApKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoZ3JvdXAudHlwZSkge1xuICAgICAgICAgICAgZ2VuLmlmKCgwLCBkYXRhVHlwZV8yLmNoZWNrRGF0YVR5cGUpKGdyb3VwLnR5cGUsIGRhdGEsIG9wdHMuc3RyaWN0TnVtYmVycykpO1xuICAgICAgICAgICAgaXRlcmF0ZUtleXdvcmRzKGl0LCBncm91cCk7XG4gICAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09PSAxICYmIHR5cGVzWzBdID09PSBncm91cC50eXBlICYmIHR5cGVFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBnZW4uZWxzZSgpO1xuICAgICAgICAgICAgICAgICgwLCBkYXRhVHlwZV8yLnJlcG9ydFR5cGVFcnJvcikoaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ2VuLmVuZElmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRlS2V5d29yZHMoaXQsIGdyb3VwKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIG1ha2UgaXQgXCJva1wiIGNhbGw/XG4gICAgICAgIGlmICghYWxsRXJyb3JzKVxuICAgICAgICAgICAgZ2VuLmlmKCgwLCBjb2RlZ2VuXzEuXykgYCR7bmFtZXNfMS5kZWZhdWx0LmVycm9yc30gPT09ICR7ZXJyc0NvdW50IHx8IDB9YCk7XG4gICAgfVxufVxuZnVuY3Rpb24gaXRlcmF0ZUtleXdvcmRzKGl0LCBncm91cCkge1xuICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWEsIG9wdHM6IHsgdXNlRGVmYXVsdHMgfSwgfSA9IGl0O1xuICAgIGlmICh1c2VEZWZhdWx0cylcbiAgICAgICAgKDAsIGRlZmF1bHRzXzEuYXNzaWduRGVmYXVsdHMpKGl0LCBncm91cC50eXBlKTtcbiAgICBnZW4uYmxvY2soKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgZ3JvdXAucnVsZXMpIHtcbiAgICAgICAgICAgIGlmICgoMCwgYXBwbGljYWJpbGl0eV8xLnNob3VsZFVzZVJ1bGUpKHNjaGVtYSwgcnVsZSkpIHtcbiAgICAgICAgICAgICAgICBrZXl3b3JkQ29kZShpdCwgcnVsZS5rZXl3b3JkLCBydWxlLmRlZmluaXRpb24sIGdyb3VwLnR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5mdW5jdGlvbiBjaGVja1N0cmljdFR5cGVzKGl0LCB0eXBlcykge1xuICAgIGlmIChpdC5zY2hlbWFFbnYubWV0YSB8fCAhaXQub3B0cy5zdHJpY3RUeXBlcylcbiAgICAgICAgcmV0dXJuO1xuICAgIGNoZWNrQ29udGV4dFR5cGVzKGl0LCB0eXBlcyk7XG4gICAgaWYgKCFpdC5vcHRzLmFsbG93VW5pb25UeXBlcylcbiAgICAgICAgY2hlY2tNdWx0aXBsZVR5cGVzKGl0LCB0eXBlcyk7XG4gICAgY2hlY2tLZXl3b3JkVHlwZXMoaXQsIGl0LmRhdGFUeXBlcyk7XG59XG5mdW5jdGlvbiBjaGVja0NvbnRleHRUeXBlcyhpdCwgdHlwZXMpIHtcbiAgICBpZiAoIXR5cGVzLmxlbmd0aClcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICghaXQuZGF0YVR5cGVzLmxlbmd0aCkge1xuICAgICAgICBpdC5kYXRhVHlwZXMgPSB0eXBlcztcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0eXBlcy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgIGlmICghaW5jbHVkZXNUeXBlKGl0LmRhdGFUeXBlcywgdCkpIHtcbiAgICAgICAgICAgIHN0cmljdFR5cGVzRXJyb3IoaXQsIGB0eXBlIFwiJHt0fVwiIG5vdCBhbGxvd2VkIGJ5IGNvbnRleHQgXCIke2l0LmRhdGFUeXBlcy5qb2luKFwiLFwiKX1cImApO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgbmFycm93U2NoZW1hVHlwZXMoaXQsIHR5cGVzKTtcbn1cbmZ1bmN0aW9uIGNoZWNrTXVsdGlwbGVUeXBlcyhpdCwgdHMpIHtcbiAgICBpZiAodHMubGVuZ3RoID4gMSAmJiAhKHRzLmxlbmd0aCA9PT0gMiAmJiB0cy5pbmNsdWRlcyhcIm51bGxcIikpKSB7XG4gICAgICAgIHN0cmljdFR5cGVzRXJyb3IoaXQsIFwidXNlIGFsbG93VW5pb25UeXBlcyB0byBhbGxvdyB1bmlvbiB0eXBlIGtleXdvcmRcIik7XG4gICAgfVxufVxuZnVuY3Rpb24gY2hlY2tLZXl3b3JkVHlwZXMoaXQsIHRzKSB7XG4gICAgY29uc3QgcnVsZXMgPSBpdC5zZWxmLlJVTEVTLmFsbDtcbiAgICBmb3IgKGNvbnN0IGtleXdvcmQgaW4gcnVsZXMpIHtcbiAgICAgICAgY29uc3QgcnVsZSA9IHJ1bGVzW2tleXdvcmRdO1xuICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT0gXCJvYmplY3RcIiAmJiAoMCwgYXBwbGljYWJpbGl0eV8xLnNob3VsZFVzZVJ1bGUpKGl0LnNjaGVtYSwgcnVsZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHlwZSB9ID0gcnVsZS5kZWZpbml0aW9uO1xuICAgICAgICAgICAgaWYgKHR5cGUubGVuZ3RoICYmICF0eXBlLnNvbWUoKHQpID0+IGhhc0FwcGxpY2FibGVUeXBlKHRzLCB0KSkpIHtcbiAgICAgICAgICAgICAgICBzdHJpY3RUeXBlc0Vycm9yKGl0LCBgbWlzc2luZyB0eXBlIFwiJHt0eXBlLmpvaW4oXCIsXCIpfVwiIGZvciBrZXl3b3JkIFwiJHtrZXl3b3JkfVwiYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBoYXNBcHBsaWNhYmxlVHlwZShzY2hUcywga3dkVCkge1xuICAgIHJldHVybiBzY2hUcy5pbmNsdWRlcyhrd2RUKSB8fCAoa3dkVCA9PT0gXCJudW1iZXJcIiAmJiBzY2hUcy5pbmNsdWRlcyhcImludGVnZXJcIikpO1xufVxuZnVuY3Rpb24gaW5jbHVkZXNUeXBlKHRzLCB0KSB7XG4gICAgcmV0dXJuIHRzLmluY2x1ZGVzKHQpIHx8ICh0ID09PSBcImludGVnZXJcIiAmJiB0cy5pbmNsdWRlcyhcIm51bWJlclwiKSk7XG59XG5mdW5jdGlvbiBuYXJyb3dTY2hlbWFUeXBlcyhpdCwgd2l0aFR5cGVzKSB7XG4gICAgY29uc3QgdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgaXQuZGF0YVR5cGVzKSB7XG4gICAgICAgIGlmIChpbmNsdWRlc1R5cGUod2l0aFR5cGVzLCB0KSlcbiAgICAgICAgICAgIHRzLnB1c2godCk7XG4gICAgICAgIGVsc2UgaWYgKHdpdGhUeXBlcy5pbmNsdWRlcyhcImludGVnZXJcIikgJiYgdCA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgIHRzLnB1c2goXCJpbnRlZ2VyXCIpO1xuICAgIH1cbiAgICBpdC5kYXRhVHlwZXMgPSB0cztcbn1cbmZ1bmN0aW9uIHN0cmljdFR5cGVzRXJyb3IoaXQsIG1zZykge1xuICAgIGNvbnN0IHNjaGVtYVBhdGggPSBpdC5zY2hlbWFFbnYuYmFzZUlkICsgaXQuZXJyU2NoZW1hUGF0aDtcbiAgICBtc2cgKz0gYCBhdCBcIiR7c2NoZW1hUGF0aH1cIiAoc3RyaWN0VHlwZXMpYDtcbiAgICAoMCwgdXRpbF8xLmNoZWNrU3RyaWN0TW9kZSkoaXQsIG1zZywgaXQub3B0cy5zdHJpY3RUeXBlcyk7XG59XG5jbGFzcyBLZXl3b3JkQ3h0IHtcbiAgICBjb25zdHJ1Y3RvcihpdCwgZGVmLCBrZXl3b3JkKSB7XG4gICAgICAgICgwLCBrZXl3b3JkXzEudmFsaWRhdGVLZXl3b3JkVXNhZ2UpKGl0LCBkZWYsIGtleXdvcmQpO1xuICAgICAgICB0aGlzLmdlbiA9IGl0LmdlbjtcbiAgICAgICAgdGhpcy5hbGxFcnJvcnMgPSBpdC5hbGxFcnJvcnM7XG4gICAgICAgIHRoaXMua2V5d29yZCA9IGtleXdvcmQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IGl0LmRhdGE7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gaXQuc2NoZW1hW2tleXdvcmRdO1xuICAgICAgICB0aGlzLiRkYXRhID0gZGVmLiRkYXRhICYmIGl0Lm9wdHMuJGRhdGEgJiYgdGhpcy5zY2hlbWEgJiYgdGhpcy5zY2hlbWEuJGRhdGE7XG4gICAgICAgIHRoaXMuc2NoZW1hVmFsdWUgPSAoMCwgdXRpbF8xLnNjaGVtYVJlZk9yVmFsKShpdCwgdGhpcy5zY2hlbWEsIGtleXdvcmQsIHRoaXMuJGRhdGEpO1xuICAgICAgICB0aGlzLnNjaGVtYVR5cGUgPSBkZWYuc2NoZW1hVHlwZTtcbiAgICAgICAgdGhpcy5wYXJlbnRTY2hlbWEgPSBpdC5zY2hlbWE7XG4gICAgICAgIHRoaXMucGFyYW1zID0ge307XG4gICAgICAgIHRoaXMuaXQgPSBpdDtcbiAgICAgICAgdGhpcy5kZWYgPSBkZWY7XG4gICAgICAgIGlmICh0aGlzLiRkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNjaGVtYUNvZGUgPSBpdC5nZW4uY29uc3QoXCJ2U2NoZW1hXCIsIGdldERhdGEodGhpcy4kZGF0YSwgaXQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZW1hQ29kZSA9IHRoaXMuc2NoZW1hVmFsdWU7XG4gICAgICAgICAgICBpZiAoISgwLCBrZXl3b3JkXzEudmFsaWRTY2hlbWFUeXBlKSh0aGlzLnNjaGVtYSwgZGVmLnNjaGVtYVR5cGUsIGRlZi5hbGxvd1VuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5d29yZH0gdmFsdWUgbXVzdCBiZSAke0pTT04uc3RyaW5naWZ5KGRlZi5zY2hlbWFUeXBlKX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJjb2RlXCIgaW4gZGVmID8gZGVmLnRyYWNrRXJyb3JzIDogZGVmLmVycm9ycyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyc0NvdW50ID0gaXQuZ2VuLmNvbnN0KFwiX2VycnNcIiwgbmFtZXNfMS5kZWZhdWx0LmVycm9ycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0KGNvbmRpdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZmFpbEFjdGlvbikge1xuICAgICAgICB0aGlzLmZhaWxSZXN1bHQoKDAsIGNvZGVnZW5fMS5ub3QpKGNvbmRpdGlvbiksIHN1Y2Nlc3NBY3Rpb24sIGZhaWxBY3Rpb24pO1xuICAgIH1cbiAgICBmYWlsUmVzdWx0KGNvbmRpdGlvbiwgc3VjY2Vzc0FjdGlvbiwgZmFpbEFjdGlvbikge1xuICAgICAgICB0aGlzLmdlbi5pZihjb25kaXRpb24pO1xuICAgICAgICBpZiAoZmFpbEFjdGlvbilcbiAgICAgICAgICAgIGZhaWxBY3Rpb24oKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5lcnJvcigpO1xuICAgICAgICBpZiAoc3VjY2Vzc0FjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5nZW4uZWxzZSgpO1xuICAgICAgICAgICAgc3VjY2Vzc0FjdGlvbigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsRXJyb3JzKVxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuLmVuZElmKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxFcnJvcnMpXG4gICAgICAgICAgICAgICAgdGhpcy5nZW4uZW5kSWYoKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0aGlzLmdlbi5lbHNlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFzcyhjb25kaXRpb24sIGZhaWxBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5mYWlsUmVzdWx0KCgwLCBjb2RlZ2VuXzEubm90KShjb25kaXRpb24pLCB1bmRlZmluZWQsIGZhaWxBY3Rpb24pO1xuICAgIH1cbiAgICBmYWlsKGNvbmRpdGlvbikge1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbGxFcnJvcnMpXG4gICAgICAgICAgICAgICAgdGhpcy5nZW4uaWYoZmFsc2UpOyAvLyB0aGlzIGJyYW5jaCB3aWxsIGJlIHJlbW92ZWQgYnkgZ2VuLm9wdGltaXplXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZW4uaWYoY29uZGl0aW9uKTtcbiAgICAgICAgdGhpcy5lcnJvcigpO1xuICAgICAgICBpZiAodGhpcy5hbGxFcnJvcnMpXG4gICAgICAgICAgICB0aGlzLmdlbi5lbmRJZigpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLmdlbi5lbHNlKCk7XG4gICAgfVxuICAgIGZhaWwkZGF0YShjb25kaXRpb24pIHtcbiAgICAgICAgaWYgKCF0aGlzLiRkYXRhKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmFpbChjb25kaXRpb24pO1xuICAgICAgICBjb25zdCB7IHNjaGVtYUNvZGUgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZmFpbCgoMCwgY29kZWdlbl8xLl8pIGAke3NjaGVtYUNvZGV9ICE9PSB1bmRlZmluZWQgJiYgKCR7KDAsIGNvZGVnZW5fMS5vcikodGhpcy5pbnZhbGlkJGRhdGEoKSwgY29uZGl0aW9uKX0pYCk7XG4gICAgfVxuICAgIGVycm9yKGFwcGVuZCwgZXJyb3JQYXJhbXMsIGVycm9yUGF0aHMpIHtcbiAgICAgICAgaWYgKGVycm9yUGFyYW1zKSB7XG4gICAgICAgICAgICB0aGlzLnNldFBhcmFtcyhlcnJvclBhcmFtcyk7XG4gICAgICAgICAgICB0aGlzLl9lcnJvcihhcHBlbmQsIGVycm9yUGF0aHMpO1xuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbXMoe30pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Vycm9yKGFwcGVuZCwgZXJyb3JQYXRocyk7XG4gICAgfVxuICAgIF9lcnJvcihhcHBlbmQsIGVycm9yUGF0aHMpIHtcbiAgICAgICAgO1xuICAgICAgICAoYXBwZW5kID8gZXJyb3JzXzEucmVwb3J0RXh0cmFFcnJvciA6IGVycm9yc18xLnJlcG9ydEVycm9yKSh0aGlzLCB0aGlzLmRlZi5lcnJvciwgZXJyb3JQYXRocyk7XG4gICAgfVxuICAgICRkYXRhRXJyb3IoKSB7XG4gICAgICAgICgwLCBlcnJvcnNfMS5yZXBvcnRFcnJvcikodGhpcywgdGhpcy5kZWYuJGRhdGFFcnJvciB8fCBlcnJvcnNfMS5rZXl3b3JkJERhdGFFcnJvcik7XG4gICAgfVxuICAgIHJlc2V0KCkge1xuICAgICAgICBpZiAodGhpcy5lcnJzQ291bnQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYWRkIFwidHJhY2tFcnJvcnNcIiB0byBrZXl3b3JkIGRlZmluaXRpb24nKTtcbiAgICAgICAgKDAsIGVycm9yc18xLnJlc2V0RXJyb3JzQ291bnQpKHRoaXMuZ2VuLCB0aGlzLmVycnNDb3VudCk7XG4gICAgfVxuICAgIG9rKGNvbmQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbEVycm9ycylcbiAgICAgICAgICAgIHRoaXMuZ2VuLmlmKGNvbmQpO1xuICAgIH1cbiAgICBzZXRQYXJhbXMob2JqLCBhc3NpZ24pIHtcbiAgICAgICAgaWYgKGFzc2lnbilcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXJhbXMsIG9iaik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMucGFyYW1zID0gb2JqO1xuICAgIH1cbiAgICBibG9jayRkYXRhKHZhbGlkLCBjb2RlQmxvY2ssICRkYXRhVmFsaWQgPSBjb2RlZ2VuXzEubmlsKSB7XG4gICAgICAgIHRoaXMuZ2VuLmJsb2NrKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2skZGF0YSh2YWxpZCwgJGRhdGFWYWxpZCk7XG4gICAgICAgICAgICBjb2RlQmxvY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNoZWNrJGRhdGEodmFsaWQgPSBjb2RlZ2VuXzEubmlsLCAkZGF0YVZhbGlkID0gY29kZWdlbl8xLm5pbCkge1xuICAgICAgICBpZiAoIXRoaXMuJGRhdGEpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHsgZ2VuLCBzY2hlbWFDb2RlLCBzY2hlbWFUeXBlLCBkZWYgfSA9IHRoaXM7XG4gICAgICAgIGdlbi5pZigoMCwgY29kZWdlbl8xLm9yKSgoMCwgY29kZWdlbl8xLl8pIGAke3NjaGVtYUNvZGV9ID09PSB1bmRlZmluZWRgLCAkZGF0YVZhbGlkKSk7XG4gICAgICAgIGlmICh2YWxpZCAhPT0gY29kZWdlbl8xLm5pbClcbiAgICAgICAgICAgIGdlbi5hc3NpZ24odmFsaWQsIHRydWUpO1xuICAgICAgICBpZiAoc2NoZW1hVHlwZS5sZW5ndGggfHwgZGVmLnZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAgICAgICBnZW4uZWxzZUlmKHRoaXMuaW52YWxpZCRkYXRhKCkpO1xuICAgICAgICAgICAgdGhpcy4kZGF0YUVycm9yKCk7XG4gICAgICAgICAgICBpZiAodmFsaWQgIT09IGNvZGVnZW5fMS5uaWwpXG4gICAgICAgICAgICAgICAgZ2VuLmFzc2lnbih2YWxpZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGdlbi5lbHNlKCk7XG4gICAgfVxuICAgIGludmFsaWQkZGF0YSgpIHtcbiAgICAgICAgY29uc3QgeyBnZW4sIHNjaGVtYUNvZGUsIHNjaGVtYVR5cGUsIGRlZiwgaXQgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiAoMCwgY29kZWdlbl8xLm9yKSh3cm9uZyREYXRhVHlwZSgpLCBpbnZhbGlkJERhdGFTY2hlbWEoKSk7XG4gICAgICAgIGZ1bmN0aW9uIHdyb25nJERhdGFUeXBlKCkge1xuICAgICAgICAgICAgaWYgKHNjaGVtYVR5cGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgICAgICAgICAgICAgaWYgKCEoc2NoZW1hQ29kZSBpbnN0YW5jZW9mIGNvZGVnZW5fMS5OYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYWp2IGltcGxlbWVudGF0aW9uIGVycm9yXCIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ID0gQXJyYXkuaXNBcnJheShzY2hlbWFUeXBlKSA/IHNjaGVtYVR5cGUgOiBbc2NoZW1hVHlwZV07XG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXykgYCR7KDAsIGRhdGFUeXBlXzIuY2hlY2tEYXRhVHlwZXMpKHN0LCBzY2hlbWFDb2RlLCBpdC5vcHRzLnN0cmljdE51bWJlcnMsIGRhdGFUeXBlXzIuRGF0YVR5cGUuV3JvbmcpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZWdlbl8xLm5pbDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBpbnZhbGlkJERhdGFTY2hlbWEoKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnZhbGlkYXRlU2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVTY2hlbWFSZWYgPSBnZW4uc2NvcGVWYWx1ZShcInZhbGlkYXRlJGRhdGFcIiwgeyByZWY6IGRlZi52YWxpZGF0ZVNjaGVtYSB9KTsgLy8gVE9ETyB2YWx1ZS5jb2RlIGZvciBzdGFuZGFsb25lXG4gICAgICAgICAgICAgICAgcmV0dXJuICgwLCBjb2RlZ2VuXzEuXykgYCEke3ZhbGlkYXRlU2NoZW1hUmVmfSgke3NjaGVtYUNvZGV9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZWdlbl8xLm5pbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdWJzY2hlbWEoYXBwbCwgdmFsaWQpIHtcbiAgICAgICAgY29uc3Qgc3Vic2NoZW1hID0gKDAsIHN1YnNjaGVtYV8xLmdldFN1YnNjaGVtYSkodGhpcy5pdCwgYXBwbCk7XG4gICAgICAgICgwLCBzdWJzY2hlbWFfMS5leHRlbmRTdWJzY2hlbWFEYXRhKShzdWJzY2hlbWEsIHRoaXMuaXQsIGFwcGwpO1xuICAgICAgICAoMCwgc3Vic2NoZW1hXzEuZXh0ZW5kU3Vic2NoZW1hTW9kZSkoc3Vic2NoZW1hLCBhcHBsKTtcbiAgICAgICAgY29uc3QgbmV4dENvbnRleHQgPSB7IC4uLnRoaXMuaXQsIC4uLnN1YnNjaGVtYSwgaXRlbXM6IHVuZGVmaW5lZCwgcHJvcHM6IHVuZGVmaW5lZCB9O1xuICAgICAgICBzdWJzY2hlbWFDb2RlKG5leHRDb250ZXh0LCB2YWxpZCk7XG4gICAgICAgIHJldHVybiBuZXh0Q29udGV4dDtcbiAgICB9XG4gICAgbWVyZ2VFdmFsdWF0ZWQoc2NoZW1hQ3h0LCB0b05hbWUpIHtcbiAgICAgICAgY29uc3QgeyBpdCwgZ2VuIH0gPSB0aGlzO1xuICAgICAgICBpZiAoIWl0Lm9wdHMudW5ldmFsdWF0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChpdC5wcm9wcyAhPT0gdHJ1ZSAmJiBzY2hlbWFDeHQucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaXQucHJvcHMgPSB1dGlsXzEubWVyZ2VFdmFsdWF0ZWQucHJvcHMoZ2VuLCBzY2hlbWFDeHQucHJvcHMsIGl0LnByb3BzLCB0b05hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdC5pdGVtcyAhPT0gdHJ1ZSAmJiBzY2hlbWFDeHQuaXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaXQuaXRlbXMgPSB1dGlsXzEubWVyZ2VFdmFsdWF0ZWQuaXRlbXMoZ2VuLCBzY2hlbWFDeHQuaXRlbXMsIGl0Lml0ZW1zLCB0b05hbWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG1lcmdlVmFsaWRFdmFsdWF0ZWQoc2NoZW1hQ3h0LCB2YWxpZCkge1xuICAgICAgICBjb25zdCB7IGl0LCBnZW4gfSA9IHRoaXM7XG4gICAgICAgIGlmIChpdC5vcHRzLnVuZXZhbHVhdGVkICYmIChpdC5wcm9wcyAhPT0gdHJ1ZSB8fCBpdC5pdGVtcyAhPT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgIGdlbi5pZih2YWxpZCwgKCkgPT4gdGhpcy5tZXJnZUV2YWx1YXRlZChzY2hlbWFDeHQsIGNvZGVnZW5fMS5OYW1lKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuS2V5d29yZEN4dCA9IEtleXdvcmRDeHQ7XG5mdW5jdGlvbiBrZXl3b3JkQ29kZShpdCwga2V5d29yZCwgZGVmLCBydWxlVHlwZSkge1xuICAgIGNvbnN0IGN4dCA9IG5ldyBLZXl3b3JkQ3h0KGl0LCBkZWYsIGtleXdvcmQpO1xuICAgIGlmIChcImNvZGVcIiBpbiBkZWYpIHtcbiAgICAgICAgZGVmLmNvZGUoY3h0LCBydWxlVHlwZSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGN4dC4kZGF0YSAmJiBkZWYudmFsaWRhdGUpIHtcbiAgICAgICAgKDAsIGtleXdvcmRfMS5mdW5jS2V5d29yZENvZGUpKGN4dCwgZGVmKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoXCJtYWNyb1wiIGluIGRlZikge1xuICAgICAgICAoMCwga2V5d29yZF8xLm1hY3JvS2V5d29yZENvZGUpKGN4dCwgZGVmKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGVmLmNvbXBpbGUgfHwgZGVmLnZhbGlkYXRlKSB7XG4gICAgICAgICgwLCBrZXl3b3JkXzEuZnVuY0tleXdvcmRDb2RlKShjeHQsIGRlZik7XG4gICAgfVxufVxuY29uc3QgSlNPTl9QT0lOVEVSID0gL15cXC8oPzpbXn5dfH4wfH4xKSokLztcbmNvbnN0IFJFTEFUSVZFX0pTT05fUE9JTlRFUiA9IC9eKFswLTldKykoI3xcXC8oPzpbXn5dfH4wfH4xKSopPyQvO1xuZnVuY3Rpb24gZ2V0RGF0YSgkZGF0YSwgeyBkYXRhTGV2ZWwsIGRhdGFOYW1lcywgZGF0YVBhdGhBcnIgfSkge1xuICAgIGxldCBqc29uUG9pbnRlcjtcbiAgICBsZXQgZGF0YTtcbiAgICBpZiAoJGRhdGEgPT09IFwiXCIpXG4gICAgICAgIHJldHVybiBuYW1lc18xLmRlZmF1bHQucm9vdERhdGE7XG4gICAgaWYgKCRkYXRhWzBdID09PSBcIi9cIikge1xuICAgICAgICBpZiAoIUpTT05fUE9JTlRFUi50ZXN0KCRkYXRhKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBKU09OLXBvaW50ZXI6ICR7JGRhdGF9YCk7XG4gICAgICAgIGpzb25Qb2ludGVyID0gJGRhdGE7XG4gICAgICAgIGRhdGEgPSBuYW1lc18xLmRlZmF1bHQucm9vdERhdGE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gUkVMQVRJVkVfSlNPTl9QT0lOVEVSLmV4ZWMoJGRhdGEpO1xuICAgICAgICBpZiAoIW1hdGNoZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgSlNPTi1wb2ludGVyOiAkeyRkYXRhfWApO1xuICAgICAgICBjb25zdCB1cCA9ICttYXRjaGVzWzFdO1xuICAgICAgICBqc29uUG9pbnRlciA9IG1hdGNoZXNbMl07XG4gICAgICAgIGlmIChqc29uUG9pbnRlciA9PT0gXCIjXCIpIHtcbiAgICAgICAgICAgIGlmICh1cCA+PSBkYXRhTGV2ZWwpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKFwicHJvcGVydHkvaW5kZXhcIiwgdXApKTtcbiAgICAgICAgICAgIHJldHVybiBkYXRhUGF0aEFycltkYXRhTGV2ZWwgLSB1cF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwID4gZGF0YUxldmVsKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnKFwiZGF0YVwiLCB1cCkpO1xuICAgICAgICBkYXRhID0gZGF0YU5hbWVzW2RhdGFMZXZlbCAtIHVwXTtcbiAgICAgICAgaWYgKCFqc29uUG9pbnRlcilcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBsZXQgZXhwciA9IGRhdGE7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBqc29uUG9pbnRlci5zcGxpdChcIi9cIik7XG4gICAgZm9yIChjb25zdCBzZWdtZW50IG9mIHNlZ21lbnRzKSB7XG4gICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICBkYXRhID0gKDAsIGNvZGVnZW5fMS5fKSBgJHtkYXRhfSR7KDAsIGNvZGVnZW5fMS5nZXRQcm9wZXJ0eSkoKDAsIHV0aWxfMS51bmVzY2FwZUpzb25Qb2ludGVyKShzZWdtZW50KSl9YDtcbiAgICAgICAgICAgIGV4cHIgPSAoMCwgY29kZWdlbl8xLl8pIGAke2V4cHJ9ICYmICR7ZGF0YX1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICAgIGZ1bmN0aW9uIGVycm9yTXNnKHBvaW50ZXJUeXBlLCB1cCkge1xuICAgICAgICByZXR1cm4gYENhbm5vdCBhY2Nlc3MgJHtwb2ludGVyVHlwZX0gJHt1cH0gbGV2ZWxzIHVwLCBjdXJyZW50IGxldmVsIGlzICR7ZGF0YUxldmVsfWA7XG4gICAgfVxufVxuZXhwb3J0cy5nZXREYXRhID0gZ2V0RGF0YTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztDQUNBLE9BQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztDQUM1RCxRQUFRLFVBQVUsUUFBUSxhQUFhLFFBQVEsdUJBQXVCLEtBQUs7Q0FDM0UsTUFBTSxlQUFBLG1CQUFBO0NBQ04sTUFBTSxhQUFBLGlCQUFBO0NBQ04sTUFBTSxrQkFBQSxzQkFBQTtDQUNOLE1BQU0sYUFB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