Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
code / usr / share / code / resources / app / extensions / node-debug / out / node / nodeV8Protocol.js
Size: Mime:
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
"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 EE = require('events');
var nls = require('vscode-nls');
var localize = nls.loadMessageBundle(__filename);
var NodeV8Message = (function () {
    function NodeV8Message(type) {
        this.seq = 0;
        this.type = type;
    }
    return NodeV8Message;
}());
exports.NodeV8Message = NodeV8Message;
var NodeV8Response = (function (_super) {
    __extends(NodeV8Response, _super);
    function NodeV8Response(request, message) {
        _super.call(this, 'response');
        this.request_seq = request.seq;
        this.command = request.command;
        if (message) {
            this.success = false;
            this.message = message;
        }
        else {
            this.success = true;
        }
    }
    return NodeV8Response;
}(NodeV8Message));
exports.NodeV8Response = NodeV8Response;
var NodeV8Event = (function (_super) {
    __extends(NodeV8Event, _super);
    function NodeV8Event(event, body) {
        _super.call(this, 'event');
        this.event = event;
        if (body) {
            this.body = body;
        }
    }
    return NodeV8Event;
}(NodeV8Message));
exports.NodeV8Event = NodeV8Event;
//---- the protocol implementation
var NodeV8Protocol = (function (_super) {
    __extends(NodeV8Protocol, _super);
    function NodeV8Protocol(responseHook) {
        _super.call(this);
        this._pendingRequests = new Map();
        this.embeddedHostVersion = -1;
        this._responseHook = responseHook;
    }
    NodeV8Protocol.prototype.startDispatch = function (inStream, outStream) {
        var _this = this;
        this._sequence = 1;
        this._writableStream = outStream;
        inStream.on('data', function (data) { return _this.execute(data); });
        inStream.on('close', function () {
            _this.emitEvent(new NodeV8Event('close'));
        });
        inStream.on('error', function (error) {
            _this.emitEvent(new NodeV8Event('error'));
        });
        outStream.on('error', function (error) {
            _this.emitEvent(new NodeV8Event('error'));
        });
        inStream.resume();
    };
    NodeV8Protocol.prototype.stop = function () {
        if (this._writableStream) {
            this._writableStream.end();
        }
    };
    NodeV8Protocol.prototype.command = function (command, args, cb) {
        this._command(command, args, NodeV8Protocol.TIMEOUT, cb);
    };
    NodeV8Protocol.prototype.command2 = function (command, args, timeout) {
        var _this = this;
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return new Promise(function (resolve, reject) {
            _this.command(command, args, function (response) {
                if (response.success) {
                    resolve(response);
                }
                else {
                    reject(response);
                }
            });
        });
    };
    NodeV8Protocol.prototype.evaluate = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('evaluate', args);
    };
    NodeV8Protocol.prototype.scripts = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('scripts', args);
    };
    NodeV8Protocol.prototype.setVariableValue = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('setvariablevalue', args);
    };
    NodeV8Protocol.prototype.frame = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('frame', args);
    };
    NodeV8Protocol.prototype.setBreakpoint = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('setbreakpoint', args);
    };
    NodeV8Protocol.prototype.setExceptionBreak = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('setexceptionbreak', args);
    };
    NodeV8Protocol.prototype.clearBreakpoint = function (args, timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('clearbreakpoint', args);
    };
    NodeV8Protocol.prototype.listBreakpoints = function (timeout) {
        if (timeout === void 0) { timeout = NodeV8Protocol.TIMEOUT; }
        return this.command2('listbreakpoints');
    };
    NodeV8Protocol.prototype.sendEvent = function (event) {
        this.send('event', event);
    };
    NodeV8Protocol.prototype.sendResponse = function (response) {
        if (response.seq > 0) {
        }
        else {
            this.send('response', response);
        }
    };
    // ---- private ------------------------------------------------------------
    NodeV8Protocol.prototype._command = function (command, args, timeout, cb) {
        var _this = this;
        var request = {
            command: command
        };
        if (args && Object.keys(args).length > 0) {
            request.arguments = args;
        }
        if (!this._writableStream) {
            if (cb) {
                cb(new NodeV8Response(request, localize(0, null)));
            }
            return;
        }
        if (this._unresponsiveMode) {
            if (cb) {
                cb(new NodeV8Response(request, localize(1, null)));
            }
            return;
        }
        this.send('request', request);
        if (cb) {
            this._pendingRequests[request.seq] = cb;
            var timer_1 = setTimeout(function () {
                clearTimeout(timer_1);
                var clb = _this._pendingRequests[request.seq];
                if (clb) {
                    delete _this._pendingRequests[request.seq];
                    clb(new NodeV8Response(request, localize(2, null, timeout)));
                    _this._unresponsiveMode = true;
                    _this.emitEvent(new NodeV8Event('diagnostic', { reason: "request '" + command + "' timed out'" }));
                }
            }, timeout);
        }
    };
    NodeV8Protocol.prototype.emitEvent = function (event) {
        this.emit(event.event, event);
    };
    NodeV8Protocol.prototype.send = function (typ, message) {
        message.type = typ;
        message.seq = this._sequence++;
        var json = JSON.stringify(message);
        var data = 'Content-Length: ' + Buffer.byteLength(json, 'utf8') + '\r\n\r\n' + json;
        if (this._writableStream) {
            this._writableStream.write(data);
        }
    };
    NodeV8Protocol.prototype.internalDispatch = function (message) {
        switch (message.type) {
            case 'event':
                var e = message;
                this.emitEvent(e);
                break;
            case 'response':
                if (this._unresponsiveMode) {
                    this._unresponsiveMode = false;
                    this.emitEvent(new NodeV8Event('diagnostic', { reason: 'responsive' }));
                }
                var response = message;
                var clb = this._pendingRequests[response.request_seq];
                if (clb) {
                    delete this._pendingRequests[response.request_seq];
                    if (this._responseHook) {
                        this._responseHook(response);
                    }
                    clb(response);
                }
                break;
            default:
                break;
        }
    };
    NodeV8Protocol.prototype.execute = function (data) {
        this._rawData = this._rawData ? Buffer.concat([this._rawData, data]) : data;
        while (true) {
            if (this._contentLength >= 0) {
                if (this._rawData.length >= this._contentLength) {
                    var message = this._rawData.toString('utf8', 0, this._contentLength);
                    this._rawData = this._rawData.slice(this._contentLength);
                    this._contentLength = -1;
                    if (message.length > 0) {
                        try {
                            this.internalDispatch(JSON.parse(message));
                        }
                        catch (e) {
                        }
                    }
                    continue; // there may be more complete messages to process
                }
            }
            else {
                var idx = this._rawData.indexOf(NodeV8Protocol.TWO_CRLF);
                if (idx !== -1) {
                    var header = this._rawData.toString('utf8', 0, idx);
                    var lines = header.split('\r\n');
                    for (var i = 0; i < lines.length; i++) {
                        var pair = lines[i].split(/: +/);
                        switch (pair[0]) {
                            case 'V8-Version':
                                var match0 = pair[1].match(/(\d+(?:\.\d+)+)/);
                                if (match0 && match0.length === 2) {
                                    this.v8Version = match0[1];
                                }
                                break;
                            case 'Embedding-Host':
                                var match = pair[1].match(/node\sv(\d+)\.(\d+)\.(\d+)/);
                                if (match && match.length === 4) {
                                    this.embeddedHostVersion = (parseInt(match[1]) * 100 + parseInt(match[2])) * 100 + parseInt(match[3]);
                                }
                                else if (pair[1] === 'Electron') {
                                    this.embeddedHostVersion = 51000; // TODO this needs to be detected in a smarter way by looking at the V8 version in Electron
                                }
                                break;
                            case 'Content-Length':
                                this._contentLength = +pair[1];
                                break;
                        }
                    }
                    this._rawData = this._rawData.slice(idx + NodeV8Protocol.TWO_CRLF.length);
                    continue; // try to handle a complete message
                }
            }
            break;
        }
    };
    NodeV8Protocol.TIMEOUT = 10000;
    NodeV8Protocol.TWO_CRLF = '\r\n\r\n';
    return NodeV8Protocol;
}(EE.EventEmitter));
exports.NodeV8Protocol = NodeV8Protocol;

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGUvbm9kZVY4UHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztnR0FHZ0c7Ozs7Ozs7QUFFaEcsSUFBWSxFQUFFLFdBQU0sUUFBUSxDQUFDLENBQUE7QUFDN0IsSUFBWSxHQUFHLFdBQU0sWUFBWSxDQUFDLENBQUE7QUFFbEMsSUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixZQUFFLENBQUM7QUFFekM7SUFJQyx1QkFBbUIsSUFBc0M7UUFDeEQsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNsQixDQUFDO0lBQ0Ysb0JBQUM7QUFBRCxDQVJBLEFBUUMsSUFBQTtBQVJZLHFCQUFhLGdCQVF6QixDQUFBO0FBRUQ7SUFBb0Msa0NBQWE7SUFTaEQsd0JBQW1CLE9BQXVCLEVBQUUsT0FBZ0I7UUFDM0Qsa0JBQU0sVUFBVSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQztJQUNGLENBQUM7SUFDRixxQkFBQztBQUFELENBcEJBLEFBb0JDLENBcEJtQyxhQUFhLEdBb0JoRDtBQXBCWSxzQkFBYyxpQkFvQjFCLENBQUE7QUFFRDtJQUFpQywrQkFBYTtJQUk3QyxxQkFBbUIsS0FBYSxFQUFFLElBQVU7UUFDM0Msa0JBQU0sT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsS0FB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Q0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQzFFLFFBQVEsQ0FBQyxDQUFDLG1DQUFtQztnQkFDOUMsQ0FBQztZQUNGLENBQUM7WUFDRCxLQUFLLENBQUM7UUFDUCxDQUFDO0lBQ0YsQ0FBQztJQWpQYyxzQkFBTyxHQUFHLEtBQUssQ0FBQztJQUNoQix1QkFBUSxHQUFHLFVBQVUsQ0FBQztJQWlQdEMscUJBQUM7QUFBRCxDQXBQQSxBQW9QQyxDQXBQbUMsRUFBRSxDQUFDLFlBQVksR0FvUGxEO0FBcFBZLHNCQUFjLGlCQW9QMUIsQ0FBQSIsImZpbGUiOiJub2RlL25vZGVWOFByb3RvY29sLmpzIiwic291cmNlUm9vdCI6Ii9zb3VyY2UvIiwic291cmNlc0NvbnRlbnQiOlsiLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbmltcG9ydCAqIGFzIEVFIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgKiBhcyBubHMgZnJvbSAndnNjb2RlLW5scyc7XG5cbmNvbnN0IGxvY2FsaXplID0gbmxzLmxvYWRNZXNzYWdlQnVuZGxlKCk7XG5cbmV4cG9ydCBjbGFzcyBOb2RlVjhNZXNzYWdlIHtcblx0c2VxOiBudW1iZXI7XG5cdHR5cGU6ICdyZXF1ZXN0JyB8ICdyZXNwb25zZScgfCAnZXZlbnQnO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50Jykge1xuXHRcdHRoaXMuc2VxID0gMDtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlVjhSZXNwb25zZSBleHRlbmRzIE5vZGVWOE1lc3NhZ2Uge1xuXHRyZXF1ZXN0X3NlcTogbnVtYmVyO1xuXHRzdWNjZXNzOiBib29sZWFuO1xuXHRydW5uaW5nOiAgYm9vbGVhbjtcblx0Y29tbWFuZDogc3RyaW5nO1xuXHRtZXNzYWdlOiBzdHJpbmc7XG5cdGJvZHk6IGFueTtcblx0cmVmczogVjhPYmplY3RbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocmVxdWVzdDogTm9kZVY4UmVzcG9uc2UsIG1lc3NhZ2U/OiBzdHJpbmcpIHtcblx0XHRzdXBlcigncmVzcG9uc2UnKTtcblx0XHR0aGlzLnJlcXVlc3Rfc2VxID0gcmVxdWVzdC5zZXE7XG5cdFx0dGhpcy5jb21tYW5kID0gcmVxdWVzdC5jb21tYW5kO1xuXHRcdGlmIChtZXNzYWdlKSB7XG5cdFx0XHR0aGlzLnN1Y2Nlc3MgPSBmYWxzZTtcblx0XHRcdHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuc3VjY2VzcyA9IHRydWU7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBOb2RlVjhFdmVudCBleHRlbmRzIE5vZGVWOE1lc3NhZ2Uge1xuXHRldmVudDogc3RyaW5nO1xuXHRib2R5OiBWOEV2ZW50Qm9keTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoZXZlbnQ6IHN0cmluZywgYm9keT86IGFueSkge1xuXHRcdHN1cGVyKCdldmVudCcpO1xuXHRcdHRoaXMuZXZlbnQgPSBldmVudDtcblx0XHRpZiAoYm9keSkge1xuXHRcdFx0dGhpcy5ib2R5ID0gYm9keTtcblx0XHR9XG5cdH1cbn1cblxuLy8gcmVzcG9uc2UgdHlwZXNcblxuZXhwb3J0IGludGVyZmFjZSBWOEhhbmRsZSB7XG5cdGhhbmRsZTogbnVtYmVyO1xuXHR0eXBlOiAndW5kZWZpbmVkJyB8ICdudWxsJyB8ICdib29sZWFuJyB8ICdudW1iZXInIHwgJ3N0cmluZycgfCAnb2JqZWN0JyB8ICdmdW5jdGlvbicgfCAnZnJhbWUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4U2ltcGxlIGV4dGVuZHMgVjhIYW5kbGUge1xuXHR2YWx1ZT86IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhPYmplY3QgZXh0ZW5kcyBWOFNpbXBsZSB7XG5cblx0dnNjb2RlX3NpemU/OiBudW1iZXI7XG5cblx0Y2xhc3NOYW1lPzogc3RyaW5nO1xuXHRjb25zdHJ1Y3RvckZ1bmN0aW9uPzogVjhSZWY7XG5cdHByb3RvT2JqZWN0PzogVjhSZWY7XG5cdHByb3RvdHlwZU9iamVjdD86IFY4UmVmO1xuXHRwcm9wZXJ0aWVzPzogVjhQcm9wZXJ0eVtdO1xuXG5cblx0dGV4dD86IHN0cmluZztcblxuXHRzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhGdW5jdGlvbiBleHRlbmRzIFY4T2JqZWN0IHtcblxuXHRuYW1lPzogc3RyaW5nO1xuXHRpbmZlcnJlZE5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhTY3JpcHQgZXh0ZW5kcyBWOEhhbmRsZSB7XG5cdG5hbWU6IHN0cmluZztcblx0aWQ6IG51bWJlcjtcblx0c291cmNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4UmVmIHtcblx0cmVmOiBudW1iZXI7XG5cblx0Ly8gaWYgcmVzb2x2ZWQsIHRoZW4gYSB2YWx1ZSBleGlzdHNcblx0dmFsdWU/OiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nO1xuXHRoYW5kbGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhQcm9wZXJ0eSBleHRlbmRzIFY4UmVmIHtcblx0bmFtZTogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4RnJhbWUge1xuXHRpbmRleDogbnVtYmVyO1xuXG5cdGxpbmU6IG51bWJlcjtcblx0Y29sdW1uOiBudW1iZXI7XG5cblx0c2NyaXB0OiBWOFJlZjtcblx0ZnVuYzogVjhSZWY7XG5cdHJlY2VpdmVyOiBWOFJlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOFNjb3BlIHtcblx0dHlwZTogbnVtYmVyO1xuXHRmcmFtZUluZGV4IDogbnVtYmVyO1xuXHRpbmRleDogbnVtYmVyO1xuXHRvYmplY3Q6IFY4UmVmO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4QnJlYWtwb2ludCB7XG5cdHR5cGU6ICdzY3JpcHRJZCcgfCAnc2NyaXB0UmVnRXhwJztcblx0c2NyaXB0X2lkOiBudW1iZXI7XG5cdG51bWJlcjogbnVtYmVyO1xuXHRzY3JpcHRfcmVnZXhwOiBzdHJpbmc7XG59XG5cbi8vIHJlc3BvbnNlc1xuXG5leHBvcnQgaW50ZXJmYWNlIFY4U2NvcGVSZXNwb25zZSBleHRlbmRzIE5vZGVWOFJlc3BvbnNlIHtcblx0Ym9keToge1xuXHRcdHZzY29kZV9sb2NhbHM/OiBudW1iZXI7XG5cdFx0c2NvcGVzOiBWOFNjb3BlW107XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhFdmFsdWF0ZVJlc3BvbnNlIGV4dGVuZHMgTm9kZVY4UmVzcG9uc2Uge1xuXHRib2R5OiBWOE9iamVjdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOEJhY2t0cmFjZVJlc3BvbnNlIGV4dGVuZHMgTm9kZVY4UmVzcG9uc2Uge1xuXHRib2R5OiB7XG5cdFx0ZnJvbUZyYW1lOiBudW1iZXI7XG5cdFx0dG9GcmFtZTogbnVtYmVyO1xuXHRcdHRvdGFsRnJhbWVzOiBudW1iZXI7XG5cdFx0ZnJhbWVzOiBWOEZyYW1lW107XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhTY3JpcHRzUmVzcG9uc2UgZXh0ZW5kcyBOb2RlVjhSZXNwb25zZSB7XG5cdGJvZHk6IFY4U2NyaXB0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhTZXRWYXJpYWJsZVZhbHVlUmVzcG9uc2UgZXh0ZW5kcyBOb2RlVjhSZXNwb25zZSB7XG5cdGJvZHk6IHtcblx0XHRuZXdWYWx1ZTogVjhIYW5kbGU7XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhGcmFtZVJlc3BvbnNlIGV4dGVuZHMgTm9kZVY4UmVzcG9uc2Uge1xuXHRib2R5OiBWOEZyYW1lO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4TGlzdEJyZWFrcG9pbnRzUmVzcG9uc2UgZXh0ZW5kcyBOb2RlVjhSZXNwb25zZSB7XG5cdGJvZHk6IHtcblx0XHRicmVha3BvaW50czogVjhCcmVha3BvaW50W107XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhTZXRCcmVha3BvaW50UmVzcG9uc2UgZXh0ZW5kcyBOb2RlVjhSZXNwb25zZSB7XG5cdGJvZHk6IHtcblx0XHR0eXBlOiBzdHJpbmc7XG5cdFx0YnJlYWtwb2ludDogbnVtYmVyO1xuXHRcdHNjcmlwdF9pZDogbnVtYmVyO1xuXHRcdGFjdHVhbF9sb2NhdGlvbnM6IHtcblx0XHRcdGxpbmU6IG51bWJlcjtcblx0XHRcdGNvbHVtbjogbnVtYmVyO1xuXHRcdH1bXTtcblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOFNldEV4Y2VwdGlvbkJyZWFrUmVzcG9uc2UgZXh0ZW5kcyBOb2RlVjhSZXNwb25zZSB7XG5cdGJvZHk6IHtcblx0XHR0eXBlOiAnYWxsJyB8ICd1bmNhdWdodCc7XG5cdFx0ZW5hYmxlZDogYm9vbGVhbjtcblx0fTtcbn1cblxuLy8gZXZlbnRzXG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhFdmVudEJvZHkge1xuXHRzY3JpcHQ6IFY4U2NyaXB0O1xuXHRleGNlcHRpb246IFY4T2JqZWN0O1xuXHRicmVha3BvaW50czogYW55W107XG5cdHNvdXJjZUxpbmU6IG51bWJlcjtcblx0c291cmNlQ29sdW1uOiBudW1iZXI7XG5cdHNvdXJjZUxpbmVUZXh0OiBzdHJpbmc7XG59XG5cbi8vIGFyZ3VtZW50c1xuXG5leHBvcnQgaW50ZXJmYWNlIFY4RXZhbHVhdGVBcmdzIHtcblx0ZXhwcmVzc2lvbjogc3RyaW5nO1xuXHRkaXNhYmxlX2JyZWFrPzogYm9vbGVhbjtcblx0bWF4U3RyaW5nTGVuZ3RoPzogbnVtYmVyO1xuXHRnbG9iYWw/OiBib29sZWFuO1xuXHRmcmFtZT86IG51bWJlcjtcblx0YWRkaXRpb25hbF9jb250ZXh0Pzoge1xuXHRcdG5hbWU6IHN0cmluZztcblx0XHRoYW5kbGU6IG51bWJlcjtcblx0fVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4U2NyaXB0c0FyZ3Mge1xuXHR0eXBlczogbnVtYmVyO1xuXHRpbmNsdWRlU291cmNlPzogYm9vbGVhbjtcblx0aWRzPzogbnVtYmVyW107XG5cdGZpbHRlcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOFNldFZhcmlhYmxlVmFsdWVBcmdzIHtcblx0c2NvcGU6IHtcblx0XHRmcmFtZU51bWJlcjogbnVtYmVyO1xuXHRcdG51bWJlcjogbnVtYmVyO1xuXHR9O1xuXHRuYW1lOiBzdHJpbmc7XG5cdG5ld1ZhbHVlOiB7XG5cdFx0dmFsdWU6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmc7XG5cdFx0dHlwZTogc3RyaW5nO1xuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFY4RnJhbWVBcmdzIHtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOENsZWFyQnJlYWtwb2ludEFyZ3Mge1xuXHRicmVha3BvaW50OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjhTZXRCcmVha3BvaW50QXJncyB7XG5cdHR5cGUgOiAnZnVuY3Rpb24nIHwgJ3NjcmlwdCcgfCAnc2NyaXB0SWQnIHwgJ3NjcmlwdFJlZ0V4cCc7XG5cdHRhcmdldDogbnVtYmVyIHwgc3RyaW5nO1xuXHRsaW5lPzogbnVtYmVyO1xuXHRjb2x1bW4/OiBudW1iZXI7XG5cdGNvbmRpdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWOFNldEV4Y2VwdGlvbkJyZWFrQXJncyB7XG5cdHR5cGUgOiAnYWxsJyB8ICd1bmNhdWdodCc7XG5cdGVuYWJsZWQ/OiBib29sZWFuO1xufVxuXG4vLy0tLS0gdGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uXG5cbmV4cG9ydCBjbGFzcyBOb2RlVjhQcm90b2NvbCBleHRlbmRzIEVFLkV2ZW50RW1pdHRlciB7XG5cblx0cHJpdmF0ZSBzdGF0aWMgVElNRU9VVCA9IDEwMDAwO1xuXHRwcml2YXRlIHN0YXRpYyBUV09fQ1JMRiA9ICdcXHJcXG5cXHJcXG4nO1xuXG5cdHByaXZhdGUgX3Jhd0RhdGE6IEJ1ZmZlcjtcblx0cHJpdmF0ZSBfY29udGVudExlbmd0aDogbnVtYmVyO1xuXHRwcml2YXRlIF9zZXF1ZW5jZTogbnVtYmVyO1xuXHRwcml2YXRlIF93cml0YWJsZVN0cmVhbTogTm9kZUpTLldyaXRhYmxlU3RyZWFtO1xuXHRwcml2YXRlIF9wZW5kaW5nUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgTm9kZVY4UmVzcG9uc2U+KCk7XG5cdHByaXZhdGUgX3VucmVzcG9uc2l2ZU1vZGU6IGJvb2xlYW47XG5cdHByaXZhdGUgX3Jlc3BvbnNlSG9vazogKHJlc3BvbnNlOiBOb2RlVjhSZXNwb25zZSkgPT4gdm9pZDtcblxuXHRwdWJsaWMgZW1iZWRkZWRIb3N0VmVyc2lvbjogbnVtYmVyID0gLTE7XG5cdHB1YmxpYyB2OFZlcnNpb246IHN0cmluZztcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocmVzcG9uc2VIb29rPzogKHJlc3BvbnNlOiBOb2RlVjhSZXNwb25zZSkgPT4gdm9pZCkge1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5fcmVzcG9uc2VIb29rID0gcmVzcG9uc2VIb29rO1xuXHR9XG5cblx0cHVibGljIHN0YXJ0RGlzcGF0Y2goaW5TdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSwgb3V0U3RyZWFtOiBOb2RlSlMuV3JpdGFibGVTdHJlYW0pIDogdm9pZCB7XG5cdFx0dGhpcy5fc2VxdWVuY2UgPSAxO1xuXHRcdHRoaXMuX3dyaXRhYmxlU3RyZWFtID0gb3V0U3RyZWFtO1xuXG5cdFx0aW5TdHJlYW0ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB0aGlzLmV4ZWN1dGUoZGF0YSkpO1xuXHRcdGluU3RyZWFtLm9uKCdjbG9zZScsICgpID0+IHtcblx0XHRcdHRoaXMuZW1pdEV2ZW50KG5ldyBOb2RlVjhFdmVudCgnY2xvc2UnKSk7XG5cdFx0fSk7XG5cdFx0aW5TdHJlYW0ub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG5cdFx0XHR0aGlzLmVtaXRFdmVudChuZXcgTm9kZVY4RXZlbnQoJ2Vycm9yJykpO1xuXHRcdH0pO1xuXG5cdFx0b3V0U3RyZWFtLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuXHRcdFx0dGhpcy5lbWl0RXZlbnQobmV3IE5vZGVWOEV2ZW50KCdlcnJvcicpKTtcblx0XHR9KTtcblxuXHRcdGluU3RyZWFtLnJlc3VtZSgpO1xuXHR9XG5cblx0cHVibGljIHN0b3AoKSA6IHZvaWQge1xuXHRcdGlmICh0aGlzLl93cml0YWJsZVN0cmVhbSkge1xuXHRcdFx0dGhpcy5fd3JpdGFibGVTdHJlYW0uZW5kKCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBhcmdzPzogYW55LCBjYj86IChyZXNwb25zZTogTm9kZVY4UmVzcG9uc2UpID0+IHZvaWQpIDogdm9pZCB7XG5cdFx0dGhpcy5fY29tbWFuZChjb21tYW5kLCBhcmdzLCBOb2RlVjhQcm90b2NvbC5USU1FT1VULCBjYik7XG5cdH1cblxuXHRwdWJsaWMgY29tbWFuZDIoY29tbWFuZDogc3RyaW5nLCBhcmdzPzogYW55LCB0aW1lb3V0OiBudW1iZXIgPSBOb2RlVjhQcm90b2NvbC5USU1FT1VUKSA6IFByb21pc2U8Tm9kZVY4UmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0dGhpcy5jb21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlc3BvbnNlID0+IHtcblx0XHRcdFx0aWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcblx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZWplY3QocmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBldmFsdWF0ZShhcmdzOiBWOEV2YWx1YXRlQXJncywgdGltZW91dDogbnVtYmVyID0gTm9kZVY4UHJvdG9jb2wuVElNRU9VVCkgOiBQcm9taXNlPFY4RXZhbHVhdGVSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbW1hbmQyKCdldmFsdWF0ZScsIGFyZ3MpO1xuXHR9XG5cblx0cHVibGljIHNjcmlwdHMoYXJnczogVjhTY3JpcHRzQXJncywgdGltZW91dDogbnVtYmVyID0gTm9kZVY4UHJvdG9jb2wuVElNRU9VVCkgOiBQcm9taXNlPFY4U2NyaXB0c1Jlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29tbWFuZDIoJ3NjcmlwdHMnLCBhcmdzKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRWYXJpYWJsZVZhbHVlKGFyZ3M6IFY4U2V0VmFyaWFibGVWYWx1ZUFyZ3MsIHRpbWVvdXQ6IG51bWJlciA9IE5vZGVWOFByb3RvY29sLlRJTUVPVVQpIDogUHJvbWlzZTxWOFNldFZhcmlhYmxlVmFsdWVSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbW1hbmQyKCdzZXR2YXJpYWJsZXZhbHVlJywgYXJncyk7XG5cdH1cblxuXHRwdWJsaWMgZnJhbWUoYXJnczogVjhGcmFtZUFyZ3MsIHRpbWVvdXQ6IG51bWJlciA9IE5vZGVWOFByb3RvY29sLlRJTUVPVVQpIDogUHJvbWlzZTxWOEZyYW1lUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gdGhpcy5jb21tYW5kMignZnJhbWUnLCBhcmdzKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRCcmVha3BvaW50KGFyZ3M6IFY4U2V0QnJlYWtwb2ludEFyZ3MsIHRpbWVvdXQ6IG51bWJlciA9IE5vZGVWOFByb3RvY29sLlRJTUVPVVQpIDogUHJvbWlzZTxWOFNldEJyZWFrcG9pbnRSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbW1hbmQyKCdzZXRicmVha3BvaW50JywgYXJncyk7XG5cdH1cblxuXHRwdWJsaWMgc2V0RXhjZXB0aW9uQnJlYWsoYXJnczogVjhTZXRFeGNlcHRpb25CcmVha0FyZ3MsIHRpbWVvdXQ6IG51bWJlciA9IE5vZGVWOFByb3RvY29sLlRJTUVPVVQpIDogUHJvbWlzZTxWOFNldEV4Y2VwdGlvbkJyZWFrUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gdGhpcy5jb21tYW5kMignc2V0ZXhjZXB0aW9uYnJlYWsnLCBhcmdzKTtcblx0fVxuXG5cdHB1YmxpYyBjbGVhckJyZWFrcG9pbnQoYXJnczogVjhDbGVhckJyZWFrcG9pbnRBcmdzLCB0aW1lb3V0OiBudW1iZXIgPSBOb2RlVjhQcm90b2NvbC5USU1FT1VUKSA6IFByb21pc2U8Tm9kZVY4UmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gdGhpcy5jb21tYW5kMignY2xlYXJicmVha3BvaW50JywgYXJncyk7XG5cdH1cblxuXHRwdWJsaWMgbGlzdEJyZWFrcG9pbnRzKHRpbWVvdXQ6IG51bWJlciA9IE5vZGVWOFByb3RvY29sLlRJTUVPVVQpIDogUHJvbWlzZTxWOExpc3RCcmVha3BvaW50c1Jlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29tbWFuZDIoJ2xpc3RicmVha3BvaW50cycpO1xuXHR9XG5cblx0cHVibGljIHNlbmRFdmVudChldmVudDogTm9kZVY4RXZlbnQpIDogdm9pZCB7XG5cdFx0dGhpcy5zZW5kKCdldmVudCcsIGV2ZW50KTtcblx0fVxuXG5cdHB1YmxpYyBzZW5kUmVzcG9uc2UocmVzcG9uc2U6IE5vZGVWOFJlc3BvbnNlKSA6IHZvaWQge1xuXHRcdGlmIChyZXNwb25zZS5zZXEgPiAwKSB7XG5cdFx0XHQvLyBjb25zb2xlLmVycm9yKCdhdHRlbXB0IHRvIHNlbmQgbW9yZSB0aGFuIG9uZSByZXNwb25zZSBmb3IgY29tbWFuZCB7MH0nLCByZXNwb25zZS5jb21tYW5kKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5zZW5kKCdyZXNwb25zZScsIHJlc3BvbnNlKTtcblx0XHR9XG5cdH1cblxuXHQvLyAtLS0tIHByaXZhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuXHRwcml2YXRlIF9jb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgYXJnczogYW55LCB0aW1lb3V0OiBudW1iZXIsIGNiOiAocmVzcG9uc2U6IE5vZGVWOFJlc3BvbnNlKSA9PiB2b2lkKSA6IHZvaWQge1xuXG5cdFx0Y29uc3QgcmVxdWVzdDogYW55ID0ge1xuXHRcdFx0Y29tbWFuZDogY29tbWFuZFxuXHRcdH07XG5cdFx0aWYgKGFyZ3MgJiYgT2JqZWN0LmtleXMoYXJncykubGVuZ3RoID4gMCkge1xuXHRcdFx0cmVxdWVzdC5hcmd1bWVudHMgPSBhcmdzO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fd3JpdGFibGVTdHJlYW0pIHtcblx0XHRcdGlmIChjYikge1xuXHRcdFx0XHRjYihuZXcgTm9kZVY4UmVzcG9uc2UocmVxdWVzdCwgbG9jYWxpemUoJ25vdC5jb25uZWN0ZWQnLCBcIm5vdCBjb25uZWN0ZWQgdG8gcnVudGltZVwiKSkpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl91bnJlc3BvbnNpdmVNb2RlKSB7XG5cdFx0XHRpZiAoY2IpIHtcblx0XHRcdFx0Y2IobmV3IE5vZGVWOFJlc3BvbnNlKHJlcXVlc3QsIGxvY2FsaXplKCdydW50aW1lLnVucmVzcG9uc2l2ZScsIFwiY2FuY2VsbGVkIGJlY2F1c2UgTm9kZS5qcyBpcyB1bnJlc3BvbnNpdmVcIikpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnNlbmQoJ3JlcXVlc3QnLCByZXF1ZXN0KTtcblxuXHRcdGlmIChjYikge1xuXHRcdFx0dGhpcy5fcGVuZGluZ1JlcXVlc3RzW3JlcXVlc3Quc2VxXSA9IGNiO1xuXG5cdFx0XHRjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdFx0XHRjb25zdCBjbGIgPSB0aGlzLl9wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdC5zZXFdO1xuXHRcdFx0XHRpZiAoY2xiKSB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0LnNlcV07XG5cdFx0XHRcdFx0Y2xiKG5ldyBOb2RlVjhSZXNwb25zZShyZXF1ZXN0LCBsb2NhbGl6ZSgncnVudGltZS50aW1lb3V0JywgXCJ0aW1lb3V0IGFmdGVyIHswfSBtc1wiLCB0aW1lb3V0KSkpO1xuXG5cdFx0XHRcdFx0dGhpcy5fdW5yZXNwb25zaXZlTW9kZSA9IHRydWU7XG5cdFx0XHRcdFx0dGhpcy5lbWl0RXZlbnQobmV3IE5vZGVWOEV2ZW50KCdkaWFnbm9zdGljJywgeyByZWFzb246IGByZXF1ZXN0ICcke2NvbW1hbmR9JyB0aW1lZCBvdXQnYH0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGltZW91dCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBlbWl0RXZlbnQoZXZlbnQ6IE5vZGVWOEV2ZW50KSB7XG5cdFx0dGhpcy5lbWl0KGV2ZW50LmV2ZW50LCBldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIHNlbmQodHlwOiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JywgbWVzc2FnZTogTm9kZVY4TWVzc2FnZSkgOiB2b2lkIHtcblx0XHRtZXNzYWdlLnR5cGUgPSB0eXA7XG5cdFx0bWVzc2FnZS5zZXEgPSB0aGlzLl9zZXF1ZW5jZSsrO1xuXHRcdGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcblx0XHRjb25zdCBkYXRhID0gJ0NvbnRlbnQtTGVuZ3RoOiAnICsgQnVmZmVyLmJ5dGVMZW5ndGgoanNvbiwgJ3V0ZjgnKSArICdcXHJcXG5cXHJcXG4nICsganNvbjtcblx0XHRpZiAodGhpcy5fd3JpdGFibGVTdHJlYW0pIHtcblx0XHRcdHRoaXMuX3dyaXRhYmxlU3RyZWFtLndyaXRlKGRhdGEpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW50ZXJuYWxEaXNwYXRjaChtZXNzYWdlOiBOb2RlVjhNZXNzYWdlKSA6IHZvaWQge1xuXHRcdHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG5cdFx0Y2FzZSAnZXZlbnQnOlxuXHRcdFx0Y29uc3QgZSA9IDxOb2RlVjhFdmVudD4gbWVzc2FnZTtcblx0XHRcdHRoaXMuZW1pdEV2ZW50KGUpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAncmVzcG9uc2UnOlxuXHRcdFx0aWYgKHRoaXMuX3VucmVzcG9uc2l2ZU1vZGUpIHtcblx0XHRcdFx0dGhpcy5fdW5yZXNwb25zaXZlTW9kZSA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLmVtaXRFdmVudChuZXcgTm9kZVY4RXZlbnQoJ2RpYWdub3N0aWMnLCB7IHJlYXNvbjogJ3Jlc3BvbnNpdmUnIH0pKTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gPE5vZGVWOFJlc3BvbnNlPiBtZXNzYWdlO1xuXHRcdFx0Y29uc3QgY2xiID0gdGhpcy5fcGVuZGluZ1JlcXVlc3RzW3Jlc3BvbnNlLnJlcXVlc3Rfc2VxXTtcblx0XHRcdGlmIChjbGIpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tyZXNwb25zZS5yZXF1ZXN0X3NlcV07XG5cdFx0XHRcdGlmICh0aGlzLl9yZXNwb25zZUhvb2spIHtcblx0XHRcdFx0XHR0aGlzLl9yZXNwb25zZUhvb2socmVzcG9uc2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNsYihyZXNwb25zZSk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRkZWZhdWx0OlxuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlKGRhdGE6IEJ1ZmZlcik6IHZvaWQge1xuXG5cdFx0dGhpcy5fcmF3RGF0YSA9IHRoaXMuX3Jhd0RhdGEgPyBCdWZmZXIuY29uY2F0KFt0aGlzLl9yYXdEYXRhLCBkYXRhXSkgOiBkYXRhO1xuXG5cdFx0d2hpbGUgKHRydWUpIHtcblx0XHRcdGlmICh0aGlzLl9jb250ZW50TGVuZ3RoID49IDApIHtcblx0XHRcdFx0aWYgKHRoaXMuX3Jhd0RhdGEubGVuZ3RoID49IHRoaXMuX2NvbnRlbnRMZW5ndGgpIHtcblx0XHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5fcmF3RGF0YS50b1N0cmluZygndXRmOCcsIDAsIHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuXHRcdFx0XHRcdHRoaXMuX3Jhd0RhdGEgPSB0aGlzLl9yYXdEYXRhLnNsaWNlKHRoaXMuX2NvbnRlbnRMZW5ndGgpO1xuXHRcdFx0XHRcdHRoaXMuX2NvbnRlbnRMZW5ndGggPSAtMTtcblx0XHRcdFx0XHRpZiAobWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmludGVybmFsRGlzcGF0Y2goSlNPTi5wYXJzZShtZXNzYWdlKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb250aW51ZTtcdC8vIHRoZXJlIG1heSBiZSBtb3JlIGNvbXBsZXRlIG1lc3NhZ2VzIHRvIHByb2Nlc3Ncblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3QgaWR4ID0gdGhpcy5fcmF3RGF0YS5pbmRleE9mKE5vZGVWOFByb3RvY29sLlRXT19DUkxGKTtcblx0XHRcdFx0aWYgKGlkeCAhPT0gLTEpIHtcblx0XHRcdFx0XHRjb25zdCBoZWFkZXIgPSB0aGlzLl9yYXdEYXRhLnRvU3RyaW5nKCd1dGY4JywgMCwgaWR4KTtcblx0XHRcdFx0XHRjb25zdCBsaW5lcyA9IGhlYWRlci5zcGxpdCgnXFxyXFxuJyk7XG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFpciA9IGxpbmVzW2ldLnNwbGl0KC86ICsvKTtcblx0XHRcdFx0XHRcdHN3aXRjaCAocGFpclswXSkge1xuXHRcdFx0XHRcdFx0XHRjYXNlICdWOC1WZXJzaW9uJzpcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtYXRjaDAgPSBwYWlyWzFdLm1hdGNoKC8oXFxkKyg/OlxcLlxcZCspKykvKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWF0Y2gwICYmIG1hdGNoMC5sZW5ndGggPT09IDIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMudjhWZXJzaW9uID0gbWF0Y2gwWzFdO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0Y2FzZSAnRW1iZWRkaW5nLUhvc3QnOlxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1hdGNoID0gcGFpclsxXS5tYXRjaCgvbm9kZVxcc3YoXFxkKylcXC4oXFxkKylcXC4oXFxkKykvKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID09PSA0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmVtYmVkZGVkSG9zdFZlcnNpb24gPSAocGFyc2VJbnQobWF0Y2hbMV0pKjEwMCArIHBhcnNlSW50KG1hdGNoWzJdKSkqMTAwICsgcGFyc2VJbnQobWF0Y2hbM10pO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocGFpclsxXSA9PT0gJ0VsZWN0cm9uJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5lbWJlZGRlZEhvc3RWZXJzaW9uID0gNTEwMDA7IC8vIFRPRE8gdGhpcyBuZWVkcyB0byBiZSBkZXRlY3RlZCBpbiBhIHNtYXJ0ZXIgd2F5IGJ5IGxvb2tpbmcgYXQgdGhlIFY4IHZlcnNpb24gaW4gRWxlY3Ryb25cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdGNhc2UgJ0NvbnRlbnQtTGVuZ3RoJzpcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jb250ZW50TGVuZ3RoID0gK3BhaXJbMV07XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuX3Jhd0RhdGEgPSB0aGlzLl9yYXdEYXRhLnNsaWNlKGlkeCArIE5vZGVWOFByb3RvY29sLlRXT19DUkxGLmxlbmd0aCk7XG5cdFx0XHRcdFx0Y29udGludWU7XHQvLyB0cnkgdG8gaGFuZGxlIGEgY29tcGxldGUgbWVzc2FnZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cbn1cbiJdfQ==