ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
312 lines (307 loc) • 35.8 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.UpdatableBlockTracker = exports.SimpleBlockTracker = exports.ElementStack = exports.Fragment = undefined;
var _bounds2 = require('./bounds');
var _util = require('@glimmer/util');
var _dom = require('./compiled/opcodes/dom');
class First {
constructor(node) {
this.node = node;
}
firstNode() {
return this.node;
}
}
class Last {
constructor(node) {
this.node = node;
}
lastNode() {
return this.node;
}
}
class Fragment {
constructor(bounds) {
this.bounds = bounds;
}
parentElement() {
return this.bounds.parentElement();
}
firstNode() {
return this.bounds.firstNode();
}
lastNode() {
return this.bounds.lastNode();
}
update(bounds) {
this.bounds = bounds;
}
}
exports.Fragment = Fragment;
class ElementStack {
constructor(env, parentNode, nextSibling) {
this.constructing = null;
this.operations = null;
this.elementStack = new _util.Stack();
this.nextSiblingStack = new _util.Stack();
this.blockStack = new _util.Stack();
this.env = env;
this.dom = env.getAppendOperations();
this.updateOperations = env.getDOM();
this.element = parentNode;
this.nextSibling = nextSibling;
this.defaultOperations = new _dom.SimpleElementOperations(env);
this.pushSimpleBlock();
this.elementStack.push(this.element);
this.nextSiblingStack.push(this.nextSibling);
}
static forInitialRender(env, parentNode, nextSibling) {
return new ElementStack(env, parentNode, nextSibling);
}
static resume(env, tracker, nextSibling) {
let parentNode = tracker.parentElement();
let stack = new ElementStack(env, parentNode, nextSibling);
stack.pushBlockTracker(tracker);
return stack;
}
expectConstructing(method) {
return (0, _util.expect)(this.constructing, `${method} should only be called while constructing an element`);
}
expectOperations(method) {
return (0, _util.expect)(this.operations, `${method} should only be called while constructing an element`);
}
block() {
return (0, _util.expect)(this.blockStack.current, "Expected a current block tracker");
}
popElement() {
let { elementStack, nextSiblingStack } = this;
let topElement = elementStack.pop();
nextSiblingStack.pop();
// LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);
this.element = (0, _util.expect)(elementStack.current, "can't pop past the last element");
this.nextSibling = nextSiblingStack.current;
return topElement;
}
pushSimpleBlock() {
let tracker = new SimpleBlockTracker(this.element);
this.pushBlockTracker(tracker);
return tracker;
}
pushUpdatableBlock() {
let tracker = new UpdatableBlockTracker(this.element);
this.pushBlockTracker(tracker);
return tracker;
}
pushBlockTracker(tracker, isRemote = false) {
let current = this.blockStack.current;
if (current !== null) {
current.newDestroyable(tracker);
if (!isRemote) {
current.newBounds(tracker);
}
}
this.blockStack.push(tracker);
return tracker;
}
pushBlockList(list) {
let tracker = new BlockListTracker(this.element, list);
let current = this.blockStack.current;
if (current !== null) {
current.newDestroyable(tracker);
current.newBounds(tracker);
}
this.blockStack.push(tracker);
return tracker;
}
popBlock() {
this.block().finalize(this);
return (0, _util.expect)(this.blockStack.pop(), "Expected popBlock to return a block");
}
openElement(tag, _operations) {
// workaround argument.length transpile of arg initializer
let operations = _operations === undefined ? this.defaultOperations : _operations;
let element = this.dom.createElement(tag, this.element);
this.constructing = element;
this.operations = operations;
return element;
}
flushElement() {
let parent = this.element;
let element = (0, _util.expect)(this.constructing, `flushElement should only be called when constructing an element`);
this.dom.insertBefore(parent, element, this.nextSibling);
this.constructing = null;
this.operations = null;
this.pushElement(element, null);
this.block().openElement(element);
}
pushRemoteElement(element, nextSibling = null) {
this.pushElement(element, nextSibling);
let tracker = new RemoteBlockTracker(element);
this.pushBlockTracker(tracker, true);
}
popRemoteElement() {
this.popBlock();
this.popElement();
}
pushElement(element, nextSibling) {
this.element = element;
this.elementStack.push(element);
// LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);
this.nextSibling = nextSibling;
this.nextSiblingStack.push(nextSibling);
}
newDestroyable(d) {
this.block().newDestroyable(d);
}
newBounds(bounds) {
this.block().newBounds(bounds);
}
appendText(string) {
let { dom } = this;
let text = dom.createTextNode(string);
dom.insertBefore(this.element, text, this.nextSibling);
this.block().newNode(text);
return text;
}
appendComment(string) {
let { dom } = this;
let comment = dom.createComment(string);
dom.insertBefore(this.element, comment, this.nextSibling);
this.block().newNode(comment);
return comment;
}
setStaticAttribute(name, value) {
this.expectOperations('setStaticAttribute').addStaticAttribute(this.expectConstructing('setStaticAttribute'), name, value);
}
setStaticAttributeNS(namespace, name, value) {
this.expectOperations('setStaticAttributeNS').addStaticAttributeNS(this.expectConstructing('setStaticAttributeNS'), namespace, name, value);
}
setDynamicAttribute(name, reference, isTrusting) {
this.expectOperations('setDynamicAttribute').addDynamicAttribute(this.expectConstructing('setDynamicAttribute'), name, reference, isTrusting);
}
setDynamicAttributeNS(namespace, name, reference, isTrusting) {
this.expectOperations('setDynamicAttributeNS').addDynamicAttributeNS(this.expectConstructing('setDynamicAttributeNS'), namespace, name, reference, isTrusting);
}
closeElement() {
this.block().closeElement();
this.popElement();
}
}
exports.ElementStack = ElementStack;
class SimpleBlockTracker {
constructor(parent) {
this.parent = parent;
this.first = null;
this.last = null;
this.destroyables = null;
this.nesting = 0;
}
destroy() {
let { destroyables } = this;
if (destroyables && destroyables.length) {
for (let i = 0; i < destroyables.length; i++) {
destroyables[i].destroy();
}
}
}
parentElement() {
return this.parent;
}
firstNode() {
return this.first && this.first.firstNode();
}
lastNode() {
return this.last && this.last.lastNode();
}
openElement(element) {
this.newNode(element);
this.nesting++;
}
closeElement() {
this.nesting--;
}
newNode(node) {
if (this.nesting !== 0) return;
if (!this.first) {
this.first = new First(node);
}
this.last = new Last(node);
}
newBounds(bounds) {
if (this.nesting !== 0) return;
if (!this.first) {
this.first = bounds;
}
this.last = bounds;
}
newDestroyable(d) {
this.destroyables = this.destroyables || [];
this.destroyables.push(d);
}
finalize(stack) {
if (!this.first) {
stack.appendComment('');
}
}
}
exports.SimpleBlockTracker = SimpleBlockTracker;
class RemoteBlockTracker extends SimpleBlockTracker {
destroy() {
super.destroy();
(0, _bounds2.clear)(this);
}
}
class UpdatableBlockTracker extends SimpleBlockTracker {
reset(env) {
let { destroyables } = this;
if (destroyables && destroyables.length) {
for (let i = 0; i < destroyables.length; i++) {
env.didDestroy(destroyables[i]);
}
}
let nextSibling = (0, _bounds2.clear)(this);
this.first = null;
this.last = null;
this.destroyables = null;
this.nesting = 0;
return nextSibling;
}
}
exports.UpdatableBlockTracker = UpdatableBlockTracker;
class BlockListTracker {
constructor(parent, boundList) {
this.parent = parent;
this.boundList = boundList;
this.parent = parent;
this.boundList = boundList;
}
destroy() {
this.boundList.forEachNode(node => node.destroy());
}
parentElement() {
return this.parent;
}
firstNode() {
let head = this.boundList.head();
return head && head.firstNode();
}
lastNode() {
let tail = this.boundList.tail();
return tail && tail.lastNode();
}
openElement(_element) {
(0, _util.assert)(false, 'Cannot openElement directly inside a block list');
}
closeElement() {
(0, _util.assert)(false, 'Cannot closeElement directly inside a block list');
}
newNode(_node) {
(0, _util.assert)(false, 'Cannot create a new node directly inside a block list');
}
newBounds(_bounds) {}
newDestroyable(_d) {}
finalize(_stack) {}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9idWlsZGVyLmpzIl0sIm5hbWVzIjpbIkZpcnN0IiwiY29uc3RydWN0b3IiLCJub2RlIiwiZmlyc3ROb2RlIiwiTGFzdCIsImxhc3ROb2RlIiwiRnJhZ21lbnQiLCJib3VuZHMiLCJwYXJlbnRFbGVtZW50IiwidXBkYXRlIiwiRWxlbWVudFN0YWNrIiwiZW52IiwicGFyZW50Tm9kZSIsIm5leHRTaWJsaW5nIiwiY29uc3RydWN0aW5nIiwib3BlcmF0aW9ucyIsImVsZW1lbnRTdGFjayIsIm5leHRTaWJsaW5nU3RhY2siLCJibG9ja1N0YWNrIiwiZG9tIiwiZ2V0QXBwZW5kT3BlcmF0aW9ucyIsInVwZGF0ZU9wZXJhdGlvbnMiLCJnZXRET00iLCJlbGVtZW50IiwiZGVmYXVsdE9wZXJhdGlvbnMiLCJwdXNoU2ltcGxlQmxvY2siLCJwdXNoIiwiZm9ySW5pdGlhbFJlbmRlciIsInJlc3VtZSIsInRyYWNrZXIiLCJzdGFjayIsInB1c2hCbG9ja1RyYWNrZXIiLCJleHBlY3RDb25zdHJ1Y3RpbmciLCJtZXRob2QiLCJleHBlY3RPcGVyYXRpb25zIiwiYmxvY2siLCJjdXJyZW50IiwicG9wRWxlbWVudCIsInRvcEVsZW1lbnQiLCJwb3AiLCJTaW1wbGVCbG9ja1RyYWNrZXIiLCJwdXNoVXBkYXRhYmxlQmxvY2siLCJVcGRhdGFibGVCbG9ja1RyYWNrZXIiLCJpc1JlbW90ZSIsIm5ld0Rlc3Ryb3lhYmxlIiwibmV3Qm91bmRzIiwicHVzaEJsb2NrTGlzdCIsImxpc3QiLCJCbG9ja0xpc3RUcmFja2VyIiwicG9wQmxvY2siLCJmaW5hbGl6ZSIsIm9wZW5FbGVtZW50IiwidGFnIiwiX29wZXJhdGlvbnMiLCJ1bmRlZmluZWQiLCJjcmVhdGVFbGVtZW50IiwiZmx1c2hFbGVtZW50IiwicGFyZW50IiwiaW5zZXJ0QmVmb3JlIiwicHVzaEVsZW1lbnQiLCJwdXNoUmVtb3RlRWxlbWVudCIsIlJlbW90ZUJsb2NrVHJhY2tlciIsInBvcFJlbW90ZUVsZW1lbnQiLCJkIiwiYXBwZW5kVGV4dCIsInN0cmluZyIsInRleHQiLCJjcmVhdGVUZXh0Tm9kZSIsIm5ld05vZGUiLCJhcHBlbmRDb21tZW50IiwiY29tbWVudCIsImNyZWF0ZUNvbW1lbnQiLCJzZXRTdGF0aWNBdHRyaWJ1dGUiLCJuYW1lIiwidmFsdWUiLCJhZGRTdGF0aWNBdHRyaWJ1dGUiLCJzZXRTdGF0aWNBdHRyaWJ1dGVOUyIsIm5hbWVzcGFjZSIsImFkZFN0YXRpY0F0dHJpYnV0ZU5TIiwic2V0RHluYW1pY0F0dHJpYnV0ZSIsInJlZmVyZW5jZSIsImlzVHJ1c3RpbmciLCJhZGREeW5hbWljQXR0cmlidXRlIiwic2V0RHluYW1pY0F0dHJpYnV0ZU5TIiwiYWRkRHluYW1pY0F0dHJpYnV0ZU5TIiwiY2xvc2VFbGVtZW50IiwiZmlyc3QiLCJsYXN0IiwiZGVzdHJveWFibGVzIiwibmVzdGluZyIsImRlc3Ryb3kiLCJsZW5ndGgiLCJpIiwicmVzZXQiLCJkaWREZXN0cm95IiwiYm91bmRMaXN0IiwiZm9yRWFjaE5vZGUiLCJoZWFkIiwidGFpbCIsIl9lbGVtZW50IiwiX25vZGUiLCJfYm91bmRzIiwiX2QiLCJfc3RhY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQSxNQUFNQSxLQUFOLENBQVk7QUFDUkMsZ0JBQVlDLElBQVosRUFBa0I7QUFDZCxhQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNEQyxnQkFBWTtBQUNSLGVBQU8sS0FBS0QsSUFBWjtBQUNIO0FBTk87QUFRWixNQUFNRSxJQUFOLENBQVc7QUFDUEgsZ0JBQVlDLElBQVosRUFBa0I7QUFDZCxhQUFLQSxJQUFMLEdBQVlBLElBQVo7QUFDSDtBQUNERyxlQUFXO0FBQ1AsZUFBTyxLQUFLSCxJQUFaO0FBQ0g7QUFOTTtBQVFKLE1BQU1JLFFBQU4sQ0FBZTtBQUNsQkwsZ0JBQVlNLE1BQVosRUFBb0I7QUFDaEIsYUFBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0g7QUFDREMsb0JBQWdCO0FBQ1osZUFBTyxLQUFLRCxN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Q0EsZUFBT0EsUUFBUUEsS0FBSzlGLFNBQUwsRUFBZjtBQUNIO0FBQ0RFLGVBQVc7QUFDUCxZQUFJNkYsT0FBTyxLQUFLSCxTQUFMLENBQWVHLElBQWYsRUFBWDtBQUNBLGVBQU9BLFFBQVFBLEtBQUs3RixRQUFMLEVBQWY7QUFDSDtBQUNEOEMsZ0JBQVlnRCxRQUFaLEVBQXNCO0FBQ2xCLDBCQUFPLEtBQVAsRUFBYyxpREFBZDtBQUNIO0FBQ0RkLG1CQUFlO0FBQ1gsMEJBQU8sS0FBUCxFQUFjLGtEQUFkO0FBQ0g7QUFDRGpCLFlBQVFnQyxLQUFSLEVBQWU7QUFDWCwwQkFBTyxLQUFQLEVBQWMsdURBQWQ7QUFDSDtBQUNEdkQsY0FBVXdELE9BQVYsRUFBbUIsQ0FBRTtBQUNyQnpELG1CQUFlMEQsRUFBZixFQUFtQixDQUFFO0FBQ3JCcEQsYUFBU3FELE1BQVQsRUFBaUIsQ0FBRTtBQWhDQSIsImZpbGUiOiJsaWIvYnVpbGRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNsZWFyIH0gZnJvbSAnLi9ib3VuZHMnO1xuaW1wb3J0IHsgU3RhY2ssIGFzc2VydCwgZXhwZWN0IH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBTaW1wbGVFbGVtZW50T3BlcmF0aW9ucyB9IGZyb20gJy4vY29tcGlsZWQvb3Bjb2Rlcy9kb20nO1xuY2xhc3MgRmlyc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgZmlyc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ub2RlO1xuICAgIH1cbn1cbmNsYXNzIExhc3Qge1xuICAgIGNvbnN0cnVjdG9yKG5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2RlID0gbm9kZTtcbiAgICB9XG4gICAgbGFzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGU7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEZyYWdtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxuICAgIHBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgfVxuICAgIGZpcnN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYm91bmRzLmxhc3ROb2RlKCk7XG4gICAgfVxuICAgIHVwZGF0ZShib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEVsZW1lbnRTdGFjayB7XG4gICAgY29uc3RydWN0b3IoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZWxlbWVudFN0YWNrID0gbmV3IFN0YWNrKCk7XG4gICAgICAgIHRoaXMubmV4dFNpYmxpbmdTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmJsb2NrU3RhY2sgPSBuZXcgU3RhY2soKTtcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgICAgIHRoaXMuZG9tID0gZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcGVyYXRpb25zID0gZW52LmdldERPTSgpO1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBwYXJlbnROb2RlO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmc7XG4gICAgICAgIHRoaXMuZGVmYXVsdE9wZXJhdGlvbnMgPSBuZXcgU2ltcGxlRWxlbWVudE9wZXJhdGlvbnMoZW52KTtcbiAgICAgICAgdGhpcy5wdXNoU2ltcGxlQmxvY2soKTtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaCh0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaCh0aGlzLm5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIGZvckluaXRpYWxSZW5kZXIoZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZykge1xuICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnRTdGFjayhlbnYsIHBhcmVudE5vZGUsIG5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgc3RhdGljIHJlc3VtZShlbnYsIHRyYWNrZXIsIG5leHRTaWJsaW5nKSB7XG4gICAgICAgIGxldCBwYXJlbnROb2RlID0gdHJhY2tlci5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGxldCBzdGFjayA9IG5ldyBFbGVtZW50U3RhY2soZW52LCBwYXJlbnROb2RlLCBuZXh0U2libGluZyk7XG4gICAgICAgIHN0YWNrLnB1c2hCbG9ja1RyYWNrZXIodHJhY2tlcik7XG4gICAgICAgIHJldHVybiBzdGFjaztcbiAgICB9XG4gICAgZXhwZWN0Q29uc3RydWN0aW5nKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgJHttZXRob2R9IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudGApO1xuICAgIH1cbiAgICBleHBlY3RPcGVyYXRpb25zKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZXhwZWN0KHRoaXMub3BlcmF0aW9ucywgYCR7bWV0aG9kfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hpbGUgY29uc3RydWN0aW5nIGFuIGVsZW1lbnRgKTtcbiAgICB9XG4gICAgYmxvY2soKSB7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQsIFwiRXhwZWN0ZWQgYSBjdXJyZW50IGJsb2NrIHRyYWNrZXJcIik7XG4gICAgfVxuICAgIHBvcEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCB7IGVsZW1lbnRTdGFjaywgbmV4dFNpYmxpbmdTdGFjayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHRvcEVsZW1lbnQgPSBlbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICAgIG5leHRTaWJsaW5nU3RhY2sucG9wKCk7XG4gICAgICAgIC8vIExPR0dFUi5kZWJ1ZyhgLT4gZWxlbWVudCBzdGFjayAke3RoaXMuZWxlbWVudFN0YWNrLnRvQXJyYXkoKS5tYXAoZSA9PiBlLnRhZ05hbWUpLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGV4cGVjdChlbGVtZW50U3RhY2suY3VycmVudCwgXCJjYW4ndCBwb3AgcGFzdCB0aGUgbGFzdCBlbGVtZW50XCIpO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nID0gbmV4dFNpYmxpbmdTdGFjay5jdXJyZW50O1xuICAgICAgICByZXR1cm4gdG9wRWxlbWVudDtcbiAgICB9XG4gICAgcHVzaFNpbXBsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBTaW1wbGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaFVwZGF0YWJsZUJsb2NrKCkge1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBVcGRhdGFibGVCbG9ja1RyYWNrZXIodGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5wdXNoQmxvY2tUcmFja2VyKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCBpc1JlbW90ZSA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5ibG9ja1N0YWNrLmN1cnJlbnQ7XG4gICAgICAgIGlmIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0Rlc3Ryb3lhYmxlKHRyYWNrZXIpO1xuICAgICAgICAgICAgaWYgKCFpc1JlbW90ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQubmV3Qm91bmRzKHRyYWNrZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tTdGFjay5wdXNoKHRyYWNrZXIpO1xuICAgICAgICByZXR1cm4gdHJhY2tlcjtcbiAgICB9XG4gICAgcHVzaEJsb2NrTGlzdChsaXN0KSB7XG4gICAgICAgIGxldCB0cmFja2VyID0gbmV3IEJsb2NrTGlzdFRyYWNrZXIodGhpcy5lbGVtZW50LCBsaXN0KTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmJsb2NrU3RhY2suY3VycmVudDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnQubmV3RGVzdHJveWFibGUodHJhY2tlcik7XG4gICAgICAgICAgICBjdXJyZW50Lm5ld0JvdW5kcyh0cmFja2VyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsb2NrU3RhY2sucHVzaCh0cmFja2VyKTtcbiAgICAgICAgcmV0dXJuIHRyYWNrZXI7XG4gICAgfVxuICAgIHBvcEJsb2NrKCkge1xuICAgICAgICB0aGlzLmJsb2NrKCkuZmluYWxpemUodGhpcyk7XG4gICAgICAgIHJldHVybiBleHBlY3QodGhpcy5ibG9ja1N0YWNrLnBvcCgpLCBcIkV4cGVjdGVkIHBvcEJsb2NrIHRvIHJldHVybiBhIGJsb2NrXCIpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudCh0YWcsIF9vcGVyYXRpb25zKSB7XG4gICAgICAgIC8vIHdvcmthcm91bmQgYXJndW1lbnQubGVuZ3RoIHRyYW5zcGlsZSBvZiBhcmcgaW5pdGlhbGl6ZXJcbiAgICAgICAgbGV0IG9wZXJhdGlvbnMgPSBfb3BlcmF0aW9ucyA9PT0gdW5kZWZpbmVkID8gdGhpcy5kZWZhdWx0T3BlcmF0aW9ucyA6IF9vcGVyYXRpb25zO1xuICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQodGFnLCB0aGlzLmVsZW1lbnQpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IGVsZW1lbnQ7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIGxldCBlbGVtZW50ID0gZXhwZWN0KHRoaXMuY29uc3RydWN0aW5nLCBgZmx1c2hFbGVtZW50IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIGNvbnN0cnVjdGluZyBhbiBlbGVtZW50YCk7XG4gICAgICAgIHRoaXMuZG9tLmluc2VydEJlZm9yZShwYXJlbnQsIGVsZW1lbnQsIHRoaXMubmV4dFNpYmxpbmcpO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdGluZyA9IG51bGw7XG4gICAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbnVsbCk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5vcGVuRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG4gICAgcHVzaFJlbW90ZUVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcgPSBudWxsKSB7XG4gICAgICAgIHRoaXMucHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpO1xuICAgICAgICBsZXQgdHJhY2tlciA9IG5ldyBSZW1vdGVCbG9ja1RyYWNrZXIoZWxlbWVudCk7XG4gICAgICAgIHRoaXMucHVzaEJsb2NrVHJhY2tlcih0cmFja2VyLCB0cnVlKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wb3BCbG9jaygpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG4gICAgcHVzaEVsZW1lbnQoZWxlbWVudCwgbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbGVtZW50KTtcbiAgICAgICAgLy8gTE9HR0VSLmRlYnVnKGAtPiBlbGVtZW50IHN0YWNrICR7dGhpcy5lbGVtZW50U3RhY2sudG9BcnJheSgpLm1hcChlID0+IGUudGFnTmFtZSkuam9pbignLCAnKX1gKTtcbiAgICAgICAgdGhpcy5uZXh0U2libGluZyA9IG5leHRTaWJsaW5nO1xuICAgICAgICB0aGlzLm5leHRTaWJsaW5nU3RhY2sucHVzaChuZXh0U2libGluZyk7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld0Rlc3Ryb3lhYmxlKGQpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoYm91bmRzKSB7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdCb3VuZHMoYm91bmRzKTtcbiAgICB9XG4gICAgYXBwZW5kVGV4dChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgdGV4dCA9IGRvbS5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpO1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgdGV4dCwgdGhpcy5uZXh0U2libGluZyk7XG4gICAgICAgIHRoaXMuYmxvY2soKS5uZXdOb2RlKHRleHQpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgYXBwZW5kQ29tbWVudChzdHJpbmcpIHtcbiAgICAgICAgbGV0IHsgZG9tIH0gPSB0aGlzO1xuICAgICAgICBsZXQgY29tbWVudCA9IGRvbS5jcmVhdGVDb21tZW50KHN0cmluZyk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUodGhpcy5lbGVtZW50LCBjb21tZW50LCB0aGlzLm5leHRTaWJsaW5nKTtcbiAgICAgICAgdGhpcy5ibG9jaygpLm5ld05vZGUoY29tbWVudCk7XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cbiAgICBzZXRTdGF0aWNBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGUnKS5hZGRTdGF0aWNBdHRyaWJ1dGUodGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldFN0YXRpY0F0dHJpYnV0ZScpLCBuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIHNldFN0YXRpY0F0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLmFkZFN0YXRpY0F0dHJpYnV0ZU5TKHRoaXMuZXhwZWN0Q29uc3RydWN0aW5nKCdzZXRTdGF0aWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gICAgc2V0RHluYW1pY0F0dHJpYnV0ZShuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlJykuYWRkRHluYW1pY0F0dHJpYnV0ZSh0aGlzLmV4cGVjdENvbnN0cnVjdGluZygnc2V0RHluYW1pY0F0dHJpYnV0ZScpLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpO1xuICAgIH1cbiAgICBzZXREeW5hbWljQXR0cmlidXRlTlMobmFtZXNwYWNlLCBuYW1lLCByZWZlcmVuY2UsIGlzVHJ1c3RpbmcpIHtcbiAgICAgICAgdGhpcy5leHBlY3RPcGVyYXRpb25zKCdzZXREeW5hbWljQXR0cmlidXRlTlMnKS5hZGREeW5hbWljQXR0cmlidXRlTlModGhpcy5leHBlY3RDb25zdHJ1Y3RpbmcoJ3NldER5bmFtaWNBdHRyaWJ1dGVOUycpLCBuYW1lc3BhY2UsIG5hbWUsIHJlZmVyZW5jZSwgaXNUcnVzdGluZyk7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5ibG9jaygpLmNsb3NlRWxlbWVudCgpO1xuICAgICAgICB0aGlzLnBvcEVsZW1lbnQoKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZmlyc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3QgPSBudWxsO1xuICAgICAgICB0aGlzLmRlc3Ryb3lhYmxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMubmVzdGluZyA9IDA7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGxldCB7IGRlc3Ryb3lhYmxlcyB9ID0gdGhpcztcbiAgICAgICAgaWYgKGRlc3Ryb3lhYmxlcyAmJiBkZXN0cm95YWJsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc3Ryb3lhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lhYmxlc1tpXS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0ICYmIHRoaXMuZmlyc3QuZmlyc3ROb2RlKCk7XG4gICAgfVxuICAgIGxhc3ROb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXN0ICYmIHRoaXMubGFzdC5sYXN0Tm9kZSgpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMubmV3Tm9kZShlbGVtZW50KTtcbiAgICAgICAgdGhpcy5uZXN0aW5nKys7XG4gICAgfVxuICAgIGNsb3NlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5uZXN0aW5nLS07XG4gICAgfVxuICAgIG5ld05vZGUobm9kZSkge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IG5ldyBGaXJzdChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBuZXcgTGFzdChub2RlKTtcbiAgICB9XG4gICAgbmV3Qm91bmRzKGJvdW5kcykge1xuICAgICAgICBpZiAodGhpcy5uZXN0aW5nICE9PSAwKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5maXJzdCkge1xuICAgICAgICAgICAgdGhpcy5maXJzdCA9IGJvdW5kcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3QgPSBib3VuZHM7XG4gICAgfVxuICAgIG5ld0Rlc3Ryb3lhYmxlKGQpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMgPSB0aGlzLmRlc3Ryb3lhYmxlcyB8fCBbXTtcbiAgICAgICAgdGhpcy5kZXN0cm95YWJsZXMucHVzaChkKTtcbiAgICB9XG4gICAgZmluYWxpemUoc3RhY2spIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0KSB7XG4gICAgICAgICAgICBzdGFjay5hcHBlbmRDb21tZW50KCcnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIFJlbW90ZUJsb2NrVHJhY2tlciBleHRlbmRzIFNpbXBsZUJsb2NrVHJhY2tlciB7XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIuZGVzdHJveSgpO1xuICAgICAgICBjbGVhcih0aGlzKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgVXBkYXRhYmxlQmxvY2tUcmFja2VyIGV4dGVuZHMgU2ltcGxlQmxvY2tUcmFja2VyIHtcbiAgICByZXNldChlbnYpIHtcbiAgICAgICAgbGV0IHsgZGVzdHJveWFibGVzIH0gPSB0aGlzO1xuICAgICAgICBpZiAoZGVzdHJveWFibGVzICYmIGRlc3Ryb3lhYmxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJveWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW52LmRpZERlc3Ryb3koZGVzdHJveWFibGVzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcih0aGlzKTtcbiAgICAgICAgdGhpcy5maXJzdCA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdCA9IG51bGw7XG4gICAgICAgIHRoaXMuZGVzdHJveWFibGVzID0gbnVsbDtcbiAgICAgICAgdGhpcy5uZXN0aW5nID0gMDtcbiAgICAgICAgcmV0dXJuIG5leHRTaWJsaW5nO1xuICAgIH1cbn1cbmNsYXNzIEJsb2NrTGlzdFRyYWNrZXIge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgYm91bmRMaXN0KSB7XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmJvdW5kTGlzdCA9IGJvdW5kTGlzdDtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuYm91bmRMaXN0ID0gYm91bmRMaXN0O1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmJvdW5kTGlzdC5mb3JFYWNoTm9kZShub2RlID0+IG5vZGUuZGVzdHJveSgpKTtcbiAgICB9XG4gICAgcGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgIH1cbiAgICBmaXJzdE5vZGUoKSB7XG4gICAgICAgIGxldCBoZWFkID0gdGhpcy5ib3VuZExpc3QuaGVhZCgpO1xuICAgICAgICByZXR1cm4gaGVhZCAmJiBoZWFkLmZpcnN0Tm9kZSgpO1xuICAgIH1cbiAgICBsYXN0Tm9kZSgpIHtcbiAgICAgICAgbGV0IHRhaWwgPSB0aGlzLmJvdW5kTGlzdC50YWlsKCk7XG4gICAgICAgIHJldHVybiB0YWlsICYmIHRhaWwubGFzdE5vZGUoKTtcbiAgICB9XG4gICAgb3BlbkVsZW1lbnQoX2VsZW1lbnQpIHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlLCAnQ2Fubm90IG9wZW5FbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgY2xvc2VFbGVtZW50KCkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY2xvc2VFbGVtZW50IGRpcmVjdGx5IGluc2lkZSBhIGJsb2NrIGxpc3QnKTtcbiAgICB9XG4gICAgbmV3Tm9kZShfbm9kZSkge1xuICAgICAgICBhc3NlcnQoZmFsc2UsICdDYW5ub3QgY3JlYXRlIGEgbmV3IG5vZGUgZGlyZWN0bHkgaW5zaWRlIGEgYmxvY2sgbGlzdCcpO1xuICAgIH1cbiAgICBuZXdCb3VuZHMoX2JvdW5kcykge31cbiAgICBuZXdEZXN0cm95YWJsZShfZCkge31cbiAgICBmaW5hbGl6ZShfc3RhY2spIHt9XG59Il19