smartfile/dist/smartfile.fs.js

270 lines
27 KiB
JavaScript

"use strict";
require("typings-global");
var plugins = require("./smartfile.plugins");
var SmartfileInterpreter = require("./smartfile.interpreter");
/*===============================================================
============================ Checks =============================
===============================================================*/
/**
*
* @param filePath
* @returns {boolean}
*/
exports.fileExistsSync = function (filePath) {
var fileExistsBool = false;
try {
plugins.fs.readFileSync(filePath);
fileExistsBool = true;
}
catch (err) {
fileExistsBool = false;
}
return fileExistsBool;
};
/**
*
* @param filePath
* @returns {any}
*/
exports.fileExists = function (filePath) {
var done = plugins.q.defer();
plugins.fs.access(filePath, plugins.fs.R_OK, function (err) {
err ? done.reject() : done.resolve();
});
return done.promise;
};
/**
* Checks if given path points to an existing directory
*/
exports.isDirectory = function (pathArg) {
return plugins.fs.statSync(pathArg).isDirectory();
};
/**
* Checks if a given path points to an existing file
*/
exports.isFile = function (pathArg) {
return plugins.fs.statSync(pathArg).isFile();
};
/*===============================================================
============================ FS ACTIONS =========================
===============================================================*/
/**
* ensures that a directory is in place
*/
exports.ensureDir = function (dirPathArg) {
var done = plugins.q.defer();
plugins.fs.ensureDir(dirPathArg, done.resolve);
return done.promise;
};
/**
* ensures that a directory is in place
*/
exports.ensureDirSync = function (dirPathArg) {
plugins.fs.ensureDirSync(dirPathArg);
};
/**
* copies a file from A to B on the local disk
*/
exports.copy = function (fromArg, toArg) {
var done = plugins.q.defer();
plugins.fs.copy(fromArg, toArg, {}, function () {
done.resolve();
});
return done.promise;
};
/**
* copies a file SYNCHRONOUSLY from A to B on the local disk
*/
exports.copySync = function (fromArg, toArg) {
plugins.fs.copySync(fromArg, toArg);
return true;
};
/**
* removes a file or folder from local disk
*/
exports.remove = function (pathArg) {
var done = plugins.q.defer();
plugins.fs.remove(pathArg, function () {
done.resolve();
});
return done.promise;
};
/**
* removes a file SYNCHRONOUSLY from local disk
*/
exports.removeSync = function (pathArg) {
plugins.fs.removeSync(pathArg);
return true;
};
/*===============================================================
============================ Write/Read =========================
===============================================================*/
/**
*
* @param filePathArg
* @returns {*}
*/
exports.toGulpStreamSync = function (filePathArg) {
var stream = plugins.gulp.src(filePathArg);
return stream;
};
exports.toGulpDestSync = function (folderPathArg) {
return plugins.gulp.dest(folderPathArg);
};
/**
*
* @param filePathArg
* @param fileTypeArg
* @returns {any}
*/
exports.toObjectSync = function (filePathArg, fileTypeArg) {
var fileString = plugins.fs.readFileSync(filePathArg, 'utf8');
var fileType;
fileTypeArg ? fileType = fileTypeArg : fileType = SmartfileInterpreter.filetype(filePathArg);
return SmartfileInterpreter.objectFile(fileString, fileType);
};
/**
* reads a file content to a String
* @param filePath
* @returns {string|Buffer|any}
*/
exports.toStringSync = function (filePath) {
var fileString;
fileString = plugins.fs.readFileSync(filePath, "utf8");
return fileString;
};
/**
*
* @param filePathArg
* @param options
* @returns {number}
*/
exports.toVinylSync = function (filePathArg, options) {
if (options === void 0) { options = {}; }
return plugins.vinylFile.readSync(filePathArg, options);
};
/**
* lets you reload files hot.
* @param path
* @returns {any}
*/
exports.requireReload = function (path) {
return plugins.requireReload(path);
};
/**
* lists Folders in a directory on local disk
* @returns Promise
*/
exports.listFolders = function (pathArg, regexFilter) {
var done = plugins.q.defer();
var folderArray = plugins.fs.readdirSync(pathArg).filter(function (file) {
return plugins.fs.statSync(plugins.path.join(pathArg, file)).isDirectory();
});
if (regexFilter) {
folderArray = folderArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
done.resolve(folderArray);
return done.promise;
};
/**
* lists Folders SYNCHRONOUSLY in a directory on local disk
* @returns an array with the folder names as strings
*/
exports.listFoldersSync = function (pathArg, regexFilter) {
var folderArray = plugins.fs.readdirSync(pathArg).filter(function (file) {
return plugins.fs.statSync(plugins.path.join(pathArg, file)).isDirectory();
});
if (regexFilter) {
folderArray = folderArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
;
return folderArray;
};
/**
* lists Files in a directory on local disk
* @returns Promise
*/
exports.listFiles = function (pathArg, regexFilter) {
var done = plugins.q.defer();
var fileArray = plugins.fs.readdirSync(pathArg).filter(function (file) {
return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile();
});
if (regexFilter) {
fileArray = fileArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
;
done.resolve(fileArray);
return done.promise;
};
/**
* lists Files SYNCHRONOUSLY in a directory on local disk
* @returns an array with the folder names as strings
*/
exports.listFilesSync = function (pathArg, regexFilter) {
var fileArray = plugins.fs.readdirSync(pathArg).filter(function (file) {
return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile();
});
if (regexFilter) {
fileArray = fileArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
;
return fileArray;
};
/**
* lists all items (folders AND files) in a directory on local disk
* @returns Promise
*/
exports.listAllItems = function (pathArg, regexFilter) {
var done = plugins.q.defer();
var allItmesArray = plugins.fs.readdirSync(pathArg);
if (regexFilter) {
allItmesArray = allItmesArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
;
done.resolve(allItmesArray);
return done.promise;
};
/**
* lists all items (folders AND files) SYNCHRONOUSLY in a directory on local disk
* @returns an array with the folder names as strings
*/
exports.listAllItemsSync = function (pathArg, regexFilter) {
var allItmesArray = plugins.fs.readdirSync(pathArg).filter(function (file) {
return plugins.fs.statSync(plugins.path.join(pathArg, file)).isFile();
});
if (regexFilter) {
allItmesArray = allItmesArray.filter(function (fileItem) {
return regexFilter.test(fileItem);
});
}
;
return allItmesArray;
};
exports.listFileTree = function (dirPath, miniMatchFilter) {
var done = plugins.q.defer();
var options = {
cwd: dirPath
};
plugins.glob(miniMatchFilter, options, function (err, files) {
if (err) {
console.log(err);
done.reject();
}
;
done.resolve(files);
});
return done.promise;
};
//# sourceMappingURL=data:application/json;charset=utf8;base64,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ekIsQ0FBQyxDQUFDO0FBRVMsb0JBQVksR0FBRyxVQUFDLE9BQWMsRUFBRSxlQUFzQjtJQUM3RCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLElBQUksT0FBTyxHQUFHO1FBQ1YsR0FBRyxFQUFDLE9BQU87S0FDZCxDQUFBO0lBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUMsT0FBTyxFQUFDLFVBQUMsR0FBRyxFQUFDLEtBQWM7UUFDcEQsRUFBRSxDQUFBLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBQztZQUNKLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLENBQUM7UUFBQSxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsImZpbGUiOiJzbWFydGZpbGUuZnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJ0eXBpbmdzLWdsb2JhbFwiO1xuXG5pbXBvcnQgcGx1Z2lucyA9IHJlcXVpcmUoXCIuL3NtYXJ0ZmlsZS5wbHVnaW5zXCIpO1xuaW1wb3J0IFNtYXJ0ZmlsZUludGVycHJldGVyID0gcmVxdWlyZShcIi4vc21hcnRmaWxlLmludGVycHJldGVyXCIpO1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDaGVja3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBsZXQgZmlsZUV4aXN0c1N5bmMgPSBmdW5jdGlvbihmaWxlUGF0aCk6Ym9vbGVhbiB7XG4gICAgbGV0IGZpbGVFeGlzdHNCb29sOmJvb2xlYW4gPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBwbHVnaW5zLmZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCk7XG4gICAgICAgIGZpbGVFeGlzdHNCb29sID0gdHJ1ZVxuICAgIH1cbiAgICBjYXRjaChlcnIpe1xuICAgICAgICBmaWxlRXhpc3RzQm9vbCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZUV4aXN0c0Jvb2w7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZmlsZVBhdGhcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmV4cG9ydCBsZXQgZmlsZUV4aXN0cyA9IGZ1bmN0aW9uKGZpbGVQYXRoKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHBsdWdpbnMuZnMuYWNjZXNzKGZpbGVQYXRoLCBwbHVnaW5zLmZzLlJfT0ssIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgZXJyID8gZG9uZS5yZWplY3QoKSA6IGRvbmUucmVzb2x2ZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiBnaXZlbiBwYXRoIHBvaW50cyB0byBhbiBleGlzdGluZyBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGxldCBpc0RpcmVjdG9yeSA9IGZ1bmN0aW9uKHBhdGhBcmcpOmJvb2xlYW57XG4gICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGF0aEFyZykuaXNEaXJlY3RvcnkoKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gcGF0aCBwb2ludHMgdG8gYW4gZXhpc3RpbmcgZmlsZVxuICovXG5leHBvcnQgbGV0IGlzRmlsZSA9IGZ1bmN0aW9uKHBhdGhBcmcpOmJvb2xlYW57XG4gICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGF0aEFyZykuaXNGaWxlKCk7XG59O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGUyBBQ1RJT05TID09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICogZW5zdXJlcyB0aGF0IGEgZGlyZWN0b3J5IGlzIGluIHBsYWNlXG4gKi9cbmV4cG9ydCBsZXQgZW5zdXJlRGlyID0gKGRpclBhdGhBcmc6c3RyaW5nKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBwbHVnaW5zLmZzLmVuc3VyZURpcihkaXJQYXRoQXJnLGRvbmUucmVzb2x2ZSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxuLyoqXG4gKiBlbnN1cmVzIHRoYXQgYSBkaXJlY3RvcnkgaXMgaW4gcGxhY2VcbiAqL1xuZXhwb3J0IGxldCBlbnN1cmVEaXJTeW5jID0gKGRpclBhdGhBcmc6c3RyaW5nKSA9PiB7XG4gICAgcGx1Z2lucy5mcy5lbnN1cmVEaXJTeW5jKGRpclBhdGhBcmcpO1xufVxuXG4vKipcbiAqIGNvcGllcyBhIGZpbGUgZnJvbSBBIHRvIEIgb24gdGhlIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCBjb3B5ID0gZnVuY3Rpb24oZnJvbUFyZzpzdHJpbmcsIHRvQXJnOnN0cmluZyl7XG4gICAgdmFyIGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBwbHVnaW5zLmZzLmNvcHkoZnJvbUFyZyx0b0FyZyx7fSxmdW5jdGlvbigpe1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBjb3BpZXMgYSBmaWxlIFNZTkNIUk9OT1VTTFkgZnJvbSBBIHRvIEIgb24gdGhlIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCBjb3B5U3luYyA9IGZ1bmN0aW9uKGZyb21Bcmc6c3RyaW5nLHRvQXJnOnN0cmluZyk6Ym9vbGVhbntcbiAgICBwbHVnaW5zLmZzLmNvcHlTeW5jKGZyb21BcmcsdG9BcmcpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbiBcbiAvKipcbiAgKiByZW1vdmVzIGEgZmlsZSBvciBmb2xkZXIgZnJvbSBsb2NhbCBkaXNrXG4gICovXG5leHBvcnQgbGV0IHJlbW92ZSA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nKXtcbiAgICB2YXIgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIHBsdWdpbnMuZnMucmVtb3ZlKHBhdGhBcmcsZnVuY3Rpb24oKXtcbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07XG5cbi8qKlxuICogcmVtb3ZlcyBhIGZpbGUgU1lOQ0hST05PVVNMWSBmcm9tIGxvY2FsIGRpc2tcbiAqL1xuZXhwb3J0IGxldCByZW1vdmVTeW5jID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcpOmJvb2xlYW57XG4gICAgcGx1Z2lucy5mcy5yZW1vdmVTeW5jKHBhdGhBcmcpO1xuICAgIHJldHVybiB0cnVlO1xufTtcblxuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBXcml0ZS9SZWFkID09PT09PT09PT09PT09PT09PT09PT09PT1cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBsZXQgdG9HdWxwU3RyZWFtU3luYyA9IGZ1bmN0aW9uKGZpbGVQYXRoQXJnOnN0cmluZyl7XG4gICAgbGV0IHN0cmVhbSA9IHBsdWdpbnMuZ3VscC5zcmMoZmlsZVBhdGhBcmcpO1xuICAgIHJldHVybiBzdHJlYW07XG59O1xuXG5leHBvcnQgbGV0IHRvR3VscERlc3RTeW5jID0gZnVuY3Rpb24oZm9sZGVyUGF0aEFyZzpzdHJpbmcpe1xuICAgIHJldHVybiBwbHVnaW5zLmd1bHAuZGVzdChmb2xkZXJQYXRoQXJnKTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHBhcmFtIGZpbGVUeXBlQXJnXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5leHBvcnQgbGV0IHRvT2JqZWN0U3luYyA9IGZ1bmN0aW9uKGZpbGVQYXRoQXJnLGZpbGVUeXBlQXJnPykge1xuICAgIGxldCBmaWxlU3RyaW5nID0gcGx1Z2lucy5mcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGhBcmcsICd1dGY4Jyk7XG4gICAgbGV0IGZpbGVUeXBlO1xuICAgIGZpbGVUeXBlQXJnID8gZmlsZVR5cGUgPSBmaWxlVHlwZUFyZyA6IGZpbGVUeXBlID0gU21hcnRmaWxlSW50ZXJwcmV0ZXIuZmlsZXR5cGUoZmlsZVBhdGhBcmcpO1xuICAgIHJldHVybiBTbWFydGZpbGVJbnRlcnByZXRlci5vYmplY3RGaWxlKGZpbGVTdHJpbmcsZmlsZVR5cGUpO1xufTtcblxuLyoqXG4gKiByZWFkcyBhIGZpbGUgY29udGVudCB0byBhIFN0cmluZ1xuICogQHBhcmFtIGZpbGVQYXRoXG4gKiBAcmV0dXJucyB7c3RyaW5nfEJ1ZmZlcnxhbnl9XG4gKi9cbmV4cG9ydCBsZXQgdG9TdHJpbmdTeW5jID0gZnVuY3Rpb24oZmlsZVBhdGgpIHtcbiAgICBsZXQgZmlsZVN0cmluZztcbiAgICBmaWxlU3RyaW5nID0gcGx1Z2lucy5mcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsIFwidXRmOFwiKTtcbiAgICByZXR1cm4gZmlsZVN0cmluZztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBmaWxlUGF0aEFyZ1xuICogQHBhcmFtIG9wdGlvbnNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBsZXQgdG9WaW55bFN5bmMgPSBmdW5jdGlvbihmaWxlUGF0aEFyZyxvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gcGx1Z2lucy52aW55bEZpbGUucmVhZFN5bmMoZmlsZVBhdGhBcmcsb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIGxldHMgeW91IHJlbG9hZCBmaWxlcyBob3QuXG4gKiBAcGFyYW0gcGF0aFxuICogQHJldHVybnMge2FueX1cbiAqL1xuZXhwb3J0IGxldCByZXF1aXJlUmVsb2FkID0gZnVuY3Rpb24ocGF0aDpzdHJpbmcpe1xuICAgIHJldHVybiBwbHVnaW5zLnJlcXVpcmVSZWxvYWQocGF0aCk7XG59O1xuXG4vKipcbiAqIGxpc3RzIEZvbGRlcnMgaW4gYSBkaXJlY3Rvcnkgb24gbG9jYWwgZGlza1xuICogQHJldHVybnMgUHJvbWlzZVxuICovXG5leHBvcnQgbGV0IGxpc3RGb2xkZXJzID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcscmVnZXhGaWx0ZXI/OlJlZ0V4cCl7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBsZXQgZm9sZGVyQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpLmZpbHRlcihmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHJldHVybiBwbHVnaW5zLmZzLnN0YXRTeW5jKHBsdWdpbnMucGF0aC5qb2luKHBhdGhBcmcsIGZpbGUpKS5pc0RpcmVjdG9yeSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgZm9sZGVyQXJyYXkgPSBmb2xkZXJBcnJheS5maWx0ZXIoKGZpbGVJdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZXhGaWx0ZXIudGVzdChmaWxlSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBkb25lLnJlc29sdmUoZm9sZGVyQXJyYXkpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59O1xuXG4vKipcbiAqIGxpc3RzIEZvbGRlcnMgU1lOQ0hST05PVVNMWSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBmb2xkZXIgbmFtZXMgYXMgc3RyaW5nc1xuICovXG5leHBvcnQgbGV0IGxpc3RGb2xkZXJzU3luYyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLHJlZ2V4RmlsdGVyPzpSZWdFeHApOnN0cmluZ1tde1xuICAgIGxldCBmb2xkZXJBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRGlyZWN0b3J5KCk7XG4gICAgfSk7XG4gICAgaWYocmVnZXhGaWx0ZXIpe1xuICAgICAgICBmb2xkZXJBcnJheSA9IGZvbGRlckFycmF5LmZpbHRlcigoZmlsZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWdleEZpbHRlci50ZXN0KGZpbGVJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gZm9sZGVyQXJyYXk7XG59O1xuXG5cbi8qKlxuICogbGlzdHMgRmlsZXMgaW4gYSBkaXJlY3Rvcnkgb24gbG9jYWwgZGlza1xuICogQHJldHVybnMgUHJvbWlzZVxuICovXG5leHBvcnQgbGV0IGxpc3RGaWxlcyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLCByZWdleEZpbHRlcj86UmVnRXhwKXtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCBmaWxlQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpLmZpbHRlcihmdW5jdGlvbihmaWxlKSB7XG4gICAgICAgIHJldHVybiBwbHVnaW5zLmZzLnN0YXRTeW5jKHBsdWdpbnMucGF0aC5qb2luKHBhdGhBcmcsIGZpbGUpKS5pc0ZpbGUoKTtcbiAgICB9KTtcbiAgICBpZihyZWdleEZpbHRlcil7XG4gICAgICAgIGZpbGVBcnJheSA9IGZpbGVBcnJheS5maWx0ZXIoKGZpbGVJdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gcmVnZXhGaWx0ZXIudGVzdChmaWxlSXRlbSk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgZG9uZS5yZXNvbHZlKGZpbGVBcnJheSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07XG5cbi8qKlxuICogbGlzdHMgRmlsZXMgU1lOQ0hST05PVVNMWSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSBmb2xkZXIgbmFtZXMgYXMgc3RyaW5nc1xuICovXG5leHBvcnQgbGV0IGxpc3RGaWxlc1N5bmMgPSBmdW5jdGlvbihwYXRoQXJnOnN0cmluZywgcmVnZXhGaWx0ZXI/OlJlZ0V4cCk6c3RyaW5nW117XG4gICAgbGV0IGZpbGVBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRmlsZSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgZmlsZUFycmF5ID0gZmlsZUFycmF5LmZpbHRlcigoZmlsZUl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZWdleEZpbHRlci50ZXN0KGZpbGVJdGVtKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gZmlsZUFycmF5O1xufTtcblxuLyoqXG4gKiBsaXN0cyBhbGwgaXRlbXMgKGZvbGRlcnMgQU5EIGZpbGVzKSBpbiBhIGRpcmVjdG9yeSBvbiBsb2NhbCBkaXNrXG4gKiBAcmV0dXJucyBQcm9taXNlXG4gKi9cbmV4cG9ydCBsZXQgbGlzdEFsbEl0ZW1zID0gZnVuY3Rpb24ocGF0aEFyZzpzdHJpbmcsIHJlZ2V4RmlsdGVyPzpSZWdFeHApe1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgbGV0IGFsbEl0bWVzQXJyYXkgPSBwbHVnaW5zLmZzLnJlYWRkaXJTeW5jKHBhdGhBcmcpO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgYWxsSXRtZXNBcnJheSA9IGFsbEl0bWVzQXJyYXkuZmlsdGVyKChmaWxlSXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4RmlsdGVyLnRlc3QoZmlsZUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGRvbmUucmVzb2x2ZShhbGxJdG1lc0FycmF5KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxuLyoqXG4gKiBsaXN0cyBhbGwgaXRlbXMgKGZvbGRlcnMgQU5EIGZpbGVzKSBTWU5DSFJPTk9VU0xZIGluIGEgZGlyZWN0b3J5IG9uIGxvY2FsIGRpc2tcbiAqIEByZXR1cm5zIGFuIGFycmF5IHdpdGggdGhlIGZvbGRlciBuYW1lcyBhcyBzdHJpbmdzXG4gKi9cbmV4cG9ydCBsZXQgbGlzdEFsbEl0ZW1zU3luYyA9IGZ1bmN0aW9uKHBhdGhBcmc6c3RyaW5nLCByZWdleEZpbHRlcj86UmVnRXhwKTpzdHJpbmdbXXtcbiAgICBsZXQgYWxsSXRtZXNBcnJheSA9IHBsdWdpbnMuZnMucmVhZGRpclN5bmMocGF0aEFyZykuZmlsdGVyKGZ1bmN0aW9uKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHBsdWdpbnMuZnMuc3RhdFN5bmMocGx1Z2lucy5wYXRoLmpvaW4ocGF0aEFyZywgZmlsZSkpLmlzRmlsZSgpO1xuICAgIH0pO1xuICAgIGlmKHJlZ2V4RmlsdGVyKXtcbiAgICAgICAgYWxsSXRtZXNBcnJheSA9IGFsbEl0bWVzQXJyYXkuZmlsdGVyKChmaWxlSXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHJlZ2V4RmlsdGVyLnRlc3QoZmlsZUl0ZW0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBhbGxJdG1lc0FycmF5O1xufTtcblxuZXhwb3J0IGxldCBsaXN0RmlsZVRyZWUgPSAoZGlyUGF0aDpzdHJpbmcsIG1pbmlNYXRjaEZpbHRlcjpzdHJpbmcpID0+IHtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGxldCBvcHRpb25zID0ge1xuICAgICAgICBjd2Q6ZGlyUGF0aFxuICAgIH1cbiAgICBwbHVnaW5zLmdsb2IobWluaU1hdGNoRmlsdGVyLG9wdGlvbnMsKGVycixmaWxlczpzdHJpbmdbXSkgPT4ge1xuICAgICAgICBpZihlcnIpe1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIGRvbmUucmVqZWN0KCk7XG4gICAgICAgIH07XG4gICAgICAgIGRvbmUucmVzb2x2ZShmaWxlcyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn07Il19