18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* ***** BEGIN LICENSE BLOCK ***** 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Version: NPL 1.1/GPL 2.0/LGPL 2.1 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The contents of this file are subject to the Netscape Public License 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Version 1.1 (the "License"); you may not use this file except in 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* compliance with the License. You may obtain a copy of the License at 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* http://www.mozilla.org/NPL/ 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Software distributed under the License is distributed on an "AS IS" basis, 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* for the specific language governing rights and limitations under the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* License. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Original Code is JavaScript Engine testing utilities. 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* The Initial Developer of the Original Code is Netscape Communications Corp. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Portions created by the Initial Developer are Copyright (C) 2002 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the Initial Developer. All Rights Reserved. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Contributor(s): igor3@apochta.com, pschwartau@netscape.com 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Alternatively, the contents of this file may be used under the terms of 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* either the GNU General Public License Version 2 or later (the "GPL"), or 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* in which case the provisions of the GPL or the LGPL are applicable instead 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* of those above. If you wish to allow use of your version of this file only 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* under the terms of either the GPL or the LGPL, and not to allow others to 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* use your version of this file under the terms of the NPL, indicate your 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* decision by deleting the provisions above and replace them with the notice 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* and other provisions required by the GPL or the LGPL. If you do not delete 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the provisions above, a recipient may use your version of this file under 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* the terms of any one of the NPL, the GPL or the LGPL. 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* ***** END LICENSE BLOCK ***** 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Date: 21 May 2002 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* SUMMARY: ECMA conformance of Function.prototype.apply 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* Function.prototype.apply(thisArg, argArray) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project* See ECMA-262 Edition 3 Final, Section 15.3.4.3 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar UBound = 0; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar bug = 145791; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar summary = 'Testing ECMA conformance of Function.prototype.apply'; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar status = ''; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar statusitems = []; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actual = ''; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar actualvalues = []; 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expect= ''; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvar expectedvalues = []; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction F0(a) 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "" + this + arguments.length; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction F1(a) 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "" + this + a; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction F2() 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return "" + this; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply.length should return 2 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(1); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = Function.prototype.apply.length; 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = 2; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * When |thisArg| is not provided to the apply() method, the 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * called function must be passed the global object as |this| 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(2); 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F0.apply(); 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = "" + this + 0; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * If |argArray| is not provided to the apply() method, the 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * called function should be invoked with an empty argument list 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(3); 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F0.apply(""); 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = "" + "" + 0; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(4); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F0.apply(true); 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = "" + true + 0; 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(x) and 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(x, undefined) should return the same result 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(5); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(0, undefined); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(0); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(6); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply("", undefined); 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(""); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(7); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(null, undefined); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(null); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(8); 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(undefined, undefined); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(undefined); 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(x) and 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(x, null) should return the same result 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(9); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(0, null); 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(0); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(10); 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply("", null); 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(""); 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(11); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(null, null); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(null); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(12); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F1.apply(undefined, null); 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F1.apply(undefined); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply() and 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(undefined) should return the same result 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(13); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F2.apply(undefined); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F2.apply(); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply() and 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Function.prototype.apply(null) should return the same result 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatus = inSection(14); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectactual = F2.apply(null); 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectexpect = F2.apply(); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectaddThis(); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttest(); 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//----------------------------------------------------------------------------- 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction addThis() 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project statusitems[UBound] = status; 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project actualvalues[UBound] = actual; 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project expectedvalues[UBound] = expect; 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project UBound++; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectfunction test() 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project enterFunc('test'); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printBugNumber(bug); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printStatus(summary); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (var i=0; i<UBound; i++) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project exitFunc ('test'); 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 206