jsii-docgen
Version:
generates api docs for jsii modules
164 lines • 18.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.bestAssemblyMatch = bestAssemblyMatch;
exports.discoverAssemblies = discoverAssemblies;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const zlib = __importStar(require("zlib"));
const spec_1 = require("@jsii/spec");
const fg = __importStar(require("fast-glob"));
const semver = __importStar(require("semver"));
const errors_1 = require("../../errors");
;
/**
* Given an AssemblyLookup map and an assembly name + version constraint,
* returns the best possible match.
*
* This is not a strict semver implementation, instead the following algorithm is used:
* 1. the highest (latest) version matching the semver constraint
* 2. a matching major version, even if constraint doesn't match (this will use the lowest major version of the constraint)
* 3. the highest available version of the dependency regardless of constraint
*
* @param assemblies a map of assembly identifier to name, version and path
* @param constraint the assembly name and version to match
*
* @returns the best matching assembly info or undefined if no match was found
*/
function bestAssemblyMatch(assemblies, constraint) {
const lastAtIndex = constraint.lastIndexOf('@');
const name = lastAtIndex === -1 ? constraint : constraint.substring(0, lastAtIndex);
const versionConstraint = lastAtIndex === -1 ? undefined : constraint.substring(lastAtIndex + 1);
const candidates = Object.values(assemblies).filter(a => a.name === name);
if (candidates.length === 0) {
// `assemblies` is a view on top of the installation directory,
// it should contain the assembly.
throw new errors_1.CorruptedAssemblyError(`Unable to locate assembly for dependency: ${constraint}`);
}
candidates.sort((a, b) => semver.rcompare(a.version, b.version) || 0);
if (!versionConstraint) {
return candidates[0];
}
// 1. Try semver constraint match
const semverMatch = candidates.find(a => {
try {
return semver.satisfies(a.version, versionConstraint);
}
catch {
return false;
}
});
if (semverMatch) {
return semverMatch;
}
// 2. Try major version match
const targetVersion = semver.valid(versionConstraint) || semver.minVersion(versionConstraint);
if (targetVersion) {
const constraintMajor = semver.major(targetVersion);
const majorMatch = candidates.find(a => {
try {
return semver.major(a.version) === constraintMajor;
}
catch {
return false;
}
});
if (majorMatch) {
return majorMatch;
}
}
// 3. Return highest version regardless of constraint
return candidates[0];
}
/**
* Search a directory for jsii assemblies and return a map of assembly identifier to name, version and path.
*/
function discoverAssemblies(searchDir) {
// searchDir might include backslashes on Windows.
// The glob pattern must only used forward slashes, so we pass the assembliesDir as CWD which does not have this restriction
const discovered = fg.sync(`**/${spec_1.SPEC_FILE_NAME}`, {
cwd: path.normalize(searchDir),
absolute: true,
});
const assemblies = {};
for (let dotJsii of discovered) {
const info = getAssemblyInfoFromFile(dotJsii);
assemblies[`${info.name}@${info.version}`] = { ...info };
}
return assemblies;
}
/**
* Opens the assembly file to get the assemblies name and,
* if present, follows instructions found in the file to unzip compressed assemblies.
*
* @param pathToFile the path to the SPEC_FILE_NAME file
* @returns the assembly name
*/
function getAssemblyInfoFromFile(pathToFile) {
const data = fs.readFileSync(pathToFile);
try {
const readFile = (filename) => fs.readFileSync(path.resolve(pathToFile, '..', filename));
let contents = JSON.parse(data.toString('utf-8'));
// check if the file holds instructions to the actual assembly file
while ((0, spec_1.isAssemblyRedirect)(contents)) {
contents = followRedirect(contents, readFile);
}
return {
name: contents.name,
version: contents.version,
path: pathToFile,
};
}
catch (e) {
throw new Error(`Error loading assembly from file ${pathToFile}:\n${e}`);
}
}
function followRedirect(assemblyRedirect, readFile) {
// Validating the schema, this is cheap (the schema is small).
(0, spec_1.validateAssemblyRedirect)(assemblyRedirect);
let data = readFile(assemblyRedirect.filename);
switch (assemblyRedirect.compression) {
case 'gzip':
data = zlib.gunzipSync(data);
break;
case undefined:
break;
default:
throw new Error(`Unsupported compression algorithm: ${JSON.stringify(assemblyRedirect.compression)}`);
}
const json = data.toString('utf-8');
return JSON.parse(json);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZG9jZ2VuL3ZpZXcvYXNzZW1ibHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErQkEsOENBZ0RDO0FBS0QsZ0RBZUM7QUFuR0QsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QiwyQ0FBNkI7QUFDN0IscUNBQTRHO0FBQzVHLDhDQUFnQztBQUVoQywrQ0FBaUM7QUFDakMseUNBQXNEO0FBTXJELENBQUM7QUFJRjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsVUFBMEIsRUFBRSxVQUFrQjtJQUM5RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sSUFBSSxHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRixNQUFNLGlCQUFpQixHQUFHLFdBQVcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7SUFFMUUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLCtEQUErRDtRQUMvRCxrQ0FBa0M7UUFDbEMsTUFBTSxJQUFJLCtCQUFzQixDQUFDLDZDQUE2QyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzlG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dCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgemxpYiBmcm9tICd6bGliJztcbmltcG9ydCB7IEFzc2VtYmx5UmVkaXJlY3QsIGlzQXNzZW1ibHlSZWRpcmVjdCwgU1BFQ19GSUxFX05BTUUsIHZhbGlkYXRlQXNzZW1ibHlSZWRpcmVjdCB9IGZyb20gJ0Bqc2lpL3NwZWMnO1xuaW1wb3J0ICogYXMgZmcgZnJvbSAnZmFzdC1nbG9iJztcbmltcG9ydCB7IEFzc2VtYmx5IH0gZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgQ29ycnVwdGVkQXNzZW1ibHlFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibHlJbmZvIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIEFzc2VtYmx5TG9va3VwID0gUmVjb3JkPHN0cmluZywgQXNzZW1ibHlJbmZvPjtcblxuLyoqXG4gKiBHaXZlbiBhbiBBc3NlbWJseUxvb2t1cCBtYXAgYW5kIGFuIGFzc2VtYmx5IG5hbWUgKyB2ZXJzaW9uIGNvbnN0cmFpbnQsXG4gKiByZXR1cm5zIHRoZSBiZXN0IHBvc3NpYmxlIG1hdGNoLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgc3RyaWN0IHNlbXZlciBpbXBsZW1lbnRhdGlvbiwgaW5zdGVhZCB0aGUgZm9sbG93aW5nIGFsZ29yaXRobSBpcyB1c2VkOlxuICogICAxLiB0aGUgaGlnaGVzdCAobGF0ZXN0KSB2ZXJzaW9uIG1hdGNoaW5nIHRoZSBzZW12ZXIgY29uc3RyYWludFxuICogICAyLiBhIG1hdGNoaW5nIG1ham9yIHZlcnNpb24sIGV2ZW4gaWYgY29uc3RyYWludCBkb2Vzbid0IG1hdGNoICh0aGlzIHdpbGwgdXNlIHRoZSBsb3dlc3QgbWFqb3IgdmVyc2lvbiBvZiB0aGUgY29uc3RyYWludClcbiAqICAgMy4gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHZlcnNpb24gb2YgdGhlIGRlcGVuZGVuY3kgcmVnYXJkbGVzcyBvZiBjb25zdHJhaW50XG4gKlxuICogQHBhcmFtIGFzc2VtYmxpZXMgYSBtYXAgb2YgYXNzZW1ibHkgaWRlbnRpZmllciB0byBuYW1lLCB2ZXJzaW9uIGFuZCBwYXRoXG4gKiBAcGFyYW0gY29uc3RyYWludCB0aGUgYXNzZW1ibHkgbmFtZSBhbmQgdmVyc2lvbiB0byBtYXRjaFxuICpcbiAqIEByZXR1cm5zIHRoZSBiZXN0IG1hdGNoaW5nIGFzc2VtYmx5IGluZm8gb3IgdW5kZWZpbmVkIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVzdEFzc2VtYmx5TWF0Y2goYXNzZW1ibGllczogQXNzZW1ibHlMb29rdXAsIGNvbnN0cmFpbnQ6IHN0cmluZyk6IEFzc2VtYmx5SW5mbyB7XG4gIGNvbnN0IGxhc3RBdEluZGV4ID0gY29uc3RyYWludC5sYXN0SW5kZXhPZignQCcpO1xuICBjb25zdCBuYW1lID0gbGFzdEF0SW5kZXggPT09IC0xID8gY29uc3RyYWludCA6IGNvbnN0cmFpbnQuc3Vic3RyaW5nKDAsIGxhc3RBdEluZGV4KTtcbiAgY29uc3QgdmVyc2lvbkNvbnN0cmFpbnQgPSBsYXN0QXRJbmRleCA9PT0gLTEgPyB1bmRlZmluZWQgOiBjb25zdHJhaW50LnN1YnN0cmluZyhsYXN0QXRJbmRleCArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVzID0gT2JqZWN0LnZhbHVlcyhhc3NlbWJsaWVzKS5maWx0ZXIoYSA9PiBhLm5hbWUgPT09IG5hbWUpO1xuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGBhc3NlbWJsaWVzYCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LFxuICAgIC8vIGl0IHNob3VsZCBjb250YWluIHRoZSBhc3NlbWJseS5cbiAgICB0aHJvdyBuZXcgQ29ycnVwdGVkQXNzZW1ibHlFcnJvcihgVW5hYmxlIHRvIGxvY2F0ZSBhc3NlbWJseSBmb3IgZGVwZW5kZW5jeTogJHtjb25zdHJhaW50fWApO1xuICB9XG5cbiAgY2FuZGlkYXRlcy5zb3J0KChhLCBiKSA9PiBzZW12ZXIucmNvbXBhcmUoYS52ZXJzaW9uLCBiLnZlcnNpb24pIHx8IDApO1xuXG4gIGlmICghdmVyc2lvbkNvbnN0cmFpbnQpIHtcbiAgICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbiAgfVxuXG4gIC8vIDEuIFRyeSBzZW12ZXIgY29uc3RyYWludCBtYXRjaFxuICBjb25zdCBzZW12ZXJNYXRjaCA9IGNhbmRpZGF0ZXMuZmluZChhID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHNlbXZlci5zYXRpc2ZpZXMoYS52ZXJzaW9uLCB2ZXJzaW9uQ29uc3RyYWludCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcbiAgaWYgKHNlbXZlck1hdGNoKSB7XG4gICAgcmV0dXJuIHNlbXZlck1hdGNoO1xuICB9XG5cbiAgLy8gMi4gVHJ5IG1ham9yIHZlcnNpb24gbWF0Y2hcbiAgY29uc3QgdGFyZ2V0VmVyc2lvbiA9IHNlbXZlci52YWxpZCh2ZXJzaW9uQ29uc3RyYWludCkgfHwgc2VtdmVyLm1pblZlcnNpb24odmVyc2lvbkNvbnN0cmFpbnQpO1xuICBpZiAodGFyZ2V0VmVyc2lvbikge1xuICAgIGNvbnN0IGNvbnN0cmFpbnRNYWpvciA9IHNlbXZlci5tYWpvcih0YXJnZXRWZXJzaW9uKTtcbiAgICBjb25zdCBtYWpvck1hdGNoID0gY2FuZGlkYXRlcy5maW5kKGEgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHNlbXZlci5tYWpvcihhLnZlcnNpb24pID09PSBjb25zdHJhaW50TWFqb3I7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChtYWpvck1hdGNoKSB7XG4gICAgICByZXR1cm4gbWFqb3JNYXRjaDtcbiAgICB9XG4gIH1cblxuICAvLyAzLiBSZXR1cm4gaGlnaGVzdCB2ZXJzaW9uIHJlZ2FyZGxlc3Mgb2YgY29uc3RyYWludFxuICByZXR1cm4gY2FuZGlkYXRlc1swXTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGpzaWkgYXNzZW1ibGllcyBhbmQgcmV0dXJuIGEgbWFwIG9mIGFzc2VtYmx5IGlkZW50aWZpZXIgdG8gbmFtZSwgdmVyc2lvbiBhbmQgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NvdmVyQXNzZW1ibGllcyhzZWFyY2hEaXI6IHN0cmluZyk6IEFzc2VtYmx5TG9va3VwIHtcbiAgLy8gc2VhcmNoRGlyIG1pZ2h0IGluY2x1ZGUgYmFja3NsYXNoZXMgb24gV2luZG93cy5cbiAgLy8gVGhlIGdsb2IgcGF0dGVybiBtdXN0IG9ubHkgdXNlZCBmb3J3YXJkIHNsYXNoZXMsIHNvIHdlIHBhc3MgdGhlIGFzc2VtYmxpZXNEaXIgYXMgQ1dEIHdoaWNoIGRvZXMgbm90IGhhdmUgdGhpcyByZXN0cmljdGlvblxuICBjb25zdCBkaXNjb3ZlcmVkID0gZmcuc3luYyhgKiovJHtTUEVDX0ZJTEVfTkFNRX1gLCB7XG4gICAgY3dkOiBwYXRoLm5vcm1hbGl6ZShzZWFyY2hEaXIpLFxuICAgIGFic29sdXRlOiB0cnVlLFxuICB9KTtcblxuICBjb25zdCBhc3NlbWJsaWVzOiBBc3NlbWJseUxvb2t1cCA9IHt9O1xuICBmb3IgKGxldCBkb3RKc2lpIG9mIGRpc2NvdmVyZWQpIHtcbiAgICBjb25zdCBpbmZvID0gZ2V0QXNzZW1ibHlJbmZvRnJvbUZpbGUoZG90SnNpaSk7XG4gICAgYXNzZW1ibGllc1tgJHtpbmZvLm5hbWV9QCR7aW5mby52ZXJzaW9ufWBdID0geyAuLi5pbmZvIH07XG4gIH1cblxuICByZXR1cm4gYXNzZW1ibGllcztcbn1cblxuLyoqXG4gKiBPcGVucyB0aGUgYXNzZW1ibHkgZmlsZSB0byBnZXQgdGhlIGFzc2VtYmxpZXMgbmFtZSBhbmQsXG4gKiBpZiBwcmVzZW50LCBmb2xsb3dzIGluc3RydWN0aW9ucyBmb3VuZCBpbiB0aGUgZmlsZSB0byB1bnppcCBjb21wcmVzc2VkIGFzc2VtYmxpZXMuXG4gKlxuICogQHBhcmFtIHBhdGhUb0ZpbGUgdGhlIHBhdGggdG8gdGhlIFNQRUNfRklMRV9OQU1FIGZpbGVcbiAqIEByZXR1cm5zIHRoZSBhc3NlbWJseSBuYW1lXG4gKi9cbmZ1bmN0aW9uIGdldEFzc2VtYmx5SW5mb0Zyb21GaWxlKHBhdGhUb0ZpbGU6IHN0cmluZyk6IEFzc2VtYmx5SW5mbyB7XG4gIGNvbnN0IGRhdGEgPSBmcy5yZWFkRmlsZVN5bmMocGF0aFRvRmlsZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVhZEZpbGUgPSAoZmlsZW5hbWU6IHN0cmluZykgPT4gZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShwYXRoVG9GaWxlLCAnLi4nLCBmaWxlbmFtZSkpO1xuICAgIGxldCBjb250ZW50cyA9IEpTT04ucGFyc2UoZGF0YS50b1N0cmluZygndXRmLTgnKSk7XG5cbiAgICAvLyBjaGVjayBpZiB0aGUgZmlsZSBob2xkcyBpbnN0cnVjdGlvbnMgdG8gdGhlIGFjdHVhbCBhc3NlbWJseSBmaWxlXG4gICAgd2hpbGUgKGlzQXNzZW1ibHlSZWRpcmVjdChjb250ZW50cykpIHtcbiAgICAgIGNvbnRlbnRzID0gZm9sbG93UmVkaXJlY3QoY29udGVudHMsIHJlYWRGaWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogKGNvbnRlbnRzIGFzIEFzc2VtYmx5KS5uYW1lLFxuICAgICAgdmVyc2lvbjogKGNvbnRlbnRzIGFzIEFzc2VtYmx5KS52ZXJzaW9uLFxuICAgICAgcGF0aDogcGF0aFRvRmlsZSxcbiAgICB9O1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgYXNzZW1ibHkgZnJvbSBmaWxlICR7cGF0aFRvRmlsZX06XFxuJHtlfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvbGxvd1JlZGlyZWN0KFxuICBhc3NlbWJseVJlZGlyZWN0OiBBc3NlbWJseVJlZGlyZWN0LFxuICByZWFkRmlsZTogKGZpbGVuYW1lOiBzdHJpbmcpID0+IEJ1ZmZlcixcbikge1xuICAvLyBWYWxpZGF0aW5nIHRoZSBzY2hlbWEsIHRoaXMgaXMgY2hlYXAgKHRoZSBzY2hlbWEgaXMgc21hbGwpLlxuICB2YWxpZGF0ZUFzc2VtYmx5UmVkaXJlY3QoYXNzZW1ibHlSZWRpcmVjdCk7XG5cbiAgbGV0IGRhdGEgPSByZWFkRmlsZShhc3NlbWJseVJlZGlyZWN0LmZpbGVuYW1lKTtcbiAgc3dpdGNoIChhc3NlbWJseVJlZGlyZWN0LmNvbXByZXNzaW9uKSB7XG4gICAgY2FzZSAnZ3ppcCc6XG4gICAgICBkYXRhID0gemxpYi5ndW56aXBTeW5jKGRhdGEpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIGFzc2VtYmx5UmVkaXJlY3QuY29tcHJlc3Npb24sXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gIH1cbiAgY29uc3QganNvbiA9IGRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xufVxuIl19