find-node-modules
Version:
Return an array of all parent node_modules directories
1,436 lines (1,386 loc) • 46.5 kB
JavaScript
"use strict";
var cov_l5hg93smj = function () {
var path = "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/commitizen/adapter.js";
var hash = "b8bd02e835e5df95fa6376d9655a32b6e1be5e78";
var global = new Function("return this")();
var gcv = "__coverage__";
var coverageData = {
path: "/Users/callumacrae/Sites/find-node-modules/cz-cli/src/commitizen/adapter.js",
statementMap: {
"0": {
start: {
line: 37,
column: 32
},
end: {
line: 43,
column: 3
}
},
"1": {
start: {
line: 45,
column: 24
},
end: {
line: 45,
column: 91
}
},
"2": {
start: {
line: 46,
column: 26
},
end: {
line: 46,
column: 67
}
},
"3": {
start: {
line: 48,
column: 15
},
end: {
line: 48,
column: 61
}
},
"4": {
start: {
line: 49,
column: 27
},
end: {
line: 49,
column: 56
}
},
"5": {
start: {
line: 50,
column: 30
},
end: {
line: 50,
column: 32
}
},
"6": {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
},
"7": {
start: {
line: 52,
column: 4
},
end: {
line: 52,
column: 81
}
},
"8": {
start: {
line: 54,
column: 2
},
end: {
line: 54,
column: 96
}
},
"9": {
start: {
line: 63,
column: 30
},
end: {
line: 63,
column: 61
}
},
"10": {
start: {
line: 66,
column: 2
},
end: {
line: 70,
column: 3
}
},
"11": {
start: {
line: 67,
column: 4
},
end: {
line: 69,
column: 5
}
},
"12": {
start: {
line: 68,
column: 6
},
end: {
line: 68,
column: 66
}
},
"13": {
start: {
line: 72,
column: 2
},
end: {
line: 72,
column: 31
}
},
"14": {
start: {
line: 81,
column: 30
},
end: {
line: 81,
column: 58
}
},
"15": {
start: {
line: 84,
column: 2
},
end: {
line: 88,
column: 3
}
},
"16": {
start: {
line: 85,
column: 4
},
end: {
line: 87,
column: 5
}
},
"17": {
start: {
line: 86,
column: 6
},
end: {
line: 86,
column: 66
}
},
"18": {
start: {
line: 90,
column: 2
},
end: {
line: 90,
column: 31
}
},
"19": {
start: {
line: 99,
column: 31
},
end: {
line: 99,
column: 55
}
},
"20": {
start: {
line: 104,
column: 2
},
end: {
line: 108,
column: 3
}
},
"21": {
start: {
line: 105,
column: 4
},
end: {
line: 105,
column: 37
}
},
"22": {
start: {
line: 115,
column: 2
},
end: {
line: 115,
column: 78
}
},
"23": {
start: {
line: 122,
column: 2
},
end: {
line: 126,
column: 49
}
},
"24": {
start: {
line: 133,
column: 2
},
end: {
line: 136,
column: 49
}
},
"25": {
start: {
line: 144,
column: 28
},
end: {
line: 144,
column: 59
}
},
"26": {
start: {
line: 147,
column: 16
},
end: {
line: 147,
column: 44
}
},
"27": {
start: {
line: 165,
column: 15
},
end: {
line: 165,
column: 45
}
},
"28": {
start: {
line: 166,
column: 15
},
end: {
line: 166,
column: 68
}
},
"29": {
start: {
line: 169,
column: 28
},
end: {
line: 171,
column: 22
}
},
"30": {
start: {
line: 173,
column: 2
},
end: {
line: 179,
column: 3
}
},
"31": {
start: {
line: 175,
column: 4
},
end: {
line: 175,
column: 48
}
},
"32": {
start: {
line: 177,
column: 4
},
end: {
line: 177,
column: 86
}
},
"33": {
start: {
line: 178,
column: 4
},
end: {
line: 178,
column: 16
}
},
"34": {
start: {
line: 183,
column: 2
},
end: {
line: 183,
column: 109
}
}
},
fnMap: {
"0": {
name: "addPathToAdapterConfig",
decl: {
start: {
line: 35,
column: 9
},
end: {
line: 35,
column: 31
}
},
loc: {
start: {
line: 35,
column: 68
},
end: {
line: 55,
column: 1
}
},
line: 35
},
"1": {
name: "generateNpmInstallAdapterCommand",
decl: {
start: {
line: 60,
column: 9
},
end: {
line: 60,
column: 41
}
},
loc: {
start: {
line: 60,
column: 75
},
end: {
line: 73,
column: 1
}
},
line: 60
},
"2": {
name: "generateYarnAddAdapterCommand",
decl: {
start: {
line: 78,
column: 9
},
end: {
line: 78,
column: 38
}
},
loc: {
start: {
line: 78,
column: 72
},
end: {
line: 91,
column: 1
}
},
line: 78
},
"3": {
name: "getNearestNodeModulesDirectory",
decl: {
start: {
line: 96,
column: 9
},
end: {
line: 96,
column: 39
}
},
loc: {
start: {
line: 96,
column: 50
},
end: {
line: 109,
column: 1
}
},
line: 96
},
"4": {
name: "getNearestProjectRootDirectory",
decl: {
start: {
line: 114,
column: 9
},
end: {
line: 114,
column: 39
}
},
loc: {
start: {
line: 114,
column: 60
},
end: {
line: 116,
column: 1
}
},
line: 114
},
"5": {
name: "getNpmInstallStringMappings",
decl: {
start: {
line: 121,
column: 9
},
end: {
line: 121,
column: 36
}
},
loc: {
start: {
line: 121,
column: 71
},
end: {
line: 127,
column: 1
}
},
line: 121
},
"6": {
name: "getYarnAddStringMappings",
decl: {
start: {
line: 132,
column: 9
},
end: {
line: 132,
column: 33
}
},
loc: {
start: {
line: 132,
column: 54
},
end: {
line: 137,
column: 1
}
},
line: 132
},
"7": {
name: "getPrompter",
decl: {
start: {
line: 142,
column: 9
},
end: {
line: 142,
column: 20
}
},
loc: {
start: {
line: 142,
column: 35
},
end: {
line: 157,
column: 1
}
},
line: 142
},
"8": {
name: "resolveAdapterPath",
decl: {
start: {
line: 163,
column: 9
},
end: {
line: 163,
column: 27
}
},
loc: {
start: {
line: 163,
column: 49
},
end: {
line: 180,
column: 1
}
},
line: 163
},
"9": {
name: "getGitRootPath",
decl: {
start: {
line: 182,
column: 9
},
end: {
line: 182,
column: 23
}
},
loc: {
start: {
line: 182,
column: 27
},
end: {
line: 184,
column: 1
}
},
line: 182
}
},
branchMap: {
"0": {
loc: {
start: {
line: 48,
column: 15
},
end: {
line: 48,
column: 61
}
},
type: "binary-expr",
locations: [{
start: {
line: 48,
column: 15
},
end: {
line: 48,
column: 53
}
}, {
start: {
line: 48,
column: 57
},
end: {
line: 48,
column: 61
}
}],
line: 48
},
"1": {
loc: {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
},
type: "if",
locations: [{
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
}, {
start: {
line: 51,
column: 2
},
end: {
line: 53,
column: 3
}
}],
line: 51
},
"2": {
loc: {
start: {
line: 67,
column: 4
},
end: {
line: 69,
column: 5
}
},
type: "if",
locations: [{
start: {
line: 67,
column: 4
},
end: {
line: 69,
column: 5
}
}, {
start: {
line: 67,
column: 4
},
end: {
line: 69,
column: 5
}
}],
line: 67
},
"3": {
loc: {
start: {
line: 85,
column: 4
},
end: {
line: 87,
column: 5
}
},
type: "if",
locations: [{
start: {
line: 85,
column: 4
},
end: {
line: 87,
column: 5
}
}, {
start: {
line: 85,
column: 4
},
end: {
line: 87,
column: 5
}
}],
line: 85
},
"4": {
loc: {
start: {
line: 104,
column: 2
},
end: {
line: 108,
column: 3
}
},
type: "if",
locations: [{
start: {
line: 104,
column: 2
},
end: {
line: 108,
column: 3
}
}],
line: 104
},
"5": {
loc: {
start: {
line: 104,
column: 6
},
end: {
line: 104,
column: 65
}
},
type: "binary-expr",
locations: [{
start: {
line: 104,
column: 6
},
end: {
line: 104,
column: 28
}
}, {
start: {
line: 104,
column: 32
},
end: {
line: 104,
column: 65
}
}],
line: 104
},
"6": {
loc: {
start: {
line: 123,
column: 17
},
end: {
line: 123,
column: 58
}
},
type: "cond-expr",
locations: [{
start: {
line: 123,
column: 38
},
end: {
line: 123,
column: 46
}
}, {
start: {
line: 123,
column: 49
},
end: {
line: 123,
column: 58
}
}],
line: 123
},
"7": {
loc: {
start: {
line: 123,
column: 18
},
end: {
line: 123,
column: 34
}
},
type: "binary-expr",
locations: [{
start: {
line: 123,
column: 18
},
end: {
line: 123,
column: 22
}
}, {
start: {
line: 123,
column: 26
},
end: {
line: 123,
column: 34
}
}],
line: 123
},
"8": {
loc: {
start: {
line: 124,
column: 20
},
end: {
line: 124,
column: 54
}
},
type: "cond-expr",
locations: [{
start: {
line: 124,
column: 30
},
end: {
line: 124,
column: 42
}
}, {
start: {
line: 124,
column: 45
},
end: {
line: 124,
column: 54
}
}],
line: 124
},
"9": {
loc: {
start: {
line: 125,
column: 22
},
end: {
line: 125,
column: 60
}
},
type: "cond-expr",
locations: [{
start: {
line: 125,
column: 34
},
end: {
line: 125,
column: 48
}
}, {
start: {
line: 125,
column: 51
},
end: {
line: 125,
column: 60
}
}],
line: 125
},
"10": {
loc: {
start: {
line: 126,
column: 18
},
end: {
line: 126,
column: 47
}
},
type: "cond-expr",
locations: [{
start: {
line: 126,
column: 26
},
end: {
line: 126,
column: 35
}
}, {
start: {
line: 126,
column: 38
},
end: {
line: 126,
column: 47
}
}],
line: 126
},
"11": {
loc: {
start: {
line: 134,
column: 16
},
end: {
line: 134,
column: 41
}
},
type: "cond-expr",
locations: [{
start: {
line: 134,
column: 22
},
end: {
line: 134,
column: 29
}
}, {
start: {
line: 134,
column: 32
},
end: {
line: 134,
column: 41
}
}],
line: 134
},
"12": {
loc: {
start: {
line: 135,
column: 18
},
end: {
line: 135,
column: 47
}
},
type: "cond-expr",
locations: [{
start: {
line: 135,
column: 26
},
end: {
line: 135,
column: 35
}
}, {
start: {
line: 135,
column: 38
},
end: {
line: 135,
column: 47
}
}],
line: 135
},
"13": {
loc: {
start: {
line: 136,
column: 18
},
end: {
line: 136,
column: 47
}
},
type: "cond-expr",
locations: [{
start: {
line: 136,
column: 26
},
end: {
line: 136,
column: 35
}
}, {
start: {
line: 136,
column: 38
},
end: {
line: 136,
column: 47
}
}],
line: 136
},
"14": {
loc: {
start: {
line: 166,
column: 15
},
end: {
line: 166,
column: 68
}
},
type: "binary-expr",
locations: [{
start: {
line: 166,
column: 15
},
end: {
line: 166,
column: 36
}
}, {
start: {
line: 166,
column: 40
},
end: {
line: 166,
column: 68
}
}],
line: 166
},
"15": {
loc: {
start: {
line: 169,
column: 28
},
end: {
line: 171,
column: 22
}
},
type: "cond-expr",
locations: [{
start: {
line: 170,
column: 4
},
end: {
line: 170,
column: 54
}
}, {
start: {
line: 171,
column: 4
},
end: {
line: 171,
column: 22
}
}],
line: 169
}
},
s: {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0,
"13": 0,
"14": 0,
"15": 0,
"16": 0,
"17": 0,
"18": 0,
"19": 0,
"20": 0,
"21": 0,
"22": 0,
"23": 0,
"24": 0,
"25": 0,
"26": 0,
"27": 0,
"28": 0,
"29": 0,
"30": 0,
"31": 0,
"32": 0,
"33": 0,
"34": 0
},
f: {
"0": 0,
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0
},
b: {
"0": [0, 0],
"1": [0, 0],
"2": [0, 0],
"3": [0, 0],
"4": [0],
"5": [0, 0],
"6": [0, 0],
"7": [0, 0],
"8": [0, 0],
"9": [0, 0],
"10": [0, 0],
"11": [0, 0],
"12": [0, 0],
"13": [0, 0],
"14": [0, 0],
"15": [0, 0]
},
_coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
hash: "b8bd02e835e5df95fa6376d9655a32b6e1be5e78"
};
var coverage = global[gcv] || (global[gcv] = {});
if (coverage[path] && coverage[path].hash === hash) {
return coverage[path];
}
return coverage[path] = coverageData;
}();
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.addPathToAdapterConfig = addPathToAdapterConfig;
exports.getNearestNodeModulesDirectory = getNearestNodeModulesDirectory;
exports.getNearestProjectRootDirectory = getNearestProjectRootDirectory;
exports.getNpmInstallStringMappings = getNpmInstallStringMappings;
exports.getPrompter = getPrompter;
exports.generateNpmInstallAdapterCommand = generateNpmInstallAdapterCommand;
exports.resolveAdapterPath = resolveAdapterPath;
exports.getYarnAddStringMappings = getYarnAddStringMappings;
exports.generateYarnAddAdapterCommand = generateYarnAddAdapterCommand;
var _child_process = _interopRequireDefault(require("child_process"));
var _path = _interopRequireDefault(require("path"));
var _fs = _interopRequireDefault(require("fs"));
var _findNodeModules = _interopRequireDefault(require("find-node-modules"));
var _lodash = _interopRequireDefault(require("lodash"));
var _detectIndent = _interopRequireDefault(require("detect-indent"));
var _util = require("../common/util");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* ADAPTER
*
* Adapter is generally responsible for actually installing adapters to an
* end user's project. It does not perform checks to determine if there is
* a previous commitizen adapter installed or if the proper fields were
* provided. It defers that responsibility to init.
*/
/**
* Modifies the package.json, sets config.commitizen.path to the path of the adapter
* Must be passed an absolute path to the cli's root
*/
function addPathToAdapterConfig(cliPath, repoPath, adapterNpmName) {
cov_l5hg93smj.f[0]++;
let commitizenAdapterConfig = (cov_l5hg93smj.s[0]++, {
config: {
commitizen: {
path: `./node_modules/${adapterNpmName}`
}
}
});
let packageJsonPath = (cov_l5hg93smj.s[1]++, _path.default.join(getNearestProjectRootDirectory(repoPath), 'package.json'));
let packageJsonString = (cov_l5hg93smj.s[2]++, _fs.default.readFileSync(packageJsonPath, 'utf-8')); // tries to detect the indentation and falls back to a default if it can't
let indent = (cov_l5hg93smj.s[3]++, (cov_l5hg93smj.b[0][0]++, (0, _detectIndent.default)(packageJsonString).indent) || (cov_l5hg93smj.b[0][1]++, ' '));
let packageJsonContent = (cov_l5hg93smj.s[4]++, JSON.parse(packageJsonString));
let newPackageJsonContent = (cov_l5hg93smj.s[5]++, '');
cov_l5hg93smj.s[6]++;
if (_lodash.default.get(packageJsonContent, 'config.commitizen.path') !== adapterNpmName) {
cov_l5hg93smj.b[1][0]++;
cov_l5hg93smj.s[7]++;
newPackageJsonContent = _lodash.default.merge(packageJsonContent, commitizenAdapterConfig);
} else {
cov_l5hg93smj.b[1][1]++;
}
cov_l5hg93smj.s[8]++;
_fs.default.writeFileSync(packageJsonPath, JSON.stringify(newPackageJsonContent, null, indent) + '\n');
}
/**
* Generates an npm install command given a map of strings and a package name
*/
function generateNpmInstallAdapterCommand(stringMappings, adapterNpmName) {
cov_l5hg93smj.f[1]++;
// Start with an initial npm install command
let installAdapterCommand = (cov_l5hg93smj.s[9]++, `npm install ${adapterNpmName}`); // Append the neccesary arguments to it based on user preferences
cov_l5hg93smj.s[10]++;
for (let value of stringMappings.values()) {
cov_l5hg93smj.s[11]++;
if (value) {
cov_l5hg93smj.b[2][0]++;
cov_l5hg93smj.s[12]++;
installAdapterCommand = installAdapterCommand + ' ' + value;
} else {
cov_l5hg93smj.b[2][1]++;
}
}
cov_l5hg93smj.s[13]++;
return installAdapterCommand;
}
/**
* Generates an yarn add command given a map of strings and a package name
*/
function generateYarnAddAdapterCommand(stringMappings, adapterNpmName) {
cov_l5hg93smj.f[2]++;
// Start with an initial yarn add command
let installAdapterCommand = (cov_l5hg93smj.s[14]++, `yarn add ${adapterNpmName}`); // Append the necessary arguments to it based on user preferences
cov_l5hg93smj.s[15]++;
for (let value of stringMappings.values()) {
cov_l5hg93smj.s[16]++;
if (value) {
cov_l5hg93smj.b[3][0]++;
cov_l5hg93smj.s[17]++;
installAdapterCommand = installAdapterCommand + ' ' + value;
} else {
cov_l5hg93smj.b[3][1]++;
}
}
cov_l5hg93smj.s[18]++;
return installAdapterCommand;
}
/**
* Gets the nearest npm_modules directory
*/
function getNearestNodeModulesDirectory(options) {
cov_l5hg93smj.f[3]++;
// Get the nearest node_modules directories to the current working directory
let nodeModulesDirectories = (cov_l5hg93smj.s[19]++, (0, _findNodeModules.default)(options)); // Make sure we find a node_modules folder
/* istanbul ignore else */
cov_l5hg93smj.s[20]++;
if ((cov_l5hg93smj.b[5][0]++, nodeModulesDirectories) && (cov_l5hg93smj.b[5][1]++, nodeModulesDirectories.length > 0)) {
cov_l5hg93smj.b[4][0]++;
cov_l5hg93smj.s[21]++;
return nodeModulesDirectories[0];
} else {
console.error(`Error: Could not locate node_modules in your project's root directory. Did you forget to npm init or npm install?`);
}
}
/**
* Gets the nearest project root directory
*/
function getNearestProjectRootDirectory(repoPath, options) {
cov_l5hg93smj.f[4]++;
cov_l5hg93smj.s[22]++;
return _path.default.join(repoPath, getNearestNodeModulesDirectory(options), '/../');
}
/**
* Gets a map of arguments where the value is the corresponding npm strings
*/
function getNpmInstallStringMappings(save, saveDev, saveExact, force) {
cov_l5hg93smj.f[5]++;
cov_l5hg93smj.s[23]++;
return new Map().set('save', (cov_l5hg93smj.b[7][0]++, save) && (cov_l5hg93smj.b[7][1]++, !saveDev) ? (cov_l5hg93smj.b[6][0]++, '--save') : (cov_l5hg93smj.b[6][1]++, undefined)).set('saveDev', saveDev ? (cov_l5hg93smj.b[8][0]++, '--save-dev') : (cov_l5hg93smj.b[8][1]++, undefined)).set('saveExact', saveExact ? (cov_l5hg93smj.b[9][0]++, '--save-exact') : (cov_l5hg93smj.b[9][1]++, undefined)).set('force', force ? (cov_l5hg93smj.b[10][0]++, '--force') : (cov_l5hg93smj.b[10][1]++, undefined));
}
/**
* Gets a map of arguments where the value is the corresponding yarn strings
*/
function getYarnAddStringMappings(dev, exact, force) {
cov_l5hg93smj.f[6]++;
cov_l5hg93smj.s[24]++;
return new Map().set('dev', dev ? (cov_l5hg93smj.b[11][0]++, '--dev') : (cov_l5hg93smj.b[11][1]++, undefined)).set('exact', exact ? (cov_l5hg93smj.b[12][0]++, '--exact') : (cov_l5hg93smj.b[12][1]++, undefined)).set('force', force ? (cov_l5hg93smj.b[13][0]++, '--force') : (cov_l5hg93smj.b[13][1]++, undefined));
}
/**
* Gets the prompter from an adapter given an adapter path
*/
function getPrompter(adapterPath) {
cov_l5hg93smj.f[7]++;
// Resolve the adapter path
let resolvedAdapterPath = (cov_l5hg93smj.s[25]++, resolveAdapterPath(adapterPath)); // Load the adapter
let adapter = (cov_l5hg93smj.s[26]++, require(resolvedAdapterPath));
/* istanbul ignore next */
if (adapter && adapter.prompter && (0, _util.isFunction)(adapter.prompter)) {
return adapter.prompter;
} else if (adapter && adapter.default && adapter.default.prompter && (0, _util.isFunction)(adapter.default.prompter)) {
return adapter.default.prompter;
} else {
throw new Error(`Could not find prompter method in the provided adapter module: ${adapterPath}`);
}
}
/**
* Given a resolvable module name or path, which can be a directory or file, will
* return a located adapter path or will throw.
*/
function resolveAdapterPath(inboundAdapterPath) {
cov_l5hg93smj.f[8]++;
// Check if inboundAdapterPath is a path or node module name
let parsed = (cov_l5hg93smj.s[27]++, _path.default.parse(inboundAdapterPath));
let isPath = (cov_l5hg93smj.s[28]++, (cov_l5hg93smj.b[14][0]++, parsed.dir.length > 0) && (cov_l5hg93smj.b[14][1]++, parsed.dir.charAt(0) !== "@")); // Resolve from the root of the git repo if inboundAdapterPath is a path
let absoluteAdapterPath = (cov_l5hg93smj.s[29]++, isPath ? (cov_l5hg93smj.b[15][0]++, _path.default.resolve(getGitRootPath(), inboundAdapterPath)) : (cov_l5hg93smj.b[15][1]++, inboundAdapterPath));
cov_l5hg93smj.s[30]++;
try {
cov_l5hg93smj.s[31]++;
// try to resolve the given path
return require.resolve(absoluteAdapterPath);
} catch (error) {
cov_l5hg93smj.s[32]++;
error.message = "Could not resolve " + absoluteAdapterPath + ". " + error.message;
cov_l5hg93smj.s[33]++;
throw error;
}
}
function getGitRootPath() {
cov_l5hg93smj.f[9]++;
cov_l5hg93smj.s[34]++;
return _child_process.default.spawnSync('git', ['rev-parse', '--show-toplevel'], {
encoding: 'utf8'
}).stdout.trim();
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFkYXB0ZXIuanMiXSwibmFtZXMiOlsiYWRkUGF0aFRvQWRhcHRlckNvbmZpZyIsImNsaVBhdGgiLCJyZXBvUGF0aCIsImFkYXB0ZXJOcG1OYW1lIiwiY29tbWl0aXplbkFkYXB0ZXJDb25maWciLCJjb25maWciLCJjb21taXRpemVuIiwicGF0aCIsInBhY2thZ2VKc29uUGF0aCIsImpvaW4iLCJnZXROZWFyZXN0UHJvamVjdFJvb3REaXJlY3RvcnkiLCJwYWNrYWdlSnNvblN0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiaW5kZW50IiwicGFja2FnZUpzb25Db250ZW50IiwiSlNPTiIsInBhcnNlIiwibmV3UGFja2FnZUpzb25Db250ZW50IiwiXyIsImdldCIsIm1lcmdlIiwid3JpdGVGaWxlU3luYyIsInN0cmluZ2lmeSIsImdlbmVyYXRlTnBtSW5zdGFsbEFkYXB0ZXJDb21tYW5kIiwic3RyaW5nTWFwcGluZ3MiLCJpbnN0YWxsQWRhcHRlckNvbW1hbmQiLCJ2YWx1ZSIsInZhbHVlcyIsImdlbmVyYXRlWWFybkFkZEFkYXB0ZXJDb21tYW5kIiwiZ2V0TmVhcmVzdE5vZGVNb2R1bGVzRGlyZWN0b3J5Iiwib3B0aW9ucyIsIm5vZGVNb2R1bGVzRGlyZWN0b3JpZXMiLCJsZW5ndGgiLCJjb25zb2xlIiwiZXJyb3IiLCJnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MiLCJzYXZlIiwic2F2ZURldiIsInNhdmVFeGFjdCIsImZvcmNlIiwiTWFwIiwic2V0IiwidW5kZWZpbmVkIiwiZ2V0WWFybkFkZFN0cmluZ01hcHBpbmdzIiwiZGV2IiwiZXhhY3QiLCJnZXRQcm9tcHRlciIsImFkYXB0ZXJQYXRoIiwicmVzb2x2ZWRBZGFwdGVyUGF0aCIsInJlc29sdmVBZGFwdGVyUGF0aCIsImFkYXB0ZXIiLCJyZXF1aXJlIiwicHJvbXB0ZXIiLCJkZWZhdWx0IiwiRXJyb3IiLCJpbmJvdW5kQWRhcHRlclBhdGgiLCJwYXJzZWQiLCJpc1BhdGgiLCJkaXIiLCJjaGFyQXQiLCJhYnNvbHV0ZUFkYXB0ZXJQYXRoIiwicmVzb2x2ZSIsImdldEdpdFJvb3RQYXRoIiwibWVzc2FnZSIsImNoaWxkUHJvY2VzcyIsInNwYXduU3luYyIsImVuY29kaW5nIiwic3Rkb3V0IiwidHJpbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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WixHQUFoRSxFQUFzRkMsTUFBdEYsQ0FBNkZDLElBQTdGLEVBQVA7QUFDRCIsInNvdXJjZVJvb3QiOiIvVXNlcnMvY2FsbHVtYWNyYWUvU2l0ZXMvZmluZC1ub2RlLW1vZHVsZXMvY3otY2xpL3NyYy9jb21taXRpemVuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoaWxkUHJvY2VzcyBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBmaW5kTm9kZU1vZHVsZXMgZnJvbSAnZmluZC1ub2RlLW1vZHVsZXMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBkZXRlY3RJbmRlbnQgZnJvbSAnZGV0ZWN0LWluZGVudCc7XG5cbmltcG9ydCB7IGlzRnVuY3Rpb24gfSBmcm9tICcuLi9jb21tb24vdXRpbCc7XG5cbmV4cG9ydCB7XG4gIGFkZFBhdGhUb0FkYXB0ZXJDb25maWcsXG4gIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeSxcbiAgZ2V0TmVhcmVzdFByb2plY3RSb290RGlyZWN0b3J5LFxuICBnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MsXG4gIGdldFByb21wdGVyLFxuICBnZW5lcmF0ZU5wbUluc3RhbGxBZGFwdGVyQ29tbWFuZCxcbiAgcmVzb2x2ZUFkYXB0ZXJQYXRoLFxuICBnZXRZYXJuQWRkU3RyaW5nTWFwcGluZ3MsXG4gIGdlbmVyYXRlWWFybkFkZEFkYXB0ZXJDb21tYW5kLFxufTtcblxuLyoqXG4gKiBBREFQVEVSXG4gKlxuICogQWRhcHRlciBpcyBnZW5lcmFsbHkgcmVzcG9uc2libGUgZm9yIGFjdHVhbGx5IGluc3RhbGxpbmcgYWRhcHRlcnMgdG8gYW5cbiAqIGVuZCB1c2VyJ3MgcHJvamVjdC4gSXQgZG9lcyBub3QgcGVyZm9ybSBjaGVja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzXG4gKiBhIHByZXZpb3VzIGNvbW1pdGl6ZW4gYWRhcHRlciBpbnN0YWxsZWQgb3IgaWYgdGhlIHByb3BlciBmaWVsZHMgd2VyZVxuICogcHJvdmlkZWQuIEl0IGRlZmVycyB0aGF0IHJlc3BvbnNpYmlsaXR5IHRvIGluaXQuXG4gKi9cblxuLyoqXG4gKiBNb2RpZmllcyB0aGUgcGFja2FnZS5qc29uLCBzZXRzIGNvbmZpZy5jb21taXRpemVuLnBhdGggdG8gdGhlIHBhdGggb2YgdGhlIGFkYXB0ZXJcbiAqIE11c3QgYmUgcGFzc2VkIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGNsaSdzIHJvb3RcbiAqL1xuZnVuY3Rpb24gYWRkUGF0aFRvQWRhcHRlckNvbmZpZyAoY2xpUGF0aCwgcmVwb1BhdGgsIGFkYXB0ZXJOcG1OYW1lKSB7XG5cbiAgbGV0IGNvbW1pdGl6ZW5BZGFwdGVyQ29uZmlnID0ge1xuICAgIGNvbmZpZzoge1xuICAgICAgY29tbWl0aXplbjoge1xuICAgICAgICBwYXRoOiBgLi9ub2RlX21vZHVsZXMvJHthZGFwdGVyTnBtTmFtZX1gXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGxldCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oZ2V0TmVhcmVzdFByb2plY3RSb290RGlyZWN0b3J5KHJlcG9QYXRoKSwgJ3BhY2thZ2UuanNvbicpO1xuICBsZXQgcGFja2FnZUpzb25TdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKTtcbiAgLy8gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpbmRlbnRhdGlvbiBhbmQgZmFsbHMgYmFjayB0byBhIGRlZmF1bHQgaWYgaXQgY2FuJ3RcbiAgbGV0IGluZGVudCA9IGRldGVjdEluZGVudChwYWNrYWdlSnNvblN0cmluZykuaW5kZW50IHx8ICcgICc7XG4gIGxldCBwYWNrYWdlSnNvbkNvbnRlbnQgPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uU3RyaW5nKTtcbiAgbGV0IG5ld1BhY2thZ2VKc29uQ29udGVudCA9ICcnO1xuICBpZiAoXy5nZXQocGFja2FnZUpzb25Db250ZW50LCAnY29uZmlnLmNvbW1pdGl6ZW4ucGF0aCcpICE9PSBhZGFwdGVyTnBtTmFtZSkge1xuICAgIG5ld1BhY2thZ2VKc29uQ29udGVudCA9IF8ubWVyZ2UocGFja2FnZUpzb25Db250ZW50LCBjb21taXRpemVuQWRhcHRlckNvbmZpZyk7XG4gIH1cbiAgZnMud3JpdGVGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsIEpTT04uc3RyaW5naWZ5KG5ld1BhY2thZ2VKc29uQ29udGVudCwgbnVsbCwgaW5kZW50KSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYW4gbnBtIGluc3RhbGwgY29tbWFuZCBnaXZlbiBhIG1hcCBvZiBzdHJpbmdzIGFuZCBhIHBhY2thZ2UgbmFtZVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZU5wbUluc3RhbGxBZGFwdGVyQ29tbWFuZCAoc3RyaW5nTWFwcGluZ3MsIGFkYXB0ZXJOcG1OYW1lKSB7XG5cbiAgLy8gU3RhcnQgd2l0aCBhbiBpbml0aWFsIG5wbSBpbnN0YWxsIGNvbW1hbmRcbiAgbGV0IGluc3RhbGxBZGFwdGVyQ29tbWFuZCA9IGBucG0gaW5zdGFsbCAke2FkYXB0ZXJOcG1OYW1lfWA7XG5cbiAgLy8gQXBwZW5kIHRoZSBuZWNjZXNhcnkgYXJndW1lbnRzIHRvIGl0IGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXNcbiAgZm9yIChsZXQgdmFsdWUgb2Ygc3RyaW5nTWFwcGluZ3MudmFsdWVzKCkpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIGluc3RhbGxBZGFwdGVyQ29tbWFuZCA9IGluc3RhbGxBZGFwdGVyQ29tbWFuZCArICcgJyArIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0YWxsQWRhcHRlckNvbW1hbmQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuIHlhcm4gYWRkIGNvbW1hbmQgZ2l2ZW4gYSBtYXAgb2Ygc3RyaW5ncyBhbmQgYSBwYWNrYWdlIG5hbWVcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVZYXJuQWRkQWRhcHRlckNvbW1hbmQgKHN0cmluZ01hcHBpbmdzLCBhZGFwdGVyTnBtTmFtZSkge1xuXG4gIC8vIFN0YXJ0IHdpdGggYW4gaW5pdGlhbCB5YXJuIGFkZCBjb21tYW5kXG4gIGxldCBpbnN0YWxsQWRhcHRlckNvbW1hbmQgPSBgeWFybiBhZGQgJHthZGFwdGVyTnBtTmFtZX1gO1xuXG4gIC8vIEFwcGVuZCB0aGUgbmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBpdCBiYXNlZCBvbiB1c2VyIHByZWZlcmVuY2VzXG4gIGZvciAobGV0IHZhbHVlIG9mIHN0cmluZ01hcHBpbmdzLnZhbHVlcygpKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICBpbnN0YWxsQWRhcHRlckNvbW1hbmQgPSBpbnN0YWxsQWRhcHRlckNvbW1hbmQgKyAnICcgKyB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdGFsbEFkYXB0ZXJDb21tYW5kO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5lYXJlc3QgbnBtX21vZHVsZXMgZGlyZWN0b3J5XG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3ROb2RlTW9kdWxlc0RpcmVjdG9yeSAob3B0aW9ucykge1xuXG4gIC8vIEdldCB0aGUgbmVhcmVzdCBub2RlX21vZHVsZXMgZGlyZWN0b3JpZXMgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnlcbiAgbGV0IG5vZGVNb2R1bGVzRGlyZWN0b3JpZXMgPSBmaW5kTm9kZU1vZHVsZXMob3B0aW9ucyk7XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGZpbmQgYSBub2RlX21vZHVsZXMgZm9sZGVyXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKG5vZGVNb2R1bGVzRGlyZWN0b3JpZXMgJiYgbm9kZU1vZHVsZXNEaXJlY3Rvcmllcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG5vZGVNb2R1bGVzRGlyZWN0b3JpZXNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5lcnJvcihgRXJyb3I6IENvdWxkIG5vdCBsb2NhdGUgbm9kZV9tb2R1bGVzIGluIHlvdXIgcHJvamVjdCdzIHJvb3QgZGlyZWN0b3J5LiBEaWQgeW91IGZvcmdldCB0byBucG0gaW5pdCBvciBucG0gaW5zdGFsbD9gKVxuICB9XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbmVhcmVzdCBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5XG4gKi9cbmZ1bmN0aW9uIGdldE5lYXJlc3RQcm9qZWN0Um9vdERpcmVjdG9yeSAocmVwb1BhdGgsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIHBhdGguam9pbihyZXBvUGF0aCwgZ2V0TmVhcmVzdE5vZGVNb2R1bGVzRGlyZWN0b3J5KG9wdGlvbnMpLCAnLy4uLycpO1xufVxuXG4vKipcbiAqIEdldHMgYSBtYXAgb2YgYXJndW1lbnRzIHdoZXJlIHRoZSB2YWx1ZSBpcyB0aGUgY29ycmVzcG9uZGluZyBucG0gc3RyaW5nc1xuICovXG5mdW5jdGlvbiBnZXROcG1JbnN0YWxsU3RyaW5nTWFwcGluZ3MgKHNhdmUsIHNhdmVEZXYsIHNhdmVFeGFjdCwgZm9yY2UpIHtcbiAgcmV0dXJuIG5ldyBNYXAoKVxuICAgIC5zZXQoJ3NhdmUnLCAoc2F2ZSAmJiAhc2F2ZURldikgPyAnLS1zYXZlJyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdzYXZlRGV2Jywgc2F2ZURldiA/ICctLXNhdmUtZGV2JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdzYXZlRXhhY3QnLCBzYXZlRXhhY3QgPyAnLS1zYXZlLWV4YWN0JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdmb3JjZScsIGZvcmNlID8gJy0tZm9yY2UnIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgbWFwIG9mIGFyZ3VtZW50cyB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIGNvcnJlc3BvbmRpbmcgeWFybiBzdHJpbmdzXG4gKi9cbmZ1bmN0aW9uIGdldFlhcm5BZGRTdHJpbmdNYXBwaW5ncyAoZGV2LCBleGFjdCwgZm9yY2UpIHtcbiAgcmV0dXJuIG5ldyBNYXAoKVxuICAgIC5zZXQoJ2RldicsIGRldiA/ICctLWRldicgOiB1bmRlZmluZWQpXG4gICAgLnNldCgnZXhhY3QnLCBleGFjdCA/ICctLWV4YWN0JyA6IHVuZGVmaW5lZClcbiAgICAuc2V0KCdmb3JjZScsIGZvcmNlID8gJy0tZm9yY2UnIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBwcm9tcHRlciBmcm9tIGFuIGFkYXB0ZXIgZ2l2ZW4gYW4gYWRhcHRlciBwYXRoXG4gKi9cbmZ1bmN0aW9uIGdldFByb21wdGVyIChhZGFwdGVyUGF0aCkge1xuICAvLyBSZXNvbHZlIHRoZSBhZGFwdGVyIHBhdGhcbiAgbGV0IHJlc29sdmVkQWRhcHRlclBhdGggPSByZXNvbHZlQWRhcHRlclBhdGgoYWRhcHRlclBhdGgpO1xuXG4gIC8vIExvYWQgdGhlIGFkYXB0ZXJcbiAgbGV0IGFkYXB0ZXIgPSByZXF1aXJlKHJlc29sdmVkQWRhcHRlclBhdGgpO1xuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChhZGFwdGVyICYmIGFkYXB0ZXIucHJvbXB0ZXIgJiYgaXNGdW5jdGlvbihhZGFwdGVyLnByb21wdGVyKSkge1xuICAgICByZXR1cm4gYWRhcHRlci5wcm9tcHRlcjtcbiAgfSBlbHNlIGlmIChhZGFwdGVyICYmIGFkYXB0ZXIuZGVmYXVsdCAmJiBhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXIgJiYgaXNGdW5jdGlvbihhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXIpKSB7XG4gICAgIHJldHVybiBhZGFwdGVyLmRlZmF1bHQucHJvbXB0ZXI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBwcm9tcHRlciBtZXRob2QgaW4gdGhlIHByb3ZpZGVkIGFkYXB0ZXIgbW9kdWxlOiAke2FkYXB0ZXJQYXRofWApO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSByZXNvbHZhYmxlIG1vZHVsZSBuYW1lIG9yIHBhdGgsIHdoaWNoIGNhbiBiZSBhIGRpcmVjdG9yeSBvciBmaWxlLCB3aWxsXG4gKiByZXR1cm4gYSBsb2NhdGVkIGFkYXB0ZXIgcGF0aCBvciB3aWxsIHRocm93LlxuICovXG5mdW5jdGlvbiByZXNvbHZlQWRhcHRlclBhdGggKGluYm91bmRBZGFwdGVyUGF0aCkge1xuICAvLyBDaGVjayBpZiBpbmJvdW5kQWRhcHRlclBhdGggaXMgYSBwYXRoIG9yIG5vZGUgbW9kdWxlIG5hbWVcbiAgbGV0IHBhcnNlZCA9IHBhdGgucGFyc2UoaW5ib3VuZEFkYXB0ZXJQYXRoKTtcbiAgbGV0IGlzUGF0aCA9IHBhcnNlZC5kaXIubGVuZ3RoID4gMCAmJiBwYXJzZWQuZGlyLmNoYXJBdCgwKSAhPT0gXCJAXCI7XG5cbiAgLy8gUmVzb2x2ZSBmcm9tIHRoZSByb290IG9mIHRoZSBnaXQgcmVwbyBpZiBpbmJvdW5kQWRhcHRlclBhdGggaXMgYSBwYXRoXG4gIGxldCBhYnNvbHV0ZUFkYXB0ZXJQYXRoID0gaXNQYXRoID9cbiAgICBwYXRoLnJlc29sdmUoZ2V0R2l0Um9vdFBhdGgoKSwgaW5ib3VuZEFkYXB0ZXJQYXRoKSA6XG4gICAgaW5ib3VuZEFkYXB0ZXJQYXRoO1xuXG4gIHRyeSB7XG4gICAgLy8gdHJ5IHRvIHJlc29sdmUgdGhlIGdpdmVuIHBhdGhcbiAgICByZXR1cm4gcmVxdWlyZS5yZXNvbHZlKGFic29sdXRlQWRhcHRlclBhdGgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGVycm9yLm1lc3NhZ2UgPSBcIkNvdWxkIG5vdCByZXNvbHZlIFwiICsgYWJzb2x1dGVBZGFwdGVyUGF0aCArIFwiLiBcIiArIGVycm9yLm1lc3NhZ2U7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0R2l0Um9vdFBhdGggKCkge1xuICByZXR1cm4gY2hpbGRQcm9jZXNzLnNwYXduU3luYygnZ2l0JywgWydyZXYtcGFyc2UnLCAnLS1zaG93LXRvcGxldmVsJ10sIHsgZW5jb2Rpbmc6ICd1dGY4JyB9KS5zdGRvdXQudHJpbSgpO1xufVxuIl19