filestack-js
Version:
Official JavaScript library for Filestack
245 lines (243 loc) • 25.1 kB
JavaScript
;
/*
* Copyright (c) 2018 by Filestack.
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.cleanUpCallbacks = exports.filterObject = exports.sanitizeName = exports.extensionToMime = exports.getMimetype = exports.uniqueId = exports.uniqueTime = exports.removeEmpty = exports.resolveHost = exports.resolveCdnUrl = void 0;
var tslib_1 = require("tslib");
var extensions_1 = require("./extensions");
var file_type_1 = require("file-type");
var isutf8_1 = tslib_1.__importDefault(require("isutf8"));
/**
* Resolve cdn url based on handle type
*
* @private
* @param session session object
* @param handle file handle (hash, src://alias, url)
*/
var resolveCdnUrl = function (session, handle) {
var cdnURL = session.urls.cdnUrl;
if (handle && (handle.indexOf('src:') === 0 || handle.indexOf('http') === 0)) {
if (!session.apikey) {
throw new Error('Api key is required when storage alias is provided');
}
// apikey is required for alias or external sources call
return "".concat(cdnURL, "/").concat(session.apikey);
}
return cdnURL;
};
exports.resolveCdnUrl = resolveCdnUrl;
/**
* Resolve all urls with provided cnames
*
* @private
* @param urls
* @param cname
*/
var resolveHost = function (urls, cname) {
if (!cname) {
return urls;
}
var hosts = /filestackapi.com|filestackcontent.com/i;
Object.keys(urls).forEach(function (key) {
urls[key] = urls[key].replace(hosts, cname);
});
return urls;
};
exports.resolveHost = resolveHost;
/**
* Removes empty options from object
*
* @private
* @param obj
*/
var removeEmpty = function (obj) {
var newObj = tslib_1.__assign({}, obj);
Object.keys(newObj).forEach(function (k) { return !newObj[k] && typeof newObj[k] !== 'boolean' && delete newObj[k]; });
return newObj;
};
exports.removeEmpty = removeEmpty;
/**
* Returns unique time
*/
var last;
var uniqueTime = function () {
var time = Date.now();
last = time === last ? time + 1 : time;
return last;
};
exports.uniqueTime = uniqueTime;
/**
* Generates random string with provided length
*
* @param len
*/
var uniqueId = function (len) {
if (len === void 0) { len = 10; }
return new Array(len).join().replace(/(.|$)/g, function () { return ((Math.random() * 36) | 0).toString(36)[Math.random() < 0.5 ? 'toString' : 'toUpperCase'](); });
};
exports.uniqueId = uniqueId;
/**
* Check if input is a svg
*
* @param {Uint8Array | Buffer} file
* @returns {string} - mimetype
*/
var getMimetype = function (file, name) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var type, e_1, excludedMimetypes, mime_1;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, (0, file_type_1.fromBuffer)(file)];
case 1:
type = _a.sent();
return [3 /*break*/, 3];
case 2:
e_1 = _a.sent();
console.warn("An exception occurred while processing the buffer:", e_1.message);
return [3 /*break*/, 3];
case 3:
excludedMimetypes = ['text/plain', 'application/octet-stream', 'application/x-ms', 'application/x-msi', 'application/zip'];
if (type && excludedMimetypes.indexOf(type.mime) === -1) {
return [2 /*return*/, type.mime];
}
if (name && name.indexOf('.') > -1) {
mime_1 = (0, exports.extensionToMime)(name);
if (mime_1) {
return [2 /*return*/, mime_1];
}
}
try {
if ((0, isutf8_1.default)(file)) {
return [2 /*return*/, 'text/plain'];
}
}
catch (e) {
/* istanbul ignore next */
console.warn('Additional mimetype checks (text/plain) are currently not supported for browsers');
}
// this is only fallback, omit it in coverage
/* istanbul ignore next */
// if we cant find types by extensions and we have magic bytes fallback to it
if (type) {
return [2 /*return*/, type.mime];
}
return [2 /*return*/, 'application/octet-stream'];
}
});
}); };
exports.getMimetype = getMimetype;
/**
* Change extension to according mimetype using ext=>mimetype map
*
* @param ext - string
* @return string|boolean
*/
var extensionToMime = function (ext) {
if (!ext || ext.length === 0) {
return;
}
if (ext.split('/').length === 2) {
return ext;
}
if (ext.indexOf('.') > -1) {
ext = ext.split('.').pop();
}
ext = ext.toLocaleLowerCase();
var keys = Object.keys(extensions_1.ExtensionsMap);
var mapLen = keys.length;
for (var i = 0; i < mapLen; i++) {
if (extensions_1.ExtensionsMap[keys[i]].indexOf(ext) > -1) {
return keys[i];
}
}
return;
};
exports.extensionToMime = extensionToMime;
/**
* Sanitize file name
*
* @param name
* @param {bool} options - enable,disable sanitizer, default enabled
* @param {string} options.replacement - replacement for sanitized chars defaults to "-"
* @param {string[]} options.exclude - array with excluded chars default - `['\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']`
*/
var sanitizeName = function (name, options) {
if (options === void 0) { options = true; }
if (typeof options === 'boolean' && !options) {
return name;
}
var ext;
var replacement = typeof options !== 'boolean' && options.replacement ? options.replacement : '-';
var exclude = typeof options !== 'boolean' && options.exclude ? options.exclude : ['\\', '{', '}', '|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>'];
if (!name || name.length === 0) {
return 'undefined';
}
var fileParts = name.split('.');
if (fileParts.length > 1) {
ext = fileParts.pop();
}
return "".concat(fileParts
.join('.')
.split('')
.map(function (char) { return (exclude.indexOf(char) > -1 ? replacement : char); })
.join('')).concat(ext ? '.' + ext : '');
};
exports.sanitizeName = sanitizeName;
/**
* Filter object to given fields
*
* @param toFilter
* @param requiredFields
*/
var filterObject = function (toFilter, requiredFields) {
if (!requiredFields || requiredFields.length === 0) {
return toFilter;
}
if (Object.keys(toFilter).length === 0) {
return toFilter;
}
return Object.keys(toFilter)
.filter(function (f) { return requiredFields.indexOf(f) > -1; })
.reduce(function (obj, key) {
var _a;
return (tslib_1.__assign(tslib_1.__assign({}, obj), (_a = {}, _a[key] = toFilter[key], _a)));
}, {});
};
exports.filterObject = filterObject;
/**
* Deep cleanup object from functions
*
* @param obj
*/
var cleanUpCallbacks = function (obj) {
if (!obj || Object.keys(obj).length === 0) {
return obj;
}
Object.keys(obj).forEach(function (k) {
if (typeof obj[k] === 'function') {
obj[k] = undefined;
}
if (obj[k] === Object(obj[k])) {
obj[k] = (0, exports.cleanUpCallbacks)(obj[k]);
}
});
return obj;
};
exports.cleanUpCallbacks = cleanUpCallbacks;
tslib_1.__exportStar(require("./index.node"), exports);
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUlILDJDQUE2QztBQUM3Qyx1Q0FBdUM7QUFDdkMsMERBQTRCO0FBRTVCOzs7Ozs7R0FNRztBQUNJLElBQU0sYUFBYSxHQUFHLFVBQUMsT0FBZ0IsRUFBRSxNQUFjO0lBQzVELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRW5DLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCx3REFBd0Q7UUFDeEQsT0FBTyxVQUFHLE1BQU0sY0FBSSxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUM7S0FDdEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFiVyxRQUFBLGFBQWEsaUJBYXhCO0FBRUY7Ozs7OztHQU1HO0FBQ0ksSUFBTSxXQUFXLEdBQUcsVUFBQyxJQUFXLEVBQUUsS0FBYTtJQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQU0sS0FBSyxHQUFHLHdDQUF3QyxDQUFDO0lBRXZELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFF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LE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFBLHdCQUFnQixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQWhCVyxRQUFBLGdCQUFnQixvQkFnQjNCO0FBRUYsdURBQTZCIiwiZmlsZSI6ImxpYi91dGlscy9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHsgSG9zdHMgfSBmcm9tICcuLy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zTWFwIH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IGZyb21CdWZmZXIgfSBmcm9tICdmaWxlLXR5cGUnO1xuaW1wb3J0IGlzdXRmOCBmcm9tICdpc3V0ZjgnO1xuXG4vKipcbiAqIFJlc29sdmUgY2RuIHVybCBiYXNlZCBvbiBoYW5kbGUgdHlwZVxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gc2Vzc2lvbiBzZXNzaW9uIG9iamVjdFxuICogQHBhcmFtIGhhbmRsZSBmaWxlIGhhbmRsZSAoaGFzaCwgc3JjOi8vYWxpYXMsIHVybClcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVDZG5VcmwgPSAoc2Vzc2lvbjogU2Vzc2lvbiwgaGFuZGxlOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBjZG5VUkwgPSBzZXNzaW9uLnVybHMuY2RuVXJsO1xuXG4gIGlmIChoYW5kbGUgJiYgKGhhbmRsZS5pbmRleE9mKCdzcmM6JykgPT09IDAgfHwgaGFuZGxlLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCkpIHtcbiAgICBpZiAoIXNlc3Npb24uYXBpa2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwaSBrZXkgaXMgcmVxdWlyZWQgd2hlbiBzdG9yYWdlIGFsaWFzIGlzIHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgLy8gYXBpa2V5IGlzIHJlcXVpcmVkIGZvciBhbGlhcyBvciBleHRlcm5hbCBzb3VyY2VzIGNhbGxcbiAgICByZXR1cm4gYCR7Y2RuVVJMfS8ke3Nlc3Npb24uYXBpa2V5fWA7XG4gIH1cblxuICByZXR1cm4gY2RuVVJMO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlIGFsbCB1cmxzIHdpdGggcHJvdmlkZWQgY25hbWVzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB1cmxzXG4gKiBAcGFyYW0gY25hbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVIb3N0ID0gKHVybHM6IEhvc3RzLCBjbmFtZTogc3RyaW5nKTogSG9zdHMgPT4ge1xuICBpZiAoIWNuYW1lKSB7XG4gICAgcmV0dXJuIHVybHM7XG4gIH1cblxuICBjb25zdCBob3N0cyA9IC9maWxlc3RhY2thcGkuY29tfGZpbGVzdGFja2NvbnRlbnQuY29tL2k7XG5cbiAgT2JqZWN0LmtleXModXJscykuZm9yRWFjaChrZXkgPT4ge1xuICAgIHVybHNba2V5XSA9IHVybHNba2V5XS5yZXBsYWNlKGhvc3RzLCBjbmFtZSk7XG4gIH0pO1xuXG4gIHJldHVybiB1cmxzO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIGVtcHR5IG9wdGlvbnMgZnJvbSBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIG9ialxuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRW1wdHkgPSAob2JqOiBhbnkpID0+IHtcbiAgY29uc3QgbmV3T2JqID0geyAuLi5vYmogfTtcbiAgT2JqZWN0LmtleXMobmV3T2JqKS5mb3JFYWNoKGsgPT4gIW5ld09ialtrXSAmJiB0eXBlb2YgbmV3T2JqW2tdICE9PSAnYm9vbGVhbicgJiYgZGVsZXRlIG5ld09ialtrXSk7XG4gIHJldHVybiBuZXdPYmo7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdW5pcXVlIHRpbWVcbiAqL1xubGV0IGxhc3Q7XG5leHBvcnQgY29uc3QgdW5pcXVlVGltZSA9ICgpID0+IHtcbiAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gIGxhc3QgPSB0aW1lID09PSBsYXN0ID8gdGltZSArIDEgOiB0aW1lO1xuICByZXR1cm4gbGFzdDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIHJhbmRvbSBzdHJpbmcgd2l0aCBwcm92aWRlZCBsZW5ndGhcbiAqXG4gKiBAcGFyYW0gbGVuXG4gKi9cbmV4cG9ydCBjb25zdCB1bmlxdWVJZCA9IChsZW46IG51bWJlciA9IDEwKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIG5ldyBBcnJheShsZW4pLmpvaW4oKS5yZXBsYWNlKC8oLnwkKS9nLCAoKSA9PiAoKE1hdGgucmFuZG9tKCkgKiAzNikgfCAwKS50b1N0cmluZygzNilbTWF0aC5yYW5kb20oKSA8IDAuNSA/ICd0b1N0cmluZycgOiAndG9VcHBlckNhc2UnXSgpKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgaW5wdXQgaXMgYSBzdmdcbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXkgfCBCdWZmZXJ9IGZpbGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gbWltZXR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1pbWV0eXBlID0gYXN5bmMoZmlsZTogVWludDhBcnJheSB8IEJ1ZmZlciwgbmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGxldCB0eXBlO1xuXG4gIHRyeSB7XG4gICAgdHlwZSA9IGF3YWl0IGZyb21CdWZmZXIoZmlsZSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIGNvbnNvbGUud2FybihcIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBwcm9jZXNzaW5nIHRoZSBidWZmZXI6XCIsIGUubWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBleGNsdWRlZE1pbWV0eXBlcyA9IFsndGV4dC9wbGFpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnYXBwbGljYXRpb24veC1tcycsICdhcHBsaWNhdGlvbi94LW1zaScsICdhcHBsaWNhdGlvbi96aXAnXTtcblxuICBpZiAodHlwZSAmJiBleGNsdWRlZE1pbWV0eXBlcy5pbmRleE9mKHR5cGUubWltZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGUubWltZTtcbiAgfVxuXG4gIGlmIChuYW1lICYmIG5hbWUuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICBjb25zdCBtaW1lID0gZXh0ZW5zaW9uVG9NaW1lKG5hbWUpO1xuXG4gICAgaWYgKG1pbWUpIHtcbiAgICAgIHJldHVybiBtaW1lO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGlzdXRmOChmaWxlKSkge1xuICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNvbnNvbGUud2FybignQWRkaXRpb25hbCBtaW1ldHlwZSBjaGVja3MgKHRleHQvcGxhaW4pIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3IgYnJvd3NlcnMnKTtcbiAgfVxuICAvLyB0aGlzIGlzIG9ubHkgZmFsbGJhY2ssIG9taXQgaXQgaW4gY292ZXJhZ2VcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAvLyBpZiB3ZSBjYW50IGZpbmQgdHlwZXMgYnkgZXh0ZW5zaW9ucyBhbmQgd2UgaGF2ZSBtYWdpYyBieXRlcyBmYWxsYmFjayB0byBpdFxuICBpZiAodHlwZSkge1xuICAgIHJldHVybiB0eXBlLm1pbWU7XG4gIH1cblxuICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG59O1xuXG4vKipcbiAqIENoYW5nZSBleHRlbnNpb24gdG8gYWNjb3JkaW5nIG1pbWV0eXBlIHVzaW5nIGV4dD0+bWltZXR5cGUgbWFwXG4gKlxuICogQHBhcmFtIGV4dCAtIHN0cmluZ1xuICogQHJldHVybiBzdHJpbmd8Ym9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZXh0ZW5zaW9uVG9NaW1lID0gKGV4dDogc3RyaW5nKSA9PiB7XG4gIGlmICghZXh0IHx8IGV4dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXh0LnNwbGl0KCcvJykubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGV4dDtcbiAgfVxuXG4gIGlmIChleHQuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICBleHQgPSBleHQuc3BsaXQoJy4nKS5wb3AoKTtcbiAgfVxuXG4gIGV4dCA9IGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhFeHRlbnNpb25zTWFwKTtcbiAgY29uc3QgbWFwTGVuID0ga2V5cy5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBMZW47IGkrKykge1xuICAgIGlmIChFeHRlbnNpb25zTWFwW2tleXNbaV1dLmluZGV4T2YoZXh0KSA+IC0xKSB7XG4gICAgICByZXR1cm4ga2V5c1tpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59O1xuXG4vKipcbiAqIFNhbml0aXplciBPcHRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplT3B0aW9ucyA9XG4gIHwgYm9vbGVhblxuICB8IHtcbiAgICBleGNsdWRlPzogc3RyaW5nW107XG4gICAgcmVwbGFjZW1lbnQ/OiBzdHJpbmc7XG4gIH07XG5cbi8qKlxuICogU2FuaXRpemUgZmlsZSBuYW1lXG4gKlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSB7Ym9vbH0gb3B0aW9ucyAgLSBlbmFibGUsZGlzYWJsZSBzYW5pdGl6ZXIsIGRlZmF1bHQgZW5hYmxlZFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucmVwbGFjZW1lbnQgLSByZXBsYWNlbWVudCBmb3Igc2FuaXRpemVkIGNoYXJzIGRlZmF1bHRzIHRvIFwiLVwiXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zLmV4Y2x1ZGUgLSBhcnJheSB3aXRoIGV4Y2x1ZGVkIGNoYXJzIGRlZmF1bHQgLSBgWydcXCcsICd7JywgJ30nLCd8JywgJyUnLCAnYCcsICdcIicsIFwiJ1wiLCAnficsICdbJywgJ10nLCAnIycsICd8JywgJ14nLCAnPCcsICc+J11gXG4gKi9cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZU5hbWUgPSAobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTYW5pdGl6ZU9wdGlvbnMgPSB0cnVlKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIGxldCBleHQ7XG5cbiAgY29uc3QgcmVwbGFjZW1lbnQgPSB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMucmVwbGFjZW1lbnQgPyBvcHRpb25zLnJlcGxhY2VtZW50IDogJy0nO1xuICBjb25zdCBleGNsdWRlID0gdHlwZW9mIG9wdGlvbnMgIT09ICdib29sZWFuJyAmJiBvcHRpb25zLmV4Y2x1ZGUgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbJ1xcXFwnLCAneycsICd9JywgJ3wnLCAnJScsICdgJywgJ1wiJywgXCInXCIsICd+JywgJ1snLCAnXScsICcjJywgJ3wnLCAnXicsICc8JywgJz4nXTtcblxuICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBjb25zdCBmaWxlUGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7XG5cbiAgaWYgKGZpbGVQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgZXh0ID0gZmlsZVBhcnRzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIGAke2ZpbGVQYXJ0c1xuICAgIC5qb2luKCcuJylcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChjaGFyID0+IChleGNsdWRlLmluZGV4T2YoY2hhcikgPiAtMSA/IHJlcGxhY2VtZW50IDogY2hhcikpXG4gICAgLmpvaW4oJycpfSR7ZXh0ID8gJy4nICsgZXh0IDogJyd9YDtcbn07XG5cbi8qKlxuICogRmlsdGVyIG9iamVjdCB0byBnaXZlbiBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gdG9GaWx0ZXJcbiAqIEBwYXJhbSByZXF1aXJlZEZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZmlsdGVyT2JqZWN0ID0gKHRvRmlsdGVyLCByZXF1aXJlZEZpZWxkczogc3RyaW5nW10pID0+IHtcbiAgaWYgKCFyZXF1aXJlZEZpZWxkcyB8fCByZXF1aXJlZEZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdG9GaWx0ZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModG9GaWx0ZXIpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0b0ZpbHRlcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyh0b0ZpbHRlcilcbiAgICAuZmlsdGVyKGYgPT4gcmVxdWlyZWRGaWVsZHMuaW5kZXhPZihmKSA+IC0xKVxuICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiAoeyAuLi5vYmosIFtrZXldOiB0b0ZpbHRlcltrZXldIH0pLCB7fSk7XG59O1xuXG4vKipcbiAqIERlZXAgY2xlYW51cCBvYmplY3QgZnJvbSBmdW5jdGlvbnNcbiAqXG4gKiBAcGFyYW0gb2JqXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhblVwQ2FsbGJhY2tzID0gKG9iajogYW55KSA9PiB7XG4gIGlmICghb2JqIHx8IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcbiAgICBpZiAodHlwZW9mIG9ialtrXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqW2tdID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChvYmpba10gPT09IE9iamVjdChvYmpba10pKSB7XG4gICAgICBvYmpba10gPSBjbGVhblVwQ2FsbGJhY2tzKG9ialtrXSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5ub2RlJztcbiJdfQ==