UNPKG

ember-legacy-class-transform

Version:
514 lines (499 loc) 58 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.BasicOpcodeBuilder = undefined; var _util = require('@glimmer/util'); var _compiler = require('../../compiler'); var _opcodes = require('../../opcodes'); var _functions = require('../../syntax/functions'); var _rawBlock = require('../../syntax/raw-block'); var _rawBlock2 = _interopRequireDefault(_rawBlock); var _content = require('../opcodes/content'); var _content2 = require('./content'); var content = _interopRequireWildcard(_content2); var _vm = require('./vm'); var vm = _interopRequireWildcard(_vm); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } class Labels { constructor() { this.labels = (0, _util.dict)(); this.targets = []; } label(name, index) { this.labels[name] = index; } target(at, Target, target) { this.targets.push({ at, Target, target }); } patch(program) { let { targets, labels } = this; for (let i = 0; i < targets.length; i++) { let { at, target } = targets[i]; let goto = labels[target] - at; program.heap.setbyaddr(at + 1, goto); } } } class BasicOpcodeBuilder { constructor(env, meta, program) { this.env = env; this.meta = meta; this.program = program; this.labelsStack = new _util.Stack(); this.constants = program.constants; this.heap = program.heap; this.start = this.heap.malloc(); } get pos() { return (0, _util.typePos)(this.heap.size()); } get nextPos() { return this.heap.size(); } upvars(count) { return (0, _util.fillNulls)(count); } reserve(name) { this.push(name, 0, 0, 0); } push(name, op1 = 0, op2 = 0, op3 = 0) { this.heap.push(name); this.heap.push(op1); this.heap.push(op2); this.heap.push(op3); } finalize() { this.push(22 /* Return */); this.heap.finishMalloc(this.start); return this.start; } // args pushArgs(synthetic) { this.push(58 /* PushArgs */, synthetic === true ? 1 : 0); } // helpers get labels() { return (0, _util.expect)(this.labelsStack.current, 'bug: not in a label stack'); } startLabels() { this.labelsStack.push(new Labels()); } stopLabels() { let label = (0, _util.expect)(this.labelsStack.pop(), 'unbalanced push and pop labels'); label.patch(this.program); } // components pushComponentManager(definition) { this.push(56 /* PushComponentManager */, this.other(definition)); } pushDynamicComponentManager() { this.push(57 /* PushDynamicComponentManager */); } prepareArgs(state) { this.push(59 /* PrepareArgs */, state); } createComponent(state, hasDefault, hasInverse) { let flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1; this.push(60 /* CreateComponent */, flag, state); } registerComponentDestructor(state) { this.push(61 /* RegisterComponentDestructor */, state); } beginComponentTransaction() { this.push(65 /* BeginComponentTransaction */); } commitComponentTransaction() { this.push(66 /* CommitComponentTransaction */); } pushComponentOperations() { this.push(62 /* PushComponentOperations */); } getComponentSelf(state) { this.push(63 /* GetComponentSelf */, state); } getComponentLayout(state) { this.push(64 /* GetComponentLayout */, state); } didCreateElement(state) { this.push(67 /* DidCreateElement */, state); } didRenderLayout(state) { this.push(68 /* DidRenderLayout */, state); } // partial getPartialTemplate() { this.push(69 /* GetPartialTemplate */); } resolveMaybeLocal(name) { this.push(70 /* ResolveMaybeLocal */, this.string(name)); } // debugger debugger(symbols, evalInfo) { this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo)); } // content dynamicContent(Opcode) { this.push(26 /* DynamicContent */, this.other(Opcode)); } cautiousAppend() { this.dynamicContent(new content.OptimizedCautiousAppendOpcode()); } trustingAppend() { this.dynamicContent(new content.OptimizedTrustingAppendOpcode()); } // dom text(text) { this.push(24 /* Text */, this.constants.string(text)); } openPrimitiveElement(tag) { this.push(27 /* OpenElement */, this.constants.string(tag)); } openElementWithOperations(tag) { this.push(28 /* OpenElementWithOperations */, this.constants.string(tag)); } openDynamicElement() { this.push(29 /* OpenDynamicElement */); } flushElement() { this.push(33 /* FlushElement */); } closeElement() { this.push(34 /* CloseElement */); } staticAttr(_name, _namespace, _value) { let name = this.constants.string(_name); let namespace = _namespace ? this.constants.string(_namespace) : 0; let value = this.constants.string(_value); this.push(30 /* StaticAttr */, name, value, namespace); } dynamicAttrNS(_name, _namespace, trusting) { let name = this.constants.string(_name); let namespace = this.constants.string(_namespace); this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0); } dynamicAttr(_name, trusting) { let name = this.constants.string(_name); this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0); } comment(_comment) { let comment = this.constants.string(_comment); this.push(25 /* Comment */, comment); } modifier(_definition) { this.push(35 /* Modifier */, this.other(_definition)); } // lists putIterator() { this.push(54 /* PutIterator */); } enterList(start) { this.reserve(52 /* EnterList */); this.labels.target(this.pos, 52 /* EnterList */, start); } exitList() { this.push(53 /* ExitList */); } iterate(breaks) { this.reserve(55 /* Iterate */); this.labels.target(this.pos, 55 /* Iterate */, breaks); } // expressions setVariable(symbol) { this.push(4 /* SetVariable */, symbol); } getVariable(symbol) { this.push(5 /* GetVariable */, symbol); } getProperty(key) { this.push(6 /* GetProperty */, this.string(key)); } getBlock(symbol) { this.push(8 /* GetBlock */, symbol); } hasBlock(symbol) { this.push(9 /* HasBlock */, symbol); } hasBlockParams(symbol) { this.push(10 /* HasBlockParams */, symbol); } concat(size) { this.push(11 /* Concat */, size); } function(f) { this.push(2 /* Function */, this.func(f)); } load(register) { this.push(17 /* Load */, register); } fetch(register) { this.push(18 /* Fetch */, register); } dup(register = _opcodes.Register.sp, offset = 0) { return this.push(15 /* Dup */, register, offset); } pop(count = 1) { return this.push(16 /* Pop */, count); } // vm pushRemoteElement() { this.push(36 /* PushRemoteElement */); } popRemoteElement() { this.push(37 /* PopRemoteElement */); } label(name) { this.labels.label(name, this.nextPos); } pushRootScope(symbols, bindCallerScope) { this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0); } pushChildScope() { this.push(20 /* ChildScope */); } popScope() { this.push(21 /* PopScope */); } returnTo(label) { this.reserve(23 /* ReturnTo */); this.labels.target(this.pos, 23 /* ReturnTo */, label); } pushDynamicScope() { this.push(39 /* PushDynamicScope */); } popDynamicScope() { this.push(40 /* PopDynamicScope */); } pushImmediate(value) { this.push(13 /* Constant */, this.other(value)); } primitive(_primitive) { let flag = 0; let primitive; switch (typeof _primitive) { case 'number': if (_primitive % 1 === 0 && _primitive > 0) { primitive = _primitive; } else { primitive = this.float(_primitive); flag = 1; } break; case 'string': primitive = this.string(_primitive); flag = 2; break; case 'boolean': primitive = _primitive | 0; flag = 3; break; case 'object': // assume null primitive = 2; flag = 3; break; case 'undefined': primitive = 3; flag = 3; break; default: throw new Error('Invalid primitive passed to pushPrimitive'); } this.push(14 /* PrimitiveReference */, flag << 30 | primitive); } helper(func) { this.push(1 /* Helper */, this.func(func)); } pushBlock(block) { this.push(7 /* PushBlock */, this.block(block)); } bindDynamicScope(_names) { this.push(38 /* BindDynamicScope */, this.names(_names)); } enter(args) { this.push(49 /* Enter */, args); } exit() { this.push(50 /* Exit */); } return() { this.push(22 /* Return */); } pushFrame() { this.push(47 /* PushFrame */); } popFrame() { this.push(48 /* PopFrame */); } compileDynamicBlock() { this.push(41 /* CompileDynamicBlock */); } invokeDynamic(invoker) { this.push(43 /* InvokeDynamic */, this.other(invoker)); } invokeStatic(block, callerCount = 0) { let { parameters } = block.symbolTable; let calleeCount = parameters.length; let count = Math.min(callerCount, calleeCount); this.pushFrame(); if (count) { this.pushChildScope(); for (let i = 0; i < count; i++) { this.dup(_opcodes.Register.fp, callerCount - i); this.setVariable(parameters[i]); } } let _block = this.constants.block(block); this.push(42 /* InvokeStatic */, _block); if (count) { this.popScope(); } this.popFrame(); } test(testFunc) { let _func; if (testFunc === 'const') { _func = vm.ConstTest; } else if (testFunc === 'simple') { _func = vm.SimpleTest; } else if (testFunc === 'environment') { _func = vm.EnvironmentTest; } else if (typeof testFunc === 'function') { _func = testFunc; } else { throw new Error('unreachable'); } let func = this.constants.function(_func); this.push(51 /* Test */, func); } jump(target) { this.reserve(44 /* Jump */); this.labels.target(this.pos, 44 /* Jump */, target); } jumpIf(target) { this.reserve(45 /* JumpIf */); this.labels.target(this.pos, 45 /* JumpIf */, target); } jumpUnless(target) { this.reserve(46 /* JumpUnless */); this.labels.target(this.pos, 46 /* JumpUnless */, target); } string(_string) { return this.constants.string(_string); } float(num) { return this.constants.float(num); } names(_names) { let names = []; for (let i = 0; i < _names.length; i++) { let n = _names[i]; names[i] = this.constants.string(n); } return this.constants.array(names); } symbols(symbols) { return this.constants.array(symbols); } other(value) { return this.constants.other(value); } block(block) { return block ? this.constants.block(block) : 0; } func(func) { return this.constants.function(func); } } exports.BasicOpcodeBuilder = BasicOpcodeBuilder; function isCompilableExpression(expr) { return typeof expr === 'object' && expr !== null && typeof expr.compile === 'function'; } class OpcodeBuilder extends BasicOpcodeBuilder { constructor(env, meta, program = env.program) { super(env, meta, program); this.component = new _compiler.ComponentBuilder(this); } compileArgs(params, hash, synthetic) { let positional = 0; if (params) { for (let i = 0; i < params.length; i++) { (0, _functions.expr)(params[i], this); } positional = params.length; } this.pushImmediate(positional); let names = _util.EMPTY_ARRAY; if (hash) { names = hash[0]; let val = hash[1]; for (let i = 0; i < val.length; i++) { (0, _functions.expr)(val[i], this); } } this.pushImmediate(names); this.pushArgs(synthetic); } compile(expr) { if (isCompilableExpression(expr)) { return expr.compile(this); } else { return expr; } } guardedAppend(expression, trusting) { this.startLabels(); this.pushFrame(); this.returnTo('END'); (0, _functions.expr)(expression, this); this.dup(); this.test(reference => { return _content.IsComponentDefinitionReference.create(reference); }); this.enter(2); this.jumpUnless('ELSE'); this.pushDynamicComponentManager(); this.invokeComponent(null, null, null, null, null); this.exit(); this.return(); this.label('ELSE'); if (trusting) { this.trustingAppend(); } else { this.cautiousAppend(); } this.exit(); this.return(); this.label('END'); this.popFrame(); this.stopLabels(); } invokeComponent(attrs, params, hash, block, inverse = null) { this.fetch(_opcodes.Register.s0); this.dup(_opcodes.Register.sp, 1); this.load(_opcodes.Register.s0); this.pushBlock(block); this.pushBlock(inverse); this.compileArgs(params, hash, false); this.prepareArgs(_opcodes.Register.s0); this.beginComponentTransaction(); this.pushDynamicScope(); this.createComponent(_opcodes.Register.s0, block !== null, inverse !== null); this.registerComponentDestructor(_opcodes.Register.s0); this.getComponentSelf(_opcodes.Register.s0); this.getComponentLayout(_opcodes.Register.s0); this.invokeDynamic(new _functions.InvokeDynamicLayout(attrs && attrs.scan())); this.popFrame(); this.popScope(); this.popDynamicScope(); this.commitComponentTransaction(); this.load(_opcodes.Register.s0); } template(block) { if (!block) return null; return new _rawBlock2.default(this.meta, block.statements, block.parameters); } } exports.default = OpcodeBuilder; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiXSwibmFtZXMiOlsiY29udGVudCIsInZtIiwiTGFiZWxzIiwiY29uc3RydWN0b3IiLCJsYWJlbHMiLCJ0YXJnZXRzIiwibGFiZWwiLCJuYW1lIiwiaW5kZXgiLCJ0YXJnZXQiLCJhdCIsIlRhcmdldCIsInB1c2giLCJwYXRjaCIsInByb2dyYW0iLCJpIiwibGVuZ3RoIiwiZ290byIsImhlYXAiLCJzZXRieWFkZHIiLCJCYXNpY09wY29kZUJ1aWxkZXIiLCJlbnYiLCJtZXRhIiwibGFiZWxzU3RhY2siLCJjb25zdGFudHMiLCJzdGFydCIsIm1hbGxvYyIsInBvcyIsInNpemUiLCJuZXh0UG9zIiwidXB2YXJzIiwiY291bnQiLCJyZXNlcnZlIiwib3AxIiwib3AyIiwib3AzIiwiZmluYWxpemUiLCJmaW5pc2hNYWxsb2MiLCJwdXNoQXJncyIsInN5bnRoZXRpYyIsImN1cnJlbnQiLCJzdGFydExhYmVscyIsInN0b3BMYWJlbHMiLCJwb3AiLCJwdXNoQ29tcG9uZW50TWFuYWdlciIsImRlZmluaXRpb24iLCJvdGhlciIsInB1c2hEeW5hbWljQ29tcG9uZW50TWFuYWdlciIsInByZXBhcmVBcmdzIiwic3RhdGUiLCJjcmVhdGVDb21wb25lbnQiLCJoYXNEZWZhdWx0IiwiaGFzSW52ZXJzZSIsImZsYWciLCJyZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3IiLCJiZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uIiwiY29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24iLCJwdXNoQ29tcG9uZW50T3BlcmF0aW9ucyIsImdldENvbXBvbmVudFNlbGYiLCJnZXRDb21wb25lbnRMYXlvdXQiLCJkaWRDcmVhdGVFbGVtZW50IiwiZGlkUmVuZGVyTGF5b3V0IiwiZ2V0UGFydGlhbFRlbXBsYXRlIiwicmVzb2x2ZU1heWJlTG9jYWwiLCJzdHJpbmciLCJkZWJ1Z2dlciIsInN5bWJvbHMiLCJldmFsSW5mbyIsImFycmF5IiwiZHluYW1pY0NvbnRlbnQiLCJPcGNvZGUiLCJjYXV0aW91c0FwcGVuZCIsIk9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlIiwidHJ1c3RpbmdBcHBlbmQiLCJPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZSIsInRleHQiLCJvcGVuUHJpbWl0aXZlRWxlbWVudCIsInRhZyIsIm9wZW5FbGVtZW50V2l0aE9wZXJhdGlvbnMiLCJvcGVuRHluYW1pY0VsZW1lbnQiLCJmbHVzaEVsZW1lbnQiLCJjbG9zZUVsZW1lbnQiLCJzdGF0aWNBdHRyIiwiX25hbWUiLCJfbmFtZXNwYWNlIiwiX3ZhbHVlIiwibmFtZXNwYWNlIiwidmFsdWUiLCJkeW5hbWljQXR0ck5TIiwidHJ1c3RpbmciLCJkeW5hbWljQXR0ciIsImNvbW1lbnQiLCJfY29tbWVudCIsIm1vZGlmaWVyIiwiX2RlZmluaXRpb24iLCJwdXRJdGVyYXRvciIsImVudGVyTGlzdCIsImV4aXRMaXN0IiwiaXRlcmF0ZSIsImJyZWFrcyIsInNldFZhcmlhYmxlIiwic3ltYm9sIiwiZ2V0VmFyaWFibGUiLCJnZXRQcm9wZXJ0eSIsImtleSIsImdldEJsb2NrIiwiaGFzQmxvY2siLCJoYXNCbG9ja1BhcmFtcyIsImNvbmNhdCIsImZ1bmN0aW9uIiwiZiIsImZ1bmMiLCJsb2FkIiwicmVnaXN0ZXIiLCJmZXRjaCIsImR1cCIsInNwIiwib2Zmc2V0IiwicHVzaFJlbW90ZUVsZW1lbnQiLCJwb3BSZW1vdGVFbGVtZW50IiwicHVzaFJvb3RTY29wZSIsImJpbmRDYWxsZXJTY29wZSIsInB1c2hDaGlsZFNjb3BlIiwicG9wU2NvcGUiLCJyZXR1cm5UbyIsInB1c2hEeW5hbWljU2NvcGUiLCJwb3BEeW5hbWljU2NvcGUiLCJwdXNoSW1tZWRpYXRlIiwicHJpbWl0aXZlIiwiX3ByaW1pdGl2ZSIsImZsb2F0IiwiRXJyb3IiLCJoZWxwZXIiLCJwdXNoQmxvY2siLCJibG9jayIsImJpbmREeW5hbWljU2NvcGUiLCJfbmFtZXMiLCJuYW1lcyIsImVudGVyIiwiYXJncyIsImV4aXQiLCJyZXR1cm4iLCJwdXNoRnJhbWUiLCJwb3BGcmFtZSIsImNvbXBpbGVEeW5hbWljQmxvY2siLCJpbnZva2VEeW5hbWljIiwiaW52b2tlciIsImludm9rZVN0YXRpYyIsImNhbGxlckNvdW50IiwicGFyYW1ldGVycyIsInN5bWJvbFRhYmxlIiwiY2FsbGVlQ291bnQiLCJNYXRoIiwibWluIiwiZnAiLCJfYmxvY2siLCJ0ZXN0IiwidGVzdEZ1bmMiLCJfZnVuYyIsIkNvbnN0VGVzdCIsIlNpbXBsZVRlc3QiLCJFbnZpcm9ubWVudFRlc3QiLCJqdW1wIiwianVtcElmIiwianVtcFVubGVzcyIsIl9zdHJpbmciLCJudW0iLCJuIiwiaXNDb21waWxhYmxlRXhwcmVzc2lvbiIsImV4cHIiLCJjb21waWxlIiwiT3Bjb2RlQnVpbGRlciIsImNvbXBvbmVudCIsImNvbXBpbGVBcmdzIiwicGFyYW1zIiwiaGFzaCIsInBvc2l0aW9uYWwiLCJ2YWwiLCJndWFyZGVkQXBwZW5kIiwiZXhwcmVzc2lvbiIsInJlZmVyZW5jZSIsImNyZWF0ZSIsImludm9rZUNvbXBvbmVudCIsImF0dHJzIiwiaW52ZXJzZSIsInMwIiwic2NhbiIsInRlbXBsYXRlIiwic3RhdGVtZW50cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7O0FBQ0E7O0lBQVlBLE87O0FBQ1o7O0lBQVlDLEU7Ozs7OztBQUNaLE1BQU1DLE1BQU4sQ0FBYTtBQUNUQyxrQkFBYztBQUNWLGFBQUtDLE1BQUwsR0FBYyxpQkFBZDtBQUNBLGFBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7QUFDREMsVUFBTUMsSUFBTixFQUFZQyxLQUFaLEVBQW1CO0FBQ2YsYUFBS0osTUFBTCxDQUFZRyxJQUFaLElBQW9CQyxLQUFwQjtBQUNIO0FBQ0RDLFdBQU9DLEVBQVAsRUFBV0MsTUFBWCxFQUFtQkYsTUFBbkIsRUFBMkI7QUFDdkIsYUFBS0osT0FBTCxDQUFhTyxJQUFiLENBQWtCLEVBQUVGLEVBQUYs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LFVBQXBDLEVBQWdEdEQsTUFBTWUsVUFBdEQsQ0FBUDtBQUNIO0FBbkZ5RDtrQkFBekNzQixhIiwiZmlsZSI6ImxpYi9jb21waWxlZC9vcGNvZGVzL2J1aWxkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkaWN0LCBFTVBUWV9BUlJBWSwgZXhwZWN0LCBmaWxsTnVsbHMsIFN0YWNrLCB0eXBlUG9zIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRCdWlsZGVyIH0gZnJvbSAnLi4vLi4vY29tcGlsZXInO1xuaW1wb3J0IHsgUmVnaXN0ZXIgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IGV4cHIsIEludm9rZUR5bmFtaWNMYXlvdXQgfSBmcm9tICcuLi8uLi9zeW50YXgvZnVuY3Rpb25zJztcbmltcG9ydCBSYXdJbmxpbmVCbG9jayBmcm9tICcuLi8uLi9zeW50YXgvcmF3LWJsb2NrJztcbmltcG9ydCB7IElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSB9IGZyb20gJy4uL29wY29kZXMvY29udGVudCc7XG5pbXBvcnQgKiBhcyBjb250ZW50IGZyb20gJy4vY29udGVudCc7XG5pbXBvcnQgKiBhcyB2bSBmcm9tICcuL3ZtJztcbmNsYXNzIExhYmVscyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubGFiZWxzID0gZGljdCgpO1xuICAgICAgICB0aGlzLnRhcmdldHMgPSBbXTtcbiAgICB9XG4gICAgbGFiZWwobmFtZSwgaW5kZXgpIHtcbiAgICAgICAgdGhpcy5sYWJlbHNbbmFtZV0gPSBpbmRleDtcbiAgICB9XG4gICAgdGFyZ2V0KGF0LCBUYXJnZXQsIHRhcmdldCkge1xuICAgICAgICB0aGlzLnRhcmdldHMucHVzaCh7IGF0LCBUYXJnZXQsIHRhcmdldCB9KTtcbiAgICB9XG4gICAgcGF0Y2gocHJvZ3JhbSkge1xuICAgICAgICBsZXQgeyB0YXJnZXRzLCBsYWJlbHMgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHsgYXQsIHRhcmdldCB9ID0gdGFyZ2V0c1tpXTtcbiAgICAgICAgICAgIGxldCBnb3RvID0gbGFiZWxzW3RhcmdldF0gLSBhdDtcbiAgICAgICAgICAgIHByb2dyYW0uaGVhcC5zZXRieWFkZHIoYXQgKyAxLCBnb3RvKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBCYXNpY09wY29kZUJ1aWxkZXIge1xuICAgIGNvbnN0cnVjdG9yKGVudiwgbWV0YSwgcHJvZ3JhbSkge1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICAgICAgdGhpcy5tZXRhID0gbWV0YTtcbiAgICAgICAgdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTtcbiAgICAgICAgdGhpcy5sYWJlbHNTdGFjayA9IG5ldyBTdGFjaygpO1xuICAgICAgICB0aGlzLmNvbnN0YW50cyA9IHByb2dyYW0uY29uc3RhbnRzO1xuICAgICAgICB0aGlzLmhlYXAgPSBwcm9ncmFtLmhlYXA7XG4gICAgICAgIHRoaXMuc3RhcnQgPSB0aGlzLmhlYXAubWFsbG9jKCk7XG4gICAgfVxuICAgIGdldCBwb3MoKSB7XG4gICAgICAgIHJldHVybiB0eXBlUG9zKHRoaXMuaGVhcC5zaXplKCkpO1xuICAgIH1cbiAgICBnZXQgbmV4dFBvcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGVhcC5zaXplKCk7XG4gICAgfVxuICAgIHVwdmFycyhjb3VudCkge1xuICAgICAgICByZXR1cm4gZmlsbE51bGxzKGNvdW50KTtcbiAgICB9XG4gICAgcmVzZXJ2ZShuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaChuYW1lLCAwLCAwLCAwKTtcbiAgICB9XG4gICAgcHVzaChuYW1lLCBvcDEgPSAwLCBvcDIgPSAwLCBvcDMgPSAwKSB7XG4gICAgICAgIHRoaXMuaGVhcC5wdXNoKG5hbWUpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDEpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDIpO1xuICAgICAgICB0aGlzLmhlYXAucHVzaChvcDMpO1xuICAgIH1cbiAgICBmaW5hbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDIyIC8qIFJldHVybiAqLyk7XG4gICAgICAgIHRoaXMuaGVhcC5maW5pc2hNYWxsb2ModGhpcy5zdGFydCk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0O1xuICAgIH1cbiAgICAvLyBhcmdzXG4gICAgcHVzaEFyZ3Moc3ludGhldGljKSB7XG4gICAgICAgIHRoaXMucHVzaCg1OCAvKiBQdXNoQXJncyAqLywgc3ludGhldGljID09PSB0cnVlID8gMSA6IDApO1xuICAgIH1cbiAgICAvLyBoZWxwZXJzXG4gICAgZ2V0IGxhYmVscygpIHtcbiAgICAgICAgcmV0dXJuIGV4cGVjdCh0aGlzLmxhYmVsc1N0YWNrLmN1cnJlbnQsICdidWc6IG5vdCBpbiBhIGxhYmVsIHN0YWNrJyk7XG4gICAgfVxuICAgIHN0YXJ0TGFiZWxzKCkge1xuICAgICAgICB0aGlzLmxhYmVsc1N0YWNrLnB1c2gobmV3IExhYmVscygpKTtcbiAgICB9XG4gICAgc3RvcExhYmVscygpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gZXhwZWN0KHRoaXMubGFiZWxzU3RhY2sucG9wKCksICd1bmJhbGFuY2VkIHB1c2ggYW5kIHBvcCBsYWJlbHMnKTtcbiAgICAgICAgbGFiZWwucGF0Y2godGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgLy8gY29tcG9uZW50c1xuICAgIHB1c2hDb21wb25lbnRNYW5hZ2VyKGRlZmluaXRpb24pIHtcbiAgICAgICAgdGhpcy5wdXNoKDU2IC8qIFB1c2hDb21wb25lbnRNYW5hZ2VyICovLCB0aGlzLm90aGVyKGRlZmluaXRpb24pKTtcbiAgICB9XG4gICAgcHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyKCkge1xuICAgICAgICB0aGlzLnB1c2goNTcgLyogUHVzaER5bmFtaWNDb21wb25lbnRNYW5hZ2VyICovKTtcbiAgICB9XG4gICAgcHJlcGFyZUFyZ3Moc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDU5IC8qIFByZXBhcmVBcmdzICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGNyZWF0ZUNvbXBvbmVudChzdGF0ZSwgaGFzRGVmYXVsdCwgaGFzSW52ZXJzZSkge1xuICAgICAgICBsZXQgZmxhZyA9IChoYXNEZWZhdWx0ID09PSB0cnVlID8gMSA6IDApIHwgKGhhc0ludmVyc2UgPT09IHRydWUgPyAxIDogMCkgPDwgMTtcbiAgICAgICAgdGhpcy5wdXNoKDYwIC8qIENyZWF0ZUNvbXBvbmVudCAqLywgZmxhZywgc3RhdGUpO1xuICAgIH1cbiAgICByZWdpc3RlckNvbXBvbmVudERlc3RydWN0b3Ioc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYxIC8qIFJlZ2lzdGVyQ29tcG9uZW50RGVzdHJ1Y3RvciAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBiZWdpbkNvbXBvbmVudFRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aGlzLnB1c2goNjUgLyogQmVnaW5Db21wb25lbnRUcmFuc2FjdGlvbiAqLyk7XG4gICAgfVxuICAgIGNvbW1pdENvbXBvbmVudFRyYW5zYWN0aW9uKCkge1xuICAgICAgICB0aGlzLnB1c2goNjYgLyogQ29tbWl0Q29tcG9uZW50VHJhbnNhY3Rpb24gKi8pO1xuICAgIH1cbiAgICBwdXNoQ29tcG9uZW50T3BlcmF0aW9ucygpIHtcbiAgICAgICAgdGhpcy5wdXNoKDYyIC8qIFB1c2hDb21wb25lbnRPcGVyYXRpb25zICovKTtcbiAgICB9XG4gICAgZ2V0Q29tcG9uZW50U2VsZihzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjMgLyogR2V0Q29tcG9uZW50U2VsZiAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBnZXRDb21wb25lbnRMYXlvdXQoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDY0IC8qIEdldENvbXBvbmVudExheW91dCAqLywgc3RhdGUpO1xuICAgIH1cbiAgICBkaWRDcmVhdGVFbGVtZW50KHN0YXRlKSB7XG4gICAgICAgIHRoaXMucHVzaCg2NyAvKiBEaWRDcmVhdGVFbGVtZW50ICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIGRpZFJlbmRlckxheW91dChzdGF0ZSkge1xuICAgICAgICB0aGlzLnB1c2goNjggLyogRGlkUmVuZGVyTGF5b3V0ICovLCBzdGF0ZSk7XG4gICAgfVxuICAgIC8vIHBhcnRpYWxcbiAgICBnZXRQYXJ0aWFsVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCg2OSAvKiBHZXRQYXJ0aWFsVGVtcGxhdGUgKi8pO1xuICAgIH1cbiAgICByZXNvbHZlTWF5YmVMb2NhbChuYW1lKSB7XG4gICAgICAgIHRoaXMucHVzaCg3MCAvKiBSZXNvbHZlTWF5YmVMb2NhbCAqLywgdGhpcy5zdHJpbmcobmFtZSkpO1xuICAgIH1cbiAgICAvLyBkZWJ1Z2dlclxuICAgIGRlYnVnZ2VyKHN5bWJvbHMsIGV2YWxJbmZvKSB7XG4gICAgICAgIHRoaXMucHVzaCg3MSAvKiBEZWJ1Z2dlciAqLywgdGhpcy5jb25zdGFudHMub3RoZXIoc3ltYm9scyksIHRoaXMuY29uc3RhbnRzLmFycmF5KGV2YWxJbmZvKSk7XG4gICAgfVxuICAgIC8vIGNvbnRlbnRcbiAgICBkeW5hbWljQ29udGVudChPcGNvZGUpIHtcbiAgICAgICAgdGhpcy5wdXNoKDI2IC8qIER5bmFtaWNDb250ZW50ICovLCB0aGlzLm90aGVyKE9wY29kZSkpO1xuICAgIH1cbiAgICBjYXV0aW91c0FwcGVuZCgpIHtcbiAgICAgICAgdGhpcy5keW5hbWljQ29udGVudChuZXcgY29udGVudC5PcHRpbWl6ZWRDYXV0aW91c0FwcGVuZE9wY29kZSgpKTtcbiAgICB9XG4gICAgdHJ1c3RpbmdBcHBlbmQoKSB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbnRlbnQobmV3IGNvbnRlbnQuT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUoKSk7XG4gICAgfVxuICAgIC8vIGRvbVxuICAgIHRleHQodGV4dCkge1xuICAgICAgICB0aGlzLnB1c2goMjQgLyogVGV4dCAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRleHQpKTtcbiAgICB9XG4gICAgb3BlblByaW1pdGl2ZUVsZW1lbnQodGFnKSB7XG4gICAgICAgIHRoaXMucHVzaCgyNyAvKiBPcGVuRWxlbWVudCAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRhZykpO1xuICAgIH1cbiAgICBvcGVuRWxlbWVudFdpdGhPcGVyYXRpb25zKHRhZykge1xuICAgICAgICB0aGlzLnB1c2goMjggLyogT3BlbkVsZW1lbnRXaXRoT3BlcmF0aW9ucyAqLywgdGhpcy5jb25zdGFudHMuc3RyaW5nKHRhZykpO1xuICAgIH1cbiAgICBvcGVuRHluYW1pY0VsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyOSAvKiBPcGVuRHluYW1pY0VsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBmbHVzaEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgzMyAvKiBGbHVzaEVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBjbG9zZUVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMucHVzaCgzNCAvKiBDbG9zZUVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBzdGF0aWNBdHRyKF9uYW1lLCBfbmFtZXNwYWNlLCBfdmFsdWUpIHtcbiAgICAgICAgbGV0IG5hbWUgPSB0aGlzLmNvbnN0YW50cy5zdHJpbmcoX25hbWUpO1xuICAgICAgICBsZXQgbmFtZXNwYWNlID0gX25hbWVzcGFjZSA/IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZXNwYWNlKSA6IDA7XG4gICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfdmFsdWUpO1xuICAgICAgICB0aGlzLnB1c2goMzAgLyogU3RhdGljQXR0ciAqLywgbmFtZSwgdmFsdWUsIG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIGR5bmFtaWNBdHRyTlMoX25hbWUsIF9uYW1lc3BhY2UsIHRydXN0aW5nKSB7XG4gICAgICAgIGxldCBuYW1lID0gdGhpcy5jb25zdGFudHMuc3RyaW5nKF9uYW1lKTtcbiAgICAgICAgbGV0IG5hbWVzcGFjZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZXNwYWNlKTtcbiAgICAgICAgdGhpcy5wdXNoKDMyIC8qIER5bmFtaWNBdHRyTlMgKi8sIG5hbWUsIG5hbWVzcGFjZSwgdHJ1c3RpbmcgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIGR5bmFtaWNBdHRyKF9uYW1lLCB0cnVzdGluZykge1xuICAgICAgICBsZXQgbmFtZSA9IHRoaXMuY29uc3RhbnRzLnN0cmluZyhfbmFtZSk7XG4gICAgICAgIHRoaXMucHVzaCgzMSAvKiBEeW5hbWljQXR0ciAqLywgbmFtZSwgdHJ1c3RpbmcgPT09IHRydWUgPyAxIDogMCk7XG4gICAgfVxuICAgIGNvbW1lbnQoX2NvbW1lbnQpIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSB0aGlzLmNvbnN0YW50cy5zdHJpbmcoX2NvbW1lbnQpO1xuICAgICAgICB0aGlzLnB1c2goMjUgLyogQ29tbWVudCAqLywgY29tbWVudCk7XG4gICAgfVxuICAgIG1vZGlmaWVyKF9kZWZpbml0aW9uKSB7XG4gICAgICAgIHRoaXMucHVzaCgzNSAvKiBNb2RpZmllciAqLywgdGhpcy5vdGhlcihfZGVmaW5pdGlvbikpO1xuICAgIH1cbiAgICAvLyBsaXN0c1xuICAgIHB1dEl0ZXJhdG9yKCkge1xuICAgICAgICB0aGlzLnB1c2goNTQgLyogUHV0SXRlcmF0b3IgKi8pO1xuICAgIH1cbiAgICBlbnRlckxpc3Qoc3RhcnQpIHtcbiAgICAgICAgdGhpcy5yZXNlcnZlKDUyIC8qIEVudGVyTGlzdCAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgNTIgLyogRW50ZXJMaXN0ICovLCBzdGFydCk7XG4gICAgfVxuICAgIGV4aXRMaXN0KCkge1xuICAgICAgICB0aGlzLnB1c2goNTMgLyogRXhpdExpc3QgKi8pO1xuICAgIH1cbiAgICBpdGVyYXRlKGJyZWFrcykge1xuICAgICAgICB0aGlzLnJlc2VydmUoNTUgLyogSXRlcmF0ZSAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgNTUgLyogSXRlcmF0ZSAqLywgYnJlYWtzKTtcbiAgICB9XG4gICAgLy8gZXhwcmVzc2lvbnNcbiAgICBzZXRWYXJpYWJsZShzeW1ib2wpIHtcbiAgICAgICAgdGhpcy5wdXNoKDQgLyogU2V0VmFyaWFibGUgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGdldFZhcmlhYmxlKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnB1c2goNSAvKiBHZXRWYXJpYWJsZSAqLywgc3ltYm9sKTtcbiAgICB9XG4gICAgZ2V0UHJvcGVydHkoa2V5KSB7XG4gICAgICAgIHRoaXMucHVzaCg2IC8qIEdldFByb3BlcnR5ICovLCB0aGlzLnN0cmluZyhrZXkpKTtcbiAgICB9XG4gICAgZ2V0QmxvY2soc3ltYm9sKSB7XG4gICAgICAgIHRoaXMucHVzaCg4IC8qIEdldEJsb2NrICovLCBzeW1ib2wpO1xuICAgIH1cbiAgICBoYXNCbG9jayhzeW1ib2wpIHtcbiAgICAgICAgdGhpcy5wdXNoKDkgLyogSGFzQmxvY2sgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGhhc0Jsb2NrUGFyYW1zKHN5bWJvbCkge1xuICAgICAgICB0aGlzLnB1c2goMTAgLyogSGFzQmxvY2tQYXJhbXMgKi8sIHN5bWJvbCk7XG4gICAgfVxuICAgIGNvbmNhdChzaXplKSB7XG4gICAgICAgIHRoaXMucHVzaCgxMSAvKiBDb25jYXQgKi8sIHNpemUpO1xuICAgIH1cbiAgICBmdW5jdGlvbihmKSB7XG4gICAgICAgIHRoaXMucHVzaCgyIC8qIEZ1bmN0aW9uICovLCB0aGlzLmZ1bmMoZikpO1xuICAgIH1cbiAgICBsb2FkKHJlZ2lzdGVyKSB7XG4gICAgICAgIHRoaXMucHVzaCgxNyAvKiBMb2FkICovLCByZWdpc3Rlcik7XG4gICAgfVxuICAgIGZldGNoKHJlZ2lzdGVyKSB7XG4gICAgICAgIHRoaXMucHVzaCgxOCAvKiBGZXRjaCAqLywgcmVnaXN0ZXIpO1xuICAgIH1cbiAgICBkdXAocmVnaXN0ZXIgPSBSZWdpc3Rlci5zcCwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKDE1IC8qIER1cCAqLywgcmVnaXN0ZXIsIG9mZnNldCk7XG4gICAgfVxuICAgIHBvcChjb3VudCA9IDEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHVzaCgxNiAvKiBQb3AgKi8sIGNvdW50KTtcbiAgICB9XG4gICAgLy8gdm1cbiAgICBwdXNoUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM2IC8qIFB1c2hSZW1vdGVFbGVtZW50ICovKTtcbiAgICB9XG4gICAgcG9wUmVtb3RlRWxlbWVudCgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM3IC8qIFBvcFJlbW90ZUVsZW1lbnQgKi8pO1xuICAgIH1cbiAgICBsYWJlbChuYW1lKSB7XG4gICAgICAgIHRoaXMubGFiZWxzLmxhYmVsKG5hbWUsIHRoaXMubmV4dFBvcyk7XG4gICAgfVxuICAgIHB1c2hSb290U2NvcGUoc3ltYm9scywgYmluZENhbGxlclNjb3BlKSB7XG4gICAgICAgIHRoaXMucHVzaCgxOSAvKiBSb290U2NvcGUgKi8sIHN5bWJvbHMsIGJpbmRDYWxsZXJTY29wZSA/IDEgOiAwKTtcbiAgICB9XG4gICAgcHVzaENoaWxkU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMCAvKiBDaGlsZFNjb3BlICovKTtcbiAgICB9XG4gICAgcG9wU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCgyMSAvKiBQb3BTY29wZSAqLyk7XG4gICAgfVxuICAgIHJldHVyblRvKGxhYmVsKSB7XG4gICAgICAgIHRoaXMucmVzZXJ2ZSgyMyAvKiBSZXR1cm5UbyAqLyk7XG4gICAgICAgIHRoaXMubGFiZWxzLnRhcmdldCh0aGlzLnBvcywgMjMgLyogUmV0dXJuVG8gKi8sIGxhYmVsKTtcbiAgICB9XG4gICAgcHVzaER5bmFtaWNTY29wZSgpIHtcbiAgICAgICAgdGhpcy5wdXNoKDM5IC8qIFB1c2hEeW5hbWljU2NvcGUgKi8pO1xuICAgIH1cbiAgICBwb3BEeW5hbWljU2NvcGUoKSB7XG4gICAgICAgIHRoaXMucHVzaCg0MCAvKiBQb3BEeW5hbWljU2NvcGUgKi8pO1xuICAgIH1cbiAgICBwdXNoSW1tZWRpYXRlKHZhbHVlKSB7XG4gICAgICAgIHRoaXMucHVzaCgxMyAvKiBDb25zdGFudCAqLywgdGhpcy5vdGhlcih2YWx1ZSkpO1xuICAgIH1cbiAgICBwcmltaXRpdmUoX3ByaW1pdGl2ZSkge1xuICAgICAgICBsZXQgZmxhZyA9IDA7XG4gICAgICAgIGxldCBwcmltaXRpdmU7XG4gICAgICAgIHN3aXRjaCAodHlwZW9mIF9wcmltaXRpdmUpIHtcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgaWYgKF9wcmltaXRpdmUgJSAxID09PSAwICYmIF9wcmltaXRpdmUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IF9wcmltaXRpdmU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlID0gdGhpcy5mbG9hdChfcHJpbWl0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICBwcmltaXRpdmUgPSB0aGlzLnN0cmluZyhfcHJpbWl0aXZlKTtcbiAgICAgICAgICAgICAgICBmbGFnID0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IF9wcmltaXRpdmUgfCAwO1xuICAgICAgICAgICAgICAgIGZsYWcgPSAzO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgICAgICAvLyBhc3N1bWUgbnVsbFxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IDI7XG4gICAgICAgICAgICAgICAgZmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZSA9IDM7XG4gICAgICAgICAgICAgICAgZmxhZyA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwcmltaXRpdmUgcGFzc2VkIHRvIHB1c2hQcmltaXRpdmUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2goMTQgLyogUHJpbWl0aXZlUmVmZXJlbmNlICovLCBmbGFnIDw8IDMwIHwgcHJpbWl0aXZlKTtcbiAgICB9XG4gICAgaGVscGVyKGZ1bmMpIHtcbiAgICAgICAgdGhpcy5wdXNoKDEgLyogSG