UNPKG

browserfs

Version:

A filesystem in your browser!

844 lines 113 kB
"use strict"; var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var file_system_1 = require('../core/file_system'); var api_error_1 = require('../core/api_error'); var file_flag_1 = require('../core/file_flag'); var preload_file_1 = require('../generic/preload_file'); var locked_fs_1 = require('../generic/locked_fs'); var path = require('path'); var deletionLogPath = '/.deletedFiles.log'; function makeModeWritable(mode) { return 146 | mode; } function getFlag(f) { return file_flag_1.FileFlag.getFileFlag(f); } var OverlayFile = (function (_super) { __extends(OverlayFile, _super); function OverlayFile(fs, path, flag, stats, data) { _super.call(this, fs, path, flag, stats, data); } OverlayFile.prototype.sync = function (cb) { var _this = this; if (!this.isDirty()) { cb(null); return; } this._fs._syncAsync(this, function (err) { _this.resetDirty(); cb(err); }); }; OverlayFile.prototype.syncSync = function () { if (this.isDirty()) { this._fs._syncSync(this); this.resetDirty(); } }; OverlayFile.prototype.close = function (cb) { this.sync(cb); }; OverlayFile.prototype.closeSync = function () { this.syncSync(); }; return OverlayFile; }(preload_file_1.PreloadFile)); var UnlockedOverlayFS = (function (_super) { __extends(UnlockedOverlayFS, _super); function UnlockedOverlayFS(writable, readable) { _super.call(this); this._isInitialized = false; this._initializeCallbacks = []; this._deletedFiles = {}; this._deleteLog = ''; this._deleteLogUpdatePending = false; this._deleteLogUpdateNeeded = false; this._deleteLogError = null; this._writable = writable; this._readable = readable; if (this._writable.isReadOnly()) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EINVAL, "Writable file system must be writable."); } } UnlockedOverlayFS.prototype.checkInitialized = function () { if (!this._isInitialized) { throw new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, "OverlayFS is not initialized. Please initialize OverlayFS using its initialize() method before using it."); } else if (this._deleteLogError !== null) { var e = this._deleteLogError; this._deleteLogError = null; throw e; } }; UnlockedOverlayFS.prototype.checkInitAsync = function (cb) { if (!this._isInitialized) { cb(new api_error_1.ApiError(api_error_1.ErrorCode.EPERM, "OverlayFS is not initialized. Please initialize OverlayFS using its initialize() method before using it.")); return false; } else if (this._deleteLogError !== null) { var e = this._deleteLogError; this._deleteLogError = null; cb(e); return false; } return true; }; UnlockedOverlayFS.prototype.checkPath = function (p) { if (p === deletionLogPath) { throw api_error_1.ApiError.EPERM(p); } }; UnlockedOverlayFS.prototype.checkPathAsync = function (p, cb) { if (p === deletionLogPath) { cb(api_error_1.ApiError.EPERM(p)); return true; } return false; }; UnlockedOverlayFS.prototype.getOverlayedFileSystems = function () { return { readable: this._readable, writable: this._writable }; }; UnlockedOverlayFS.prototype.createParentDirectoriesAsync = function (p, cb) { var parent = path.dirname(p); var toCreate = []; var _this = this; this._writable.stat(parent, false, statDone); function statDone(err, stat) { if (err) { toCreate.push(parent); parent = path.dirname(parent); _this._writable.stat(parent, false, statDone); } else { createParents(); } } function createParents() { if (!toCreate.length) { return cb(); } var dir = toCreate.pop(); _this._readable.stat(dir, false, function (err, stats) { if (!stats) { return cb(); } _this._writable.mkdir(dir, stats.mode, function (err) { if (err) { return cb(err); } createParents(); }); }); } }; UnlockedOverlayFS.prototype.createParentDirectories = function (p) { var _this = this; var parent = path.dirname(p), toCreate = []; while (!this._writable.existsSync(parent)) { toCreate.push(parent); parent = path.dirname(parent); } toCreate = toCreate.reverse(); toCreate.forEach(function (p) { _this._writable.mkdirSync(p, _this.statSync(p, false).mode); }); }; UnlockedOverlayFS.isAvailable = function () { return true; }; UnlockedOverlayFS.prototype._syncAsync = function (file, cb) { var _this = this; this.createParentDirectoriesAsync(file.getPath(), function (err) { if (err) { return cb(err); } _this._writable.writeFile(file.getPath(), file.getBuffer(), null, getFlag('w'), file.getStats().mode, cb); }); }; UnlockedOverlayFS.prototype._syncSync = function (file) { this.createParentDirectories(file.getPath()); this._writable.writeFileSync(file.getPath(), file.getBuffer(), null, getFlag('w'), file.getStats().mode); }; UnlockedOverlayFS.prototype.getName = function () { return "OverlayFS"; }; UnlockedOverlayFS.prototype.initialize = function (cb) { var _this = this; var callbackArray = this._initializeCallbacks; var end = function (e) { _this._isInitialized = !e; _this._initializeCallbacks = []; callbackArray.forEach((function (cb) { return cb(e); })); }; if (this._isInitialized) { return cb(); } callbackArray.push(cb); if (callbackArray.length !== 1) { return; } this._writable.readFile(deletionLogPath, 'utf8', getFlag('r'), function (err, data) { if (err) { if (err.errno !== api_error_1.ErrorCode.ENOENT) { return end(err); } } else { _this._deleteLog = data; } _this._reparseDeletionLog(); end(null); }); }; UnlockedOverlayFS.prototype.isReadOnly = function () { return false; }; UnlockedOverlayFS.prototype.supportsSynch = function () { return this._readable.supportsSynch() && this._writable.supportsSynch(); }; UnlockedOverlayFS.prototype.supportsLinks = function () { return false; }; UnlockedOverlayFS.prototype.supportsProps = function () { return this._readable.supportsProps() && this._writable.supportsProps(); }; UnlockedOverlayFS.prototype.deletePath = function (p) { this._deletedFiles[p] = true; this.updateLog("d" + p + "\n"); }; UnlockedOverlayFS.prototype.updateLog = function (addition) { var _this = this; this._deleteLog += addition; if (this._deleteLogUpdatePending) { this._deleteLogUpdateNeeded = true; } else { this._deleteLogUpdatePending = true; this._writable.writeFile(deletionLogPath, this._deleteLog, 'utf8', file_flag_1.FileFlag.getFileFlag('w'), 420, function (e) { _this._deleteLogUpdatePending = false; if (e) { _this._deleteLogError = e; } else if (_this._deleteLogUpdateNeeded) { _this._deleteLogUpdateNeeded = false; _this.updateLog(''); } }); } }; UnlockedOverlayFS.prototype.getDeletionLog = function () { return this._deleteLog; }; UnlockedOverlayFS.prototype._reparseDeletionLog = function () { var _this = this; this._deletedFiles = {}; this._deleteLog.split('\n').forEach(function (path) { _this._deletedFiles[path.slice(1)] = path.slice(0, 1) === 'd'; }); }; UnlockedOverlayFS.prototype.restoreDeletionLog = function (log) { this._deleteLog = log; this._reparseDeletionLog(); this.updateLog(''); }; UnlockedOverlayFS.prototype.rename = function (oldPath, newPath, cb) { var _this = this; if (!this.checkInitAsync(cb) || this.checkPathAsync(oldPath, cb) || this.checkPathAsync(newPath, cb)) return; if (oldPath === deletionLogPath || newPath === deletionLogPath) { return cb(api_error_1.ApiError.EPERM('Cannot rename deletion log.')); } if (oldPath === newPath) { return cb(); } this.stat(oldPath, false, function (oldErr, oldStats) { if (oldErr) { return cb(oldErr); } return _this.stat(newPath, false, function (newErr, newStats) { function copyDirContents(files) { var file = files.shift(); if (!file) { return cb(); } var oldFile = path.resolve(oldPath, file); var newFile = path.resolve(newPath, file); this.rename(oldFile, newFile, function (err) { if (err) { return cb(err); } copyDirContents(files); }); } var mode = 511; if (oldStats.isDirectory()) { if (newErr) { if (newErr.errno !== api_error_1.ErrorCode.ENOENT) { return cb(newErr); } return _this._writable.exists(oldPath, function (exists) { if (exists) { return _this._writable.rename(oldPath, newPath, cb); } _this._writable.mkdir(newPath, mode, function (mkdirErr) { if (mkdirErr) { return cb(mkdirErr); } _this._readable.readdir(oldPath, function (err, files) { if (err) { return cb(); } copyDirContents(files); }); }); }); } mode = newStats.mode; if (!newStats.isDirectory()) { return cb(api_error_1.ApiError.ENOTDIR(newPath)); } _this.readdir(newPath, function (readdirErr, files) { if (files && files.length) { return cb(api_error_1.ApiError.ENOTEMPTY(newPath)); } _this._readable.readdir(oldPath, function (err, files) { if (err) { return cb(); } copyDirContents(files); }); }); } if (newStats && newStats.isDirectory()) { return cb(api_error_1.ApiError.EISDIR(newPath)); } _this.readFile(oldPath, null, getFlag('r'), function (err, data) { if (err) { return cb(err); } return _this.writeFile(newPath, data, null, getFlag('w'), oldStats.mode, function (err) { if (err) { return cb(err); } return _this.unlink(oldPath, cb); }); }); }); }); }; UnlockedOverlayFS.prototype.renameSync = function (oldPath, newPath) { var _this = this; this.checkInitialized(); this.checkPath(oldPath); this.checkPath(newPath); if (oldPath === deletionLogPath || newPath === deletionLogPath) { throw api_error_1.ApiError.EPERM('Cannot rename deletion log.'); } var oldStats = this.statSync(oldPath, false); if (oldStats.isDirectory()) { if (oldPath === newPath) { return; } var mode = 511; if (this.existsSync(newPath)) { var stats = this.statSync(newPath, false), mode = stats.mode; if (stats.isDirectory()) { if (this.readdirSync(newPath).length > 0) { throw api_error_1.ApiError.ENOTEMPTY(newPath); } } else { throw api_error_1.ApiError.ENOTDIR(newPath); } } if (this._writable.existsSync(oldPath)) { this._writable.renameSync(oldPath, newPath); } else if (!this._writable.existsSync(newPath)) { this._writable.mkdirSync(newPath, mode); } if (this._readable.existsSync(oldPath)) { this._readable.readdirSync(oldPath).forEach(function (name) { _this.renameSync(path.resolve(oldPath, name), path.resolve(newPath, name)); }); } } else { if (this.existsSync(newPath) && this.statSync(newPath, false).isDirectory()) { throw api_error_1.ApiError.EISDIR(newPath); } this.writeFileSync(newPath, this.readFileSync(oldPath, null, getFlag('r')), null, getFlag('w'), oldStats.mode); } if (oldPath !== newPath && this.existsSync(oldPath)) { this.unlinkSync(oldPath); } }; UnlockedOverlayFS.prototype.stat = function (p, isLstat, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this._writable.stat(p, isLstat, function (err, stat) { if (err && err.errno === api_error_1.ErrorCode.ENOENT) { if (_this._deletedFiles[p]) { cb(api_error_1.ApiError.ENOENT(p)); } _this._readable.stat(p, isLstat, function (err, stat) { if (stat) { stat = stat.clone(); stat.mode = makeModeWritable(stat.mode); } cb(err, stat); }); } else { cb(err, stat); } }); }; UnlockedOverlayFS.prototype.statSync = function (p, isLstat) { this.checkInitialized(); try { return this._writable.statSync(p, isLstat); } catch (e) { if (this._deletedFiles[p]) { throw api_error_1.ApiError.ENOENT(p); } var oldStat = this._readable.statSync(p, isLstat).clone(); oldStat.mode = makeModeWritable(oldStat.mode); return oldStat; } }; UnlockedOverlayFS.prototype.open = function (p, flag, mode, cb) { var _this = this; if (!this.checkInitAsync(cb) || this.checkPathAsync(p, cb)) return; this.stat(p, false, function (err, stats) { if (stats) { switch (flag.pathExistsAction()) { case file_flag_1.ActionType.TRUNCATE_FILE: return _this.createParentDirectoriesAsync(p, function (err) { if (err) { return cb(err); } _this._writable.open(p, flag, mode, cb); }); case file_flag_1.ActionType.NOP: return _this._writable.exists(p, function (exists) { if (exists) { _this._writable.open(p, flag, mode, cb); } else { stats = stats.clone(); stats.mode = mode; _this._readable.readFile(p, null, getFlag('r'), function (readFileErr, data) { if (readFileErr) { return cb(readFileErr); } if (stats.size === -1) { stats.size = data.length; } var f = new OverlayFile(_this, p, flag, stats, data); cb(null, f); }); } }); default: return cb(api_error_1.ApiError.EEXIST(p)); } } else { switch (flag.pathNotExistsAction()) { case file_flag_1.ActionType.CREATE_FILE: return _this.createParentDirectoriesAsync(p, function (err) { if (err) { return cb(err); } return _this._writable.open(p, flag, mode, cb); }); default: return cb(api_error_1.ApiError.ENOENT(p)); } } }); }; UnlockedOverlayFS.prototype.openSync = function (p, flag, mode) { this.checkInitialized(); this.checkPath(p); if (p === deletionLogPath) { throw api_error_1.ApiError.EPERM('Cannot open deletion log.'); } if (this.existsSync(p)) { switch (flag.pathExistsAction()) { case file_flag_1.ActionType.TRUNCATE_FILE: this.createParentDirectories(p); return this._writable.openSync(p, flag, mode); case file_flag_1.ActionType.NOP: if (this._writable.existsSync(p)) { return this._writable.openSync(p, flag, mode); } else { var buf = this._readable.readFileSync(p, null, getFlag('r')); var stats = this._readable.statSync(p, false).clone(); stats.mode = mode; return new OverlayFile(this, p, flag, stats, buf); } default: throw api_error_1.ApiError.EEXIST(p); } } else { switch (flag.pathNotExistsAction()) { case file_flag_1.ActionType.CREATE_FILE: this.createParentDirectories(p); return this._writable.openSync(p, flag, mode); default: throw api_error_1.ApiError.ENOENT(p); } } }; UnlockedOverlayFS.prototype.unlink = function (p, cb) { var _this = this; if (!this.checkInitAsync(cb) || this.checkPathAsync(p, cb)) return; this.exists(p, function (exists) { if (!exists) return cb(api_error_1.ApiError.ENOENT(p)); _this._writable.exists(p, function (writableExists) { if (writableExists) { return _this._writable.unlink(p, function (err) { if (err) { return cb(err); } _this.exists(p, function (readableExists) { if (readableExists) { _this.deletePath(p); } cb(null); }); }); } else { _this.deletePath(p); cb(null); } }); }); }; UnlockedOverlayFS.prototype.unlinkSync = function (p) { this.checkInitialized(); this.checkPath(p); if (this.existsSync(p)) { if (this._writable.existsSync(p)) { this._writable.unlinkSync(p); } if (this.existsSync(p)) { this.deletePath(p); } } else { throw api_error_1.ApiError.ENOENT(p); } }; UnlockedOverlayFS.prototype.rmdir = function (p, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; var rmdirLower = function () { _this.readdir(p, function (err, files) { if (err) { return cb(err); } if (files.length) { return cb(api_error_1.ApiError.ENOTEMPTY(p)); } _this.deletePath(p); cb(null); }); }; this.exists(p, function (exists) { if (!exists) { return cb(api_error_1.ApiError.ENOENT(p)); } _this._writable.exists(p, function (writableExists) { if (writableExists) { _this._writable.rmdir(p, function (err) { if (err) { return cb(err); } _this._readable.exists(p, function (readableExists) { if (readableExists) { rmdirLower(); } else { cb(); } }); }); } else { rmdirLower(); } }); }); }; UnlockedOverlayFS.prototype.rmdirSync = function (p) { this.checkInitialized(); if (this.existsSync(p)) { if (this._writable.existsSync(p)) { this._writable.rmdirSync(p); } if (this.existsSync(p)) { if (this.readdirSync(p).length > 0) { throw api_error_1.ApiError.ENOTEMPTY(p); } else { this.deletePath(p); } } } else { throw api_error_1.ApiError.ENOENT(p); } }; UnlockedOverlayFS.prototype.mkdir = function (p, mode, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this.exists(p, function (exists) { if (exists) { return cb(api_error_1.ApiError.EEXIST(p)); } _this.createParentDirectoriesAsync(p, function (err) { if (err) { return cb(err); } _this._writable.mkdir(p, mode, cb); }); }); }; UnlockedOverlayFS.prototype.mkdirSync = function (p, mode) { this.checkInitialized(); if (this.existsSync(p)) { throw api_error_1.ApiError.EEXIST(p); } else { this.createParentDirectories(p); this._writable.mkdirSync(p, mode); } }; UnlockedOverlayFS.prototype.readdir = function (p, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this.stat(p, false, function (err, dirStats) { if (err) { return cb(err); } if (!dirStats.isDirectory()) { return cb(api_error_1.ApiError.ENOTDIR(p)); } _this._writable.readdir(p, function (err, wFiles) { if (err && err.code !== 'ENOENT') { return cb(err); } else if (err || !wFiles) { wFiles = []; } _this._readable.readdir(p, function (err, rFiles) { if (err || !rFiles) { rFiles = []; } var seenMap = {}; var filtered = wFiles.concat(rFiles.filter(function (fPath) { return !_this._deletedFiles[(p + "/" + fPath)]; })).filter(function (fPath) { var result = !seenMap[fPath]; seenMap[fPath] = true; return result; }); cb(null, filtered); }); }); }); }; UnlockedOverlayFS.prototype.readdirSync = function (p) { var _this = this; this.checkInitialized(); var dirStats = this.statSync(p, false); if (!dirStats.isDirectory()) { throw api_error_1.ApiError.ENOTDIR(p); } var contents = []; try { contents = contents.concat(this._writable.readdirSync(p)); } catch (e) { } try { contents = contents.concat(this._readable.readdirSync(p).filter(function (fPath) { return !_this._deletedFiles[(p + "/" + fPath)]; })); } catch (e) { } var seenMap = {}; return contents.filter(function (fileP) { var result = !seenMap[fileP]; seenMap[fileP] = true; return result; }); }; UnlockedOverlayFS.prototype.exists = function (p, cb) { var _this = this; this.checkInitialized(); this._writable.exists(p, function (existsWritable) { if (existsWritable) { return cb(true); } _this._readable.exists(p, function (existsReadable) { cb(existsReadable && _this._deletedFiles[p] !== true); }); }); }; UnlockedOverlayFS.prototype.existsSync = function (p) { this.checkInitialized(); return this._writable.existsSync(p) || (this._readable.existsSync(p) && this._deletedFiles[p] !== true); }; UnlockedOverlayFS.prototype.chmod = function (p, isLchmod, mode, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this.operateOnWritableAsync(p, function (err) { if (err) { return cb(err); } else { _this._writable.chmod(p, isLchmod, mode, cb); } }); }; UnlockedOverlayFS.prototype.chmodSync = function (p, isLchmod, mode) { var _this = this; this.checkInitialized(); this.operateOnWritable(p, function () { _this._writable.chmodSync(p, isLchmod, mode); }); }; UnlockedOverlayFS.prototype.chown = function (p, isLchmod, uid, gid, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this.operateOnWritableAsync(p, function (err) { if (err) { return cb(err); } else { _this._writable.chown(p, isLchmod, uid, gid, cb); } }); }; UnlockedOverlayFS.prototype.chownSync = function (p, isLchown, uid, gid) { var _this = this; this.checkInitialized(); this.operateOnWritable(p, function () { _this._writable.chownSync(p, isLchown, uid, gid); }); }; UnlockedOverlayFS.prototype.utimes = function (p, atime, mtime, cb) { var _this = this; if (!this.checkInitAsync(cb)) return; this.operateOnWritableAsync(p, function (err) { if (err) { return cb(err); } else { _this._writable.utimes(p, atime, mtime, cb); } }); }; UnlockedOverlayFS.prototype.utimesSync = function (p, atime, mtime) { var _this = this; this.checkInitialized(); this.operateOnWritable(p, function () { _this._writable.utimesSync(p, atime, mtime); }); }; UnlockedOverlayFS.prototype.operateOnWritable = function (p, f) { if (this.existsSync(p)) { if (!this._writable.existsSync(p)) { this.copyToWritable(p); } f(); } else { throw api_error_1.ApiError.ENOENT(p); } }; UnlockedOverlayFS.prototype.operateOnWritableAsync = function (p, cb) { var _this = this; this.exists(p, function (exists) { if (!exists) { return cb(api_error_1.ApiError.ENOENT(p)); } _this._writable.exists(p, function (existsWritable) { if (existsWritable) { cb(); } else { return _this.copyToWritableAsync(p, cb); } }); }); }; UnlockedOverlayFS.prototype.copyToWritable = function (p) { var pStats = this.statSync(p, false); if (pStats.isDirectory()) { this._writable.mkdirSync(p, pStats.mode); } else { this.writeFileSync(p, this._readable.readFileSync(p, null, getFlag('r')), null, getFlag('w'), this.statSync(p, false).mode); } }; UnlockedOverlayFS.prototype.copyToWritableAsync = function (p, cb) { var _this = this; this.stat(p, false, function (err, pStats) { if (err) { return cb(err); } if (pStats.isDirectory()) { return _this._writable.mkdir(p, pStats.mode, cb); } _this._readable.readFile(p, null, getFlag('r'), function (err, data) { if (err) { return cb(err); } _this.writeFile(p, data, null, getFlag('w'), pStats.mode, cb); }); }); }; return UnlockedOverlayFS; }(file_system_1.BaseFileSystem)); exports.UnlockedOverlayFS = UnlockedOverlayFS; var OverlayFS = (function (_super) { __extends(OverlayFS, _super); function OverlayFS(writable, readable) { _super.call(this, new UnlockedOverlayFS(writable, readable)); } OverlayFS.prototype.initialize = function (cb) { _super.prototype.initialize.call(this, cb); }; OverlayFS.isAvailable = function () { return UnlockedOverlayFS.isAvailable(); }; OverlayFS.prototype.getOverlayedFileSystems = function () { return _super.prototype.getFSUnlocked.call(this).getOverlayedFileSystems(); }; OverlayFS.prototype.unwrap = function () { return _super.prototype.getFSUnlocked.call(this); }; return OverlayFS; }(locked_fs_1["default"])); exports.__esModule = true; exports["default"] = OverlayFS; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3ZlcmxheUZTLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmQvT3ZlcmxheUZTLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRCQUF5QyxxQkFBcUIsQ0FBQyxDQUFBO0FBQy9ELDBCQUFrQyxtQkFBbUIsQ0FBQyxDQUFBO0FBQ3RELDBCQUFtQyxtQkFBbUIsQ0FBQyxDQUFBO0FBSXZELDZCQUEwQix5QkFBeUIsQ0FBQyxDQUFBO0FBQ3BELDBCQUFxQixzQkFBc0IsQ0FBQyxDQUFBO0FBQzVDLElBQU8sSUFBSSxXQUFXLE1BQU0sQ0FBQyxDQUFDO0FBQzlCLElBQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDO0FBSzdDLDBCQUEwQixJQUFZO0lBQ3BDLE1BQU0sQ0FBQyxHQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxpQkFBaUIsQ0FBUztJQUN4QixNQUFNLENBQUMsb0JBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUtEO0lBQTBCLCtCQUE4QjtJQUN0RCxxQkFBWSxFQUFxQixFQUFFLElBQVksRUFBRSxJQUFjLEVBQUUsS0FBWSxFQUFFLElBQVk7UUFDekYsa0JBQU0sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSwwQkFBSSxHQUFYLFVBQVksRUFBMEI7UUFBdEMsaUJBVUM7UUFUQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1QsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxVQUFDLEdBQWE7WUFDdEMsS0FBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2xCLEVBQUUsQ0FB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