UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

239 lines (237 loc) 25.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); /* * Copyright (c) 2019 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. */ var file_tools_1 = require("./file_tools"); var fs = tslib_1.__importStar(require("fs")); jest.mock('fs'); var mockedTestFile = Buffer.from('text text'); var base64Svg = 'PHN2ZyBoZWlnaHQ9IjEwMCIgd2lkdGg9IjEwMCI+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIFNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUgU1ZHLiAgCjwvc3ZnPiA='; var base64SvgWithHeader = 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEwMCIgd2lkdGg9IjEwMCI+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIFNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUgU1ZHLiAgCjwvc3ZnPiA='; describe('Api/Upload/FileTools', function () { describe('getFileNode', function () { it('Should return file instance for nodejs loaded file from path', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file, meta, slice; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: jest.spyOn(fs, 'existsSync').mockReturnValue(true); jest.spyOn(fs, 'readFile').mockImplementation(function (path, cb) { cb(null, mockedTestFile); }); return [4 /*yield*/, (0, file_tools_1.getFile)('/testfile.txt')]; case 1: file = _a.sent(); expect(file.name).toEqual('testfile.txt'); expect(file.mimetype).toEqual('text/plain'); expect(file.size).toEqual(9); meta = file.getPartMetadata(0, 2); return [4 /*yield*/, file.getPartByMetadata(meta)]; case 2: slice = _a.sent(); expect(slice.size).toEqual(2); return [2 /*return*/]; } }); }); }); it('Should reject if provided file cannot be read', function () { jest.spyOn(fs, 'existsSync').mockReturnValue(true); jest.spyOn(fs, 'readFile').mockImplementation(function (path, cb) { cb(new Error('error'), null); }); return expect((0, file_tools_1.getFile)('/testfile.txt')).rejects.toEqual(new Error('error')); }); it('Should return correct mimetype', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: jest.unmock('fs'); return [4 /*yield*/, (0, file_tools_1.getFile)('./package.json')]; case 1: file = _a.sent(); expect(file.mimetype).toEqual('application/json'); return [2 /*return*/]; } }); }); }); it('Should return correct file instance from buffer', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)(mockedTestFile)]; case 1: file = _a.sent(); expect(file.size).toEqual(9); expect(file.mimetype).toEqual('text/plain'); return [2 /*return*/]; } }); }); }); it('Should handle base64 encoded string', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ name: 'test.svg', file: base64Svg, })]; case 1: file = _a.sent(); expect(file.mimetype).toEqual('image/svg+xml'); return [2 /*return*/]; } }); }); }); it('Should handle base64 encoded string with Header', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ name: 'test.svg', file: base64SvgWithHeader, })]; case 1: file = _a.sent(); expect(file.mimetype).toEqual('image/svg+xml'); return [2 /*return*/]; } }); }); }); it('Should detect text/plain mimetype', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ name: 'test.undefined', file: base64Svg, })]; case 1: file = _a.sent(); expect(file.mimetype).toEqual('text/plain'); return [2 /*return*/]; } }); }); }); it('Should handle base64 encoded string with b64 prefix (svg)', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = expect; return [4 /*yield*/, (0, file_tools_1.getFile)("data:image/svg+xml;base64,".concat(base64Svg))]; case 1: // it is hard to detect svg mimetype for now using fallback to application/octet-stream return [2 /*return*/, _a.apply(void 0, [(_b.sent()).mimetype]).toEqual('application/octet-stream')]; } }); }); }); it('Should get part of the buffer after slice', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file, meta, slice; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)(mockedTestFile)]; case 1: file = _a.sent(); meta = file.getPartMetadata(0, 2); return [4 /*yield*/, file.getPartByMetadata(meta)]; case 2: slice = _a.sent(); expect(slice.size).toEqual(2); return [2 /*return*/]; } }); }); }); it('Should handle base64 encoded string', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ name: 'test.undefined', file: Buffer.of(12), })]; case 1: file = _a.sent(); expect(file.mimetype).toEqual('text/plain'); return [2 /*return*/]; } }); }); }); it('Should throw error when random string is provided', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2 /*return*/, expect((0, file_tools_1.getFile)('asdasdfasdf')).rejects.toEqual(new Error('Unsupported input file type'))]; }); }); }); it('Should pass sanitize options to file instance (buffer)', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var fileRes; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ file: mockedTestFile, name: 'test<.jpg', }, { replacement: '=', })]; case 1: fileRes = _a.sent(); expect(fileRes.name).toEqual('test=.jpg'); return [2 /*return*/]; } }); }); }); it('Should pass sanitize options to file instance path', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var fileRes; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ file: './package.json', name: 'test<.jpg', }, { replacement: '=', })]; case 1: fileRes = _a.sent(); expect(fileRes.name).toEqual('test=.jpg'); return [2 /*return*/]; } }); }); }); it('Should handle named file input', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var file; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, (0, file_tools_1.getFile)({ name: '123.jpg', file: mockedTestFile, })]; case 1: file = _a.sent(); expect(file.name).toEqual('123.jpg'); expect(file.size).toEqual(9); expect(file.mimetype).toEqual('image/jpeg'); return [2 /*return*/]; } }); }); }); it('Should reject on unsupported input file type', function () { // @ts-ignore return expect((0, file_tools_1.getFile)({})).rejects.toEqual(new Error('Unsupported input file type')); }); }); }); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLnNwZWMubm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCwyQ0FBdUM7QUFDdkMsNkNBQXlCO0FBRXpCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFaEIsSUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNoRCxJQUFNLFNBQVMsR0FBRyxzT0FBc08sQ0FBQztBQUN6UCxJQUFNLG1CQUFtQixHQUFHLGdRQUFnUSxDQUFDO0FBRTdSLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtJQUMvQixRQUFRLENBQUMsYUFBYSxFQUFFO1FBRXRCLEVBQUUsQ0FBQyw4REFBOEQsRUFBRTs7Ozs7d0JBQ2pFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUMsa0JBQWtCLENBQUMsVUFBQyxJQUFJLEVBQUUsRUFBRTs0QkFDckQsRUFBRSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQzt3QkFDM0IsQ0FBQyxDQUFDLENBQUM7d0JBRVUscUJBQU0sSUFBQSxvQkFBTyxFQUFDLGVBQWUsQ0FBQyxFQUFBOzt3QkFBckMsSUFBSSxHQUFHLFNBQThCO3dCQUUzQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7d0JBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUV2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Q0FBQzs7OzthQUM3QyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsYUFBYTtZQUNiLE9BQU8sTUFBTSxDQUFDLElBQUEsb0JBQU8sRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJsaWIvYXBpL3VwbG9hZC9maWxlX3Rvb2xzLnNwZWMubm9kZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4vZmlsZV90b29scyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5cbmplc3QubW9jaygnZnMnKTtcblxuY29uc3QgbW9ja2VkVGVzdEZpbGUgPSBCdWZmZXIuZnJvbSgndGV4dCB0ZXh0Jyk7XG5jb25zdCBiYXNlNjRTdmcgPSAnUEhOMlp5Qm9aV2xuYUhROUlqRXdNQ0lnZDJsa2RHZzlJakV3TUNJK0NpQWdQR05wY21Oc1pTQmplRDBpTlRBaUlHTjVQU0kxTUNJZ2NqMGlOREFpSUhOMGNtOXJaVDBpWW14aFkyc2lJSE4wY205clpTMTNhV1IwYUQwaU15SWdabWxzYkQwaWNtVmtJaUF2UGdvZ0lGTnZjbko1TENCNWIzVnlJR0p5YjNkelpYSWdaRzlsY3lCdWIzUWdjM1Z3Y0c5eWRDQnBibXhwYm1VZ1UxWkhMaUFnQ2p3dmMzWm5QaUE9JztcbmNvbnN0IGJhc2U2NFN2Z1dpdGhIZWFkZXIgPSAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCb1pXbG5hSFE5SWpFd01DSWdkMmxrZEdnOUlqRXdNQ0krQ2lBZ1BHTnBjbU5zWlNCamVEMGlOVEFpSUdONVBTSTFNQ0lnY2owaU5EQWlJSE4wY205clpUMGlZbXhoWTJzaUlITjBjbTlyWlMxM2FXUjBhRDBpTXlJZ1ptbHNiRDBpY21Wa0lpQXZQZ29nSUZOdmNuSjVMQ0I1YjNWeUlHSnliM2R6WlhJZ1pHOWxjeUJ1YjNRZ2MzVndjRzl5ZENCcGJteHBibVVnVTFaSExpQWdDand2YzNablBpQT0nO1xuXG5kZXNjcmliZSgnQXBpL1VwbG9hZC9GaWxlVG9vbHMnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdnZXRGaWxlTm9kZScsICgpID0+IHtcblxuICAgIGl0KCdTaG91bGQgcmV0dXJuIGZpbGUgaW5zdGFuY2UgZm9yIG5vZGVqcyBsb2FkZWQgZmlsZSBmcm9tIHBhdGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBqZXN0LnNweU9uKGZzLCAnZXhpc3RzU3luYycpLm1vY2tSZXR1cm5WYWx1ZSh0cnVlKTtcbiAgICAgIGplc3Quc3B5T24oZnMsICdyZWFkRmlsZScpLm1vY2tJbXBsZW1lbnRhdGlvbigocGF0aCwgY2IpID0+IHtcbiAgICAgICAgY2IobnVsbCwgbW9ja2VkVGVzdEZpbGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKCcvdGVzdGZpbGUudHh0Jyk7XG5cbiAgICAgIGV4cGVjdChmaWxlLm5hbWUpLnRvRXF1YWwoJ3Rlc3RmaWxlLnR4dCcpO1xuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ3RleHQvcGxhaW4nKTtcbiAgICAgIGV4cGVjdChmaWxlLnNpemUpLnRvRXF1YWwoOSk7XG5cbiAgICAgIGNvbnN0IG1ldGEgPSBmaWxlLmdldFBhcnRNZXRhZGF0YSgwLCAyKTtcbiAgICAgIGNvbnN0IHNsaWNlID0gYXdhaXQgZmlsZS5nZXRQYXJ0QnlNZXRhZGF0YShtZXRhKTtcblxuICAgICAgZXhwZWN0KHNsaWNlLnNpemUpLnRvRXF1YWwoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJlamVjdCBpZiBwcm92aWRlZCBmaWxlIGNhbm5vdCBiZSByZWFkJywgKCkgPT4ge1xuICAgICAgamVzdC5zcHlPbihmcywgJ2V4aXN0c1N5bmMnKS5tb2NrUmV0dXJuVmFsdWUodHJ1ZSk7XG4gICAgICBqZXN0LnNweU9uKGZzLCAncmVhZEZpbGUnKS5tb2NrSW1wbGVtZW50YXRpb24oKHBhdGgsIGNiKSA9PiB7XG4gICAgICAgIGNiKG5ldyBFcnJvcignZXJyb3InKSwgbnVsbCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGV4cGVjdChnZXRGaWxlKCcvdGVzdGZpbGUudHh0JykpLnJlamVjdHMudG9FcXVhbChuZXcgRXJyb3IoJ2Vycm9yJykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCByZXR1cm4gY29ycmVjdCBtaW1ldHlwZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGplc3QudW5tb2NrKCdmcycpO1xuXG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgZ2V0RmlsZSgnLi9wYWNrYWdlLmpzb24nKTtcbiAgICAgIGV4cGVjdChmaWxlLm1pbWV0eXBlKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHJldHVybiBjb3JyZWN0IGZpbGUgaW5zdGFuY2UgZnJvbSBidWZmZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgZ2V0RmlsZShtb2NrZWRUZXN0RmlsZSk7XG4gICAgICBleHBlY3QoZmlsZS5zaXplKS50b0VxdWFsKDkpO1xuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ3RleHQvcGxhaW4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJhc2U2NCBlbmNvZGVkIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKHtcbiAgICAgICAgbmFtZTogJ3Rlc3Quc3ZnJyxcbiAgICAgICAgZmlsZTogYmFzZTY0U3ZnLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChmaWxlLm1pbWV0eXBlKS50b0VxdWFsKCdpbWFnZS9zdmcreG1sJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIGhhbmRsZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgd2l0aCBIZWFkZXInLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgZ2V0RmlsZSh7XG4gICAgICAgIG5hbWU6ICd0ZXN0LnN2ZycsXG4gICAgICAgIGZpbGU6IGJhc2U2NFN2Z1dpdGhIZWFkZXIsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZGV0ZWN0IHRleHQvcGxhaW4gbWltZXR5cGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlID0gYXdhaXQgZ2V0RmlsZSh7XG4gICAgICAgIG5hbWU6ICd0ZXN0LnVuZGVmaW5lZCcsXG4gICAgICAgIGZpbGU6IGJhc2U2NFN2ZyxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ3RleHQvcGxhaW4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB3aXRoIGI2NCBwcmVmaXggKHN2ZyknLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBpdCBpcyBoYXJkIHRvIGRldGVjdCBzdmcgbWltZXR5cGUgZm9yIG5vdyB1c2luZyBmYWxsYmFjayB0byBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cbiAgICAgIHJldHVybiBleHBlY3QoKGF3YWl0IGdldEZpbGUoYGRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJHtiYXNlNjRTdmd9YCkpLm1pbWV0eXBlKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgZ2V0IHBhcnQgb2YgdGhlIGJ1ZmZlciBhZnRlciBzbGljZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKG1vY2tlZFRlc3RGaWxlKTtcblxuICAgICAgY29uc3QgbWV0YSA9IGZpbGUuZ2V0UGFydE1ldGFkYXRhKDAsIDIpO1xuICAgICAgY29uc3Qgc2xpY2UgPSBhd2FpdCBmaWxlLmdldFBhcnRCeU1ldGFkYXRhKG1ldGEpO1xuXG4gICAgICBleHBlY3Qoc2xpY2Uuc2l6ZSkudG9FcXVhbCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgaGFuZGxlIGJhc2U2NCBlbmNvZGVkIHN0cmluZycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKHtcbiAgICAgICAgbmFtZTogJ3Rlc3QudW5kZWZpbmVkJyxcbiAgICAgICAgZmlsZTogQnVmZmVyLm9mKDEyKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ3RleHQvcGxhaW4nKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgdGhyb3cgZXJyb3Igd2hlbiByYW5kb20gc3RyaW5nIGlzIHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgcmV0dXJuIGV4cGVjdChnZXRGaWxlKCdhc2Rhc2RmYXNkZicpKS5yZWplY3RzLnRvRXF1YWwobmV3IEVycm9yKCdVbnN1cHBvcnRlZCBpbnB1dCBmaWxlIHR5cGUnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHBhc3Mgc2FuaXRpemUgb3B0aW9ucyB0byBmaWxlIGluc3RhbmNlIChidWZmZXIpJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZmlsZVJlcyA9IGF3YWl0IGdldEZpbGUoe1xuICAgICAgICBmaWxlOiBtb2NrZWRUZXN0RmlsZSxcbiAgICAgICAgbmFtZTogJ3Rlc3Q8LmpwZycsXG4gICAgICB9LCB7XG4gICAgICAgIHJlcGxhY2VtZW50OiAnPScsXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KGZpbGVSZXMubmFtZSkudG9FcXVhbCgndGVzdD0uanBnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIHBhc3Mgc2FuaXRpemUgb3B0aW9ucyB0byBmaWxlIGluc3RhbmNlIHBhdGgnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBmaWxlUmVzID0gYXdhaXQgZ2V0RmlsZSh7XG4gICAgICAgIGZpbGU6ICcuL3BhY2thZ2UuanNvbicsXG4gICAgICAgIG5hbWU6ICd0ZXN0PC5qcGcnLFxuICAgICAgfSwge1xuICAgICAgICByZXBsYWNlbWVudDogJz0nLFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChmaWxlUmVzLm5hbWUpLnRvRXF1YWwoJ3Rlc3Q9LmpwZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ1Nob3VsZCBoYW5kbGUgbmFtZWQgZmlsZSBpbnB1dCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBnZXRGaWxlKHtcbiAgICAgICAgbmFtZTogJzEyMy5qcGcnLFxuICAgICAgICBmaWxlOiBtb2NrZWRUZXN0RmlsZSxcbiAgICAgIH0pO1xuXG4gICAgICBleHBlY3QoZmlsZS5uYW1lKS50b0VxdWFsKCcxMjMuanBnJyk7XG4gICAgICBleHBlY3QoZmlsZS5zaXplKS50b0VxdWFsKDkpO1xuICAgICAgZXhwZWN0KGZpbGUubWltZXR5cGUpLnRvRXF1YWwoJ2ltYWdlL2pwZWcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdTaG91bGQgcmVqZWN0IG9uIHVuc3VwcG9ydGVkIGlucHV0IGZpbGUgdHlwZScsICgpID0+IHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHJldHVybiBleHBlY3QoZ2V0RmlsZSh7fSkpLnJlamVjdHMudG9FcXVhbChuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGlucHV0IGZpbGUgdHlwZScpKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==