| 
					
				 | 
			
			
				@@ -5298,7 +5298,7 @@ referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.String.klass); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-smalltalk.addClass('Set', smalltalk.Collection, ['elements'], 'Kernel-Collections'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.addClass('Set', smalltalk.Collection, ['slowBuckets', 'fastBuckets', 'size'], 'Kernel-Collections'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set.comment="I represent an unordered set of objects without duplicates."; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5347,21 +5347,54 @@ selector: "add:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 protocol: 'adding/removing', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (anObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var bucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $2,$1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bucket=self._bucketOfElement_(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$2=_st(bucket)._second(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(($receiver = $2) == nil || $receiver == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var obj,slowBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+obj=_st(bucket)._first(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.sendIdx["first"]=1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+obj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+slowBucket=_st(bucket)._third(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+slowBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st(slowBucket)._indexOf_ifAbsent_(obj,(function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st(slowBucket)._add_(obj); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+self["@size"]=_st(self["@size"]).__plus((1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return self["@size"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)})})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=obj; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var primitiveBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primitiveBucket=$receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=self._add_in_(_st(bucket)._first(),primitiveBucket); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject,bucket:bucket},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "add: anObject\x0a\x09| bucket |\x0a\x09bucket := self bucketOfElement: anObject.\x0a\x09^bucket second\x0a\x09\x09ifNil: [\x0a\x09\x09\x09| obj slowBucket |\x0a\x09\x09\x09obj := bucket first.\x0a\x09\x09\x09slowBucket := bucket third.\x0a\x09\x09\x09slowBucket indexOf: obj ifAbsent: [ slowBucket add: obj. size := size + 1 ].\x0a\x09\x09\x09obj ]\x0a\x09\x09ifNotNil: [ :primitiveBucket | self add: bucket first in: primitiveBucket ]", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["bucketOfElement:", "ifNil:ifNotNil:", "second", "first", "third", "indexOf:ifAbsent:", "add:", "+", "add:in:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.Set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		var found, objAsReceiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		objAsReceiver = _st(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		for(var i=0; i < self['@elements'].length; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			if(objAsReceiver.__eq(self['@elements'][i])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				found = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if(!found) {self['@elements'].push(anObject)} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "add:in:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protocol: 'private', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (anObject,anotherObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if (anotherObject.store[anObject]) { return false; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		self['@size']++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return anotherObject.store[anObject] = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return self}, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-args: ["anObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "add: anObject\x0a\x09<\x0a\x09\x09var found, objAsReceiver;\x0a\x09\x09objAsReceiver = _st(anObject);\x0a\x09\x09for(var i=0; i < self['@elements'].length; i++) {\x0a\x09\x09\x09if(objAsReceiver.__eq(self['@elements'][i])) {\x0a\x09\x09\x09\x09found = true;\x0a\x09\x09\x09\x09break;\x0a\x09\x09\x09}\x0a\x09\x09}\x0a\x09\x09if(!found) {self['@elements'].push(anObject)}\x0a\x09>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return self}, function($ctx1) {$ctx1.fill(self,"add:in:",{anObject:anObject,anotherObject:anotherObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject", "anotherObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "add: anObject in: anotherObject\x0a\x09<\x0a\x09\x09if (anotherObject.store[anObject]) { return false; }\x0a\x09\x09self['@size']++;\x0a\x09\x09return anotherObject.store[anObject] = true;\x0a\x09>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5369,18 +5402,27 @@ smalltalk.Set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-selector: "asArray", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-protocol: 'converting', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-fn: function (){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "bucketOfElement:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protocol: 'private', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (anObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=_st(self["@elements"])._copy(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}, function($ctx1) {$ctx1.fill(self,"asArray",{},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-args: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "asArray\x0a\x09^ elements copy", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["copy"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var prim = anObject == null ? (anObject = nil) : anObject.valueOf(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var el, bucket, type; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if ((type = typeof prim) === "object") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			el = self['@slowBuckets']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			type = anObject.constructor && anObject.constructor.name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			bucket = el[type]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (!bucket) { bucket = el[type] = []; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return [ anObject, null, bucket ]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return [ prim, self['@fastBuckets'][type] ]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return self}, function($ctx1) {$ctx1.fill(self,"bucketOfElement:",{anObject:anObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "bucketOfElement: anObject\x0a\x09<\x0a\x09\x09var prim = anObject == null ? (anObject = nil) : anObject.valueOf();\x0a\x09\x09var el, bucket, type;\x0a\x09\x09if ((type = typeof prim) === \x22object\x22) {\x0a\x09\x09\x09el = self['@slowBuckets'];\x0a\x09\x09\x09type = anObject.constructor && anObject.constructor.name;\x0a\x09\x09\x09bucket = el[type];\x0a\x09\x09\x09if (!bucket) { bucket = el[type] = []; }\x0a\x09\x09\x09return [ anObject, null, bucket ];\x0a\x09\x09}\x0a\x09\x09return [ prim, self['@fastBuckets'][type] ];\x0a\x09>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5391,14 +5433,20 @@ selector: "collect:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 protocol: 'enumerating', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (aBlock){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var collection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=_st(self._class())._withAll_(_st(self["@elements"])._collect_(aBlock)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+collection=_st(self._class())._new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+self._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return _st(collection)._add_(_st(aBlock)._value_(each)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=collection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}, function($ctx1) {$ctx1.fill(self,"collect:",{aBlock:aBlock},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx1) {$ctx1.fill(self,"collect:",{aBlock:aBlock,collection:collection},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aBlock"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "collect: aBlock\x0a\x09^ self class withAll: (elements collect: aBlock)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["withAll:", "class", "collect:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "collect: aBlock\x0a\x09| collection |\x0a\x09collection := self class new.\x0a\x09self do: [ :each | collection add: (aBlock value: each) ].\x0a\x09^ collection", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["new", "class", "do:", "add:", "value:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5410,13 +5458,24 @@ protocol: 'enumerating', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (aBlock,anotherBlock){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=_st(self["@elements"])._detect_ifNone_(aBlock,anotherBlock); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $1,$2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $early={}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+self._do_((function(each){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=_st(aBlock)._value_(each); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(smalltalk.assert($1)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+throw $early=[each]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$2=_st(anotherBlock)._value(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return $2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+catch(e) {if(e===$early)return e[0]; throw e} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, function($ctx1) {$ctx1.fill(self,"detect:ifNone:",{aBlock:aBlock,anotherBlock:anotherBlock},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aBlock", "anotherBlock"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "detect: aBlock ifNone: anotherBlock\x0a\x09^ elements detect: aBlock ifNone: anotherBlock", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["detect:ifNone:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "detect: aBlock ifNone: anotherBlock\x0a\x09self do: [ :each | (aBlock value: each) ifTrue: [ ^each ] ].\x0a\x09^ anotherBlock value", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["do:", "ifTrue:", "value:", "value"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5428,11 +5487,23 @@ protocol: 'enumerating', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (aBlock){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(self["@elements"])._do_(aBlock); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		var el, keys, i; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		el = self['@fastBuckets']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		keys = Object.keys(el); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for (i = 0; i < keys.length; ++i) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			var fastBucket = el[keys[i]], fn = fastBucket.fn, store = Object.keys(fastBucket.store); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (fn) { for (var j = 0; j < store.length; ++j) { aBlock._value_(fn(store[j])); } } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			else { store._do_(aBlock); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		el = self['@slowBuckets']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		keys = Object.keys(el); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for (i = 0; i < keys.length; ++i) { el[keys[i]]._do_(aBlock); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return self}, function($ctx1) {$ctx1.fill(self,"do:",{aBlock:aBlock},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["aBlock"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "do: aBlock\x0a\x09elements do: aBlock", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["do:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "do: aBlock\x0a\x09<\x0a\x09\x09var el, keys, i;\x0a\x09\x09el = self['@fastBuckets'];\x0a\x09\x09keys = Object.keys(el);\x0a\x09\x09for (i = 0; i < keys.length; ++i) {\x0a\x09\x09\x09var fastBucket = el[keys[i]], fn = fastBucket.fn, store = Object.keys(fastBucket.store);\x0a\x09\x09\x09if (fn) { for (var j = 0; j < store.length; ++j) { aBlock._value_(fn(store[j])); } }\x0a\x09\x09\x09else { store._do_(aBlock); }\x0a\x09\x09}\x0a\x09\x09el = self['@slowBuckets'];\x0a\x09\x09keys = Object.keys(el);\x0a\x09\x09for (i = 0; i < keys.length; ++i) { el[keys[i]]._do_(aBlock); }\x0a\x09>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5443,14 +5514,42 @@ selector: "includes:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 protocol: 'testing', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (anObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var bucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=_st(self["@elements"])._includes_(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $2,$3,$4,$1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bucket=self._bucketOfElement_(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$2=_st(bucket)._second(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(($receiver = $2) == nil || $receiver == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$3=_st(bucket)._third(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$4=_st(bucket)._first(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.sendIdx["first"]=1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=_st($3)._includes_($4); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var primitiveBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primitiveBucket=$receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=self._includes_in_(_st(bucket)._first(),primitiveBucket); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}, function($ctx1) {$ctx1.fill(self,"includes:",{anObject:anObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx1) {$ctx1.fill(self,"includes:",{anObject:anObject,bucket:bucket},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: ["anObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "includes: anObject\x0a\x09^ elements includes: anObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["includes:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "includes: anObject\x0a\x09| bucket |\x0a\x09bucket := self bucketOfElement: anObject.\x0a\x09^bucket second\x0a\x09\x09ifNil: [ bucket third includes: bucket first ]\x0a\x09\x09ifNotNil: [ :primitiveBucket | self includes: bucket first in: primitiveBucket ]", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["bucketOfElement:", "ifNil:ifNotNil:", "second", "includes:", "third", "first", "includes:in:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.Set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "includes:in:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protocol: 'private', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (anObject,anotherObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return !!anotherObject.store[anObject]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return self}, function($ctx1) {$ctx1.fill(self,"includes:in:",{anObject:anObject,anotherObject:anotherObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject", "anotherObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "includes: anObject in: anotherObject\x0a\x09<return !!anotherObject.store[anObject]>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5463,11 +5562,11 @@ fn: function (){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set.superclass.fn.prototype._initialize.apply(_st(self), []); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-self["@elements"]=[]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+self._removeAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return self}, function($ctx1) {$ctx1.fill(self,"initialize",{},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "initialize\x0a\x09super initialize.\x0a\x09elements := #()", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["initialize"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "initialize\x0a\x09super initialize.\x0a\x09self removeAll", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["initialize", "removeAll"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5502,32 +5601,56 @@ smalltalk.Set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-selector: "remove:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "remove:ifAbsent:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 protocol: 'adding/removing', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-fn: function (anObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (anObject,aBlock){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var bucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(self["@elements"])._remove_(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return self}, function($ctx1) {$ctx1.fill(self,"remove:",{anObject:anObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-args: ["anObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "remove: anObject\x0a\x09elements remove: anObject", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["remove:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $2,$3,$4,$5,$1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var $early={}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bucket=self._bucketOfElement_(anObject); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$2=_st(bucket)._second(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if(($receiver = $2) == nil || $receiver == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$3=_st(bucket)._third(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$4=_st(bucket)._first(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$ctx1.sendIdx["first"]=1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_st($3)._remove_ifAbsent_($4,(function(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return smalltalk.withContext(function($ctx2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$5=_st(aBlock)._value(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+throw $early=[$5]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)})})); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+self["@size"]=_st(self["@size"]).__minus((1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=self["@size"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+var primitiveBucket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primitiveBucket=$receiver; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=self._remove_in_(_st(bucket)._first(),primitiveBucket); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+catch(e) {if(e===$early)return e[0]; throw e} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, function($ctx1) {$ctx1.fill(self,"remove:ifAbsent:",{anObject:anObject,aBlock:aBlock,bucket:bucket},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject", "aBlock"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "remove: anObject ifAbsent: aBlock\x0a\x09| bucket |\x0a\x09bucket := self bucketOfElement: anObject.\x0a\x09^bucket second\x0a\x09\x09ifNil: [ bucket third remove: bucket first ifAbsent: [ ^aBlock value ]. size := size - 1 ]\x0a\x09\x09ifNotNil: [ :primitiveBucket | self remove: bucket first in: primitiveBucket ]", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: ["bucketOfElement:", "ifNil:ifNotNil:", "second", "remove:ifAbsent:", "third", "first", "value", "-", "remove:in:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.addMethod( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.method({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-selector: "remove:ifAbsent:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-protocol: 'adding/removing', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-fn: function (anObject,aBlock){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+selector: "remove:in:", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+protocol: 'private', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+fn: function (anObject,anotherObject){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(self["@elements"])._remove_ifAbsent_(anObject,aBlock); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return self}, function($ctx1) {$ctx1.fill(self,"remove:ifAbsent:",{anObject:anObject,aBlock:aBlock},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-args: ["anObject", "aBlock"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "remove: anObject ifAbsent: aBlock\x0a\x09elements remove: anObject ifAbsent: aBlock", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["remove:ifAbsent:"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if (delete anotherObject.store[anObject]) self['@size']--; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+return self}, function($ctx1) {$ctx1.fill(self,"remove:in:",{anObject:anObject,anotherObject:anotherObject},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+args: ["anObject", "anotherObject"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "remove: anObject in: anotherObject\x0a\x09<if (delete anotherObject.store[anObject]) self['@size']-->", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5539,11 +5662,19 @@ protocol: 'adding/removing', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 fn: function (){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-_st(self["@elements"])._removeAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		self['@slowBuckets'] = Object.create(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		self['@fastBuckets'] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			'boolean': { store: Object.create(null), fn: Boolean }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			'number': { store: Object.create(null), fn: Number }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			'string': { store: Object.create(null) } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		self['@size'] = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return self}, function($ctx1) {$ctx1.fill(self,"removeAll",{},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "removeAll\x0a\x09elements removeAll", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["removeAll"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "removeAll\x0a\x09<\x0a\x09\x09self['@slowBuckets'] = Object.create(null);\x0a\x09\x09self['@fastBuckets'] = {\x0a\x09\x09\x09'boolean': { store: Object.create(null), fn: Boolean },\x0a\x09\x09\x09'number': { store: Object.create(null), fn: Number },\x0a\x09\x09\x09'string': { store: Object.create(null) }\x0a\x09\x09};\x0a\x09\x09self['@size'] = 0;\x0a\x09>", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -5583,12 +5714,12 @@ fn: function (){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var self=this; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return smalltalk.withContext(function($ctx1) {  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 var $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-$1=_st(self["@elements"])._size(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+$1=self["@size"]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 return $1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, function($ctx1) {$ctx1.fill(self,"size",{},smalltalk.Set)})}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 args: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-source: "size\x0a\x09^ elements size", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-messageSends: ["size"], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source: "size\x0a\x09^ size", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+messageSends: [], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 referencedClasses: [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 smalltalk.Set); 
			 |