|  | @@ -1689,6 +1689,29 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.ProtoObject);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "isKindOf:",
 | 
	
		
			
				|  |  | +protocol: 'testing',
 | 
	
		
			
				|  |  | +fn: function (aClass){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +var $2,$1;
 | 
	
		
			
				|  |  | +$2=self._isMemberOf_(aClass);
 | 
	
		
			
				|  |  | +if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  | +$1=true;
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +$1=_st(self._class())._inheritsFrom_(aClass);
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +return $1;
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"isKindOf:",{aClass:aClass},globals.ProtoObject)})},
 | 
	
		
			
				|  |  | +args: ["aClass"],
 | 
	
		
			
				|  |  | +source: "isKindOf: aClass\x0a\x09^ (self isMemberOf: aClass)\x0a\x09\x09ifTrue: [ true ]\x0a\x09\x09ifFalse: [ self class inheritsFrom: aClass ]",
 | 
	
		
			
				|  |  | +messageSends: ["ifTrue:ifFalse:", "isMemberOf:", "inheritsFrom:", "class"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.ProtoObject);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "perform:",
 | 
	
	
		
			
				|  | @@ -2349,29 +2372,6 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Object);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "isKindOf:",
 | 
	
		
			
				|  |  | -protocol: 'testing',
 | 
	
		
			
				|  |  | -fn: function (aClass){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $2,$1;
 | 
	
		
			
				|  |  | -$2=self._isMemberOf_(aClass);
 | 
	
		
			
				|  |  | -if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  | -$1=true;
 | 
	
		
			
				|  |  | -} else {
 | 
	
		
			
				|  |  | -$1=_st(self._class())._inheritsFrom_(aClass);
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -return $1;
 | 
	
		
			
				|  |  | -}, function($ctx1) {$ctx1.fill(self,"isKindOf:",{aClass:aClass},globals.Object)})},
 | 
	
		
			
				|  |  | -args: ["aClass"],
 | 
	
		
			
				|  |  | -source: "isKindOf: aClass\x0a\x09^ (self isMemberOf: aClass)\x0a\x09\x09ifTrue: [ true ]\x0a\x09\x09ifFalse: [ self class inheritsFrom: aClass ]",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:ifFalse:", "isMemberOf:", "inheritsFrom:", "class"],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -globals.Object);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "isMemberOf:",
 | 
	
	
		
			
				|  | @@ -11654,7 +11654,7 @@ globals.IndexableCollection);
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "with:do:",
 | 
	
		
			
				|  |  | -protocol: 'enumarating',
 | 
	
		
			
				|  |  | +protocol: 'enumerating',
 | 
	
		
			
				|  |  |  fn: function (anotherCollection,aBlock){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
	
		
			
				|  | @@ -11673,7 +11673,7 @@ globals.IndexableCollection);
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "withIndexDo:",
 | 
	
		
			
				|  |  | -protocol: 'enumarating',
 | 
	
		
			
				|  |  | +protocol: 'enumerating',
 | 
	
		
			
				|  |  |  fn: function (aBlock){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
	
		
			
				|  | @@ -18613,19 +18613,19 @@ protocol: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  function $SystemAnnouncer(){return globals.SystemAnnouncer||(typeof SystemAnnouncer=="undefined"?nil:SystemAnnouncer)}
 | 
	
		
			
				|  |  | -function $PackageClean(){return globals.PackageClean||(typeof PackageClean=="undefined"?nil:PackageClean)}
 | 
	
		
			
				|  |  | +function $PackageDirty(){return globals.PackageDirty||(typeof PackageDirty=="undefined"?nil:PackageDirty)}
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  |  var $1,$2;
 | 
	
		
			
				|  |  |  self["@dirty"]=true;
 | 
	
		
			
				|  |  | -$1=_st($PackageClean())._new();
 | 
	
		
			
				|  |  | +$1=_st($PackageDirty())._new();
 | 
	
		
			
				|  |  |  _st($1)._package_(self);
 | 
	
		
			
				|  |  |  $2=_st($1)._yourself();
 | 
	
		
			
				|  |  |  _st(_st($SystemAnnouncer())._current())._announce_($2);
 | 
	
		
			
				|  |  |  return self}, function($ctx1) {$ctx1.fill(self,"beDirty",{},globals.Package)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "beDirty\x0a\x09dirty := true.\x0a\x09\x0a\x09SystemAnnouncer current announce: (PackageClean new\x0a\x09\x09package: self;\x0a\x09\x09yourself)",
 | 
	
		
			
				|  |  | +source: "beDirty\x0a\x09dirty := true.\x0a\x09\x0a\x09SystemAnnouncer current announce: (PackageDirty new\x0a\x09\x09package: self;\x0a\x09\x09yourself)",
 | 
	
		
			
				|  |  |  messageSends: ["announce:", "current", "package:", "new", "yourself"],
 | 
	
		
			
				|  |  | -referencedClasses: ["SystemAnnouncer", "PackageClean"]
 | 
	
		
			
				|  |  | +referencedClasses: ["SystemAnnouncer", "PackageDirty"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Package);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -18780,6 +18780,31 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Package);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "isTestPackage",
 | 
	
		
			
				|  |  | +protocol: 'testing',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +function $TestCase(){return globals.TestCase||(typeof TestCase=="undefined"?nil:TestCase)}
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +var $1;
 | 
	
		
			
				|  |  | +$1=_st(self._classes())._anySatisfy_((function(each){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +return _st(_st(each)._includesBehavior_($TestCase()))._and_((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx3) {
 | 
	
		
			
				|  |  | +return _st(_st(each)._isAbstract())._not();
 | 
	
		
			
				|  |  | +}, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)})}));
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})}));
 | 
	
		
			
				|  |  | +return $1;
 | 
	
		
			
				|  |  | +}, function($ctx1) {$ctx1.fill(self,"isTestPackage",{},globals.Package)})},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: "isTestPackage\x0a\x09^ self classes anySatisfy: [ :each |\x0a\x09\x09(each includesBehavior: TestCase) and: [ \x0a\x09\x09\x09each isAbstract not ] ]",
 | 
	
		
			
				|  |  | +messageSends: ["anySatisfy:", "classes", "and:", "includesBehavior:", "not", "isAbstract"],
 | 
	
		
			
				|  |  | +referencedClasses: ["TestCase"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.Package);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "loadDependencies",
 | 
	
	
		
			
				|  | @@ -44719,22 +44744,40 @@ selector: "testAddExtensionMethod",
 | 
	
		
			
				|  |  |  protocol: 'tests',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -var method;
 | 
	
		
			
				|  |  | +var method,dirty;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $1,$4,$3,$2;
 | 
	
		
			
				|  |  | -$1=self._class();
 | 
	
		
			
				|  |  | +var $2,$1,$4,$3,$5,$8,$7,$6,$9,$10;
 | 
	
		
			
				|  |  | +$2=self._class();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["class"]=1;
 | 
	
		
			
				|  |  | -method=_st($1)._compile_protocol_("doNothing","**not-a-package");
 | 
	
		
			
				|  |  | +$1=_st($2)._package();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["package"]=1;
 | 
	
		
			
				|  |  | +dirty=_st($1)._isDirty();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["isDirty"]=1;
 | 
	
		
			
				|  |  |  $4=self._class();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["class"]=2;
 | 
	
		
			
				|  |  |  $3=_st($4)._package();
 | 
	
		
			
				|  |  | -$2=_st($3)._isDirty();
 | 
	
		
			
				|  |  | -self._deny_($2);
 | 
	
		
			
				|  |  | -_st(self._class())._removeCompiledMethod_(method);
 | 
	
		
			
				|  |  | -return self}, function($ctx1) {$ctx1.fill(self,"testAddExtensionMethod",{method:method},globals.AnnouncementSubscriptionTest)})},
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["package"]=2;
 | 
	
		
			
				|  |  | +_st($3)._beClean();
 | 
	
		
			
				|  |  | +$5=self._class();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["class"]=3;
 | 
	
		
			
				|  |  | +method=_st($5)._compile_protocol_("doNothing","**not-a-package");
 | 
	
		
			
				|  |  | +$8=self._class();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["class"]=4;
 | 
	
		
			
				|  |  | +$7=_st($8)._package();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["package"]=3;
 | 
	
		
			
				|  |  | +$6=_st($7)._isDirty();
 | 
	
		
			
				|  |  | +self._deny_($6);
 | 
	
		
			
				|  |  | +$9=self._class();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["class"]=5;
 | 
	
		
			
				|  |  | +_st($9)._removeCompiledMethod_(method);
 | 
	
		
			
				|  |  | +$10=dirty;
 | 
	
		
			
				|  |  | +if(smalltalk.assert($10)){
 | 
	
		
			
				|  |  | +_st(_st(self._class())._package())._beDirty();
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"testAddExtensionMethod",{method:method,dirty:dirty},globals.AnnouncementSubscriptionTest)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "testAddExtensionMethod\x0a\x09| method |\x0a\x09method := self class compile: 'doNothing' protocol: '**not-a-package'.\x0a\x09self deny: self class package isDirty.\x0a\x09self class removeCompiledMethod: method.",
 | 
	
		
			
				|  |  | -messageSends: ["compile:protocol:", "class", "deny:", "isDirty", "package", "removeCompiledMethod:"],
 | 
	
		
			
				|  |  | +source: "testAddExtensionMethod\x0a\x09| method dirty |\x0a\x09dirty := self class package isDirty.\x0a\x09self class package beClean.\x0a\x09method := self class compile: 'doNothing' protocol: '**not-a-package'.\x0a\x09self deny: self class package isDirty.\x0a\x09\x0a\x09self class removeCompiledMethod: method.\x0a\x09dirty ifTrue: [ self class package beDirty ]",
 | 
	
		
			
				|  |  | +messageSends: ["isDirty", "package", "class", "beClean", "compile:protocol:", "deny:", "removeCompiledMethod:", "ifTrue:", "beDirty"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.AnnouncementSubscriptionTest);
 | 
	
	
		
			
				|  | @@ -57734,6 +57777,27 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Initer);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "npmInstallThenDo:",
 | 
	
		
			
				|  |  | +protocol: 'action',
 | 
	
		
			
				|  |  | +fn: function (aBlock){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var child;
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | +var $1;
 | 
	
		
			
				|  |  | +child=_st(self["@childProcess"])._exec_thenDo_("npm install",aBlock);
 | 
	
		
			
				|  |  | +$1=_st(child)._stdout();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["stdout"]=1;
 | 
	
		
			
				|  |  | +_st($1)._pipe_options_(_st(process)._stdout(),globals.HashedCollection._newFromPairs_(["end",false]));
 | 
	
		
			
				|  |  | +return self}, function($ctx1) {$ctx1.fill(self,"npmInstallThenDo:",{aBlock:aBlock,child:child},globals.Initer)})},
 | 
	
		
			
				|  |  | +args: ["aBlock"],
 | 
	
		
			
				|  |  | +source: "npmInstallThenDo: aBlock\x0a\x09| child |\x0a\x09child := childProcess\x0a\x09\x09exec: 'npm install'\x0a\x09\x09thenDo: aBlock.\x0a\x09child stdout pipe: process stdout options: #{ 'end' -> false }",
 | 
	
		
			
				|  |  | +messageSends: ["exec:thenDo:", "pipe:options:", "stdout"],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.Initer);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "rootDirname",
 | 
	
	
		
			
				|  | @@ -57759,22 +57823,37 @@ protocol: 'action',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $1,$2,$3,$4,$receiver;
 | 
	
		
			
				|  |  | +var $1,$2,$3,$4,$5,$6,$receiver;
 | 
	
		
			
				|  |  |  self._gruntInitThenDo_((function(error){
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  |  if(($receiver = error) == null || $receiver.isNil){
 | 
	
		
			
				|  |  |  return self._bowerInstallThenDo_((function(error2){
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx3) {
 | 
	
		
			
				|  |  |  if(($receiver = error2) == null || $receiver.isNil){
 | 
	
		
			
				|  |  | -error2;
 | 
	
		
			
				|  |  | +return self._npmInstallThenDo_((function(error3){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx4) {
 | 
	
		
			
				|  |  | +if(($receiver = error3) == null || $receiver.isNil){
 | 
	
		
			
				|  |  | +return _st(process)._exit();
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +$5=console;
 | 
	
		
			
				|  |  | +_st($5)._log_("npm install exec error:");
 | 
	
		
			
				|  |  | +$ctx4.sendIdx["log:"]=5;
 | 
	
		
			
				|  |  | +$6=_st($5)._log_(error3);
 | 
	
		
			
				|  |  | +$6;
 | 
	
		
			
				|  |  | +return _st(process)._exit();
 | 
	
		
			
				|  |  | +$ctx4.sendIdx["exit"]=3;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +}, function($ctx4) {$ctx4.fillBlock({error3:error3},$ctx3,7)})}));
 | 
	
		
			
				|  |  |  } else {
 | 
	
		
			
				|  |  |  $3=console;
 | 
	
		
			
				|  |  |  _st($3)._log_("bower install exec error:");
 | 
	
		
			
				|  |  |  $ctx3.sendIdx["log:"]=3;
 | 
	
		
			
				|  |  |  $4=_st($3)._log_(error2);
 | 
	
		
			
				|  |  | +$ctx3.sendIdx["log:"]=4;
 | 
	
		
			
				|  |  |  $4;
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  |  return _st(process)._exit();
 | 
	
		
			
				|  |  | +$ctx3.sendIdx["exit"]=2;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  |  }, function($ctx3) {$ctx3.fillBlock({error2:error2},$ctx2,4)})}));
 | 
	
		
			
				|  |  |  } else {
 | 
	
		
			
				|  |  |  $1=console;
 | 
	
	
		
			
				|  | @@ -57789,8 +57868,8 @@ $ctx2.sendIdx["exit"]=1;
 | 
	
		
			
				|  |  |  }, function($ctx2) {$ctx2.fillBlock({error:error},$ctx1,1)})}));
 | 
	
		
			
				|  |  |  return self}, function($ctx1) {$ctx1.fill(self,"start",{},globals.Initer)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "start\x0a\x09self gruntInitThenDo: [ :error |\x0a\x09\x09error ifNotNil: [ console log: 'grunt-init exec error:'; log: error. process exit ]\x0a\x09\x09ifNil: [\x0a\x09\x09\x09self bowerInstallThenDo: [ :error2 |\x0a\x09\x09\x09\x09error2 ifNotNil: [ console log: 'bower install exec error:'; log: error2 ].\x0a\x09\x09\x09\x09process exit ]]]",
 | 
	
		
			
				|  |  | -messageSends: ["gruntInitThenDo:", "ifNotNil:ifNil:", "log:", "exit", "bowerInstallThenDo:", "ifNotNil:"],
 | 
	
		
			
				|  |  | +source: "start\x0a\x09self gruntInitThenDo: [ :error | error\x0a\x09ifNotNil: [\x0a\x09\x09console log: 'grunt-init exec error:'; log: error.\x0a\x09\x09process exit ]\x0a\x09ifNil: [\x0a\x0a\x09self bowerInstallThenDo: [ :error2 | error2\x0a\x09ifNotNil: [\x0a\x09\x09console log: 'bower install exec error:'; log: error2.\x0a\x09\x09process exit ]\x0a\x09ifNil: [\x0a\x0a\x09self npmInstallThenDo: [ :error3 | error3\x0a\x09ifNotNil: [\x0a\x09\x09console log: 'npm install exec error:'; log: error3.\x0a\x09\x09process exit ]\x0a\x09ifNil: [\x0a\x0a\x09process exit ]]]]]]",
 | 
	
		
			
				|  |  | +messageSends: ["gruntInitThenDo:", "ifNotNil:ifNil:", "log:", "exit", "bowerInstallThenDo:", "npmInstallThenDo:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Initer);
 |