UNPKG

@farris/build-angular

Version:

Angular Webpack Build Facade

120 lines 20.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ // tslint:disable // TODO: cleanup this file, it's copied as is from Angular CLI. const core_1 = require("@angular-devkit/core"); const crypto = require("crypto"); const fs = require("fs"); const semver = require("semver"); const require_project_module_1 = require("../require-project-module"); const operators_1 = require("rxjs/operators"); const rxjs_1 = require("rxjs"); exports.NEW_SW_VERSION = '5.0.0-rc.0'; class CliFilesystem { constructor(_host, base) { this._host = _host; this.base = base; } list(path) { const recursiveList = (path) => this._host.list(path).pipe( // Emit each fragment individually. operators_1.concatMap(fragments => rxjs_1.from(fragments)), // Join the path with fragment. operators_1.map(fragment => core_1.join(path, fragment)), // Emit directory content paths instead of the directory path. operators_1.mergeMap(path => this._host.isDirectory(path).pipe(operators_1.concatMap(isDir => isDir ? recursiveList(path) : rxjs_1.of(path))))); return recursiveList(this._resolve(path)).pipe(operators_1.map(path => path.replace(this.base, '')), operators_1.toArray()).toPromise().then(x => x, _err => []); } read(path) { return this._readIntoBuffer(path) .then(content => core_1.virtualFs.fileBufferToString(content)); } hash(path) { const sha1 = crypto.createHash('sha1'); return this._readIntoBuffer(path) .then(content => sha1.update(Buffer.from(content))) .then(() => sha1.digest('hex')); } write(path, content) { return this._host.write(this._resolve(path), core_1.virtualFs.stringToFileBuffer(content)) .toPromise(); } _readIntoBuffer(path) { return this._host.read(this._resolve(path)) .toPromise(); } _resolve(path) { return core_1.join(core_1.normalize(this.base), path); } } function usesServiceWorker(projectRoot) { let swPackageJsonPath; try { swPackageJsonPath = require_project_module_1.resolveProjectModule(projectRoot, '@angular/service-worker/package.json'); } catch (_) { // @angular/service-worker is not installed throw new Error(core_1.tags.stripIndent ` Your project is configured with serviceWorker = true, but @angular/service-worker is not installed. Run \`npm install --save-dev @angular/service-worker\` and try again, or run \`ng set apps.0.serviceWorker=false\` in your .angular-cli.json. `); } const swPackageJson = fs.readFileSync(swPackageJsonPath).toString(); const swVersion = JSON.parse(swPackageJson)['version']; if (!semver.gte(swVersion, exports.NEW_SW_VERSION)) { throw new Error(core_1.tags.stripIndent ` The installed version of @angular/service-worker is ${swVersion}. This version of the CLI requires the @angular/service-worker version to satisfy ${exports.NEW_SW_VERSION}. Please upgrade your service worker version. `); } return true; } exports.usesServiceWorker = usesServiceWorker; function augmentAppWithServiceWorker(host, projectRoot, appRoot, outputPath, baseHref, ngswConfigPath) { // Path to the worker script itself. const distPath = core_1.normalize(outputPath); const workerPath = core_1.normalize(require_project_module_1.resolveProjectModule(core_1.getSystemPath(projectRoot), '@angular/service-worker/ngsw-worker.js')); const swConfigPath = require_project_module_1.resolveProjectModule(core_1.getSystemPath(projectRoot), '@angular/service-worker/config'); const safetyPath = core_1.join(core_1.dirname(workerPath), 'safety-worker.js'); const configPath = ngswConfigPath || core_1.join(appRoot, 'ngsw-config.json'); return host.exists(configPath).pipe(operators_1.switchMap(exists => { if (!exists) { throw new Error(core_1.tags.oneLine ` Error: Expected to find an ngsw-config.json configuration file in the ${appRoot} folder. Either provide one or disable Service Worker in your angular.json configuration file.`); } return host.read(configPath); }), operators_1.map(content => JSON.parse(core_1.virtualFs.fileBufferToString(content))), operators_1.switchMap(configJson => { const Generator = require(swConfigPath).Generator; const gen = new Generator(new CliFilesystem(host, outputPath), baseHref); return gen.process(configJson); }), operators_1.switchMap(output => { const manifest = JSON.stringify(output, null, 2); return host.read(workerPath).pipe(operators_1.switchMap(workerCode => { return rxjs_1.merge(host.write(core_1.join(distPath, 'ngsw.json'), core_1.virtualFs.stringToFileBuffer(manifest)), host.write(core_1.join(distPath, 'ngsw-worker.js'), workerCode)); })); }), operators_1.switchMap(() => host.exists(safetyPath)), // If @angular/service-worker has the safety script, copy it into two locations. operators_1.switchMap(exists => { if (!exists) { return rxjs_1.of(undefined); } return host.read(safetyPath).pipe(operators_1.switchMap(safetyCode => { return rxjs_1.merge(host.write(core_1.join(distPath, 'worker-basic.min.js'), safetyCode), host.write(core_1.join(distPath, 'safety-worker.js'), safetyCode)); })); }), // Remove all elements, reduce them to a single emit. operators_1.reduce(() => { })).toPromise(); } exports.augmentAppWithServiceWorker = augmentAppWithServiceWorker; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbInBhY2thZ2VzL2ZhcnJpc19kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvYW5ndWxhci1jbGktZmlsZXMvdXRpbGl0aWVzL3NlcnZpY2Utd29ya2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztHQU1HO0FBQ0gsaUJBQWlCO0FBQ2pCLCtEQUErRDtBQUMvRCwrQ0FBZ0g7QUFFaEgsaUNBQWlDO0FBQ2pDLHlCQUF5QjtBQUN6QixpQ0FBaUM7QUFFakMsc0VBQWlFO0FBQ2pFLDhDQUEyRjtBQUMzRiwrQkFBbUQ7QUFHdEMsUUFBQSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRzNDO0lBQ0UsWUFBb0IsS0FBcUIsRUFBVSxJQUFZO1FBQTNDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFJLENBQUM7SUFFcEUsSUFBSSxDQUFDLElBQVk7UUFDZixNQUFNLGFBQWEsR0FBRyxDQUFDLElBQVUsRUFBb0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7UUFDaEYsbUNBQW1DO1FBQ25DLHFCQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxXQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkMsK0JBQStCO1FBQy9CLGVBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFdBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDckMsOERBQThEO1FBQzlELG9CQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzlDLHFCQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFD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QUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUMvQixxQkFBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxZQUFLLENBQ1YsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFJLENBQUMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQzdELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBSSxDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUN2QyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixxREFBcUQ7SUFDckQsa0JBQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FDakIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNoQixDQUFDO0FBeEVELGtFQXdFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlXG4vLyBUT0RPOiBjbGVhbnVwIHRoaXMgZmlsZSwgaXQncyBjb3BpZWQgYXMgaXMgZnJvbSBBbmd1bGFyIENMSS5cbmltcG9ydCB7IFBhdGgsIGpvaW4sIG5vcm1hbGl6ZSwgdmlydHVhbEZzLCBkaXJuYW1lLCBnZXRTeXN0ZW1QYXRoLCB0YWdzLCBmcmFnbWVudCB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlJztcbmltcG9ydCB7IEZpbGVzeXN0ZW0gfSBmcm9tICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlci9jb25maWcnO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBzZW12ZXIgZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHsgcmVzb2x2ZVByb2plY3RNb2R1bGUgfSBmcm9tICcuLi9yZXF1aXJlLXByb2plY3QtbW9kdWxlJztcbmltcG9ydCB7IG1hcCwgcmVkdWNlLCBzd2l0Y2hNYXAsIGNvbmNhdE1hcCwgbWVyZ2VNYXAsIHRvQXJyYXksIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWVyZ2UsIG9mLCBmcm9tIH0gZnJvbSBcInJ4anNcIjtcblxuXG5leHBvcnQgY29uc3QgTkVXX1NXX1ZFUlNJT04gPSAnNS4wLjAtcmMuMCc7XG5cblxuY2xhc3MgQ2xpRmlsZXN5c3RlbSBpbXBsZW1lbnRzIEZpbGVzeXN0ZW0ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9ob3N0OiB2aXJ0dWFsRnMuSG9zdCwgcHJpdmF0ZSBiYXNlOiBzdHJpbmcpIHsgfVxuXG4gIGxpc3QocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJlY3Vyc2l2ZUxpc3QgPSAocGF0aDogUGF0aCk6IE9ic2VydmFibGU8UGF0aD4gPT4gdGhpcy5faG9zdC5saXN0KHBhdGgpLnBpcGUoXG4gICAgICAvLyBFbWl0IGVhY2ggZnJhZ21lbnQgaW5kaXZpZHVhbGx5LlxuICAgICAgY29uY2F0TWFwKGZyYWdtZW50cyA9PiBmcm9tKGZyYWdtZW50cykpLFxuICAgICAgLy8gSm9pbiB0aGUgcGF0aCB3aXRoIGZyYWdtZW50LlxuICAgICAgbWFwKGZyYWdtZW50ID0+IGpvaW4ocGF0aCwgZnJhZ21lbnQpKSxcbiAgICAgIC8vIEVtaXQgZGlyZWN0b3J5IGNvbnRlbnQgcGF0aHMgaW5zdGVhZCBvZiB0aGUgZGlyZWN0b3J5IHBhdGguXG4gICAgICBtZXJnZU1hcChwYXRoID0+IHRoaXMuX2hvc3QuaXNEaXJlY3RvcnkocGF0aCkucGlwZShcbiAgICAgICAgICBjb25jYXRNYXAoaXNEaXIgPT4gaXNEaXIgPyByZWN1cnNpdmVMaXN0KHBhdGgpIDogb2YocGF0aCkpXG4gICAgICAgIClcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiByZWN1cnNpdmVMaXN0KHRoaXMuX3Jlc29sdmUocGF0aCkpLnBpcGUoXG4gICAgICBtYXAocGF0aCA9PiBwYXRoLnJlcGxhY2UodGhpcy5iYXNlLCAnJykpLFxuICAgICAgdG9BcnJheSgpLFxuICAgICkudG9Qcm9taXNlKCkudGhlbih4ID0+IHgsIF9lcnIgPT4gW10pO1xuICB9XG5cbiAgcmVhZChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkSW50b0J1ZmZlcihwYXRoKVxuICAgICAgLnRoZW4oY29udGVudCA9PiB2aXJ0dWFsRnMuZmlsZUJ1ZmZlclRvU3RyaW5nKGNvbnRlbnQpKTtcbiAgfVxuXG4gIGhhc2gocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBzaGExID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTEnKTtcblxuICAgIHJldHVybiB0aGlzLl9yZWFkSW50b0J1ZmZlcihwYXRoKVxuICAgICAgLnRoZW4oY29udGVudCA9PiBzaGExLnVwZGF0ZShCdWZmZXIuZnJvbShjb250ZW50KSkpXG4gICAgICAudGhlbigoKSA9PiBzaGExLmRpZ2VzdCgnaGV4JykpO1xuICB9XG5cbiAgd3JpdGUocGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5faG9zdC53cml0ZSh0aGlzLl9yZXNvbHZlKHBhdGgpLCB2aXJ0dWFsRnMuc3RyaW5nVG9GaWxlQnVmZmVyKGNvbnRlbnQpKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZEludG9CdWZmZXIocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2aXJ0dWFsRnMuRmlsZUJ1ZmZlcj4ge1xuICAgIHJldHVybiB0aGlzLl9ob3N0LnJlYWQodGhpcy5fcmVzb2x2ZShwYXRoKSlcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Jlc29sdmUocGF0aDogc3RyaW5nKTogUGF0aCB7XG4gICAgcmV0dXJuIGpvaW4obm9ybWFsaXplKHRoaXMuYmFzZSksIHBhdGgpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VzU2VydmljZVdvcmtlcihwcm9qZWN0Um9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGxldCBzd1BhY2thZ2VKc29uUGF0aDtcblxuICB0cnkge1xuICAgIHN3UGFja2FnZUpzb25QYXRoID0gcmVzb2x2ZVByb2plY3RNb2R1bGUocHJvamVjdFJvb3QsICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlci9wYWNrYWdlLmpzb24nKTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIEBhbmd1bGFyL3NlcnZpY2Utd29ya2VyIGlzIG5vdCBpbnN0YWxsZWRcbiAgICB0aHJvdyBuZXcgRXJyb3IodGFncy5zdHJpcEluZGVudGBcbiAgICBZb3VyIHByb2plY3QgaXMgY29uZmlndXJlZCB3aXRoIHNlcnZpY2VXb3JrZXIgPSB0cnVlLCBidXQgQGFuZ3VsYXIvc2VydmljZS13b3JrZXJcbiAgICBpcyBub3QgaW5zdGFsbGVkLiBSdW4gXFxgbnBtIGluc3RhbGwgLS1zYXZlLWRldiBAYW5ndWxhci9zZXJ2aWNlLXdvcmtlclxcYFxuICAgIGFuZCB0cnkgYWdhaW4sIG9yIHJ1biBcXGBuZyBzZXQgYXBwcy4wLnNlcnZpY2VXb3JrZXI9ZmFsc2VcXGAgaW4geW91ciAuYW5ndWxhci1jbGkuanNvbi5cbiAgYCk7XG4gIH1cblxuICBjb25zdCBzd1BhY2thZ2VKc29uID0gZnMucmVhZEZpbGVTeW5jKHN3UGFja2FnZUpzb25QYXRoKS50b1N0cmluZygpO1xuICBjb25zdCBzd1ZlcnNpb24gPSBKU09OLnBhcnNlKHN3UGFja2FnZUpzb24pWyd2ZXJzaW9uJ107XG5cbiAgaWYgKCFzZW12ZXIuZ3RlKHN3VmVyc2lvbiwgTkVXX1NXX1ZFUlNJT04pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHRhZ3Muc3RyaXBJbmRlbnRgXG4gICAgVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIEBhbmd1bGFyL3NlcnZpY2Utd29ya2VyIGlzICR7c3dWZXJzaW9ufS4gVGhpcyB2ZXJzaW9uIG9mIHRoZSBDTElcbiAgICByZXF1aXJlcyB0aGUgQGFuZ3VsYXIvc2VydmljZS13b3JrZXIgdmVyc2lvbiB0byBzYXRpc2Z5ICR7TkVXX1NXX1ZFUlNJT059LiBQbGVhc2UgdXBncmFkZVxuICAgIHlvdXIgc2VydmljZSB3b3JrZXIgdmVyc2lvbi5cbiAgYCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1Z21lbnRBcHBXaXRoU2VydmljZVdvcmtlcihcbiAgaG9zdDogdmlydHVhbEZzLkhvc3QsXG4gIHByb2plY3RSb290OiBQYXRoLFxuICBhcHBSb290OiBQYXRoLFxuICBvdXRwdXRQYXRoOiBQYXRoLFxuICBiYXNlSHJlZjogc3RyaW5nLFxuICBuZ3N3Q29uZmlnUGF0aD86IHN0cmluZyxcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBQYXRoIHRvIHRoZSB3b3JrZXIgc2NyaXB0IGl0c2VsZi5cbiAgY29uc3QgZGlzdFBhdGggPSBub3JtYWxpemUob3V0cHV0UGF0aCk7XG4gIGNvbnN0IHdvcmtlclBhdGggPSBub3JtYWxpemUoXG4gICAgcmVzb2x2ZVByb2plY3RNb2R1bGUoZ2V0U3lzdGVtUGF0aChwcm9qZWN0Um9vdCksICdAYW5ndWxhci9zZXJ2aWNlLXdvcmtlci9uZ3N3LXdvcmtlci5qcycpLFxuICApO1xuICBjb25zdCBzd0NvbmZpZ1BhdGggPSByZXNvbHZlUHJvamVjdE1vZHVsZShcbiAgICBnZXRTeXN0ZW1QYXRoKHByb2plY3RSb290KSxcbiAgICAnQGFuZ3VsYXIvc2VydmljZS13b3JrZXIvY29uZmlnJyxcbiAgKTtcbiAgY29uc3Qgc2FmZXR5UGF0aCA9IGpvaW4oZGlybmFtZSh3b3JrZXJQYXRoKSwgJ3NhZmV0eS13b3JrZXIuanMnKTtcbiAgY29uc3QgY29uZmlnUGF0aCA9IG5nc3dDb25maWdQYXRoIGFzIFBhdGggfHwgam9pbihhcHBSb290LCAnbmdzdy1jb25maWcuanNvbicpO1xuXG4gIHJldHVybiBob3N0LmV4aXN0cyhjb25maWdQYXRoKS5waXBlKFxuICAgIHN3aXRjaE1hcChleGlzdHMgPT4ge1xuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRhZ3Mub25lTGluZWBcbiAgICAgICAgICBFcnJvcjogRXhwZWN0ZWQgdG8gZmluZCBhbiBuZ3N3LWNvbmZpZy5qc29uIGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICBmaWxlIGluIHRoZSAke2FwcFJvb3R9IGZvbGRlci4gRWl0aGVyIHByb3ZpZGUgb25lIG9yIGRpc2FibGUgU2VydmljZSBXb3JrZXJcbiAgICAgICAgICBpbiB5b3VyIGFuZ3VsYXIuanNvbiBjb25maWd1cmF0aW9uIGZpbGUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhvc3QucmVhZChjb25maWdQYXRoKSBhcyBPYnNlcnZhYmxlPHZpcnR1YWxGcy5GaWxlQnVmZmVyPjtcbiAgICB9KSxcbiAgICBtYXAoY29udGVudCA9PiBKU09OLnBhcnNlKHZpcnR1YWxGcy5maWxlQnVmZmVyVG9TdHJpbmcoY29udGVudCkpKSxcbiAgICBzd2l0Y2hNYXAoY29uZmlnSnNvbiA9PiB7XG4gICAgICBjb25zdCBHZW5lcmF0b3IgPSByZXF1aXJlKHN3Q29uZmlnUGF0aCkuR2VuZXJhdG9yO1xuICAgICAgY29uc3QgZ2VuID0gbmV3IEdlbmVyYXRvcihuZXcgQ2xpRmlsZXN5c3RlbShob3N0LCBvdXRwdXRQYXRoKSwgYmFzZUhyZWYpO1xuXG4gICAgICByZXR1cm4gZ2VuLnByb2Nlc3MoY29uZmlnSnNvbik7XG4gICAgfSksXG5cbiAgICBzd2l0Y2hNYXAob3V0cHV0ID0+IHtcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0gSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKTtcbiAgICAgIHJldHVybiBob3N0LnJlYWQod29ya2VyUGF0aCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHdvcmtlckNvZGUgPT4ge1xuICAgICAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgICAgIGhvc3Qud3JpdGUoam9pbihkaXN0UGF0aCwgJ25nc3cuanNvbicpLCB2aXJ0dWFsRnMuc3RyaW5nVG9GaWxlQnVmZmVyKG1hbmlmZXN0KSksXG4gICAgICAgICAgICBob3N0LndyaXRlKGpvaW4oZGlzdFBhdGgsICduZ3N3LXdvcmtlci5qcycpLCB3b3JrZXJDb2RlKSxcbiAgICAgICAgICApIGFzIE9ic2VydmFibGU8dm9pZD47XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSxcblxuICAgIHN3aXRjaE1hcCgoKSA9PiBob3N0LmV4aXN0cyhzYWZldHlQYXRoKSksXG4gICAgLy8gSWYgQGFuZ3VsYXIvc2VydmljZS13b3JrZXIgaGFzIHRoZSBzYWZldHkgc2NyaXB0LCBjb3B5IGl0IGludG8gdHdvIGxvY2F0aW9ucy5cbiAgICBzd2l0Y2hNYXAoZXhpc3RzID0+IHtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIHJldHVybiBvZjx2b2lkPih1bmRlZmluZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaG9zdC5yZWFkKHNhZmV0eVBhdGgpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChzYWZldHlDb2RlID0+IHtcbiAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICBob3N0LndyaXRlKGpvaW4oZGlzdFBhdGgsICd3b3JrZXItYmFzaWMubWluLmpzJyksIHNhZmV0eUNvZGUpLFxuICAgICAgICAgICAgaG9zdC53cml0ZShqb2luKGRpc3RQYXRoLCAnc2FmZXR5LXdvcmtlci5qcycpLCBzYWZldHlDb2RlKSxcbiAgICAgICAgICApIGFzIE9ic2VydmFibGU8dm9pZD47XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KSxcblxuICAgIC8vIFJlbW92ZSBhbGwgZWxlbWVudHMsIHJlZHVjZSB0aGVtIHRvIGEgc2luZ2xlIGVtaXQuXG4gICAgcmVkdWNlKCgpID0+IHt9KSxcbiAgKS50b1Byb21pc2UoKTtcbn1cbiJdfQ==