123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.default = traverse;
- var _util = require("@glimmer/util");
- var _visitorKeys = _interopRequireDefault(require("../v1/visitor-keys"));
- var _errors = require("./errors");
- var _path2 = _interopRequireDefault(require("./path"));
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
- function getEnterFunction(handler) {
- if (typeof handler === 'function') {
- return handler;
- } else {
- return handler.enter;
- }
- }
- function getExitFunction(handler) {
- if (typeof handler === 'function') {
- return undefined;
- } else {
- return handler.exit;
- }
- }
- function getKeyHandler(handler, key) {
- var keyVisitor = typeof handler !== 'function' ? handler.keys : undefined;
- if (keyVisitor === undefined) return;
- var keyHandler = keyVisitor[key];
- if (keyHandler !== undefined) {
- return keyHandler;
- }
- return keyVisitor.All;
- }
- function getNodeHandler(visitor, nodeType) {
- if (nodeType === 'Template' || nodeType === 'Block') {
- if (visitor.Program) {
- if (false
- /* LOCAL_DEBUG */
- ) {
- false && !false && (0, _util.deprecate)("The 'Program' visitor node is deprecated. Use 'Template' or 'Block' instead (node was '" + nodeType + "') ");
- }
- return visitor.Program;
- }
- }
- var handler = visitor[nodeType];
- if (handler !== undefined) {
- return handler;
- }
- return visitor.All;
- }
- function visitNode(visitor, path) {
- var node = path.node,
- parent = path.parent,
- parentKey = path.parentKey;
- var handler = getNodeHandler(visitor, node.type);
- var enter;
- var exit;
- if (handler !== undefined) {
- enter = getEnterFunction(handler);
- exit = getExitFunction(handler);
- }
- var result;
- if (enter !== undefined) {
- result = enter(node, path);
- }
- if (result !== undefined && result !== null) {
- if (JSON.stringify(node) === JSON.stringify(result)) {
- result = undefined;
- } else if (Array.isArray(result)) {
- visitArray(visitor, result, parent, parentKey);
- return result;
- } else {
- var _path = new _path2.default(result, parent, parentKey);
- return visitNode(visitor, _path) || result;
- }
- }
- if (result === undefined) {
- var keys = _visitorKeys.default[node.type];
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i]; // we know if it has child keys we can widen to a ParentNode
- visitKey(visitor, handler, path, key);
- }
- if (exit !== undefined) {
- result = exit(node, path);
- }
- }
- return result;
- }
- function get(node, key) {
- return node[key];
- }
- function set(node, key, value) {
- node[key] = value;
- }
- function visitKey(visitor, handler, path, key) {
- var node = path.node;
- var value = get(node, key);
- if (!value) {
- return;
- }
- var keyEnter;
- var keyExit;
- if (handler !== undefined) {
- var keyHandler = getKeyHandler(handler, key);
- if (keyHandler !== undefined) {
- keyEnter = getEnterFunction(keyHandler);
- keyExit = getExitFunction(keyHandler);
- }
- }
- if (keyEnter !== undefined) {
- if (keyEnter(node, key) !== undefined) {
- throw (0, _errors.cannotReplaceOrRemoveInKeyHandlerYet)(node, key);
- }
- }
- if (Array.isArray(value)) {
- visitArray(visitor, value, path, key);
- } else {
- var keyPath = new _path2.default(value, path, key);
- var result = visitNode(visitor, keyPath);
- if (result !== undefined) {
- // TODO: dynamically check the results by having a table of
- // expected node types in value space, not just type space
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- assignKey(node, key, value, result);
- }
- }
- if (keyExit !== undefined) {
- if (keyExit(node, key) !== undefined) {
- throw (0, _errors.cannotReplaceOrRemoveInKeyHandlerYet)(node, key);
- }
- }
- }
- function visitArray(visitor, array, parent, parentKey) {
- for (var i = 0; i < array.length; i++) {
- var node = array[i];
- var path = new _path2.default(node, parent, parentKey);
- var result = visitNode(visitor, path);
- if (result !== undefined) {
- i += spliceArray(array, i, result) - 1;
- }
- }
- }
- function assignKey(node, key, value, result) {
- if (result === null) {
- throw (0, _errors.cannotRemoveNode)(value, node, key);
- } else if (Array.isArray(result)) {
- if (result.length === 1) {
- set(node, key, result[0]);
- } else {
- if (result.length === 0) {
- throw (0, _errors.cannotRemoveNode)(value, node, key);
- } else {
- throw (0, _errors.cannotReplaceNode)(value, node, key);
- }
- }
- } else {
- set(node, key, result);
- }
- }
- function spliceArray(array, index, result) {
- if (result === null) {
- array.splice(index, 1);
- return 0;
- } else if (Array.isArray(result)) {
- array.splice.apply(array, [index, 1].concat(result));
- return result.length;
- } else {
- array.splice(index, 1, result);
- return 1;
- }
- }
- function traverse(node, visitor) {
- var path = new _path2.default(node);
- visitNode(visitor, path);
- }
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdHJhdmVyc2FsL3RyYXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFDQTs7QUFHQTs7QUFDQTs7QUFLQTs7OztBQVNBLFNBQUEsZ0JBQUEsQ0FBQSxPQUFBLEVBQ2dEO0FBRTlDLE1BQUksT0FBQSxPQUFBLEtBQUosVUFBQSxFQUFtQztBQUNqQyxXQUFBLE9BQUE7QUFERixHQUFBLE1BRU87QUFDTCxXQUFPLE9BQU8sQ0FBZCxLQUFBO0FBQ0Q7QUFDRjs7QUFRRCxTQUFBLGVBQUEsQ0FBQSxPQUFBLEVBQ2dEO0FBRTlDLE1BQUksT0FBQSxPQUFBLEtBQUosVUFBQSxFQUFtQztBQUNqQyxXQUFBLFNBQUE7QUFERixHQUFBLE1BRU87QUFDTCxXQUFPLE9BQU8sQ0FBZCxJQUFBO0FBQ0Q7QUFDRjs7QUFFRCxTQUFBLGFBQUEsQ0FBQSxPQUFBLEVBQUEsR0FBQSxFQUVRO0FBRU4sTUFBSSxVQUFVLEdBQUcsT0FBQSxPQUFBLEtBQUEsVUFBQSxHQUFnQyxPQUFPLENBQXZDLElBQUEsR0FBakIsU0FBQTtBQUNBLE1BQUksVUFBVSxLQUFkLFNBQUEsRUFBOEI7QUFFOUIsTUFBSSxVQUFVLEdBQUcsVUFBVSxDQUEzQixHQUEyQixDQUEzQjs7QUFDQSxNQUFJLFVBQVUsS0FBZCxTQUFBLEVBQThCO0FBQzVCLFdBQUEsVUFBQTtBQUNEOztBQUNELFNBQU8sVUFBVSxDQUFqQixHQUFBO0FBQ0Q7O0FBT0QsU0FBQSxjQUFBLENBQUEsT0FBQSxFQUFBLFFBQUEsRUFFcUI7QUFFbkIsTUFBSSxRQUFRLEtBQVIsVUFBQSxJQUEyQixRQUFRLEtBQXZDLE9BQUEsRUFBcUQ7QUFDbkQsUUFBSSxPQUFPLENBQVgsT0FBQSxFQUFxQjtBQUNuQixVQUFBO0FBQUE7QUFBQSxRQUFpQjtBQUFBLG1CQUFBLENBQUEsS0FBQSxJQUNmLHFCQUFTLDRGQURNLFFBQ04sR0FETSxLQUNm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RU87QUFDTCxjQUFNLCtCQUFpQixLQUFqQixFQUFpQixJQUFqQixFQUFOLEdBQU0sQ0FBTjtBQUNEO0FBQ0Y7QUFUSSxHQUFBLE1BVUE7QUFDTCxJQUFBLEdBQUcsQ0FBQSxJQUFBLEVBQUEsR0FBQSxFQUFILE1BQUcsQ0FBSDtBQUNEO0FBQ0Y7O0FBRUQsU0FBQSxXQUFBLENBQUEsS0FBQSxFQUFBLEtBQUEsRUFBQSxNQUFBLEVBQWlHO0FBQy9GLE1BQUksTUFBTSxLQUFWLElBQUEsRUFBcUI7QUFDbkIsSUFBQSxLQUFLLENBQUwsTUFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBO0FBQ0EsV0FBQSxDQUFBO0FBRkYsR0FBQSxNQUdPLElBQUksS0FBSyxDQUFMLE9BQUEsQ0FBSixNQUFJLENBQUosRUFBMkI7QUFDaEMsSUFBQSxLQUFLLENBQUwsTUFBQSxDQUFBLEtBQUEsQ0FBQSxLQUFBLEVBQUssQ0FBTCxLQUFLLEVBQUwsQ0FBSyxFQUFBLE1BQUEsQ0FBTCxNQUFLLENBQUw7QUFDQSxXQUFPLE1BQU0sQ0FBYixNQUFBO0FBRkssR0FBQSxNQUdBO0FBQ0wsSUFBQSxLQUFLLENBQUwsTUFBQSxDQUFBLEtBQUEsRUFBQSxDQUFBLEVBQUEsTUFBQTtBQUNBLFdBQUEsQ0FBQTtBQUNEO0FBQ0Y7O0FBRWEsU0FBQSxRQUFBLENBQUEsSUFBQSxFQUFBLE9BQUEsRUFBeUQ7QUFDckUsTUFBSSxJQUFJLEdBQUcsSUFBQSxjQUFBLENBQVgsSUFBVyxDQUFYO0FBQ0EsRUFBQSxTQUFTLENBQUEsT0FBQSxFQUFULElBQVMsQ0FBVDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTE9DQUxfREVCVUcgfSBmcm9tICdAZ2xpbW1lci9sb2NhbC1kZWJ1Zy1mbGFncyc7XG5pbXBvcnQgeyBkZXByZWNhdGUgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi4vdjEvYXBpJztcbmltcG9ydCB2aXNpdG9yS2V5cywgeyBWaXNpdG9yS2V5LCBWaXNpdG9yS2V5cyB9IGZyb20gJy4uL3YxL3Zpc2l0b3Ita2V5cyc7XG5pbXBvcnQge1xuICBjYW5ub3RSZW1vdmVOb2RlLFxuICBjYW5ub3RSZXBsYWNlTm9kZSxcbiAgY2Fubm90UmVwbGFjZU9yUmVtb3ZlSW5LZXlIYW5kbGVyWWV0LFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgV2Fsa2VyUGF0aCBmcm9tICcuL3BhdGgnO1xuaW1wb3J0IHsgS2V5SGFuZGxlciwgS2V5VHJhdmVyc2FsLCBOb2RlSGFuZGxlciwgTm9kZVRyYXZlcnNhbCwgTm9kZVZpc2l0b3IgfSBmcm9tICcuL3Zpc2l0b3InO1xuXG5mdW5jdGlvbiBnZXRFbnRlckZ1bmN0aW9uPE4gZXh0ZW5kcyBBU1R2MS5Ob2RlPihcbiAgaGFuZGxlcjogTm9kZVRyYXZlcnNhbDxOPlxuKTogTm9kZUhhbmRsZXI8Tj4gfCB1bmRlZmluZWQ7XG5mdW5jdGlvbiBnZXRFbnRlckZ1bmN0aW9uPE4gZXh0ZW5kcyBBU1R2MS5Ob2RlLCBLIGV4dGVuZHMgVmlzaXRvcktleTxOPj4oXG4gIGhhbmRsZXI6IEtleVRyYXZlcnNhbDxOLCBLPlxuKTogS2V5SGFuZGxlcjxOLCBLPiB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldEVudGVyRnVuY3Rpb248TiBleHRlbmRzIEFTVHYxLk5vZGUsIEsgZXh0ZW5kcyBWaXNpdG9yS2V5PE4+PihcbiAgaGFuZGxlcjogTm9kZVRyYXZlcnNhbDxOPiB8IEtleVRyYXZlcnNhbDxOLCBLPlxuKTogTm9kZUhhbmRsZXI8Tj4gfCBLZXlIYW5kbGVyPE4sIEs+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGhhbmRsZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGhhbmRsZXIuZW50ZXIgYXMgTm9kZUhhbmRsZXI8Tj4gfCBLZXlIYW5kbGVyPE4sIEs+O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEV4aXRGdW5jdGlvbjxOIGV4dGVuZHMgQVNUdjEuTm9kZT4oXG4gIGhhbmRsZXI6IE5vZGVUcmF2ZXJzYWw8Tj5cbik6IE5vZGVIYW5kbGVyPE4+IHwgdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0RXhpdEZ1bmN0aW9uPE4gZXh0ZW5kcyBBU1R2MS5Ob2RlLCBLIGV4dGVuZHMgVmlzaXRvcktleTxOPj4oXG4gIGhhbmRsZXI6IEtleVRyYXZlcnNhbDxOLCBLPlxuKTogS2V5SGFuZGxlcjxOLCBLPiB8IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldEV4aXRGdW5jdGlvbjxOIGV4dGVuZHMgQVNUdjEuTm9kZSwgSyBleHRlbmRzIFZpc2l0b3JLZXk8Tj4+KFxuICBoYW5kbGVyOiBOb2RlVHJhdmVyc2FsPE4+IHwgS2V5VHJhdmVyc2FsPE4sIEs+XG4pOiBOb2RlSGFuZGxlcjxOPiB8IEtleUhhbmRsZXI8TiwgSz4gfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBoYW5kbGVyLmV4aXQgYXMgTm9kZUhhbmRsZXI8Tj4gfCBLZXlIYW5kbGVyPE4sIEs+O1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEtleUhhbmRsZXI8TiBleHRlbmRzIEFTVHYxLk5vZGUsIEsgZXh0ZW5kcyBWaXNpdG9yS2V5PE4+PihcbiAgaGFuZGxlcjogTm9kZVRyYXZlcnNhbDxOPixcbiAga2V5OiBLXG4pOiBLZXlUcmF2ZXJzYWw8TiwgSz4gfCBLZXlUcmF2ZXJzYWw8TiwgVmlzaXRvcktleTxOPj4gfCB1bmRlZmluZWQge1xuICBsZXQga2V5VmlzaXRvciA9IHR5cGVvZiBoYW5kbGVyICE9PSAnZnVuY3Rpb24nID8gaGFuZGxlci5rZXlzIDogdW5kZWZpbmVkO1xuICBpZiAoa2V5VmlzaXRvciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgbGV0IGtleUhhbmRsZXIgPSBrZXlWaXNpdG9yW2tleV07XG4gIGlmIChrZXlIYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ga2V5SGFuZGxlciBhcyBLZXlUcmF2ZXJzYWw8TiwgSz47XG4gIH1cbiAgcmV0dXJuIGtleVZpc2l0b3IuQWxsO1xufVxuXG5mdW5jdGlvbiBnZXROb2RlSGFuZGxlcjxOIGV4dGVuZHMgQVNUdjEuTm9kZT4oXG4gIHZpc2l0b3I6IE5vZGVWaXNpdG9yLFxuICBub2RlVHlwZTogTlsndHlwZSddXG4pOiBOb2RlVHJhdmVyc2FsPE4+O1xuZnVuY3Rpb24gZ2V0Tm9kZUhhbmRsZXIodmlzaXRvcjogTm9kZVZpc2l0b3IsIG5vZGVUeXBlOiAnQWxsJyk6IE5vZGVUcmF2ZXJzYWw8QVNUdjEuTm9kZT47XG5mdW5jdGlvbiBnZXROb2RlSGFuZGxlcjxOIGV4dGVuZHMgQVNUdjEuTm9kZT4oXG4gIHZpc2l0b3I6IE5vZGVWaXNpdG9yLFxuICBub2RlVHlwZTogTlsndHlwZSddXG4pOiBOb2RlVHJhdmVyc2FsPEFTVHYxLk5vZGU+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKG5vZGVUeXBlID09PSAnVGVtcGxhdGUnIHx8IG5vZGVUeXBlID09PSAnQmxvY2snKSB7XG4gICAgaWYgKHZpc2l0b3IuUHJvZ3JhbSkge1xuICAgICAgaWYgKExPQ0FMX0RFQlVHKSB7XG4gICAgICAgIGRlcHJlY2F0ZShcbiAgICAgICAgICBgVGhlICdQcm9ncmFtJyB2aXNpdG9yIG5vZGUgaXMgZGVwcmVjYXRlZC4gVXNlICdUZW1wbGF0ZScgb3IgJ0Jsb2NrJyBpbnN0ZWFkIChub2RlIHdhcyAnJHtub2RlVHlwZX0nKSBgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2aXNpdG9yLlByb2dyYW0gYXMgTm9kZVRyYXZlcnNhbDxBU1R2MS5Ob2RlPjtcbiAgICB9XG4gIH1cblxuICBsZXQgaGFuZGxlciA9IHZpc2l0b3Jbbm9kZVR5cGVdO1xuICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChoYW5kbGVyIGFzIHVua25vd24pIGFzIE5vZGVUcmF2ZXJzYWw8QVNUdjEuTm9kZT47XG4gIH1cbiAgcmV0dXJuIHZpc2l0b3IuQWxsO1xufVxuXG5mdW5jdGlvbiB2aXNpdE5vZGU8TiBleHRlbmRzIEFTVHYxLk5vZGU+KFxuICB2aXNpdG9yOiBOb2RlVmlzaXRvcixcbiAgcGF0aDogV2Fsa2VyUGF0aDxOPlxuKTogQVNUdjEuTm9kZSB8IEFTVHYxLk5vZGVbXSB8IHVuZGVmaW5lZCB8IG51bGwgfCB2b2lkIHtcbiAgbGV0IHsgbm9kZSwgcGFyZW50LCBwYXJlbnRLZXkgfSA9IHBhdGg7XG5cbiAgbGV0IGhhbmRsZXI6IE5vZGVUcmF2ZXJzYWw8Tj4gPSBnZXROb2RlSGFuZGxlcih2aXNpdG9yLCBub2RlLnR5cGUpO1xuICBsZXQgZW50ZXI7XG4gIGxldCBleGl0O1xuXG4gIGlmIChoYW5kbGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbnRlciA9IGdldEVudGVyRnVuY3Rpb24oaGFuZGxlcik7XG4gICAgZXhpdCA9IGdldEV4aXRGdW5jdGlvbihoYW5kbGVyKTtcbiAgfVxuXG4gIGxldCByZXN1bHQ6IEFTVHYxLk5vZGUgfCBBU1R2MS5Ob2RlW10gfCB1bmRlZmluZWQgfCBudWxsIHwgdm9pZDtcbiAgaWYgKGVudGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXN1bHQgPSBlbnRlcihub2RlLCBwYXRoKTtcbiAgfVxuXG4gIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICBpZiAoSlNPTi5zdHJpbmdpZnkobm9kZSkgPT09IEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgICAgdmlzaXRBcnJheSh2aXNpdG9yLCByZXN1bHQsIHBhcmVudCwgcGFyZW50S2V5KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBwYXRoID0gbmV3IFdhbGtlclBhdGgocmVzdWx0LCBwYXJlbnQsIHBhcmVudEtleSk7XG4gICAgICByZXR1cm4gdmlzaXROb2RlKHZpc2l0b3IsIHBhdGgpIHx8IHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICBsZXQga2V5cyA9IHZpc2l0b3JLZXlzW25vZGUudHlwZV07XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBrZXkgPSBrZXlzW2ldIGFzIFZpc2l0b3JLZXlzW05bJ3R5cGUnXV0gJiBrZXlvZiBOO1xuICAgICAgLy8gd2Uga25vdyBpZiBpdCBoYXMgY2hpbGQga2V5cyB3ZSBjYW4gd2lkZW4gdG8gYSBQYXJlbnROb2RlXG4gICAgICB2aXNpdEtleSh2aXNpdG9yLCBoYW5kbGVyLCBwYXRoLCBrZXkpO1xuICAgIH1cblxuICAgIGlmIChleGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IGV4aXQobm9kZSwgcGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0PE4gZXh0ZW5kcyBBU1R2MS5Ob2RlPihcbiAgbm9kZTogTixcbiAga2V5OiBWaXNpdG9yS2V5c1tOWyd0eXBlJ11dICYga2V5b2YgTlxuKTogQVNUdjEuTm9kZSB8IEFTVHYxLk5vZGVbXSB7XG4gIHJldHVybiAobm9kZVtrZXldIGFzIHVua25vd24pIGFzIEFTVHYxLk5vZGUgfCBBU1R2MS5Ob2RlW107XG59XG5cbmZ1bmN0aW9uIHNldDxOIGV4dGVuZHMgQVNUdjEuTm9kZSwgSyBleHRlbmRzIGtleW9mIE4+KG5vZGU6IE4sIGtleTogSywgdmFsdWU6IE5bS10pOiB2b2lkIHtcbiAgbm9kZVtrZXldID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHZpc2l0S2V5PE4gZXh0ZW5kcyBBU1R2MS5Ob2RlPihcbiAgdmlzaXRvcjogTm9kZVZpc2l0b3IsXG4gIGhhbmRsZXI6IE5vZGVUcmF2ZXJzYWw8Tj4sXG4gIHBhdGg6IFdhbGtlclBhdGg8Tj4sXG4gIGtleTogVmlzaXRvcktleXNbTlsndHlwZSddXSAmIGtleW9mIE5cbikge1xuICBsZXQgeyBub2RlIH0gPSBwYXRoO1xuXG4gIGxldCB2YWx1ZSA9IGdldChub2RlLCBrZXkpO1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGtleUVudGVyO1xuICBsZXQga2V5RXhpdDtcblxuICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgbGV0IGtleUhhbmRsZXIgPSBnZXRLZXlIYW5kbGVyKGhhbmRsZXIsIGtleSk7XG4gICAgaWYgKGtleUhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5RW50ZXIgPSBnZXRFbnRlckZ1bmN0aW9uKGtleUhhbmRsZXIpO1xuICAgICAga2V5RXhpdCA9IGdldEV4aXRGdW5jdGlvbihrZXlIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICBpZiAoa2V5RW50ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChrZXlFbnRlcihub2RlLCBrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IGNhbm5vdFJlcGxhY2VPclJlbW92ZUluS2V5SGFuZGxlcllldChub2RlLCBrZXkpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHZpc2l0QXJyYXkodmlzaXRvciwgdmFsdWUsIHBhdGgsIGtleSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGtleVBhdGggPSBuZXcgV2Fsa2VyUGF0aCh2YWx1ZSwgcGF0aCwga2V5KTtcbiAgICBsZXQgcmVzdWx0ID0gdmlzaXROb2RlKHZpc2l0b3IsIGtleVBhdGgpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVE9ETzogZHluYW1pY2FsbHkgY2hlY2sgdGhlIHJlc3VsdHMgYnkgaGF2aW5nIGEgdGFibGUgb2ZcbiAgICAgIC8vIGV4cGVjdGVkIG5vZGUgdHlwZXMgaW4gdmFsdWUgc3BhY2UsIG5vdCBqdXN0IHR5cGUgc3BhY2VcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBhc3NpZ25LZXkobm9kZSwga2V5LCB2YWx1ZSwgcmVzdWx0IGFzIGFueSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGtleUV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChrZXlFeGl0KG5vZGUsIGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgY2Fubm90UmVwbGFjZU9yUmVtb3ZlSW5LZXlIYW5kbGVyWWV0KG5vZGUsIGtleSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZpc2l0QXJyYXkoXG4gIHZpc2l0b3I6IE5vZGVWaXNpdG9yLFxuICBhcnJheTogQVNUdjEuTm9kZVtdLFxuICBwYXJlbnQ6IFdhbGtlclBhdGg8QVNUdjEuTm9kZT4gfCBudWxsLFxuICBwYXJlbnRLZXk6IHN0cmluZyB8IG51bGxcbikge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IG5vZGUgPSBhcnJheVtpXTtcbiAgICBsZXQgcGF0aCA9IG5ldyBXYWxrZXJQYXRoKG5vZGUsIHBhcmVudCwgcGFyZW50S2V5KTtcbiAgICBsZXQgcmVzdWx0ID0gdmlzaXROb2RlKHZpc2l0b3IsIHBhdGgpO1xuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaSArPSBzcGxpY2VBcnJheShhcnJheSwgaSwgcmVzdWx0KSAtIDE7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2lnbktleTxOIGV4dGVuZHMgQVNUdjEuTm9kZSwgSyBleHRlbmRzIFZpc2l0b3JLZXk8Tj4+KFxuICBub2RlOiBOLFxuICBrZXk6IEssXG4gIHZhbHVlOiBBU1R2MS5Ob2RlLFxuICByZXN1bHQ6IE5bS10gfCBbTltLXV0gfCBudWxsXG4pIHtcbiAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgIHRocm93IGNhbm5vdFJlbW92ZU5vZGUodmFsdWUsIG5vZGUsIGtleSk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldChub2RlLCBrZXksIHJlc3VsdFswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IGNhbm5vdFJlbW92ZU5vZGUodmFsdWUsIG5vZGUsIGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBjYW5ub3RSZXBsYWNlTm9kZSh2YWx1ZSwgbm9kZSwga2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgc2V0KG5vZGUsIGtleSwgcmVzdWx0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzcGxpY2VBcnJheShhcnJheTogQVNUdjEuTm9kZVtdLCBpbmRleDogbnVtYmVyLCByZXN1bHQ6IEFTVHYxLk5vZGUgfCBBU1R2MS5Ob2RlW10gfCBudWxsKSB7XG4gIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAwO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSkge1xuICAgIGFycmF5LnNwbGljZShpbmRleCwgMSwgLi4ucmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aDtcbiAgfSBlbHNlIHtcbiAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEsIHJlc3VsdCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdHJhdmVyc2Uobm9kZTogQVNUdjEuTm9kZSwgdmlzaXRvcjogTm9kZVZpc2l0b3IpOiB2b2lkIHtcbiAgbGV0IHBhdGggPSBuZXcgV2Fsa2VyUGF0aChub2RlKTtcbiAgdmlzaXROb2RlKHZpc2l0b3IsIHBhdGgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
|