UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

245 lines (243 loc) 25.2 kB
"use strict"; /* * 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.fileTypeFromBuffer)(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', 'audio/x-m4a']; 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUlILDJDQUE2QztBQUM3Qyx1Q0FBK0M7QUFDL0MsMERBQTRCO0FBRTVCOzs7Ozs7R0FNRztBQUNJLElBQU0sYUFBYSxHQUFHLFVBQUMsT0FBZ0IsRUFBRSxNQUFjO0lBQzVELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBRW5DLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtRQUM1RSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCx3REFBd0Q7UUFDeEQsT0FBTyxVQUFHLE1BQU0sY0FBSSxPQUFPLENBQUMsTUFBTSxDQUFFLENBQUM7S0FDdEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFiVyxRQUFBLGFBQWEsaUJBYXhCO0FBRUY7Ozs7OztHQU1HO0FBQ0ksSUFBTSxXQUFXLEdBQUcsVUFBQyxJQUFXLEVBQUUsS0FBYTtJQUNwRCxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQU0sS0FBSyxHQUFHLHdDQUF3QyxDQUFDO0lBRXZELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRztRQUMzQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLENBQUM7SUFF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QUM7S0FDWjtJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztRQUN4QixJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsRUFBRTtZQUNoQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFBLHdCQUFnQixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMsQ0FBQztBQWhCVyxRQUFBLGdCQUFnQixvQkFnQjNCO0FBRUYsdURBQTZCIiwiZmlsZSI6ImxpYi91dGlscy9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggYnkgRmlsZXN0YWNrLlxuICogU29tZSByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHsgSG9zdHMgfSBmcm9tICcuLy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zTWFwIH0gZnJvbSAnLi9leHRlbnNpb25zJztcbmltcG9ydCB7IGZpbGVUeXBlRnJvbUJ1ZmZlciB9IGZyb20gJ2ZpbGUtdHlwZSc7XG5pbXBvcnQgaXN1dGY4IGZyb20gJ2lzdXRmOCc7XG5cbi8qKlxuICogUmVzb2x2ZSBjZG4gdXJsIGJhc2VkIG9uIGhhbmRsZSB0eXBlXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBzZXNzaW9uIHNlc3Npb24gb2JqZWN0XG4gKiBAcGFyYW0gaGFuZGxlIGZpbGUgaGFuZGxlIChoYXNoLCBzcmM6Ly9hbGlhcywgdXJsKVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUNkblVybCA9IChzZXNzaW9uOiBTZXNzaW9uLCBoYW5kbGU6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGNkblVSTCA9IHNlc3Npb24udXJscy5jZG5Vcmw7XG5cbiAgaWYgKGhhbmRsZSAmJiAoaGFuZGxlLmluZGV4T2YoJ3NyYzonKSA9PT0gMCB8fCBoYW5kbGUuaW5kZXhPZignaHR0cCcpID09PSAwKSkge1xuICAgIGlmICghc2Vzc2lvbi5hcGlrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXBpIGtleSBpcyByZXF1aXJlZCB3aGVuIHN0b3JhZ2UgYWxpYXMgaXMgcHJvdmlkZWQnKTtcbiAgICB9XG5cbiAgICAvLyBhcGlrZXkgaXMgcmVxdWlyZWQgZm9yIGFsaWFzIG9yIGV4dGVybmFsIHNvdXJjZXMgY2FsbFxuICAgIHJldHVybiBgJHtjZG5VUkx9LyR7c2Vzc2lvbi5hcGlrZXl9YDtcbiAgfVxuXG4gIHJldHVybiBjZG5VUkw7XG59O1xuXG4vKipcbiAqIFJlc29sdmUgYWxsIHVybHMgd2l0aCBwcm92aWRlZCBjbmFtZXNcbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHVybHNcbiAqIEBwYXJhbSBjbmFtZVxuICovXG5leHBvcnQgY29uc3QgcmVzb2x2ZUhvc3QgPSAodXJsczogSG9zdHMsIGNuYW1lOiBzdHJpbmcpOiBIb3N0cyA9PiB7XG4gIGlmICghY25hbWUpIHtcbiAgICByZXR1cm4gdXJscztcbiAgfVxuXG4gIGNvbnN0IGhvc3RzID0gL2ZpbGVzdGFja2FwaS5jb218ZmlsZXN0YWNrY29udGVudC5jb20vaTtcblxuICBPYmplY3Qua2V5cyh1cmxzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgdXJsc1trZXldID0gdXJsc1trZXldLnJlcGxhY2UoaG9zdHMsIGNuYW1lKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHVybHM7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgZW1wdHkgb3B0aW9ucyBmcm9tIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gb2JqXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVFbXB0eSA9IChvYmo6IGFueSkgPT4ge1xuICBjb25zdCBuZXdPYmogPSB7IC4uLm9iaiB9O1xuICBPYmplY3Qua2V5cyhuZXdPYmopLmZvckVhY2goayA9PiAhbmV3T2JqW2tdICYmIHR5cGVvZiBuZXdPYmpba10gIT09ICdib29sZWFuJyAmJiBkZWxldGUgbmV3T2JqW2tdKTtcbiAgcmV0dXJuIG5ld09iajtcbn07XG5cbi8qKlxuICogUmV0dXJucyB1bmlxdWUgdGltZVxuICovXG5sZXQgbGFzdDtcbmV4cG9ydCBjb25zdCB1bmlxdWVUaW1lID0gKCkgPT4ge1xuICBjb25zdCB0aW1lID0gRGF0ZS5ub3coKTtcbiAgbGFzdCA9IHRpbWUgPT09IGxhc3QgPyB0aW1lICsgMSA6IHRpbWU7XG4gIHJldHVybiBsYXN0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgcmFuZG9tIHN0cmluZyB3aXRoIHByb3ZpZGVkIGxlbmd0aFxuICpcbiAqIEBwYXJhbSBsZW5cbiAqL1xuZXhwb3J0IGNvbnN0IHVuaXF1ZUlkID0gKGxlbjogbnVtYmVyID0gMTApOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gbmV3IEFycmF5KGxlbikuam9pbigpLnJlcGxhY2UoLygufCQpL2csICgpID0+ICgoTWF0aC5yYW5kb20oKSAqIDM2KSB8IDApLnRvU3RyaW5nKDM2KVtNYXRoLnJhbmRvbSgpIDwgMC41ID8gJ3RvU3RyaW5nJyA6ICd0b1VwcGVyQ2FzZSddKCkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBpbnB1dCBpcyBhIHN2Z1xuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheSB8IEJ1ZmZlcn0gZmlsZVxuICogQHJldHVybnMge3N0cmluZ30gLSBtaW1ldHlwZVxuICovXG5leHBvcnQgY29uc3QgZ2V0TWltZXR5cGUgPSBhc3luYyAoZmlsZTogVWludDhBcnJheSB8IEJ1ZmZlciwgbmFtZT86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGxldCB0eXBlO1xuXG4gIHRyeSB7XG4gICAgdHlwZSA9IGF3YWl0IGZpbGVUeXBlRnJvbUJ1ZmZlcihmaWxlIGFzIFVpbnQ4QXJyYXkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS53YXJuKCdBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgYnVmZmVyOicsIGUubWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBleGNsdWRlZE1pbWV0eXBlcyA9IFsndGV4dC9wbGFpbicsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnYXBwbGljYXRpb24veC1tcycsICdhcHBsaWNhdGlvbi94LW1zaScsICdhcHBsaWNhdGlvbi96aXAnLCAnYXVkaW8veC1tNGEnXTtcblxuICBpZiAodHlwZSAmJiBleGNsdWRlZE1pbWV0eXBlcy5pbmRleE9mKHR5cGUubWltZSkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHR5cGUubWltZTtcbiAgfVxuXG4gIGlmIChuYW1lICYmIG5hbWUuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICBjb25zdCBtaW1lID0gZXh0ZW5zaW9uVG9NaW1lKG5hbWUpO1xuXG4gICAgaWYgKG1pbWUpIHtcbiAgICAgIHJldHVybiBtaW1lO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGlzdXRmOChmaWxlKSkge1xuICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGNvbnNvbGUud2FybignQWRkaXRpb25hbCBtaW1ldHlwZSBjaGVja3MgKHRleHQvcGxhaW4pIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3IgYnJvd3NlcnMnKTtcbiAgfVxuICAvLyB0aGlzIGlzIG9ubHkgZmFsbGJhY2ssIG9taXQgaXQgaW4gY292ZXJhZ2VcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cblxuICAvLyBpZiB3ZSBjYW50IGZpbmQgdHlwZXMgYnkgZXh0ZW5zaW9ucyBhbmQgd2UgaGF2ZSBtYWdpYyBieXRlcyBmYWxsYmFjayB0byBpdFxuICBpZiAodHlwZSkge1xuICAgIHJldHVybiB0eXBlLm1pbWU7XG4gIH1cblxuICByZXR1cm4gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG59O1xuXG4vKipcbiAqIENoYW5nZSBleHRlbnNpb24gdG8gYWNjb3JkaW5nIG1pbWV0eXBlIHVzaW5nIGV4dD0+bWltZXR5cGUgbWFwXG4gKlxuICogQHBhcmFtIGV4dCAtIHN0cmluZ1xuICogQHJldHVybiBzdHJpbmd8Ym9vbGVhblxuICovXG5leHBvcnQgY29uc3QgZXh0ZW5zaW9uVG9NaW1lID0gKGV4dDogc3RyaW5nKSA9PiB7XG4gIGlmICghZXh0IHx8IGV4dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZXh0LnNwbGl0KCcvJykubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIGV4dDtcbiAgfVxuXG4gIGlmIChleHQuaW5kZXhPZignLicpID4gLTEpIHtcbiAgICBleHQgPSBleHQuc3BsaXQoJy4nKS5wb3AoKTtcbiAgfVxuXG4gIGV4dCA9IGV4dC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhFeHRlbnNpb25zTWFwKTtcbiAgY29uc3QgbWFwTGVuID0ga2V5cy5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXBMZW47IGkrKykge1xuICAgIGlmIChFeHRlbnNpb25zTWFwW2tleXNbaV1dLmluZGV4T2YoZXh0KSA+IC0xKSB7XG4gICAgICByZXR1cm4ga2V5c1tpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm47XG59O1xuXG4vKipcbiAqIFNhbml0aXplciBPcHRpb25zXG4gKi9cbmV4cG9ydCB0eXBlIFNhbml0aXplT3B0aW9ucyA9XG4gIHwgYm9vbGVhblxuICB8IHtcbiAgICAgIGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgICAgIHJlcGxhY2VtZW50Pzogc3RyaW5nO1xuICAgIH07XG5cbi8qKlxuICogU2FuaXRpemUgZmlsZSBuYW1lXG4gKlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSB7Ym9vbH0gb3B0aW9ucyAgLSBlbmFibGUsZGlzYWJsZSBzYW5pdGl6ZXIsIGRlZmF1bHQgZW5hYmxlZFxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMucmVwbGFjZW1lbnQgLSByZXBsYWNlbWVudCBmb3Igc2FuaXRpemVkIGNoYXJzIGRlZmF1bHRzIHRvIFwiLVwiXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBvcHRpb25zLmV4Y2x1ZGUgLSBhcnJheSB3aXRoIGV4Y2x1ZGVkIGNoYXJzIGRlZmF1bHQgLSBgWydcXCcsICd7JywgJ30nLCd8JywgJyUnLCAnYCcsICdcIicsIFwiJ1wiLCAnficsICdbJywgJ10nLCAnIycsICd8JywgJ14nLCAnPCcsICc+J11gXG4gKi9cbmV4cG9ydCBjb25zdCBzYW5pdGl6ZU5hbWUgPSAobmFtZTogc3RyaW5nLCBvcHRpb25zOiBTYW5pdGl6ZU9wdGlvbnMgPSB0cnVlKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnYm9vbGVhbicgJiYgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIGxldCBleHQ7XG5cbiAgY29uc3QgcmVwbGFjZW1lbnQgPSB0eXBlb2Ygb3B0aW9ucyAhPT0gJ2Jvb2xlYW4nICYmIG9wdGlvbnMucmVwbGFjZW1lbnQgPyBvcHRpb25zLnJlcGxhY2VtZW50IDogJy0nO1xuICBjb25zdCBleGNsdWRlID0gdHlwZW9mIG9wdGlvbnMgIT09ICdib29sZWFuJyAmJiBvcHRpb25zLmV4Y2x1ZGUgPyBvcHRpb25zLmV4Y2x1ZGUgOiBbJ1xcXFwnLCAneycsICd9JywgJ3wnLCAnJScsICdgJywgJ1wiJywgXCInXCIsICd+JywgJ1snLCAnXScsICcjJywgJ3wnLCAnXicsICc8JywgJz4nXTtcblxuICBpZiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gIH1cblxuICBjb25zdCBmaWxlUGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7XG5cbiAgaWYgKGZpbGVQYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgZXh0ID0gZmlsZVBhcnRzLnBvcCgpO1xuICB9XG5cbiAgcmV0dXJuIGAke2ZpbGVQYXJ0c1xuICAgIC5qb2luKCcuJylcbiAgICAuc3BsaXQoJycpXG4gICAgLm1hcChjaGFyID0+IChleGNsdWRlLmluZGV4T2YoY2hhcikgPiAtMSA/IHJlcGxhY2VtZW50IDogY2hhcikpXG4gICAgLmpvaW4oJycpfSR7ZXh0ID8gJy4nICsgZXh0IDogJyd9YDtcbn07XG5cbi8qKlxuICogRmlsdGVyIG9iamVjdCB0byBnaXZlbiBmaWVsZHNcbiAqXG4gKiBAcGFyYW0gdG9GaWx0ZXJcbiAqIEBwYXJhbSByZXF1aXJlZEZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgZmlsdGVyT2JqZWN0ID0gKHRvRmlsdGVyLCByZXF1aXJlZEZpZWxkczogc3RyaW5nW10pID0+IHtcbiAgaWYgKCFyZXF1aXJlZEZpZWxkcyB8fCByZXF1aXJlZEZpZWxkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdG9GaWx0ZXI7XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXModG9GaWx0ZXIpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0b0ZpbHRlcjtcbiAgfVxuXG4gIHJldHVybiBPYmplY3Qua2V5cyh0b0ZpbHRlcilcbiAgICAuZmlsdGVyKGYgPT4gcmVxdWlyZWRGaWVsZHMuaW5kZXhPZihmKSA+IC0xKVxuICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiAoeyAuLi5vYmosIFtrZXldOiB0b0ZpbHRlcltrZXldIH0pLCB7fSk7XG59O1xuXG4vKipcbiAqIERlZXAgY2xlYW51cCBvYmplY3QgZnJvbSBmdW5jdGlvbnNcbiAqXG4gKiBAcGFyYW0gb2JqXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhblVwQ2FsbGJhY2tzID0gKG9iajogYW55KSA9PiB7XG4gIGlmICghb2JqIHx8IE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcbiAgICBpZiAodHlwZW9mIG9ialtrXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgb2JqW2tdID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChvYmpba10gPT09IE9iamVjdChvYmpba10pKSB7XG4gICAgICBvYmpba10gPSBjbGVhblVwQ2FsbGJhY2tzKG9ialtrXSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleC5ub2RlJztcbiJdfQ==