summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/built-ins/Array/prototype/sort
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/built-ins/Array/prototype/sort')
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.1_T1.js27
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T1.js45
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T2.js51
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.3_T1.js27
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T1.js42
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T2.js48
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.5_T1.js40
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T1.js26
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T2.js26
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T3.js36
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T1.js31
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T2.js31
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T3.js41
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T1.js54
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T2.js62
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A4_T3.js37
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A5_T1.js18
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A6_T2.js63
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A8.js25
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/browser.js0
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_1.js26
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_2.js57
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/call-with-primitive.js32
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/comparefn-nonfunction-call-throws.js97
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/length.js30
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/name.js28
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/not-a-constructor.js31
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-comparefn-throws.js54
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-appends-elements.js51
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-decreases-length.js41
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-predecessor.js45
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-successor.js46
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-increases-length.js51
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-pops-elements.js42
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-predecessor.js43
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-successor.js43
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-accessors.js44
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-element.js29
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-appends-elements.js44
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-decreases-length.js39
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-predecessor.js42
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-successor.js41
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-increases-length.js45
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-pops-elements.js40
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-predecessor.js41
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-successor.js41
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/prop-desc.js23
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/shell.js0
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/stability-11-elements.js38
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/stability-2048-elements.js2083
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/stability-5-elements.js29
-rw-r--r--js/src/tests/test262/built-ins/Array/prototype/sort/stability-513-elements.js548
52 files changed, 4574 insertions, 0 deletions
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.1_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.1_T1.js
new file mode 100644
index 0000000000..af681151b3
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.1_T1.js
@@ -0,0 +1,27 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If this object does not have a property named by ToString(j),
+ and this object does not have a property named by ToString(k), return +0
+esid: sec-array.prototype.sort
+description: If comparefn is undefined, use SortCompare operator
+---*/
+
+var x = new Array(2);
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(2); x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== undefined) {
+ throw new Test262Error('#2: var x = new Array(2); x.sort(); x[0] === undefined. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(2); x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T1.js
new file mode 100644
index 0000000000..95ccc2f4c9
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T1.js
@@ -0,0 +1,45 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If this object does not have a property named by
+ ToString(j), return 1. If this object does not have a property
+ named by ToString(k), return -1
+esid: sec-array.prototype.sort
+description: If comparefn is undefined, use SortCompare operator
+---*/
+
+var x = new Array(2);
+x[1] = 1;
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(2); x[1] = 1; x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#2: var x = new Array(2); x[1] = 1; x.sort(); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(2); x[1] = 1; x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+var x = new Array(2);
+x[0] = 1;
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#4: var x = new Array(2); x[0] = 1; x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#5: var x = new Array(2); x[0] = 1; x.sort(); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#6: var x = new Array(2); x[0] = 1; x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T2.js
new file mode 100644
index 0000000000..5c10674217
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.2_T2.js
@@ -0,0 +1,51 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If this object does not have a property named by
+ ToString(j), return 1. If this object does not have a property
+ named by ToString(k), return -1
+esid: sec-array.prototype.sort
+description: If comparefn is not undefined
+---*/
+
+var myComparefn = function(x, y) {
+ if (x === undefined) return -1;
+ if (y === undefined) return 1;
+ return 0;
+}
+
+var x = new Array(2);
+x[1] = 1;
+x.sort(myComparefn);
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(2); x[1] = 1; x.sort(myComparefn); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#2: var x = new Array(2); x[1] = 1; x.sort(myComparefn); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(2); x[1] = 1; x.sort(myComparefn); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+var x = new Array(2);
+x[0] = 1;
+x.sort(myComparefn);
+
+if (x.length !== 2) {
+ throw new Test262Error('#4: var x = new Array(2); x[0] = 1; x.sort(myComparefn); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#5: var x = new Array(2); x[0] = 1; x.sort(myComparefn); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#6: var x = new Array(2); x[0] = 1; x.sort(myComparefn); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.3_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.3_T1.js
new file mode 100644
index 0000000000..6a6d330506
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.3_T1.js
@@ -0,0 +1,27 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If [[Get]] ToString(j) and [[Get]] ToString(k)
+ are both undefined, return +0
+esid: sec-array.prototype.sort
+description: If comparefn is undefined, use SortCompare operator
+---*/
+
+var x = new Array(undefined, undefined);
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(undefined, undefined); x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== undefined) {
+ throw new Test262Error('#2: var x = new Array(undefined, undefined); x.sort(); x[0] === undefined. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(undefined, undefined); x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T1.js
new file mode 100644
index 0000000000..425c2361dd
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T1.js
@@ -0,0 +1,42 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If [[Get]] ToString(j) is undefined, return 1.
+ If [[]Get] ToString(k) is undefined, return -1
+esid: sec-array.prototype.sort
+description: If comparefn is undefined, use SortCompare operator
+---*/
+
+var x = new Array(undefined, 1);
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(undefined, 1); x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#2: var x = new Array(undefined, 1); x.sort(); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(undefined, 1); x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+var x = new Array(1, undefined);
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#4: var x = new Array(1, undefined); x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#5: var x = new Array(1, undefined); x.sort(); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#6: var x = new Array(1, undefined); x.sort(); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T2.js
new file mode 100644
index 0000000000..c0ab63090a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.4_T2.js
@@ -0,0 +1,48 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If [[Get]] ToString(j) is undefined, return 1.
+ If [[]Get] ToString(k) is undefined, return -1
+esid: sec-array.prototype.sort
+description: If comparefn is not undefined
+---*/
+
+var myComparefn = function(x, y) {
+ if (x === undefined) return -1;
+ if (y === undefined) return 1;
+ return 0;
+}
+
+var x = new Array(undefined, 1);
+x.sort(myComparefn);
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(undefined, 1); x.sort(myComparefn); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#2: var x = new Array(undefined, 1); x.sort(myComparefn); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#3: var x = new Array(undefined, 1); x.sort(myComparefn); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+var x = new Array(1, undefined);
+x.sort(myComparefn);
+
+if (x.length !== 2) {
+ throw new Test262Error('#4: var x = new Array(1, undefined); x.sort(myComparefn); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 1) {
+ throw new Test262Error('#5: var x = new Array(1, undefined); x.sort(myComparefn); x[0] === 1. Actual: ' + (x[0]));
+}
+
+if (x[1] !== undefined) {
+ throw new Test262Error('#6: var x = new Array(1, undefined); x.sort(myComparefn); x[1] === undefined. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.5_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.5_T1.js
new file mode 100644
index 0000000000..250933dd96
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A1.5_T1.js
@@ -0,0 +1,40 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: If comparefn is undefined, use SortCompare operator
+esid: sec-array.prototype.sort
+description: Checking sort() and sort(undefined)
+---*/
+
+var x = new Array(1, 0);
+x.sort();
+
+if (x.length !== 2) {
+ throw new Test262Error('#1: var x = new Array(1,0); x.sort(); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 0) {
+ throw new Test262Error('#2: var x = new Array(1,0); x.sort(); x[0] === 0. Actual: ' + (x[0]));
+}
+
+if (x[1] !== 1) {
+ throw new Test262Error('#3: var x = new Array(1,0); x.sort(); x[1] === 1. Actual: ' + (x[1]));
+}
+
+var x = new Array(1, 0);
+x.sort(undefined);
+
+if (x.length !== 2) {
+ throw new Test262Error('#4: var x = new Array(1,0); x.sort(undefined); x.length === 2. Actual: ' + (x.length));
+}
+
+if (x[0] !== 0) {
+ throw new Test262Error('#5: var x = new Array(1,0); x.sort(undefined); x[0] === 0. Actual: ' + (x[0]));
+}
+
+if (x[1] !== 1) {
+ throw new Test262Error('#6: var x = new Array(1,0); x.sort(undefined); x[1] === 1. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T1.js
new file mode 100644
index 0000000000..b4c988eec5
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T1.js
@@ -0,0 +1,26 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If ToString([[Get]] ToString(j)) < ToString([[Get]] ToString(k)), return -1.
+ If ToString([[Get]] ToString(j)) > ToString([[Get]] ToString(k)), return 1;
+ return -1
+esid: sec-array.prototype.sort
+description: Checking ENGLISH ALPHABET
+---*/
+
+var alphabetR = ["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A"];
+var alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
+
+alphabetR.sort();
+var result = true;
+for (var i = 0; i < 26; i++) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: CHECK ENGLISH ALPHABET');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T2.js
new file mode 100644
index 0000000000..e6e8ac1fc8
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T2.js
@@ -0,0 +1,26 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If ToString([[Get]] ToString(j)) < ToString([[Get]] ToString(k)), return -1.
+ If ToString([[Get]] ToString(j)) > ToString([[Get]] ToString(k)), return 1;
+ return -1
+esid: sec-array.prototype.sort
+description: Checking RUSSIAN ALPHABET
+---*/
+
+var alphabetR = ["ё", "я", "ю", "э", "ь", "ы", "ъ", "щ", "ш", "ч", "ц", "х", "ф", "у", "т", "с", "р", "П", "О", "Н", "М", "Л", "К", "Й", "И", "З", "Ж", "Е", "Д", "Г", "В", "Б", "А"];
+var alphabet = ["А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", "ё"];
+
+alphabetR.sort();
+var result = true;
+for (var i = 0; i < 26; i++) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: CHECK RUSSIAN ALPHABET');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T3.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T3.js
new file mode 100644
index 0000000000..d68d37b134
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.1_T3.js
@@ -0,0 +1,36 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ If ToString([[Get]] ToString(j)) < ToString([[Get]] ToString(k)), return -1.
+ If ToString([[Get]] ToString(j)) > ToString([[Get]] ToString(k)), return 1;
+ return -1
+esid: sec-array.prototype.sort
+description: Checking ToString operator
+---*/
+
+var obj = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return -2
+ }
+};
+var alphabetR = [undefined, 2, 1, "X", -1, "a", true, obj, NaN, Infinity];
+var alphabet = [-1, obj, 1, 2, Infinity, NaN, "X", "a", true, undefined];
+
+alphabetR.sort();
+var result = true;
+for (var i = 0; i < 10; i++) {
+ if (!(isNaN(alphabetR[i]) && isNaN(alphabet[i]))) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+ }
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: Check ToString operator');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T1.js
new file mode 100644
index 0000000000..0473e9f881
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T1.js
@@ -0,0 +1,31 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: My comparefn is inverse implementation comparefn
+esid: sec-array.prototype.sort
+description: Checking ENGLISH ALPHABET
+---*/
+
+var alphabetR = ["z", "y", "x", "w", "v", "u", "t", "s", "r", "q", "p", "o", "n", "M", "L", "K", "J", "I", "H", "G", "F", "E", "D", "C", "B", "A"];
+var alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
+
+var myComparefn = function(x, y) {
+ var xS = String(x);
+ var yS = String(y);
+ if (xS < yS) return 1
+ if (xS > yS) return -1;
+ return 0;
+}
+
+alphabet.sort(myComparefn);
+var result = true;
+for (var i = 0; i < 26; i++) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: CHECK ENGLISH ALPHABET');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T2.js
new file mode 100644
index 0000000000..4c719c957f
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T2.js
@@ -0,0 +1,31 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: My comparefn is inverse implementation comparefn
+esid: sec-array.prototype.sort
+description: Checking RUSSIAN ALPHABET
+---*/
+
+var alphabetR = ["ё", "я", "ю", "э", "ь", "ы", "ъ", "щ", "ш", "ч", "ц", "х", "ф", "у", "т", "с", "р", "П", "О", "Н", "М", "Л", "К", "Й", "И", "З", "Ж", "Е", "Д", "Г", "В", "Б", "А"];
+var alphabet = ["А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", "ё"];
+
+var myComparefn = function(x, y) {
+ var xS = String(x);
+ var yS = String(y);
+ if (xS < yS) return 1
+ if (xS > yS) return -1;
+ return 0;
+}
+
+alphabet.sort(myComparefn);
+var result = true;
+for (var i = 0; i < 26; i++) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: CHECK RUSSIAN ALPHABET');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T3.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T3.js
new file mode 100644
index 0000000000..3eef7ab2be
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A2.2_T3.js
@@ -0,0 +1,41 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: My comparefn is inverse implementation comparefn
+esid: sec-array.prototype.sort
+description: Checking ToString operator
+---*/
+
+var obj = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return -2
+ }
+};
+var alphabetR = [undefined, 2, 1, "X", -1, "a", true, obj, NaN, Infinity];
+var alphabet = [true, "a", "X", NaN, Infinity, 2, 1, obj, -1, undefined];
+
+var myComparefn = function(x, y) {
+ var xS = String(x);
+ var yS = String(y);
+ if (xS < yS) return 1
+ if (xS > yS) return -1;
+ return 0;
+}
+
+alphabetR.sort(myComparefn);
+var result = true;
+for (var i = 0; i < 10; i++) {
+ if (!(isNaN(alphabetR[i]) && isNaN(alphabet[i]))) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+ }
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: Check ToString operator');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T1.js
new file mode 100644
index 0000000000..7add56c4b5
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T1.js
@@ -0,0 +1,54 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ The sort function is intentionally generic.
+ It does not require that its this value be an Array object
+esid: sec-array.prototype.sort
+description: If comparefn is undefined, use SortCompare operator
+---*/
+
+var obj = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return -2
+ }
+};
+var alphabetR = {
+ 0: undefined,
+ 1: 2,
+ 2: 1,
+ 3: "X",
+ 4: -1,
+ 5: "a",
+ 6: true,
+ 7: obj,
+ 8: NaN,
+ 9: Infinity
+};
+alphabetR.sort = Array.prototype.sort;
+alphabetR.length = 10;
+var alphabet = [-1, obj, 1, 2, Infinity, NaN, "X", "a", true, undefined];
+
+alphabetR.sort();
+
+alphabetR.getClass = Object.prototype.toString;
+if (alphabetR.getClass() !== "[object " + "Object" + "]") {
+ throw new Test262Error('#0: alphabetR.sort() is Object object, not Array object');
+}
+
+var result = true;
+for (var i = 0; i < 10; i++) {
+ if (!(isNaN(alphabetR[i]) && isNaN(alphabet[i]))) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+ }
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: Check ToString operator');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T2.js
new file mode 100644
index 0000000000..34b9e54b68
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A3_T2.js
@@ -0,0 +1,62 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: |
+ The sort function is intentionally generic.
+ It does not require that its this value be an Array object
+esid: sec-array.prototype.sort
+description: If comparefn is not undefined
+---*/
+
+var obj = {
+ valueOf: function() {
+ return 1
+ },
+ toString: function() {
+ return -2
+ }
+};
+var alphabetR = {
+ 0: undefined,
+ 1: 2,
+ 2: 1,
+ 3: "X",
+ 4: -1,
+ 5: "a",
+ 6: true,
+ 7: obj,
+ 8: NaN,
+ 9: Infinity
+};
+alphabetR.sort = Array.prototype.sort;
+alphabetR.length = 10;
+var alphabet = [true, "a", "X", NaN, Infinity, 2, 1, obj, -1, undefined];
+
+var myComparefn = function(x, y) {
+ var xS = String(x);
+ var yS = String(y);
+ if (xS < yS) return 1
+ if (xS > yS) return -1;
+ return 0;
+}
+
+alphabetR.sort(myComparefn);
+
+alphabetR.getClass = Object.prototype.toString;
+if (alphabetR.getClass() !== "[object " + "Object" + "]") {
+ throw new Test262Error('#0: alphabetR.sort() is Object object, not Array object');
+}
+
+var result = true;
+for (var i = 0; i < 10; i++) {
+ if (!(isNaN(alphabetR[i]) && isNaN(alphabet[i]))) {
+ if (alphabetR[i] !== alphabet[i]) result = false;
+ }
+}
+
+if (result !== true) {
+ throw new Test262Error('#1: Check ToString operator');
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A4_T3.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A4_T3.js
new file mode 100644
index 0000000000..75938b93c1
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A4_T3.js
@@ -0,0 +1,37 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Check ToLength(length) for non Array objects
+esid: sec-array.prototype.sort
+description: length = -4294967294
+---*/
+
+var obj = {};
+obj.sort = Array.prototype.sort;
+obj[0] = "z";
+obj[1] = "y";
+obj[2] = "x";
+obj.length = -4294967294;
+
+if (obj.sort() !== obj) {
+ throw new Test262Error('#1: var obj = {}; obj.sort = Array.prototype.sort; obj[0] = "z"; obj[1] = "y"; obj[2] = "x"; obj.length = -4294967294; obj.sort() === obj. Actual: ' + (obj.sort()));
+}
+
+if (obj.length !== -4294967294) {
+ throw new Test262Error('#2: var obj = {}; obj.sort = Array.prototype.sort; obj[0] = "z"; obj[1] = "y"; obj[2] = "x"; obj.length = -4294967294; obj.sort(); obj.length === -4294967294. Actual: ' + (obj.length));
+}
+
+if (obj[0] !== "z") {
+ throw new Test262Error('#3: var obj = {}; obj.sort = Array.prototype.sort; obj[0] = "z"; obj[1] = "y"; obj[2] = "x"; obj.length = -4294967294; obj.sort(); obj[0] === "z". Actual: ' + (obj[0]));
+}
+
+if (obj[1] !== "y") {
+ throw new Test262Error('#4: var obj = {}; obj.sort = Array.prototype.sort; obj[0] = "z"; obj[1] = "y"; obj[2] = "x"; obj.length = -4294967294; obj.sort(); obj[1] === "y". Actual: ' + (obj[1]));
+}
+
+if (obj[2] !== "x") {
+ throw new Test262Error('#5: var obj = {}; obj.sort = Array.prototype.sort; obj[0] = "z"; obj[1] = "y"; obj[2] = "x"; obj.length = -4294967294; obj.sort(); obj[2] === "x". Actual: ' + (obj[2]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A5_T1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A5_T1.js
new file mode 100644
index 0000000000..18eaabaf40
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A5_T1.js
@@ -0,0 +1,18 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Array.sort should not eat exceptions
+esid: sec-array.prototype.sort
+description: comparefn function throw "error"
+---*/
+
+assert.throws(Test262Error, () => {
+ var myComparefn = function(x, y) {
+ throw new Test262Error();
+ }
+ var x = [1, 0];
+ x.sort(myComparefn);
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A6_T2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A6_T2.js
new file mode 100644
index 0000000000..1b75ec229a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A6_T2.js
@@ -0,0 +1,63 @@
+// Copyright 2009 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: "[[Get]], [[Delete]] from not an inherited property"
+esid: sec-array.prototype.sort
+description: >
+ [[Prototype]] of Array instance is Array.prototype, [[Prototype]
+ of Array.prototype is Object.prototype
+---*/
+
+Array.prototype[1] = -1;
+var x = [1, 0];
+x.length = 2;
+x.sort();
+
+if (x[0] !== 0) {
+ throw new Test262Error('#1: Array.prototype[1] = -1; x = [1,0]; x.length = 2; x.sort(); x[0] === 0. Actual: ' + (x[0]));
+}
+
+if (x[1] !== 1) {
+ throw new Test262Error('#2: Array.prototype[1] = -1; x = [1,0]; x.length = 2; x.sort(); x[1] === 1. Actual: ' + (x[1]));
+}
+
+x.length = 0;
+
+if (x[0] !== undefined) {
+ throw new Test262Error('#3: Array.prototype[1] = -1; x = [1,0]; x.length = 2; x.sort(); x.length = 0; x[0] === undefined. Actual: ' + (x[0]));
+}
+
+if (x[1] !== -1) {
+ throw new Test262Error('#4: Array.prototype[1] = -1; x = [1,0]; x.length = 2; x.sort(); x.length = 0; x[1] === -1. Actual: ' + (x[1]));
+}
+
+Object.prototype[1] = -1;
+Object.prototype.length = 2;
+Object.prototype.sort = Array.prototype.sort;
+x = {
+ 0: 1,
+ 1: 0
+};
+x.sort();
+
+if (x[0] !== 0) {
+ throw new Test262Error('#5: Object.prototype[1] = -1; Object.prototype.length = 2; Object.prototype.sort = Array.prototype.sort; x = {0:1,1:0}; x.sort(); x[0] === 0. Actual: ' + (x[0]));
+}
+
+if (x[1] !== 1) {
+ throw new Test262Error('#6: Object.prototype[1] = -1; Object.prototype.length = 2; Object.prototype.sort = Array.prototype.sort; x = {0:1,1:0}; x.sort(); x[1] === 1. Actual: ' + (x[1]));
+}
+
+delete x[0];
+delete x[1];
+
+if (x[0] !== undefined) {
+ throw new Test262Error('#7: Object.prototype[1] = -1; Object.prototype.length = 2; Object.prototype.sort = Array.prototype.sort; x = {0:1,1:0}; x.sort(); delete x[0]; delete x[1]; x[0] === undefined. Actual: ' + (x[0]));
+}
+
+if (x[1] !== -1) {
+ throw new Test262Error('#8: Object.prototype[1] = -1; Object.prototype.length = 2; Object.prototype.sort = Array.prototype.sort; x = {0:1,1:0}; x.sort(); delete x[0]; delete x[1]; x[1] === -1. Actual: ' + (x[1]));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A8.js b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A8.js
new file mode 100644
index 0000000000..7aa320b0ef
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/S15.4.4.11_A8.js
@@ -0,0 +1,25 @@
+// Copyright 2011 the Sputnik authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+info: Call the comparefn passing undefined as the this value (step 13b)
+esid: sec-array.prototype.sort
+description: comparefn tests that its this value is undefined
+flags: [noStrict]
+---*/
+
+var global = this;
+[2, 3].sort(function(x, y) {
+ "use strict";
+
+ if (this === global) {
+ throw new Test262Error('#1: Sort leaks global');
+ }
+ if (this !== undefined) {
+ throw new Test262Error('#2: Sort comparefn should be called with this===undefined. ' +
+ 'Actual: ' + this);
+ }
+ return x - y;
+});
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/browser.js b/js/src/tests/test262/built-ins/Array/prototype/sort/browser.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/browser.js
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_1.js b/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_1.js
new file mode 100644
index 0000000000..0298cbc442
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_1.js
@@ -0,0 +1,26 @@
+// Copyright (c) 2014 Thomas Dahlstrom. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ The SortCompare abstract operation calls ToString() for identical
+ elements (step 14/15)
+author: Thomas Dahlstrom (tdahlstrom@gmail.com)
+---*/
+
+var counter = 0;
+var object = {
+ toString: function() {
+ counter++;
+ return "";
+ }
+};
+
+[object, object].sort();
+if (counter < 2) {
+ // sort calls ToString() for each element at least once
+ throw new Test262Error('#1: [object, object].sort(); counter < 2. Actual: ' + (counter));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_2.js b/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_2.js
new file mode 100644
index 0000000000..7caa4a9f2e
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/bug_596_2.js
@@ -0,0 +1,57 @@
+// Copyright (c) 2014 Thomas Dahlstrom. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Array.prototype.sort does not change non-existent elements to
+ undefined elements, that means holes are preserved (cf. spec text
+ about [[Delete]] and sparse arrays)
+author: Thomas Dahlstrom (tdahlstrom@gmail.com)
+---*/
+
+var array = ['a', , void 0];
+
+//CHECK#1
+if (array.length !== 3) {
+ throw new Test262Error('#1: array.length !== 3. Actual: ' + (array.length))
+}
+
+//CHECK#2
+if (array.hasOwnProperty('0') !== true) {
+ throw new Test262Error("#2: array.hasOwnProperty('0'). Actual: " + array.hasOwnProperty('0'));
+}
+
+//CHECK#3
+if (array.hasOwnProperty('1') !== false) {
+ throw new Test262Error("#3: array.hasOwnProperty('1'). Actual: " + array.hasOwnProperty('1'));
+}
+
+//CHECK#4
+if (array.hasOwnProperty('2') !== true) {
+ throw new Test262Error("#4: array.hasOwnProperty('2'). Actual: " + array.hasOwnProperty('2'));
+}
+
+array.sort();
+
+//CHECK#5
+if (array.length !== 3) {
+ throw new Test262Error('#5: array.length !== 3. Actual: ' + (array.length))
+}
+
+//CHECK#6
+if (array.hasOwnProperty('0') !== true) {
+ throw new Test262Error("#6: array.hasOwnProperty('0'). Actual: " + array.hasOwnProperty('0'));
+}
+
+//CHECK#7
+if (array.hasOwnProperty('1') !== true) {
+ throw new Test262Error("#7: array.hasOwnProperty('1'). Actual: " + array.hasOwnProperty('1'));
+}
+
+//CHECK#8
+if (array.hasOwnProperty('2') !== false) {
+ throw new Test262Error("#8: array.hasOwnProperty('2'). Actual: " + array.hasOwnProperty('2'));
+}
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/call-with-primitive.js b/js/src/tests/test262/built-ins/Array/prototype/sort/call-with-primitive.js
new file mode 100644
index 0000000000..f1d1554da8
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/call-with-primitive.js
@@ -0,0 +1,32 @@
+// Copyright (C) 2021 Alexey Shvayka. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ This value is coerced to an object.
+info: |
+ Array.prototype.sort ( comparefn )
+
+ [...]
+ 2. Let obj be ? ToObject(this value).
+ [...]
+ 12. Return obj.
+features: [Symbol, BigInt]
+---*/
+
+assert.throws(TypeError, function() {
+ [].sort.call(undefined);
+}, "undefined");
+
+assert.throws(TypeError, function() {
+ [].sort.call(null);
+}, "null");
+
+assert([].sort.call(false) instanceof Boolean, "boolean");
+assert([].sort.call(0) instanceof Number, "number");
+assert([].sort.call("") instanceof String, "string");
+assert([].sort.call(Symbol()) instanceof Symbol, "symbol");
+assert([].sort.call(0n) instanceof BigInt, "bigint");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/comparefn-nonfunction-call-throws.js b/js/src/tests/test262/built-ins/Array/prototype/sort/comparefn-nonfunction-call-throws.js
new file mode 100644
index 0000000000..bef7ff158b
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/comparefn-nonfunction-call-throws.js
@@ -0,0 +1,97 @@
+// Copyright (C) 2017 Jordan Harband. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+esid: sec-array.prototype.sort
+description: throws on a non-undefined non-function
+info: |
+ 22.1.3.25 Array.prototype.sort ( comparefn )
+
+ Upon entry, the following steps are performed to initialize evaluation
+ of the sort function:
+
+ ...
+ 1. If _comparefn_ is not *undefined* and IsCallable(_comparefn_) is *false*, throw a *TypeError* exception.
+ ...
+features: [Symbol]
+---*/
+
+var sample = [1];
+var poisoned = {
+ get length() {
+ throw new Test262Error("IsCallable(comparefn) should be observed before this.length");
+ }
+};
+
+assert.throws(TypeError, function() {
+ sample.sort(null);
+}, "sample.sort(null);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, null);
+}, "[].sort.call(poisoned, null);");
+
+assert.throws(TypeError, function() {
+ sample.sort(true);
+}, "sample.sort(true);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, true);
+}, "[].sort.call(poisoned, true);");
+
+assert.throws(TypeError, function() {
+ sample.sort(false);
+}, "sample.sort(false);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, false);
+}, "[].sort.call(poisoned, false);");
+
+assert.throws(TypeError, function() {
+ sample.sort('');
+}, "sample.sort('');");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, '');
+}, "[].sort.call(poisoned, '');");
+
+assert.throws(TypeError, function() {
+ sample.sort(/a/g);
+}, "sample.sort(/a/g);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, /a/g);
+}, "[].sort.call(poisoned, /a/g);");
+
+assert.throws(TypeError, function() {
+ sample.sort(42);
+}, "sample.sort(42);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, 42);
+}, "[].sort.call(poisoned, 42);");
+
+assert.throws(TypeError, function() {
+ sample.sort([]);
+}, "sample.sort([]);");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, []);
+}, "[].sort.call(poisoned, []);");
+
+assert.throws(TypeError, function() {
+ sample.sort({});
+}, "sample.sort({});");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, {});
+}, "[].sort.call(poisoned, {});");
+
+assert.throws(TypeError, function() {
+ sample.sort(Symbol());
+}, "sample.sort(Symbol());");
+
+assert.throws(TypeError, function() {
+ [].sort.call(poisoned, Symbol());
+}, "[].sort.call(poisoned, Symbol());");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/length.js b/js/src/tests/test262/built-ins/Array/prototype/sort/length.js
new file mode 100644
index 0000000000..67a6be2969
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/length.js
@@ -0,0 +1,30 @@
+// Copyright (C) 2017 Leo Balter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ The "length" property of Array.prototype.sort
+info: |
+ 17 ECMAScript Standard Built-in Objects
+
+ Every built-in function object, including constructors, has a length property
+ whose value is an integer. Unless otherwise specified, this value is equal to
+ the largest number of named arguments shown in the subclause headings for the
+ function description. Optional parameters (which are indicated with brackets:
+ [ ]) or rest parameters (which are shown using the form «...name») are not
+ included in the default argument count.
+
+ Unless otherwise specified, the length property of a built-in function object
+ has the attributes { [[Writable]]: false, [[Enumerable]]: false,
+ [[Configurable]]: true }.
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(Array.prototype.sort.length, 1);
+
+verifyNotEnumerable(Array.prototype.sort, 'length');
+verifyNotWritable(Array.prototype.sort, 'length');
+verifyConfigurable(Array.prototype.sort, 'length');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/name.js b/js/src/tests/test262/built-ins/Array/prototype/sort/name.js
new file mode 100644
index 0000000000..5ec58a1bb8
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/name.js
@@ -0,0 +1,28 @@
+// Copyright (C) 2015 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Array.prototype.sort.name is "sort".
+info: |
+ Array.prototype.sort (comparefn)
+
+ 17 ECMAScript Standard Built-in Objects:
+ Every built-in Function object, including constructors, that is not
+ identified as an anonymous function has a name property whose value
+ is a String.
+
+ Unless otherwise specified, the name property of a built-in Function
+ object, if it exists, has the attributes { [[Writable]]: false,
+ [[Enumerable]]: false, [[Configurable]]: true }.
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(Array.prototype.sort.name, "sort");
+
+verifyNotEnumerable(Array.prototype.sort, "name");
+verifyNotWritable(Array.prototype.sort, "name");
+verifyConfigurable(Array.prototype.sort, "name");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/not-a-constructor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/not-a-constructor.js
new file mode 100644
index 0000000000..e9dd5a40d3
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/not-a-constructor.js
@@ -0,0 +1,31 @@
+// Copyright (C) 2020 Rick Waldron. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-ecmascript-standard-built-in-objects
+description: >
+ Array.prototype.sort does not implement [[Construct]], is not new-able
+info: |
+ ECMAScript Function Objects
+
+ Built-in function objects that are not identified as constructors do not
+ implement the [[Construct]] internal method unless otherwise specified in
+ the description of a particular function.
+
+ sec-evaluatenew
+
+ ...
+ 7. If IsConstructor(constructor) is false, throw a TypeError exception.
+ ...
+includes: [isConstructor.js]
+features: [Reflect.construct, arrow-function]
+---*/
+
+assert.sameValue(isConstructor(Array.prototype.sort), false, 'isConstructor(Array.prototype.sort) must return false');
+
+assert.throws(TypeError, () => {
+ new Array.prototype.sort();
+}, '`new Array.prototype.sort()` throws TypeError');
+
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-comparefn-throws.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-comparefn-throws.js
new file mode 100644
index 0000000000..3c5950982e
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-comparefn-throws.js
@@ -0,0 +1,54 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const logs = [];
+
+Object.defineProperty(Object.prototype, '2', {
+ get() {
+ logs.push('get');
+ return 4;
+ },
+ set(v) {
+ logs.push(`set with ${v}`);
+ }
+});
+const array = [undefined, 3, /*hole*/, 2, undefined, /*hole*/, 1];
+let count = 0;
+try {
+ array.sort((a, b) => {
+ if (++count === 3) {
+ throw new Error('lolwat');
+ }
+ return b - a;
+ });
+} catch (exception) {
+ logs.push(exception.message);
+}
+
+assert.sameValue(logs[0], 'get');
+assert.sameValue(logs[1], 'lolwat');
+assert.sameValue(logs.length, 2);
+
+assert.sameValue(array[0], undefined);
+assert.sameValue(array[1], 3);
+assert.sameValue('2' in array, true);
+assert.sameValue(array.hasOwnProperty('2'), false);
+assert.sameValue(array[3], 2);
+assert.sameValue(array[4], undefined);
+assert.sameValue('5' in array, false);
+assert.sameValue(array.hasOwnProperty('5'), false);
+assert.sameValue(array[6], 1);
+assert.sameValue(array.length, 7);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-appends-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-appends-elements.js
new file mode 100644
index 0000000000..d1f7ad7194
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-appends-elements.js
@@ -0,0 +1,51 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array.push('foo');
+ array.push('bar');
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue('2' in array, true);
+assert.sameValue(array.hasOwnProperty('2'), true);
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array[8], 'foo');
+assert.sameValue(array[9], 'bar');
+assert.sameValue(array.length, 10);
+assert.sameValue(array.foo, 'c');
+
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[10], 'foo');
+assert.sameValue(array[11], 'bar');
+assert.sameValue(array.length, 12);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-decreases-length.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-decreases-length.js
new file mode 100644
index 0000000000..c184ad10bf
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-decreases-length.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array.length = array.length - 2;
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'b');
+assert.sameValue(array[1], 'c');
+assert.sameValue(array[3], undefined);
+assert.sameValue(array[4], undefined);
+assert.sameValue('5' in array, false);
+assert.sameValue(array.hasOwnProperty('5'), false);
+assert.sameValue(array.length, 6);
+assert.sameValue(array.foo, undefined);
+
+assert.sameValue(array[2], undefined);
+assert.sameValue(array.length, 4);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-predecessor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-predecessor.js
new file mode 100644
index 0000000000..01348cf269
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-predecessor.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ delete array[1];
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+assert.sameValue(array[2], 'c');
+assert.sameValue('1' in array, false);
+assert.sameValue(array.hasOwnProperty(1), false);
+assert.sameValue(array.length, 8);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-successor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-successor.js
new file mode 100644
index 0000000000..4e52b7228c
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-deletes-successor.js
@@ -0,0 +1,46 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ delete array[3];
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'c');
+assert.sameValue(array[3], undefined);
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue('6' in array, false);
+assert.sameValue(array.hasOwnProperty('6'), false);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'd');
+
+assert.sameValue(array[2], 'd');
+assert.sameValue('3' in array, false);
+assert.sameValue(array.hasOwnProperty(3), false);
+assert.sameValue(array.length, 8);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-increases-length.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-increases-length.js
new file mode 100644
index 0000000000..e7d9fbf855
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-increases-length.js
@@ -0,0 +1,51 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array.length = array.length + 2;
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue('8' in array, false);
+assert.sameValue(array.hasOwnProperty('8'), false);
+assert.sameValue('9' in array, false);
+assert.sameValue(array.hasOwnProperty('9'), false);
+assert.sameValue(array.length, 10);
+assert.sameValue(array.foo, 'c');
+
+assert.sameValue(array[2], 'c');
+assert.sameValue('10' in array, false);
+assert.sameValue(array.hasOwnProperty('10'), false);
+assert.sameValue('11' in array, false);
+assert.sameValue(array.hasOwnProperty('11'), false);
+assert.sameValue(array.length, 12);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-pops-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-pops-elements.js
new file mode 100644
index 0000000000..8fb67f84e3
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-pops-elements.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array.pop();
+ array.pop();
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'b');
+assert.sameValue(array[1], 'c');
+assert.sameValue(array[3], undefined);
+assert.sameValue(array[4], undefined);
+assert.sameValue('5' in array, false);
+assert.sameValue(array.hasOwnProperty('5'), false);
+assert.sameValue(array.length, 6);
+assert.sameValue(array.foo, undefined);
+
+assert.sameValue(array[2], undefined);
+assert.sameValue(array.length, 4);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-predecessor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-predecessor.js
new file mode 100644
index 0000000000..ed440f22ec
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-predecessor.js
@@ -0,0 +1,43 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array[1] = 'foobar';
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[1], 'foobar');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-successor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-successor.js
new file mode 100644
index 0000000000..e6534ab021
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-getter-sets-successor.js
@@ -0,0 +1,43 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ array[3] = 'foobar';
+ return this.foo;
+ },
+ set(v) {
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'c');
+assert.sameValue(array[3], 'foobar');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'd');
+
+assert.sameValue(array[2], 'd');
+assert.sameValue(array[3], 'foobar');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-accessors.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-accessors.js
new file mode 100644
index 0000000000..ccad0bbf50
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-accessors.js
@@ -0,0 +1,44 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const logs = [];
+
+Object.defineProperty(Object.prototype, '2', {
+ get() {
+ logs.push('get');
+ return 4;
+ },
+ set(v) {
+ logs.push(`set with ${v}`);
+ }
+});
+const array = [undefined, 3, /*hole*/, 2, undefined, /*hole*/, 1];
+array.sort();
+
+assert.sameValue(logs[0], 'get');
+assert.sameValue(logs[1], 'set with 3');
+assert.sameValue(logs.length, 2);
+
+assert.sameValue(array[0], 1);
+assert.sameValue(array[1], 2);
+assert.sameValue('2' in array, true);
+assert.sameValue(array.hasOwnProperty('2'), false);
+assert.sameValue(array[3], 4);
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue('6' in array, false);
+assert.sameValue(array.hasOwnProperty('6'), false);
+assert.sameValue(array.length, 7);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-element.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-element.js
new file mode 100644
index 0000000000..18051f01a6
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-prototype-element.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+Object.prototype[2] = 4;
+const array = [undefined, 3, /*hole*/, 2, undefined, /*hole*/, 1];
+array.sort();
+
+assert.sameValue(array[0], 1);
+assert.sameValue(array[1], 2);
+assert.sameValue(array[2], 3);
+assert.sameValue(array[3], 4);
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue('6' in array, false);
+assert.sameValue(array.hasOwnProperty('6'), false);
+assert.sameValue(array.length, 7);
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-appends-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-appends-elements.js
new file mode 100644
index 0000000000..b5d7d8bdfb
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-appends-elements.js
@@ -0,0 +1,44 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array.push('foo');
+ array.push('bar');
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array[8], 'foo');
+assert.sameValue(array[9], 'bar');
+assert.sameValue(array.length, 10);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-decreases-length.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-decreases-length.js
new file mode 100644
index 0000000000..7d3fff0ebf
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-decreases-length.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array.length = array.length - 2;
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue(array.length, 7);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-predecessor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-predecessor.js
new file mode 100644
index 0000000000..483917d83b
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-predecessor.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ delete array[1];
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue('1' in array, false);
+assert.sameValue(array.hasOwnProperty(1), false);
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-successor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-successor.js
new file mode 100644
index 0000000000..f78b134f14
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-deletes-successor.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ delete array[3];
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-increases-length.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-increases-length.js
new file mode 100644
index 0000000000..bb95633fea
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-increases-length.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array.length = array.length + 2;
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue('8' in array, false);
+assert.sameValue(array.hasOwnProperty('8'), false);
+assert.sameValue('9' in array, false);
+assert.sameValue(array.hasOwnProperty('9'), false);
+assert.sameValue(array.length, 10);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-pops-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-pops-elements.js
new file mode 100644
index 0000000000..27b5731308
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-pops-elements.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array.pop();
+ array.pop();
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue(array.length, 7);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-predecessor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-predecessor.js
new file mode 100644
index 0000000000..95c7987196
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-predecessor.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array[1] = 'foobar';
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'foobar');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-successor.js b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-successor.js
new file mode 100644
index 0000000000..adae4922bc
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/precise-setter-sets-successor.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2021 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Previously implementation-defined aspects of Array.prototype.sort.
+info: |
+ Historically, many aspects of Array.prototype.sort remained
+ implementation-defined. https://github.com/tc39/ecma262/pull/1585
+ described some behaviors more precisely, reducing the amount of cases
+ that result in an implementation-defined sort order.
+---*/
+
+const array = [undefined, 'c', /*hole*/, 'b', undefined, /*hole*/, 'a', 'd'];
+
+Object.defineProperty(array, '2', {
+ get() {
+ return this.foo;
+ },
+ set(v) {
+ array[3] = 'foobar';
+ this.foo = v;
+ }
+});
+
+array.sort();
+
+assert.sameValue(array[0], 'a');
+assert.sameValue(array[1], 'b');
+assert.sameValue(array[2], 'c');
+assert.sameValue(array[3], 'd');
+assert.sameValue(array[4], undefined);
+assert.sameValue(array[5], undefined);
+assert.sameValue(array[6], undefined);
+assert.sameValue('7' in array, false);
+assert.sameValue(array.hasOwnProperty('7'), false);
+assert.sameValue(array.length, 8);
+assert.sameValue(array.foo, 'c');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/prop-desc.js b/js/src/tests/test262/built-ins/Array/prototype/sort/prop-desc.js
new file mode 100644
index 0000000000..a1844b2aea
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/prop-desc.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2017 Leo Balter. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ "sort" property of Array.prototype
+info: |
+ 17 ECMAScript Standard Built-in Objects
+
+ Every other data property described in clauses 18 through 26 and in Annex B.2
+ has the attributes { [[Writable]]: true, [[Enumerable]]: false,
+ [[Configurable]]: true } unless otherwise specified.
+includes: [propertyHelper.js]
+---*/
+
+assert.sameValue(typeof Array.prototype.sort, 'function', 'typeof');
+
+verifyNotEnumerable(Array.prototype, "sort");
+verifyWritable(Array.prototype, "sort");
+verifyConfigurable(Array.prototype, "sort");
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/shell.js b/js/src/tests/test262/built-ins/Array/prototype/sort/shell.js
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/shell.js
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/stability-11-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-11-elements.js
new file mode 100644
index 0000000000..2505b5228a
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-11-elements.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2018 Mathias Bynens. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Stability of Array.prototype.sort for an array with 11 elements.
+info: |
+ The sort is required to be stable (that is, elements that compare equal
+ remain in their original order).
+ The array length of 11 was chosen because V8 used an unstable
+ QuickSort for arrays with more than 10 elements until v7.0 (September
+ 2018). https://v8.dev/blog/array-sort
+---*/
+
+const array = [
+ { name: 'A', rating: 2 },
+ { name: 'B', rating: 3 },
+ { name: 'C', rating: 2 },
+ { name: 'D', rating: 4 },
+ { name: 'E', rating: 3 },
+ { name: 'F', rating: 3 },
+ { name: 'G', rating: 4 },
+ { name: 'H', rating: 3 },
+ { name: 'I', rating: 2 },
+ { name: 'J', rating: 2 },
+ { name: 'K', rating: 2 },
+];
+assert.sameValue(array.length, 11);
+
+// Sort the elements by `rating` in descending order.
+// (This updates `array` in place.)
+array.sort((a, b) => b.rating - a.rating);
+
+const reduced = array.reduce((acc, element) => acc + element.name, '');
+assert.sameValue(reduced, 'DGBEFHACIJK');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/stability-2048-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-2048-elements.js
new file mode 100644
index 0000000000..e791036a26
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-2048-elements.js
@@ -0,0 +1,2083 @@
+// Copyright (C) 2018 Mathias Bynens. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Stability of Array.prototype.sort for an array with 2048 elements.
+info: |
+ The sort is required to be stable (that is, elements that compare equal
+ remain in their original order).
+ The array length of 2048 was chosen because as of late 2018, Chakra
+ uses merge sort for arrays with 2048 or more elements. It uses
+ insertion sort for smaller arrays.
+ https://github.com/Microsoft/ChakraCore/pull/5724/files#diff-85203ec16f5961eb4c18e4253bb42140R337
+---*/
+
+const array = [
+ { name: 'A000', rating: 2 },
+ { name: 'A001', rating: 2 },
+ { name: 'A002', rating: 2 },
+ { name: 'A003', rating: 2 },
+ { name: 'A004', rating: 2 },
+ { name: 'A005', rating: 2 },
+ { name: 'A006', rating: 2 },
+ { name: 'A007', rating: 2 },
+ { name: 'A008', rating: 2 },
+ { name: 'A009', rating: 2 },
+ { name: 'A010', rating: 2 },
+ { name: 'A011', rating: 2 },
+ { name: 'A012', rating: 2 },
+ { name: 'A013', rating: 2 },
+ { name: 'A014', rating: 2 },
+ { name: 'A015', rating: 2 },
+ { name: 'A016', rating: 2 },
+ { name: 'A017', rating: 2 },
+ { name: 'A018', rating: 2 },
+ { name: 'A019', rating: 2 },
+ { name: 'A020', rating: 2 },
+ { name: 'A021', rating: 2 },
+ { name: 'A022', rating: 2 },
+ { name: 'A023', rating: 2 },
+ { name: 'A024', rating: 2 },
+ { name: 'A025', rating: 2 },
+ { name: 'A026', rating: 2 },
+ { name: 'A027', rating: 2 },
+ { name: 'A028', rating: 2 },
+ { name: 'A029', rating: 2 },
+ { name: 'A030', rating: 2 },
+ { name: 'A031', rating: 2 },
+ { name: 'A032', rating: 2 },
+ { name: 'A033', rating: 2 },
+ { name: 'A034', rating: 2 },
+ { name: 'A035', rating: 2 },
+ { name: 'A036', rating: 2 },
+ { name: 'A037', rating: 2 },
+ { name: 'A038', rating: 2 },
+ { name: 'A039', rating: 2 },
+ { name: 'A040', rating: 2 },
+ { name: 'A041', rating: 2 },
+ { name: 'A042', rating: 2 },
+ { name: 'A043', rating: 2 },
+ { name: 'A044', rating: 2 },
+ { name: 'A045', rating: 2 },
+ { name: 'A046', rating: 2 },
+ { name: 'A047', rating: 2 },
+ { name: 'A048', rating: 2 },
+ { name: 'A049', rating: 2 },
+ { name: 'A050', rating: 2 },
+ { name: 'A051', rating: 2 },
+ { name: 'A052', rating: 2 },
+ { name: 'A053', rating: 2 },
+ { name: 'A054', rating: 2 },
+ { name: 'A055', rating: 2 },
+ { name: 'A056', rating: 2 },
+ { name: 'A057', rating: 2 },
+ { name: 'A058', rating: 2 },
+ { name: 'A059', rating: 2 },
+ { name: 'A060', rating: 2 },
+ { name: 'A061', rating: 2 },
+ { name: 'A062', rating: 2 },
+ { name: 'A063', rating: 2 },
+ { name: 'A064', rating: 2 },
+ { name: 'A065', rating: 2 },
+ { name: 'A066', rating: 2 },
+ { name: 'A067', rating: 2 },
+ { name: 'A068', rating: 2 },
+ { name: 'A069', rating: 2 },
+ { name: 'A070', rating: 2 },
+ { name: 'A071', rating: 2 },
+ { name: 'A072', rating: 2 },
+ { name: 'A073', rating: 2 },
+ { name: 'A074', rating: 2 },
+ { name: 'A075', rating: 2 },
+ { name: 'A076', rating: 2 },
+ { name: 'A077', rating: 2 },
+ { name: 'A078', rating: 2 },
+ { name: 'A079', rating: 2 },
+ { name: 'A080', rating: 2 },
+ { name: 'A081', rating: 2 },
+ { name: 'A082', rating: 2 },
+ { name: 'A083', rating: 2 },
+ { name: 'A084', rating: 2 },
+ { name: 'A085', rating: 2 },
+ { name: 'A086', rating: 2 },
+ { name: 'A087', rating: 2 },
+ { name: 'A088', rating: 2 },
+ { name: 'A089', rating: 2 },
+ { name: 'A090', rating: 2 },
+ { name: 'A091', rating: 2 },
+ { name: 'A092', rating: 2 },
+ { name: 'A093', rating: 2 },
+ { name: 'A094', rating: 2 },
+ { name: 'A095', rating: 2 },
+ { name: 'A096', rating: 2 },
+ { name: 'A097', rating: 2 },
+ { name: 'A098', rating: 2 },
+ { name: 'A099', rating: 2 },
+ { name: 'A100', rating: 2 },
+ { name: 'A101', rating: 2 },
+ { name: 'A102', rating: 2 },
+ { name: 'A103', rating: 2 },
+ { name: 'A104', rating: 2 },
+ { name: 'A105', rating: 2 },
+ { name: 'A106', rating: 2 },
+ { name: 'A107', rating: 2 },
+ { name: 'A108', rating: 2 },
+ { name: 'A109', rating: 2 },
+ { name: 'A110', rating: 2 },
+ { name: 'A111', rating: 2 },
+ { name: 'A112', rating: 2 },
+ { name: 'A113', rating: 2 },
+ { name: 'A114', rating: 2 },
+ { name: 'A115', rating: 2 },
+ { name: 'A116', rating: 2 },
+ { name: 'A117', rating: 2 },
+ { name: 'A118', rating: 2 },
+ { name: 'A119', rating: 2 },
+ { name: 'A120', rating: 2 },
+ { name: 'A121', rating: 2 },
+ { name: 'A122', rating: 2 },
+ { name: 'A123', rating: 2 },
+ { name: 'A124', rating: 2 },
+ { name: 'A125', rating: 2 },
+ { name: 'A126', rating: 2 },
+ { name: 'A127', rating: 2 },
+ { name: 'A128', rating: 2 },
+ { name: 'A129', rating: 2 },
+ { name: 'A130', rating: 2 },
+ { name: 'A131', rating: 2 },
+ { name: 'A132', rating: 2 },
+ { name: 'A133', rating: 2 },
+ { name: 'A134', rating: 2 },
+ { name: 'A135', rating: 2 },
+ { name: 'A136', rating: 2 },
+ { name: 'A137', rating: 2 },
+ { name: 'A138', rating: 2 },
+ { name: 'A139', rating: 2 },
+ { name: 'A140', rating: 2 },
+ { name: 'A141', rating: 2 },
+ { name: 'A142', rating: 2 },
+ { name: 'A143', rating: 2 },
+ { name: 'A144', rating: 2 },
+ { name: 'A145', rating: 2 },
+ { name: 'A146', rating: 2 },
+ { name: 'A147', rating: 2 },
+ { name: 'A148', rating: 2 },
+ { name: 'A149', rating: 2 },
+ { name: 'A150', rating: 2 },
+ { name: 'A151', rating: 2 },
+ { name: 'A152', rating: 2 },
+ { name: 'A153', rating: 2 },
+ { name: 'A154', rating: 2 },
+ { name: 'A155', rating: 2 },
+ { name: 'A156', rating: 2 },
+ { name: 'A157', rating: 2 },
+ { name: 'A158', rating: 2 },
+ { name: 'A159', rating: 2 },
+ { name: 'A160', rating: 2 },
+ { name: 'A161', rating: 2 },
+ { name: 'A162', rating: 2 },
+ { name: 'A163', rating: 2 },
+ { name: 'A164', rating: 2 },
+ { name: 'A165', rating: 2 },
+ { name: 'A166', rating: 2 },
+ { name: 'A167', rating: 2 },
+ { name: 'A168', rating: 2 },
+ { name: 'A169', rating: 2 },
+ { name: 'A170', rating: 2 },
+ { name: 'A171', rating: 2 },
+ { name: 'A172', rating: 2 },
+ { name: 'A173', rating: 2 },
+ { name: 'A174', rating: 2 },
+ { name: 'A175', rating: 2 },
+ { name: 'A176', rating: 2 },
+ { name: 'A177', rating: 2 },
+ { name: 'A178', rating: 2 },
+ { name: 'A179', rating: 2 },
+ { name: 'A180', rating: 2 },
+ { name: 'A181', rating: 2 },
+ { name: 'A182', rating: 2 },
+ { name: 'A183', rating: 2 },
+ { name: 'A184', rating: 2 },
+ { name: 'A185', rating: 2 },
+ { name: 'A186', rating: 2 },
+ { name: 'B000', rating: 3 },
+ { name: 'B001', rating: 3 },
+ { name: 'B002', rating: 3 },
+ { name: 'B003', rating: 3 },
+ { name: 'B004', rating: 3 },
+ { name: 'B005', rating: 3 },
+ { name: 'B006', rating: 3 },
+ { name: 'B007', rating: 3 },
+ { name: 'B008', rating: 3 },
+ { name: 'B009', rating: 3 },
+ { name: 'B010', rating: 3 },
+ { name: 'B011', rating: 3 },
+ { name: 'B012', rating: 3 },
+ { name: 'B013', rating: 3 },
+ { name: 'B014', rating: 3 },
+ { name: 'B015', rating: 3 },
+ { name: 'B016', rating: 3 },
+ { name: 'B017', rating: 3 },
+ { name: 'B018', rating: 3 },
+ { name: 'B019', rating: 3 },
+ { name: 'B020', rating: 3 },
+ { name: 'B021', rating: 3 },
+ { name: 'B022', rating: 3 },
+ { name: 'B023', rating: 3 },
+ { name: 'B024', rating: 3 },
+ { name: 'B025', rating: 3 },
+ { name: 'B026', rating: 3 },
+ { name: 'B027', rating: 3 },
+ { name: 'B028', rating: 3 },
+ { name: 'B029', rating: 3 },
+ { name: 'B030', rating: 3 },
+ { name: 'B031', rating: 3 },
+ { name: 'B032', rating: 3 },
+ { name: 'B033', rating: 3 },
+ { name: 'B034', rating: 3 },
+ { name: 'B035', rating: 3 },
+ { name: 'B036', rating: 3 },
+ { name: 'B037', rating: 3 },
+ { name: 'B038', rating: 3 },
+ { name: 'B039', rating: 3 },
+ { name: 'B040', rating: 3 },
+ { name: 'B041', rating: 3 },
+ { name: 'B042', rating: 3 },
+ { name: 'B043', rating: 3 },
+ { name: 'B044', rating: 3 },
+ { name: 'B045', rating: 3 },
+ { name: 'B046', rating: 3 },
+ { name: 'B047', rating: 3 },
+ { name: 'B048', rating: 3 },
+ { name: 'B049', rating: 3 },
+ { name: 'B050', rating: 3 },
+ { name: 'B051', rating: 3 },
+ { name: 'B052', rating: 3 },
+ { name: 'B053', rating: 3 },
+ { name: 'B054', rating: 3 },
+ { name: 'B055', rating: 3 },
+ { name: 'B056', rating: 3 },
+ { name: 'B057', rating: 3 },
+ { name: 'B058', rating: 3 },
+ { name: 'B059', rating: 3 },
+ { name: 'B060', rating: 3 },
+ { name: 'B061', rating: 3 },
+ { name: 'B062', rating: 3 },
+ { name: 'B063', rating: 3 },
+ { name: 'B064', rating: 3 },
+ { name: 'B065', rating: 3 },
+ { name: 'B066', rating: 3 },
+ { name: 'B067', rating: 3 },
+ { name: 'B068', rating: 3 },
+ { name: 'B069', rating: 3 },
+ { name: 'B070', rating: 3 },
+ { name: 'B071', rating: 3 },
+ { name: 'B072', rating: 3 },
+ { name: 'B073', rating: 3 },
+ { name: 'B074', rating: 3 },
+ { name: 'B075', rating: 3 },
+ { name: 'B076', rating: 3 },
+ { name: 'B077', rating: 3 },
+ { name: 'B078', rating: 3 },
+ { name: 'B079', rating: 3 },
+ { name: 'B080', rating: 3 },
+ { name: 'B081', rating: 3 },
+ { name: 'B082', rating: 3 },
+ { name: 'B083', rating: 3 },
+ { name: 'B084', rating: 3 },
+ { name: 'B085', rating: 3 },
+ { name: 'B086', rating: 3 },
+ { name: 'B087', rating: 3 },
+ { name: 'B088', rating: 3 },
+ { name: 'B089', rating: 3 },
+ { name: 'B090', rating: 3 },
+ { name: 'B091', rating: 3 },
+ { name: 'B092', rating: 3 },
+ { name: 'B093', rating: 3 },
+ { name: 'B094', rating: 3 },
+ { name: 'B095', rating: 3 },
+ { name: 'B096', rating: 3 },
+ { name: 'B097', rating: 3 },
+ { name: 'B098', rating: 3 },
+ { name: 'B099', rating: 3 },
+ { name: 'B100', rating: 3 },
+ { name: 'B101', rating: 3 },
+ { name: 'B102', rating: 3 },
+ { name: 'B103', rating: 3 },
+ { name: 'B104', rating: 3 },
+ { name: 'B105', rating: 3 },
+ { name: 'B106', rating: 3 },
+ { name: 'B107', rating: 3 },
+ { name: 'B108', rating: 3 },
+ { name: 'B109', rating: 3 },
+ { name: 'B110', rating: 3 },
+ { name: 'B111', rating: 3 },
+ { name: 'B112', rating: 3 },
+ { name: 'B113', rating: 3 },
+ { name: 'B114', rating: 3 },
+ { name: 'B115', rating: 3 },
+ { name: 'B116', rating: 3 },
+ { name: 'B117', rating: 3 },
+ { name: 'B118', rating: 3 },
+ { name: 'B119', rating: 3 },
+ { name: 'B120', rating: 3 },
+ { name: 'B121', rating: 3 },
+ { name: 'B122', rating: 3 },
+ { name: 'B123', rating: 3 },
+ { name: 'B124', rating: 3 },
+ { name: 'B125', rating: 3 },
+ { name: 'B126', rating: 3 },
+ { name: 'B127', rating: 3 },
+ { name: 'B128', rating: 3 },
+ { name: 'B129', rating: 3 },
+ { name: 'B130', rating: 3 },
+ { name: 'B131', rating: 3 },
+ { name: 'B132', rating: 3 },
+ { name: 'B133', rating: 3 },
+ { name: 'B134', rating: 3 },
+ { name: 'B135', rating: 3 },
+ { name: 'B136', rating: 3 },
+ { name: 'B137', rating: 3 },
+ { name: 'B138', rating: 3 },
+ { name: 'B139', rating: 3 },
+ { name: 'B140', rating: 3 },
+ { name: 'B141', rating: 3 },
+ { name: 'B142', rating: 3 },
+ { name: 'B143', rating: 3 },
+ { name: 'B144', rating: 3 },
+ { name: 'B145', rating: 3 },
+ { name: 'B146', rating: 3 },
+ { name: 'B147', rating: 3 },
+ { name: 'B148', rating: 3 },
+ { name: 'B149', rating: 3 },
+ { name: 'B150', rating: 3 },
+ { name: 'B151', rating: 3 },
+ { name: 'B152', rating: 3 },
+ { name: 'B153', rating: 3 },
+ { name: 'B154', rating: 3 },
+ { name: 'B155', rating: 3 },
+ { name: 'B156', rating: 3 },
+ { name: 'B157', rating: 3 },
+ { name: 'B158', rating: 3 },
+ { name: 'B159', rating: 3 },
+ { name: 'B160', rating: 3 },
+ { name: 'B161', rating: 3 },
+ { name: 'B162', rating: 3 },
+ { name: 'B163', rating: 3 },
+ { name: 'B164', rating: 3 },
+ { name: 'B165', rating: 3 },
+ { name: 'B166', rating: 3 },
+ { name: 'B167', rating: 3 },
+ { name: 'B168', rating: 3 },
+ { name: 'B169', rating: 3 },
+ { name: 'B170', rating: 3 },
+ { name: 'B171', rating: 3 },
+ { name: 'B172', rating: 3 },
+ { name: 'B173', rating: 3 },
+ { name: 'B174', rating: 3 },
+ { name: 'B175', rating: 3 },
+ { name: 'B176', rating: 3 },
+ { name: 'B177', rating: 3 },
+ { name: 'B178', rating: 3 },
+ { name: 'B179', rating: 3 },
+ { name: 'B180', rating: 3 },
+ { name: 'B181', rating: 3 },
+ { name: 'B182', rating: 3 },
+ { name: 'B183', rating: 3 },
+ { name: 'B184', rating: 3 },
+ { name: 'B185', rating: 3 },
+ { name: 'B186', rating: 3 },
+ { name: 'C000', rating: 2 },
+ { name: 'C001', rating: 2 },
+ { name: 'C002', rating: 2 },
+ { name: 'C003', rating: 2 },
+ { name: 'C004', rating: 2 },
+ { name: 'C005', rating: 2 },
+ { name: 'C006', rating: 2 },
+ { name: 'C007', rating: 2 },
+ { name: 'C008', rating: 2 },
+ { name: 'C009', rating: 2 },
+ { name: 'C010', rating: 2 },
+ { name: 'C011', rating: 2 },
+ { name: 'C012', rating: 2 },
+ { name: 'C013', rating: 2 },
+ { name: 'C014', rating: 2 },
+ { name: 'C015', rating: 2 },
+ { name: 'C016', rating: 2 },
+ { name: 'C017', rating: 2 },
+ { name: 'C018', rating: 2 },
+ { name: 'C019', rating: 2 },
+ { name: 'C020', rating: 2 },
+ { name: 'C021', rating: 2 },
+ { name: 'C022', rating: 2 },
+ { name: 'C023', rating: 2 },
+ { name: 'C024', rating: 2 },
+ { name: 'C025', rating: 2 },
+ { name: 'C026', rating: 2 },
+ { name: 'C027', rating: 2 },
+ { name: 'C028', rating: 2 },
+ { name: 'C029', rating: 2 },
+ { name: 'C030', rating: 2 },
+ { name: 'C031', rating: 2 },
+ { name: 'C032', rating: 2 },
+ { name: 'C033', rating: 2 },
+ { name: 'C034', rating: 2 },
+ { name: 'C035', rating: 2 },
+ { name: 'C036', rating: 2 },
+ { name: 'C037', rating: 2 },
+ { name: 'C038', rating: 2 },
+ { name: 'C039', rating: 2 },
+ { name: 'C040', rating: 2 },
+ { name: 'C041', rating: 2 },
+ { name: 'C042', rating: 2 },
+ { name: 'C043', rating: 2 },
+ { name: 'C044', rating: 2 },
+ { name: 'C045', rating: 2 },
+ { name: 'C046', rating: 2 },
+ { name: 'C047', rating: 2 },
+ { name: 'C048', rating: 2 },
+ { name: 'C049', rating: 2 },
+ { name: 'C050', rating: 2 },
+ { name: 'C051', rating: 2 },
+ { name: 'C052', rating: 2 },
+ { name: 'C053', rating: 2 },
+ { name: 'C054', rating: 2 },
+ { name: 'C055', rating: 2 },
+ { name: 'C056', rating: 2 },
+ { name: 'C057', rating: 2 },
+ { name: 'C058', rating: 2 },
+ { name: 'C059', rating: 2 },
+ { name: 'C060', rating: 2 },
+ { name: 'C061', rating: 2 },
+ { name: 'C062', rating: 2 },
+ { name: 'C063', rating: 2 },
+ { name: 'C064', rating: 2 },
+ { name: 'C065', rating: 2 },
+ { name: 'C066', rating: 2 },
+ { name: 'C067', rating: 2 },
+ { name: 'C068', rating: 2 },
+ { name: 'C069', rating: 2 },
+ { name: 'C070', rating: 2 },
+ { name: 'C071', rating: 2 },
+ { name: 'C072', rating: 2 },
+ { name: 'C073', rating: 2 },
+ { name: 'C074', rating: 2 },
+ { name: 'C075', rating: 2 },
+ { name: 'C076', rating: 2 },
+ { name: 'C077', rating: 2 },
+ { name: 'C078', rating: 2 },
+ { name: 'C079', rating: 2 },
+ { name: 'C080', rating: 2 },
+ { name: 'C081', rating: 2 },
+ { name: 'C082', rating: 2 },
+ { name: 'C083', rating: 2 },
+ { name: 'C084', rating: 2 },
+ { name: 'C085', rating: 2 },
+ { name: 'C086', rating: 2 },
+ { name: 'C087', rating: 2 },
+ { name: 'C088', rating: 2 },
+ { name: 'C089', rating: 2 },
+ { name: 'C090', rating: 2 },
+ { name: 'C091', rating: 2 },
+ { name: 'C092', rating: 2 },
+ { name: 'C093', rating: 2 },
+ { name: 'C094', rating: 2 },
+ { name: 'C095', rating: 2 },
+ { name: 'C096', rating: 2 },
+ { name: 'C097', rating: 2 },
+ { name: 'C098', rating: 2 },
+ { name: 'C099', rating: 2 },
+ { name: 'C100', rating: 2 },
+ { name: 'C101', rating: 2 },
+ { name: 'C102', rating: 2 },
+ { name: 'C103', rating: 2 },
+ { name: 'C104', rating: 2 },
+ { name: 'C105', rating: 2 },
+ { name: 'C106', rating: 2 },
+ { name: 'C107', rating: 2 },
+ { name: 'C108', rating: 2 },
+ { name: 'C109', rating: 2 },
+ { name: 'C110', rating: 2 },
+ { name: 'C111', rating: 2 },
+ { name: 'C112', rating: 2 },
+ { name: 'C113', rating: 2 },
+ { name: 'C114', rating: 2 },
+ { name: 'C115', rating: 2 },
+ { name: 'C116', rating: 2 },
+ { name: 'C117', rating: 2 },
+ { name: 'C118', rating: 2 },
+ { name: 'C119', rating: 2 },
+ { name: 'C120', rating: 2 },
+ { name: 'C121', rating: 2 },
+ { name: 'C122', rating: 2 },
+ { name: 'C123', rating: 2 },
+ { name: 'C124', rating: 2 },
+ { name: 'C125', rating: 2 },
+ { name: 'C126', rating: 2 },
+ { name: 'C127', rating: 2 },
+ { name: 'C128', rating: 2 },
+ { name: 'C129', rating: 2 },
+ { name: 'C130', rating: 2 },
+ { name: 'C131', rating: 2 },
+ { name: 'C132', rating: 2 },
+ { name: 'C133', rating: 2 },
+ { name: 'C134', rating: 2 },
+ { name: 'C135', rating: 2 },
+ { name: 'C136', rating: 2 },
+ { name: 'C137', rating: 2 },
+ { name: 'C138', rating: 2 },
+ { name: 'C139', rating: 2 },
+ { name: 'C140', rating: 2 },
+ { name: 'C141', rating: 2 },
+ { name: 'C142', rating: 2 },
+ { name: 'C143', rating: 2 },
+ { name: 'C144', rating: 2 },
+ { name: 'C145', rating: 2 },
+ { name: 'C146', rating: 2 },
+ { name: 'C147', rating: 2 },
+ { name: 'C148', rating: 2 },
+ { name: 'C149', rating: 2 },
+ { name: 'C150', rating: 2 },
+ { name: 'C151', rating: 2 },
+ { name: 'C152', rating: 2 },
+ { name: 'C153', rating: 2 },
+ { name: 'C154', rating: 2 },
+ { name: 'C155', rating: 2 },
+ { name: 'C156', rating: 2 },
+ { name: 'C157', rating: 2 },
+ { name: 'C158', rating: 2 },
+ { name: 'C159', rating: 2 },
+ { name: 'C160', rating: 2 },
+ { name: 'C161', rating: 2 },
+ { name: 'C162', rating: 2 },
+ { name: 'C163', rating: 2 },
+ { name: 'C164', rating: 2 },
+ { name: 'C165', rating: 2 },
+ { name: 'C166', rating: 2 },
+ { name: 'C167', rating: 2 },
+ { name: 'C168', rating: 2 },
+ { name: 'C169', rating: 2 },
+ { name: 'C170', rating: 2 },
+ { name: 'C171', rating: 2 },
+ { name: 'C172', rating: 2 },
+ { name: 'C173', rating: 2 },
+ { name: 'C174', rating: 2 },
+ { name: 'C175', rating: 2 },
+ { name: 'C176', rating: 2 },
+ { name: 'C177', rating: 2 },
+ { name: 'C178', rating: 2 },
+ { name: 'C179', rating: 2 },
+ { name: 'C180', rating: 2 },
+ { name: 'C181', rating: 2 },
+ { name: 'C182', rating: 2 },
+ { name: 'C183', rating: 2 },
+ { name: 'C184', rating: 2 },
+ { name: 'C185', rating: 2 },
+ { name: 'C186', rating: 2 },
+ { name: 'D000', rating: 4 },
+ { name: 'D001', rating: 4 },
+ { name: 'D002', rating: 4 },
+ { name: 'D003', rating: 4 },
+ { name: 'D004', rating: 4 },
+ { name: 'D005', rating: 4 },
+ { name: 'D006', rating: 4 },
+ { name: 'D007', rating: 4 },
+ { name: 'D008', rating: 4 },
+ { name: 'D009', rating: 4 },
+ { name: 'D010', rating: 4 },
+ { name: 'D011', rating: 4 },
+ { name: 'D012', rating: 4 },
+ { name: 'D013', rating: 4 },
+ { name: 'D014', rating: 4 },
+ { name: 'D015', rating: 4 },
+ { name: 'D016', rating: 4 },
+ { name: 'D017', rating: 4 },
+ { name: 'D018', rating: 4 },
+ { name: 'D019', rating: 4 },
+ { name: 'D020', rating: 4 },
+ { name: 'D021', rating: 4 },
+ { name: 'D022', rating: 4 },
+ { name: 'D023', rating: 4 },
+ { name: 'D024', rating: 4 },
+ { name: 'D025', rating: 4 },
+ { name: 'D026', rating: 4 },
+ { name: 'D027', rating: 4 },
+ { name: 'D028', rating: 4 },
+ { name: 'D029', rating: 4 },
+ { name: 'D030', rating: 4 },
+ { name: 'D031', rating: 4 },
+ { name: 'D032', rating: 4 },
+ { name: 'D033', rating: 4 },
+ { name: 'D034', rating: 4 },
+ { name: 'D035', rating: 4 },
+ { name: 'D036', rating: 4 },
+ { name: 'D037', rating: 4 },
+ { name: 'D038', rating: 4 },
+ { name: 'D039', rating: 4 },
+ { name: 'D040', rating: 4 },
+ { name: 'D041', rating: 4 },
+ { name: 'D042', rating: 4 },
+ { name: 'D043', rating: 4 },
+ { name: 'D044', rating: 4 },
+ { name: 'D045', rating: 4 },
+ { name: 'D046', rating: 4 },
+ { name: 'D047', rating: 4 },
+ { name: 'D048', rating: 4 },
+ { name: 'D049', rating: 4 },
+ { name: 'D050', rating: 4 },
+ { name: 'D051', rating: 4 },
+ { name: 'D052', rating: 4 },
+ { name: 'D053', rating: 4 },
+ { name: 'D054', rating: 4 },
+ { name: 'D055', rating: 4 },
+ { name: 'D056', rating: 4 },
+ { name: 'D057', rating: 4 },
+ { name: 'D058', rating: 4 },
+ { name: 'D059', rating: 4 },
+ { name: 'D060', rating: 4 },
+ { name: 'D061', rating: 4 },
+ { name: 'D062', rating: 4 },
+ { name: 'D063', rating: 4 },
+ { name: 'D064', rating: 4 },
+ { name: 'D065', rating: 4 },
+ { name: 'D066', rating: 4 },
+ { name: 'D067', rating: 4 },
+ { name: 'D068', rating: 4 },
+ { name: 'D069', rating: 4 },
+ { name: 'D070', rating: 4 },
+ { name: 'D071', rating: 4 },
+ { name: 'D072', rating: 4 },
+ { name: 'D073', rating: 4 },
+ { name: 'D074', rating: 4 },
+ { name: 'D075', rating: 4 },
+ { name: 'D076', rating: 4 },
+ { name: 'D077', rating: 4 },
+ { name: 'D078', rating: 4 },
+ { name: 'D079', rating: 4 },
+ { name: 'D080', rating: 4 },
+ { name: 'D081', rating: 4 },
+ { name: 'D082', rating: 4 },
+ { name: 'D083', rating: 4 },
+ { name: 'D084', rating: 4 },
+ { name: 'D085', rating: 4 },
+ { name: 'D086', rating: 4 },
+ { name: 'D087', rating: 4 },
+ { name: 'D088', rating: 4 },
+ { name: 'D089', rating: 4 },
+ { name: 'D090', rating: 4 },
+ { name: 'D091', rating: 4 },
+ { name: 'D092', rating: 4 },
+ { name: 'D093', rating: 4 },
+ { name: 'D094', rating: 4 },
+ { name: 'D095', rating: 4 },
+ { name: 'D096', rating: 4 },
+ { name: 'D097', rating: 4 },
+ { name: 'D098', rating: 4 },
+ { name: 'D099', rating: 4 },
+ { name: 'D100', rating: 4 },
+ { name: 'D101', rating: 4 },
+ { name: 'D102', rating: 4 },
+ { name: 'D103', rating: 4 },
+ { name: 'D104', rating: 4 },
+ { name: 'D105', rating: 4 },
+ { name: 'D106', rating: 4 },
+ { name: 'D107', rating: 4 },
+ { name: 'D108', rating: 4 },
+ { name: 'D109', rating: 4 },
+ { name: 'D110', rating: 4 },
+ { name: 'D111', rating: 4 },
+ { name: 'D112', rating: 4 },
+ { name: 'D113', rating: 4 },
+ { name: 'D114', rating: 4 },
+ { name: 'D115', rating: 4 },
+ { name: 'D116', rating: 4 },
+ { name: 'D117', rating: 4 },
+ { name: 'D118', rating: 4 },
+ { name: 'D119', rating: 4 },
+ { name: 'D120', rating: 4 },
+ { name: 'D121', rating: 4 },
+ { name: 'D122', rating: 4 },
+ { name: 'D123', rating: 4 },
+ { name: 'D124', rating: 4 },
+ { name: 'D125', rating: 4 },
+ { name: 'D126', rating: 4 },
+ { name: 'D127', rating: 4 },
+ { name: 'D128', rating: 4 },
+ { name: 'D129', rating: 4 },
+ { name: 'D130', rating: 4 },
+ { name: 'D131', rating: 4 },
+ { name: 'D132', rating: 4 },
+ { name: 'D133', rating: 4 },
+ { name: 'D134', rating: 4 },
+ { name: 'D135', rating: 4 },
+ { name: 'D136', rating: 4 },
+ { name: 'D137', rating: 4 },
+ { name: 'D138', rating: 4 },
+ { name: 'D139', rating: 4 },
+ { name: 'D140', rating: 4 },
+ { name: 'D141', rating: 4 },
+ { name: 'D142', rating: 4 },
+ { name: 'D143', rating: 4 },
+ { name: 'D144', rating: 4 },
+ { name: 'D145', rating: 4 },
+ { name: 'D146', rating: 4 },
+ { name: 'D147', rating: 4 },
+ { name: 'D148', rating: 4 },
+ { name: 'D149', rating: 4 },
+ { name: 'D150', rating: 4 },
+ { name: 'D151', rating: 4 },
+ { name: 'D152', rating: 4 },
+ { name: 'D153', rating: 4 },
+ { name: 'D154', rating: 4 },
+ { name: 'D155', rating: 4 },
+ { name: 'D156', rating: 4 },
+ { name: 'D157', rating: 4 },
+ { name: 'D158', rating: 4 },
+ { name: 'D159', rating: 4 },
+ { name: 'D160', rating: 4 },
+ { name: 'D161', rating: 4 },
+ { name: 'D162', rating: 4 },
+ { name: 'D163', rating: 4 },
+ { name: 'D164', rating: 4 },
+ { name: 'D165', rating: 4 },
+ { name: 'D166', rating: 4 },
+ { name: 'D167', rating: 4 },
+ { name: 'D168', rating: 4 },
+ { name: 'D169', rating: 4 },
+ { name: 'D170', rating: 4 },
+ { name: 'D171', rating: 4 },
+ { name: 'D172', rating: 4 },
+ { name: 'D173', rating: 4 },
+ { name: 'D174', rating: 4 },
+ { name: 'D175', rating: 4 },
+ { name: 'D176', rating: 4 },
+ { name: 'D177', rating: 4 },
+ { name: 'D178', rating: 4 },
+ { name: 'D179', rating: 4 },
+ { name: 'D180', rating: 4 },
+ { name: 'D181', rating: 4 },
+ { name: 'D182', rating: 4 },
+ { name: 'D183', rating: 4 },
+ { name: 'D184', rating: 4 },
+ { name: 'D185', rating: 4 },
+ { name: 'D186', rating: 4 },
+ { name: 'E000', rating: 3 },
+ { name: 'E001', rating: 3 },
+ { name: 'E002', rating: 3 },
+ { name: 'E003', rating: 3 },
+ { name: 'E004', rating: 3 },
+ { name: 'E005', rating: 3 },
+ { name: 'E006', rating: 3 },
+ { name: 'E007', rating: 3 },
+ { name: 'E008', rating: 3 },
+ { name: 'E009', rating: 3 },
+ { name: 'E010', rating: 3 },
+ { name: 'E011', rating: 3 },
+ { name: 'E012', rating: 3 },
+ { name: 'E013', rating: 3 },
+ { name: 'E014', rating: 3 },
+ { name: 'E015', rating: 3 },
+ { name: 'E016', rating: 3 },
+ { name: 'E017', rating: 3 },
+ { name: 'E018', rating: 3 },
+ { name: 'E019', rating: 3 },
+ { name: 'E020', rating: 3 },
+ { name: 'E021', rating: 3 },
+ { name: 'E022', rating: 3 },
+ { name: 'E023', rating: 3 },
+ { name: 'E024', rating: 3 },
+ { name: 'E025', rating: 3 },
+ { name: 'E026', rating: 3 },
+ { name: 'E027', rating: 3 },
+ { name: 'E028', rating: 3 },
+ { name: 'E029', rating: 3 },
+ { name: 'E030', rating: 3 },
+ { name: 'E031', rating: 3 },
+ { name: 'E032', rating: 3 },
+ { name: 'E033', rating: 3 },
+ { name: 'E034', rating: 3 },
+ { name: 'E035', rating: 3 },
+ { name: 'E036', rating: 3 },
+ { name: 'E037', rating: 3 },
+ { name: 'E038', rating: 3 },
+ { name: 'E039', rating: 3 },
+ { name: 'E040', rating: 3 },
+ { name: 'E041', rating: 3 },
+ { name: 'E042', rating: 3 },
+ { name: 'E043', rating: 3 },
+ { name: 'E044', rating: 3 },
+ { name: 'E045', rating: 3 },
+ { name: 'E046', rating: 3 },
+ { name: 'E047', rating: 3 },
+ { name: 'E048', rating: 3 },
+ { name: 'E049', rating: 3 },
+ { name: 'E050', rating: 3 },
+ { name: 'E051', rating: 3 },
+ { name: 'E052', rating: 3 },
+ { name: 'E053', rating: 3 },
+ { name: 'E054', rating: 3 },
+ { name: 'E055', rating: 3 },
+ { name: 'E056', rating: 3 },
+ { name: 'E057', rating: 3 },
+ { name: 'E058', rating: 3 },
+ { name: 'E059', rating: 3 },
+ { name: 'E060', rating: 3 },
+ { name: 'E061', rating: 3 },
+ { name: 'E062', rating: 3 },
+ { name: 'E063', rating: 3 },
+ { name: 'E064', rating: 3 },
+ { name: 'E065', rating: 3 },
+ { name: 'E066', rating: 3 },
+ { name: 'E067', rating: 3 },
+ { name: 'E068', rating: 3 },
+ { name: 'E069', rating: 3 },
+ { name: 'E070', rating: 3 },
+ { name: 'E071', rating: 3 },
+ { name: 'E072', rating: 3 },
+ { name: 'E073', rating: 3 },
+ { name: 'E074', rating: 3 },
+ { name: 'E075', rating: 3 },
+ { name: 'E076', rating: 3 },
+ { name: 'E077', rating: 3 },
+ { name: 'E078', rating: 3 },
+ { name: 'E079', rating: 3 },
+ { name: 'E080', rating: 3 },
+ { name: 'E081', rating: 3 },
+ { name: 'E082', rating: 3 },
+ { name: 'E083', rating: 3 },
+ { name: 'E084', rating: 3 },
+ { name: 'E085', rating: 3 },
+ { name: 'E086', rating: 3 },
+ { name: 'E087', rating: 3 },
+ { name: 'E088', rating: 3 },
+ { name: 'E089', rating: 3 },
+ { name: 'E090', rating: 3 },
+ { name: 'E091', rating: 3 },
+ { name: 'E092', rating: 3 },
+ { name: 'E093', rating: 3 },
+ { name: 'E094', rating: 3 },
+ { name: 'E095', rating: 3 },
+ { name: 'E096', rating: 3 },
+ { name: 'E097', rating: 3 },
+ { name: 'E098', rating: 3 },
+ { name: 'E099', rating: 3 },
+ { name: 'E100', rating: 3 },
+ { name: 'E101', rating: 3 },
+ { name: 'E102', rating: 3 },
+ { name: 'E103', rating: 3 },
+ { name: 'E104', rating: 3 },
+ { name: 'E105', rating: 3 },
+ { name: 'E106', rating: 3 },
+ { name: 'E107', rating: 3 },
+ { name: 'E108', rating: 3 },
+ { name: 'E109', rating: 3 },
+ { name: 'E110', rating: 3 },
+ { name: 'E111', rating: 3 },
+ { name: 'E112', rating: 3 },
+ { name: 'E113', rating: 3 },
+ { name: 'E114', rating: 3 },
+ { name: 'E115', rating: 3 },
+ { name: 'E116', rating: 3 },
+ { name: 'E117', rating: 3 },
+ { name: 'E118', rating: 3 },
+ { name: 'E119', rating: 3 },
+ { name: 'E120', rating: 3 },
+ { name: 'E121', rating: 3 },
+ { name: 'E122', rating: 3 },
+ { name: 'E123', rating: 3 },
+ { name: 'E124', rating: 3 },
+ { name: 'E125', rating: 3 },
+ { name: 'E126', rating: 3 },
+ { name: 'E127', rating: 3 },
+ { name: 'E128', rating: 3 },
+ { name: 'E129', rating: 3 },
+ { name: 'E130', rating: 3 },
+ { name: 'E131', rating: 3 },
+ { name: 'E132', rating: 3 },
+ { name: 'E133', rating: 3 },
+ { name: 'E134', rating: 3 },
+ { name: 'E135', rating: 3 },
+ { name: 'E136', rating: 3 },
+ { name: 'E137', rating: 3 },
+ { name: 'E138', rating: 3 },
+ { name: 'E139', rating: 3 },
+ { name: 'E140', rating: 3 },
+ { name: 'E141', rating: 3 },
+ { name: 'E142', rating: 3 },
+ { name: 'E143', rating: 3 },
+ { name: 'E144', rating: 3 },
+ { name: 'E145', rating: 3 },
+ { name: 'E146', rating: 3 },
+ { name: 'E147', rating: 3 },
+ { name: 'E148', rating: 3 },
+ { name: 'E149', rating: 3 },
+ { name: 'E150', rating: 3 },
+ { name: 'E151', rating: 3 },
+ { name: 'E152', rating: 3 },
+ { name: 'E153', rating: 3 },
+ { name: 'E154', rating: 3 },
+ { name: 'E155', rating: 3 },
+ { name: 'E156', rating: 3 },
+ { name: 'E157', rating: 3 },
+ { name: 'E158', rating: 3 },
+ { name: 'E159', rating: 3 },
+ { name: 'E160', rating: 3 },
+ { name: 'E161', rating: 3 },
+ { name: 'E162', rating: 3 },
+ { name: 'E163', rating: 3 },
+ { name: 'E164', rating: 3 },
+ { name: 'E165', rating: 3 },
+ { name: 'E166', rating: 3 },
+ { name: 'E167', rating: 3 },
+ { name: 'E168', rating: 3 },
+ { name: 'E169', rating: 3 },
+ { name: 'E170', rating: 3 },
+ { name: 'E171', rating: 3 },
+ { name: 'E172', rating: 3 },
+ { name: 'E173', rating: 3 },
+ { name: 'E174', rating: 3 },
+ { name: 'E175', rating: 3 },
+ { name: 'E176', rating: 3 },
+ { name: 'E177', rating: 3 },
+ { name: 'E178', rating: 3 },
+ { name: 'E179', rating: 3 },
+ { name: 'E180', rating: 3 },
+ { name: 'E181', rating: 3 },
+ { name: 'E182', rating: 3 },
+ { name: 'E183', rating: 3 },
+ { name: 'E184', rating: 3 },
+ { name: 'E185', rating: 3 },
+ { name: 'E186', rating: 3 },
+ { name: 'F000', rating: 3 },
+ { name: 'F001', rating: 3 },
+ { name: 'F002', rating: 3 },
+ { name: 'F003', rating: 3 },
+ { name: 'F004', rating: 3 },
+ { name: 'F005', rating: 3 },
+ { name: 'F006', rating: 3 },
+ { name: 'F007', rating: 3 },
+ { name: 'F008', rating: 3 },
+ { name: 'F009', rating: 3 },
+ { name: 'F010', rating: 3 },
+ { name: 'F011', rating: 3 },
+ { name: 'F012', rating: 3 },
+ { name: 'F013', rating: 3 },
+ { name: 'F014', rating: 3 },
+ { name: 'F015', rating: 3 },
+ { name: 'F016', rating: 3 },
+ { name: 'F017', rating: 3 },
+ { name: 'F018', rating: 3 },
+ { name: 'F019', rating: 3 },
+ { name: 'F020', rating: 3 },
+ { name: 'F021', rating: 3 },
+ { name: 'F022', rating: 3 },
+ { name: 'F023', rating: 3 },
+ { name: 'F024', rating: 3 },
+ { name: 'F025', rating: 3 },
+ { name: 'F026', rating: 3 },
+ { name: 'F027', rating: 3 },
+ { name: 'F028', rating: 3 },
+ { name: 'F029', rating: 3 },
+ { name: 'F030', rating: 3 },
+ { name: 'F031', rating: 3 },
+ { name: 'F032', rating: 3 },
+ { name: 'F033', rating: 3 },
+ { name: 'F034', rating: 3 },
+ { name: 'F035', rating: 3 },
+ { name: 'F036', rating: 3 },
+ { name: 'F037', rating: 3 },
+ { name: 'F038', rating: 3 },
+ { name: 'F039', rating: 3 },
+ { name: 'F040', rating: 3 },
+ { name: 'F041', rating: 3 },
+ { name: 'F042', rating: 3 },
+ { name: 'F043', rating: 3 },
+ { name: 'F044', rating: 3 },
+ { name: 'F045', rating: 3 },
+ { name: 'F046', rating: 3 },
+ { name: 'F047', rating: 3 },
+ { name: 'F048', rating: 3 },
+ { name: 'F049', rating: 3 },
+ { name: 'F050', rating: 3 },
+ { name: 'F051', rating: 3 },
+ { name: 'F052', rating: 3 },
+ { name: 'F053', rating: 3 },
+ { name: 'F054', rating: 3 },
+ { name: 'F055', rating: 3 },
+ { name: 'F056', rating: 3 },
+ { name: 'F057', rating: 3 },
+ { name: 'F058', rating: 3 },
+ { name: 'F059', rating: 3 },
+ { name: 'F060', rating: 3 },
+ { name: 'F061', rating: 3 },
+ { name: 'F062', rating: 3 },
+ { name: 'F063', rating: 3 },
+ { name: 'F064', rating: 3 },
+ { name: 'F065', rating: 3 },
+ { name: 'F066', rating: 3 },
+ { name: 'F067', rating: 3 },
+ { name: 'F068', rating: 3 },
+ { name: 'F069', rating: 3 },
+ { name: 'F070', rating: 3 },
+ { name: 'F071', rating: 3 },
+ { name: 'F072', rating: 3 },
+ { name: 'F073', rating: 3 },
+ { name: 'F074', rating: 3 },
+ { name: 'F075', rating: 3 },
+ { name: 'F076', rating: 3 },
+ { name: 'F077', rating: 3 },
+ { name: 'F078', rating: 3 },
+ { name: 'F079', rating: 3 },
+ { name: 'F080', rating: 3 },
+ { name: 'F081', rating: 3 },
+ { name: 'F082', rating: 3 },
+ { name: 'F083', rating: 3 },
+ { name: 'F084', rating: 3 },
+ { name: 'F085', rating: 3 },
+ { name: 'F086', rating: 3 },
+ { name: 'F087', rating: 3 },
+ { name: 'F088', rating: 3 },
+ { name: 'F089', rating: 3 },
+ { name: 'F090', rating: 3 },
+ { name: 'F091', rating: 3 },
+ { name: 'F092', rating: 3 },
+ { name: 'F093', rating: 3 },
+ { name: 'F094', rating: 3 },
+ { name: 'F095', rating: 3 },
+ { name: 'F096', rating: 3 },
+ { name: 'F097', rating: 3 },
+ { name: 'F098', rating: 3 },
+ { name: 'F099', rating: 3 },
+ { name: 'F100', rating: 3 },
+ { name: 'F101', rating: 3 },
+ { name: 'F102', rating: 3 },
+ { name: 'F103', rating: 3 },
+ { name: 'F104', rating: 3 },
+ { name: 'F105', rating: 3 },
+ { name: 'F106', rating: 3 },
+ { name: 'F107', rating: 3 },
+ { name: 'F108', rating: 3 },
+ { name: 'F109', rating: 3 },
+ { name: 'F110', rating: 3 },
+ { name: 'F111', rating: 3 },
+ { name: 'F112', rating: 3 },
+ { name: 'F113', rating: 3 },
+ { name: 'F114', rating: 3 },
+ { name: 'F115', rating: 3 },
+ { name: 'F116', rating: 3 },
+ { name: 'F117', rating: 3 },
+ { name: 'F118', rating: 3 },
+ { name: 'F119', rating: 3 },
+ { name: 'F120', rating: 3 },
+ { name: 'F121', rating: 3 },
+ { name: 'F122', rating: 3 },
+ { name: 'F123', rating: 3 },
+ { name: 'F124', rating: 3 },
+ { name: 'F125', rating: 3 },
+ { name: 'F126', rating: 3 },
+ { name: 'F127', rating: 3 },
+ { name: 'F128', rating: 3 },
+ { name: 'F129', rating: 3 },
+ { name: 'F130', rating: 3 },
+ { name: 'F131', rating: 3 },
+ { name: 'F132', rating: 3 },
+ { name: 'F133', rating: 3 },
+ { name: 'F134', rating: 3 },
+ { name: 'F135', rating: 3 },
+ { name: 'F136', rating: 3 },
+ { name: 'F137', rating: 3 },
+ { name: 'F138', rating: 3 },
+ { name: 'F139', rating: 3 },
+ { name: 'F140', rating: 3 },
+ { name: 'F141', rating: 3 },
+ { name: 'F142', rating: 3 },
+ { name: 'F143', rating: 3 },
+ { name: 'F144', rating: 3 },
+ { name: 'F145', rating: 3 },
+ { name: 'F146', rating: 3 },
+ { name: 'F147', rating: 3 },
+ { name: 'F148', rating: 3 },
+ { name: 'F149', rating: 3 },
+ { name: 'F150', rating: 3 },
+ { name: 'F151', rating: 3 },
+ { name: 'F152', rating: 3 },
+ { name: 'F153', rating: 3 },
+ { name: 'F154', rating: 3 },
+ { name: 'F155', rating: 3 },
+ { name: 'F156', rating: 3 },
+ { name: 'F157', rating: 3 },
+ { name: 'F158', rating: 3 },
+ { name: 'F159', rating: 3 },
+ { name: 'F160', rating: 3 },
+ { name: 'F161', rating: 3 },
+ { name: 'F162', rating: 3 },
+ { name: 'F163', rating: 3 },
+ { name: 'F164', rating: 3 },
+ { name: 'F165', rating: 3 },
+ { name: 'F166', rating: 3 },
+ { name: 'F167', rating: 3 },
+ { name: 'F168', rating: 3 },
+ { name: 'F169', rating: 3 },
+ { name: 'F170', rating: 3 },
+ { name: 'F171', rating: 3 },
+ { name: 'F172', rating: 3 },
+ { name: 'F173', rating: 3 },
+ { name: 'F174', rating: 3 },
+ { name: 'F175', rating: 3 },
+ { name: 'F176', rating: 3 },
+ { name: 'F177', rating: 3 },
+ { name: 'F178', rating: 3 },
+ { name: 'F179', rating: 3 },
+ { name: 'F180', rating: 3 },
+ { name: 'F181', rating: 3 },
+ { name: 'F182', rating: 3 },
+ { name: 'F183', rating: 3 },
+ { name: 'F184', rating: 3 },
+ { name: 'F185', rating: 3 },
+ { name: 'F186', rating: 3 },
+ { name: 'G000', rating: 4 },
+ { name: 'G001', rating: 4 },
+ { name: 'G002', rating: 4 },
+ { name: 'G003', rating: 4 },
+ { name: 'G004', rating: 4 },
+ { name: 'G005', rating: 4 },
+ { name: 'G006', rating: 4 },
+ { name: 'G007', rating: 4 },
+ { name: 'G008', rating: 4 },
+ { name: 'G009', rating: 4 },
+ { name: 'G010', rating: 4 },
+ { name: 'G011', rating: 4 },
+ { name: 'G012', rating: 4 },
+ { name: 'G013', rating: 4 },
+ { name: 'G014', rating: 4 },
+ { name: 'G015', rating: 4 },
+ { name: 'G016', rating: 4 },
+ { name: 'G017', rating: 4 },
+ { name: 'G018', rating: 4 },
+ { name: 'G019', rating: 4 },
+ { name: 'G020', rating: 4 },
+ { name: 'G021', rating: 4 },
+ { name: 'G022', rating: 4 },
+ { name: 'G023', rating: 4 },
+ { name: 'G024', rating: 4 },
+ { name: 'G025', rating: 4 },
+ { name: 'G026', rating: 4 },
+ { name: 'G027', rating: 4 },
+ { name: 'G028', rating: 4 },
+ { name: 'G029', rating: 4 },
+ { name: 'G030', rating: 4 },
+ { name: 'G031', rating: 4 },
+ { name: 'G032', rating: 4 },
+ { name: 'G033', rating: 4 },
+ { name: 'G034', rating: 4 },
+ { name: 'G035', rating: 4 },
+ { name: 'G036', rating: 4 },
+ { name: 'G037', rating: 4 },
+ { name: 'G038', rating: 4 },
+ { name: 'G039', rating: 4 },
+ { name: 'G040', rating: 4 },
+ { name: 'G041', rating: 4 },
+ { name: 'G042', rating: 4 },
+ { name: 'G043', rating: 4 },
+ { name: 'G044', rating: 4 },
+ { name: 'G045', rating: 4 },
+ { name: 'G046', rating: 4 },
+ { name: 'G047', rating: 4 },
+ { name: 'G048', rating: 4 },
+ { name: 'G049', rating: 4 },
+ { name: 'G050', rating: 4 },
+ { name: 'G051', rating: 4 },
+ { name: 'G052', rating: 4 },
+ { name: 'G053', rating: 4 },
+ { name: 'G054', rating: 4 },
+ { name: 'G055', rating: 4 },
+ { name: 'G056', rating: 4 },
+ { name: 'G057', rating: 4 },
+ { name: 'G058', rating: 4 },
+ { name: 'G059', rating: 4 },
+ { name: 'G060', rating: 4 },
+ { name: 'G061', rating: 4 },
+ { name: 'G062', rating: 4 },
+ { name: 'G063', rating: 4 },
+ { name: 'G064', rating: 4 },
+ { name: 'G065', rating: 4 },
+ { name: 'G066', rating: 4 },
+ { name: 'G067', rating: 4 },
+ { name: 'G068', rating: 4 },
+ { name: 'G069', rating: 4 },
+ { name: 'G070', rating: 4 },
+ { name: 'G071', rating: 4 },
+ { name: 'G072', rating: 4 },
+ { name: 'G073', rating: 4 },
+ { name: 'G074', rating: 4 },
+ { name: 'G075', rating: 4 },
+ { name: 'G076', rating: 4 },
+ { name: 'G077', rating: 4 },
+ { name: 'G078', rating: 4 },
+ { name: 'G079', rating: 4 },
+ { name: 'G080', rating: 4 },
+ { name: 'G081', rating: 4 },
+ { name: 'G082', rating: 4 },
+ { name: 'G083', rating: 4 },
+ { name: 'G084', rating: 4 },
+ { name: 'G085', rating: 4 },
+ { name: 'G086', rating: 4 },
+ { name: 'G087', rating: 4 },
+ { name: 'G088', rating: 4 },
+ { name: 'G089', rating: 4 },
+ { name: 'G090', rating: 4 },
+ { name: 'G091', rating: 4 },
+ { name: 'G092', rating: 4 },
+ { name: 'G093', rating: 4 },
+ { name: 'G094', rating: 4 },
+ { name: 'G095', rating: 4 },
+ { name: 'G096', rating: 4 },
+ { name: 'G097', rating: 4 },
+ { name: 'G098', rating: 4 },
+ { name: 'G099', rating: 4 },
+ { name: 'G100', rating: 4 },
+ { name: 'G101', rating: 4 },
+ { name: 'G102', rating: 4 },
+ { name: 'G103', rating: 4 },
+ { name: 'G104', rating: 4 },
+ { name: 'G105', rating: 4 },
+ { name: 'G106', rating: 4 },
+ { name: 'G107', rating: 4 },
+ { name: 'G108', rating: 4 },
+ { name: 'G109', rating: 4 },
+ { name: 'G110', rating: 4 },
+ { name: 'G111', rating: 4 },
+ { name: 'G112', rating: 4 },
+ { name: 'G113', rating: 4 },
+ { name: 'G114', rating: 4 },
+ { name: 'G115', rating: 4 },
+ { name: 'G116', rating: 4 },
+ { name: 'G117', rating: 4 },
+ { name: 'G118', rating: 4 },
+ { name: 'G119', rating: 4 },
+ { name: 'G120', rating: 4 },
+ { name: 'G121', rating: 4 },
+ { name: 'G122', rating: 4 },
+ { name: 'G123', rating: 4 },
+ { name: 'G124', rating: 4 },
+ { name: 'G125', rating: 4 },
+ { name: 'G126', rating: 4 },
+ { name: 'G127', rating: 4 },
+ { name: 'G128', rating: 4 },
+ { name: 'G129', rating: 4 },
+ { name: 'G130', rating: 4 },
+ { name: 'G131', rating: 4 },
+ { name: 'G132', rating: 4 },
+ { name: 'G133', rating: 4 },
+ { name: 'G134', rating: 4 },
+ { name: 'G135', rating: 4 },
+ { name: 'G136', rating: 4 },
+ { name: 'G137', rating: 4 },
+ { name: 'G138', rating: 4 },
+ { name: 'G139', rating: 4 },
+ { name: 'G140', rating: 4 },
+ { name: 'G141', rating: 4 },
+ { name: 'G142', rating: 4 },
+ { name: 'G143', rating: 4 },
+ { name: 'G144', rating: 4 },
+ { name: 'G145', rating: 4 },
+ { name: 'G146', rating: 4 },
+ { name: 'G147', rating: 4 },
+ { name: 'G148', rating: 4 },
+ { name: 'G149', rating: 4 },
+ { name: 'G150', rating: 4 },
+ { name: 'G151', rating: 4 },
+ { name: 'G152', rating: 4 },
+ { name: 'G153', rating: 4 },
+ { name: 'G154', rating: 4 },
+ { name: 'G155', rating: 4 },
+ { name: 'G156', rating: 4 },
+ { name: 'G157', rating: 4 },
+ { name: 'G158', rating: 4 },
+ { name: 'G159', rating: 4 },
+ { name: 'G160', rating: 4 },
+ { name: 'G161', rating: 4 },
+ { name: 'G162', rating: 4 },
+ { name: 'G163', rating: 4 },
+ { name: 'G164', rating: 4 },
+ { name: 'G165', rating: 4 },
+ { name: 'G166', rating: 4 },
+ { name: 'G167', rating: 4 },
+ { name: 'G168', rating: 4 },
+ { name: 'G169', rating: 4 },
+ { name: 'G170', rating: 4 },
+ { name: 'G171', rating: 4 },
+ { name: 'G172', rating: 4 },
+ { name: 'G173', rating: 4 },
+ { name: 'G174', rating: 4 },
+ { name: 'G175', rating: 4 },
+ { name: 'G176', rating: 4 },
+ { name: 'G177', rating: 4 },
+ { name: 'G178', rating: 4 },
+ { name: 'G179', rating: 4 },
+ { name: 'G180', rating: 4 },
+ { name: 'G181', rating: 4 },
+ { name: 'G182', rating: 4 },
+ { name: 'G183', rating: 4 },
+ { name: 'G184', rating: 4 },
+ { name: 'G185', rating: 4 },
+ { name: 'G186', rating: 4 },
+ { name: 'H000', rating: 3 },
+ { name: 'H001', rating: 3 },
+ { name: 'H002', rating: 3 },
+ { name: 'H003', rating: 3 },
+ { name: 'H004', rating: 3 },
+ { name: 'H005', rating: 3 },
+ { name: 'H006', rating: 3 },
+ { name: 'H007', rating: 3 },
+ { name: 'H008', rating: 3 },
+ { name: 'H009', rating: 3 },
+ { name: 'H010', rating: 3 },
+ { name: 'H011', rating: 3 },
+ { name: 'H012', rating: 3 },
+ { name: 'H013', rating: 3 },
+ { name: 'H014', rating: 3 },
+ { name: 'H015', rating: 3 },
+ { name: 'H016', rating: 3 },
+ { name: 'H017', rating: 3 },
+ { name: 'H018', rating: 3 },
+ { name: 'H019', rating: 3 },
+ { name: 'H020', rating: 3 },
+ { name: 'H021', rating: 3 },
+ { name: 'H022', rating: 3 },
+ { name: 'H023', rating: 3 },
+ { name: 'H024', rating: 3 },
+ { name: 'H025', rating: 3 },
+ { name: 'H026', rating: 3 },
+ { name: 'H027', rating: 3 },
+ { name: 'H028', rating: 3 },
+ { name: 'H029', rating: 3 },
+ { name: 'H030', rating: 3 },
+ { name: 'H031', rating: 3 },
+ { name: 'H032', rating: 3 },
+ { name: 'H033', rating: 3 },
+ { name: 'H034', rating: 3 },
+ { name: 'H035', rating: 3 },
+ { name: 'H036', rating: 3 },
+ { name: 'H037', rating: 3 },
+ { name: 'H038', rating: 3 },
+ { name: 'H039', rating: 3 },
+ { name: 'H040', rating: 3 },
+ { name: 'H041', rating: 3 },
+ { name: 'H042', rating: 3 },
+ { name: 'H043', rating: 3 },
+ { name: 'H044', rating: 3 },
+ { name: 'H045', rating: 3 },
+ { name: 'H046', rating: 3 },
+ { name: 'H047', rating: 3 },
+ { name: 'H048', rating: 3 },
+ { name: 'H049', rating: 3 },
+ { name: 'H050', rating: 3 },
+ { name: 'H051', rating: 3 },
+ { name: 'H052', rating: 3 },
+ { name: 'H053', rating: 3 },
+ { name: 'H054', rating: 3 },
+ { name: 'H055', rating: 3 },
+ { name: 'H056', rating: 3 },
+ { name: 'H057', rating: 3 },
+ { name: 'H058', rating: 3 },
+ { name: 'H059', rating: 3 },
+ { name: 'H060', rating: 3 },
+ { name: 'H061', rating: 3 },
+ { name: 'H062', rating: 3 },
+ { name: 'H063', rating: 3 },
+ { name: 'H064', rating: 3 },
+ { name: 'H065', rating: 3 },
+ { name: 'H066', rating: 3 },
+ { name: 'H067', rating: 3 },
+ { name: 'H068', rating: 3 },
+ { name: 'H069', rating: 3 },
+ { name: 'H070', rating: 3 },
+ { name: 'H071', rating: 3 },
+ { name: 'H072', rating: 3 },
+ { name: 'H073', rating: 3 },
+ { name: 'H074', rating: 3 },
+ { name: 'H075', rating: 3 },
+ { name: 'H076', rating: 3 },
+ { name: 'H077', rating: 3 },
+ { name: 'H078', rating: 3 },
+ { name: 'H079', rating: 3 },
+ { name: 'H080', rating: 3 },
+ { name: 'H081', rating: 3 },
+ { name: 'H082', rating: 3 },
+ { name: 'H083', rating: 3 },
+ { name: 'H084', rating: 3 },
+ { name: 'H085', rating: 3 },
+ { name: 'H086', rating: 3 },
+ { name: 'H087', rating: 3 },
+ { name: 'H088', rating: 3 },
+ { name: 'H089', rating: 3 },
+ { name: 'H090', rating: 3 },
+ { name: 'H091', rating: 3 },
+ { name: 'H092', rating: 3 },
+ { name: 'H093', rating: 3 },
+ { name: 'H094', rating: 3 },
+ { name: 'H095', rating: 3 },
+ { name: 'H096', rating: 3 },
+ { name: 'H097', rating: 3 },
+ { name: 'H098', rating: 3 },
+ { name: 'H099', rating: 3 },
+ { name: 'H100', rating: 3 },
+ { name: 'H101', rating: 3 },
+ { name: 'H102', rating: 3 },
+ { name: 'H103', rating: 3 },
+ { name: 'H104', rating: 3 },
+ { name: 'H105', rating: 3 },
+ { name: 'H106', rating: 3 },
+ { name: 'H107', rating: 3 },
+ { name: 'H108', rating: 3 },
+ { name: 'H109', rating: 3 },
+ { name: 'H110', rating: 3 },
+ { name: 'H111', rating: 3 },
+ { name: 'H112', rating: 3 },
+ { name: 'H113', rating: 3 },
+ { name: 'H114', rating: 3 },
+ { name: 'H115', rating: 3 },
+ { name: 'H116', rating: 3 },
+ { name: 'H117', rating: 3 },
+ { name: 'H118', rating: 3 },
+ { name: 'H119', rating: 3 },
+ { name: 'H120', rating: 3 },
+ { name: 'H121', rating: 3 },
+ { name: 'H122', rating: 3 },
+ { name: 'H123', rating: 3 },
+ { name: 'H124', rating: 3 },
+ { name: 'H125', rating: 3 },
+ { name: 'H126', rating: 3 },
+ { name: 'H127', rating: 3 },
+ { name: 'H128', rating: 3 },
+ { name: 'H129', rating: 3 },
+ { name: 'H130', rating: 3 },
+ { name: 'H131', rating: 3 },
+ { name: 'H132', rating: 3 },
+ { name: 'H133', rating: 3 },
+ { name: 'H134', rating: 3 },
+ { name: 'H135', rating: 3 },
+ { name: 'H136', rating: 3 },
+ { name: 'H137', rating: 3 },
+ { name: 'H138', rating: 3 },
+ { name: 'H139', rating: 3 },
+ { name: 'H140', rating: 3 },
+ { name: 'H141', rating: 3 },
+ { name: 'H142', rating: 3 },
+ { name: 'H143', rating: 3 },
+ { name: 'H144', rating: 3 },
+ { name: 'H145', rating: 3 },
+ { name: 'H146', rating: 3 },
+ { name: 'H147', rating: 3 },
+ { name: 'H148', rating: 3 },
+ { name: 'H149', rating: 3 },
+ { name: 'H150', rating: 3 },
+ { name: 'H151', rating: 3 },
+ { name: 'H152', rating: 3 },
+ { name: 'H153', rating: 3 },
+ { name: 'H154', rating: 3 },
+ { name: 'H155', rating: 3 },
+ { name: 'H156', rating: 3 },
+ { name: 'H157', rating: 3 },
+ { name: 'H158', rating: 3 },
+ { name: 'H159', rating: 3 },
+ { name: 'H160', rating: 3 },
+ { name: 'H161', rating: 3 },
+ { name: 'H162', rating: 3 },
+ { name: 'H163', rating: 3 },
+ { name: 'H164', rating: 3 },
+ { name: 'H165', rating: 3 },
+ { name: 'H166', rating: 3 },
+ { name: 'H167', rating: 3 },
+ { name: 'H168', rating: 3 },
+ { name: 'H169', rating: 3 },
+ { name: 'H170', rating: 3 },
+ { name: 'H171', rating: 3 },
+ { name: 'H172', rating: 3 },
+ { name: 'H173', rating: 3 },
+ { name: 'H174', rating: 3 },
+ { name: 'H175', rating: 3 },
+ { name: 'H176', rating: 3 },
+ { name: 'H177', rating: 3 },
+ { name: 'H178', rating: 3 },
+ { name: 'H179', rating: 3 },
+ { name: 'H180', rating: 3 },
+ { name: 'H181', rating: 3 },
+ { name: 'H182', rating: 3 },
+ { name: 'H183', rating: 3 },
+ { name: 'H184', rating: 3 },
+ { name: 'H185', rating: 3 },
+ { name: 'H186', rating: 3 },
+ { name: 'I000', rating: 2 },
+ { name: 'I001', rating: 2 },
+ { name: 'I002', rating: 2 },
+ { name: 'I003', rating: 2 },
+ { name: 'I004', rating: 2 },
+ { name: 'I005', rating: 2 },
+ { name: 'I006', rating: 2 },
+ { name: 'I007', rating: 2 },
+ { name: 'I008', rating: 2 },
+ { name: 'I009', rating: 2 },
+ { name: 'I010', rating: 2 },
+ { name: 'I011', rating: 2 },
+ { name: 'I012', rating: 2 },
+ { name: 'I013', rating: 2 },
+ { name: 'I014', rating: 2 },
+ { name: 'I015', rating: 2 },
+ { name: 'I016', rating: 2 },
+ { name: 'I017', rating: 2 },
+ { name: 'I018', rating: 2 },
+ { name: 'I019', rating: 2 },
+ { name: 'I020', rating: 2 },
+ { name: 'I021', rating: 2 },
+ { name: 'I022', rating: 2 },
+ { name: 'I023', rating: 2 },
+ { name: 'I024', rating: 2 },
+ { name: 'I025', rating: 2 },
+ { name: 'I026', rating: 2 },
+ { name: 'I027', rating: 2 },
+ { name: 'I028', rating: 2 },
+ { name: 'I029', rating: 2 },
+ { name: 'I030', rating: 2 },
+ { name: 'I031', rating: 2 },
+ { name: 'I032', rating: 2 },
+ { name: 'I033', rating: 2 },
+ { name: 'I034', rating: 2 },
+ { name: 'I035', rating: 2 },
+ { name: 'I036', rating: 2 },
+ { name: 'I037', rating: 2 },
+ { name: 'I038', rating: 2 },
+ { name: 'I039', rating: 2 },
+ { name: 'I040', rating: 2 },
+ { name: 'I041', rating: 2 },
+ { name: 'I042', rating: 2 },
+ { name: 'I043', rating: 2 },
+ { name: 'I044', rating: 2 },
+ { name: 'I045', rating: 2 },
+ { name: 'I046', rating: 2 },
+ { name: 'I047', rating: 2 },
+ { name: 'I048', rating: 2 },
+ { name: 'I049', rating: 2 },
+ { name: 'I050', rating: 2 },
+ { name: 'I051', rating: 2 },
+ { name: 'I052', rating: 2 },
+ { name: 'I053', rating: 2 },
+ { name: 'I054', rating: 2 },
+ { name: 'I055', rating: 2 },
+ { name: 'I056', rating: 2 },
+ { name: 'I057', rating: 2 },
+ { name: 'I058', rating: 2 },
+ { name: 'I059', rating: 2 },
+ { name: 'I060', rating: 2 },
+ { name: 'I061', rating: 2 },
+ { name: 'I062', rating: 2 },
+ { name: 'I063', rating: 2 },
+ { name: 'I064', rating: 2 },
+ { name: 'I065', rating: 2 },
+ { name: 'I066', rating: 2 },
+ { name: 'I067', rating: 2 },
+ { name: 'I068', rating: 2 },
+ { name: 'I069', rating: 2 },
+ { name: 'I070', rating: 2 },
+ { name: 'I071', rating: 2 },
+ { name: 'I072', rating: 2 },
+ { name: 'I073', rating: 2 },
+ { name: 'I074', rating: 2 },
+ { name: 'I075', rating: 2 },
+ { name: 'I076', rating: 2 },
+ { name: 'I077', rating: 2 },
+ { name: 'I078', rating: 2 },
+ { name: 'I079', rating: 2 },
+ { name: 'I080', rating: 2 },
+ { name: 'I081', rating: 2 },
+ { name: 'I082', rating: 2 },
+ { name: 'I083', rating: 2 },
+ { name: 'I084', rating: 2 },
+ { name: 'I085', rating: 2 },
+ { name: 'I086', rating: 2 },
+ { name: 'I087', rating: 2 },
+ { name: 'I088', rating: 2 },
+ { name: 'I089', rating: 2 },
+ { name: 'I090', rating: 2 },
+ { name: 'I091', rating: 2 },
+ { name: 'I092', rating: 2 },
+ { name: 'I093', rating: 2 },
+ { name: 'I094', rating: 2 },
+ { name: 'I095', rating: 2 },
+ { name: 'I096', rating: 2 },
+ { name: 'I097', rating: 2 },
+ { name: 'I098', rating: 2 },
+ { name: 'I099', rating: 2 },
+ { name: 'I100', rating: 2 },
+ { name: 'I101', rating: 2 },
+ { name: 'I102', rating: 2 },
+ { name: 'I103', rating: 2 },
+ { name: 'I104', rating: 2 },
+ { name: 'I105', rating: 2 },
+ { name: 'I106', rating: 2 },
+ { name: 'I107', rating: 2 },
+ { name: 'I108', rating: 2 },
+ { name: 'I109', rating: 2 },
+ { name: 'I110', rating: 2 },
+ { name: 'I111', rating: 2 },
+ { name: 'I112', rating: 2 },
+ { name: 'I113', rating: 2 },
+ { name: 'I114', rating: 2 },
+ { name: 'I115', rating: 2 },
+ { name: 'I116', rating: 2 },
+ { name: 'I117', rating: 2 },
+ { name: 'I118', rating: 2 },
+ { name: 'I119', rating: 2 },
+ { name: 'I120', rating: 2 },
+ { name: 'I121', rating: 2 },
+ { name: 'I122', rating: 2 },
+ { name: 'I123', rating: 2 },
+ { name: 'I124', rating: 2 },
+ { name: 'I125', rating: 2 },
+ { name: 'I126', rating: 2 },
+ { name: 'I127', rating: 2 },
+ { name: 'I128', rating: 2 },
+ { name: 'I129', rating: 2 },
+ { name: 'I130', rating: 2 },
+ { name: 'I131', rating: 2 },
+ { name: 'I132', rating: 2 },
+ { name: 'I133', rating: 2 },
+ { name: 'I134', rating: 2 },
+ { name: 'I135', rating: 2 },
+ { name: 'I136', rating: 2 },
+ { name: 'I137', rating: 2 },
+ { name: 'I138', rating: 2 },
+ { name: 'I139', rating: 2 },
+ { name: 'I140', rating: 2 },
+ { name: 'I141', rating: 2 },
+ { name: 'I142', rating: 2 },
+ { name: 'I143', rating: 2 },
+ { name: 'I144', rating: 2 },
+ { name: 'I145', rating: 2 },
+ { name: 'I146', rating: 2 },
+ { name: 'I147', rating: 2 },
+ { name: 'I148', rating: 2 },
+ { name: 'I149', rating: 2 },
+ { name: 'I150', rating: 2 },
+ { name: 'I151', rating: 2 },
+ { name: 'I152', rating: 2 },
+ { name: 'I153', rating: 2 },
+ { name: 'I154', rating: 2 },
+ { name: 'I155', rating: 2 },
+ { name: 'I156', rating: 2 },
+ { name: 'I157', rating: 2 },
+ { name: 'I158', rating: 2 },
+ { name: 'I159', rating: 2 },
+ { name: 'I160', rating: 2 },
+ { name: 'I161', rating: 2 },
+ { name: 'I162', rating: 2 },
+ { name: 'I163', rating: 2 },
+ { name: 'I164', rating: 2 },
+ { name: 'I165', rating: 2 },
+ { name: 'I166', rating: 2 },
+ { name: 'I167', rating: 2 },
+ { name: 'I168', rating: 2 },
+ { name: 'I169', rating: 2 },
+ { name: 'I170', rating: 2 },
+ { name: 'I171', rating: 2 },
+ { name: 'I172', rating: 2 },
+ { name: 'I173', rating: 2 },
+ { name: 'I174', rating: 2 },
+ { name: 'I175', rating: 2 },
+ { name: 'I176', rating: 2 },
+ { name: 'I177', rating: 2 },
+ { name: 'I178', rating: 2 },
+ { name: 'I179', rating: 2 },
+ { name: 'I180', rating: 2 },
+ { name: 'I181', rating: 2 },
+ { name: 'I182', rating: 2 },
+ { name: 'I183', rating: 2 },
+ { name: 'I184', rating: 2 },
+ { name: 'I185', rating: 2 },
+ { name: 'I186', rating: 2 },
+ { name: 'J000', rating: 2 },
+ { name: 'J001', rating: 2 },
+ { name: 'J002', rating: 2 },
+ { name: 'J003', rating: 2 },
+ { name: 'J004', rating: 2 },
+ { name: 'J005', rating: 2 },
+ { name: 'J006', rating: 2 },
+ { name: 'J007', rating: 2 },
+ { name: 'J008', rating: 2 },
+ { name: 'J009', rating: 2 },
+ { name: 'J010', rating: 2 },
+ { name: 'J011', rating: 2 },
+ { name: 'J012', rating: 2 },
+ { name: 'J013', rating: 2 },
+ { name: 'J014', rating: 2 },
+ { name: 'J015', rating: 2 },
+ { name: 'J016', rating: 2 },
+ { name: 'J017', rating: 2 },
+ { name: 'J018', rating: 2 },
+ { name: 'J019', rating: 2 },
+ { name: 'J020', rating: 2 },
+ { name: 'J021', rating: 2 },
+ { name: 'J022', rating: 2 },
+ { name: 'J023', rating: 2 },
+ { name: 'J024', rating: 2 },
+ { name: 'J025', rating: 2 },
+ { name: 'J026', rating: 2 },
+ { name: 'J027', rating: 2 },
+ { name: 'J028', rating: 2 },
+ { name: 'J029', rating: 2 },
+ { name: 'J030', rating: 2 },
+ { name: 'J031', rating: 2 },
+ { name: 'J032', rating: 2 },
+ { name: 'J033', rating: 2 },
+ { name: 'J034', rating: 2 },
+ { name: 'J035', rating: 2 },
+ { name: 'J036', rating: 2 },
+ { name: 'J037', rating: 2 },
+ { name: 'J038', rating: 2 },
+ { name: 'J039', rating: 2 },
+ { name: 'J040', rating: 2 },
+ { name: 'J041', rating: 2 },
+ { name: 'J042', rating: 2 },
+ { name: 'J043', rating: 2 },
+ { name: 'J044', rating: 2 },
+ { name: 'J045', rating: 2 },
+ { name: 'J046', rating: 2 },
+ { name: 'J047', rating: 2 },
+ { name: 'J048', rating: 2 },
+ { name: 'J049', rating: 2 },
+ { name: 'J050', rating: 2 },
+ { name: 'J051', rating: 2 },
+ { name: 'J052', rating: 2 },
+ { name: 'J053', rating: 2 },
+ { name: 'J054', rating: 2 },
+ { name: 'J055', rating: 2 },
+ { name: 'J056', rating: 2 },
+ { name: 'J057', rating: 2 },
+ { name: 'J058', rating: 2 },
+ { name: 'J059', rating: 2 },
+ { name: 'J060', rating: 2 },
+ { name: 'J061', rating: 2 },
+ { name: 'J062', rating: 2 },
+ { name: 'J063', rating: 2 },
+ { name: 'J064', rating: 2 },
+ { name: 'J065', rating: 2 },
+ { name: 'J066', rating: 2 },
+ { name: 'J067', rating: 2 },
+ { name: 'J068', rating: 2 },
+ { name: 'J069', rating: 2 },
+ { name: 'J070', rating: 2 },
+ { name: 'J071', rating: 2 },
+ { name: 'J072', rating: 2 },
+ { name: 'J073', rating: 2 },
+ { name: 'J074', rating: 2 },
+ { name: 'J075', rating: 2 },
+ { name: 'J076', rating: 2 },
+ { name: 'J077', rating: 2 },
+ { name: 'J078', rating: 2 },
+ { name: 'J079', rating: 2 },
+ { name: 'J080', rating: 2 },
+ { name: 'J081', rating: 2 },
+ { name: 'J082', rating: 2 },
+ { name: 'J083', rating: 2 },
+ { name: 'J084', rating: 2 },
+ { name: 'J085', rating: 2 },
+ { name: 'J086', rating: 2 },
+ { name: 'J087', rating: 2 },
+ { name: 'J088', rating: 2 },
+ { name: 'J089', rating: 2 },
+ { name: 'J090', rating: 2 },
+ { name: 'J091', rating: 2 },
+ { name: 'J092', rating: 2 },
+ { name: 'J093', rating: 2 },
+ { name: 'J094', rating: 2 },
+ { name: 'J095', rating: 2 },
+ { name: 'J096', rating: 2 },
+ { name: 'J097', rating: 2 },
+ { name: 'J098', rating: 2 },
+ { name: 'J099', rating: 2 },
+ { name: 'J100', rating: 2 },
+ { name: 'J101', rating: 2 },
+ { name: 'J102', rating: 2 },
+ { name: 'J103', rating: 2 },
+ { name: 'J104', rating: 2 },
+ { name: 'J105', rating: 2 },
+ { name: 'J106', rating: 2 },
+ { name: 'J107', rating: 2 },
+ { name: 'J108', rating: 2 },
+ { name: 'J109', rating: 2 },
+ { name: 'J110', rating: 2 },
+ { name: 'J111', rating: 2 },
+ { name: 'J112', rating: 2 },
+ { name: 'J113', rating: 2 },
+ { name: 'J114', rating: 2 },
+ { name: 'J115', rating: 2 },
+ { name: 'J116', rating: 2 },
+ { name: 'J117', rating: 2 },
+ { name: 'J118', rating: 2 },
+ { name: 'J119', rating: 2 },
+ { name: 'J120', rating: 2 },
+ { name: 'J121', rating: 2 },
+ { name: 'J122', rating: 2 },
+ { name: 'J123', rating: 2 },
+ { name: 'J124', rating: 2 },
+ { name: 'J125', rating: 2 },
+ { name: 'J126', rating: 2 },
+ { name: 'J127', rating: 2 },
+ { name: 'J128', rating: 2 },
+ { name: 'J129', rating: 2 },
+ { name: 'J130', rating: 2 },
+ { name: 'J131', rating: 2 },
+ { name: 'J132', rating: 2 },
+ { name: 'J133', rating: 2 },
+ { name: 'J134', rating: 2 },
+ { name: 'J135', rating: 2 },
+ { name: 'J136', rating: 2 },
+ { name: 'J137', rating: 2 },
+ { name: 'J138', rating: 2 },
+ { name: 'J139', rating: 2 },
+ { name: 'J140', rating: 2 },
+ { name: 'J141', rating: 2 },
+ { name: 'J142', rating: 2 },
+ { name: 'J143', rating: 2 },
+ { name: 'J144', rating: 2 },
+ { name: 'J145', rating: 2 },
+ { name: 'J146', rating: 2 },
+ { name: 'J147', rating: 2 },
+ { name: 'J148', rating: 2 },
+ { name: 'J149', rating: 2 },
+ { name: 'J150', rating: 2 },
+ { name: 'J151', rating: 2 },
+ { name: 'J152', rating: 2 },
+ { name: 'J153', rating: 2 },
+ { name: 'J154', rating: 2 },
+ { name: 'J155', rating: 2 },
+ { name: 'J156', rating: 2 },
+ { name: 'J157', rating: 2 },
+ { name: 'J158', rating: 2 },
+ { name: 'J159', rating: 2 },
+ { name: 'J160', rating: 2 },
+ { name: 'J161', rating: 2 },
+ { name: 'J162', rating: 2 },
+ { name: 'J163', rating: 2 },
+ { name: 'J164', rating: 2 },
+ { name: 'J165', rating: 2 },
+ { name: 'J166', rating: 2 },
+ { name: 'J167', rating: 2 },
+ { name: 'J168', rating: 2 },
+ { name: 'J169', rating: 2 },
+ { name: 'J170', rating: 2 },
+ { name: 'J171', rating: 2 },
+ { name: 'J172', rating: 2 },
+ { name: 'J173', rating: 2 },
+ { name: 'J174', rating: 2 },
+ { name: 'J175', rating: 2 },
+ { name: 'J176', rating: 2 },
+ { name: 'J177', rating: 2 },
+ { name: 'J178', rating: 2 },
+ { name: 'J179', rating: 2 },
+ { name: 'J180', rating: 2 },
+ { name: 'J181', rating: 2 },
+ { name: 'J182', rating: 2 },
+ { name: 'J183', rating: 2 },
+ { name: 'J184', rating: 2 },
+ { name: 'J185', rating: 2 },
+ { name: 'J186', rating: 2 },
+ { name: 'K000', rating: 2 },
+ { name: 'K001', rating: 2 },
+ { name: 'K002', rating: 2 },
+ { name: 'K003', rating: 2 },
+ { name: 'K004', rating: 2 },
+ { name: 'K005', rating: 2 },
+ { name: 'K006', rating: 2 },
+ { name: 'K007', rating: 2 },
+ { name: 'K008', rating: 2 },
+ { name: 'K009', rating: 2 },
+ { name: 'K010', rating: 2 },
+ { name: 'K011', rating: 2 },
+ { name: 'K012', rating: 2 },
+ { name: 'K013', rating: 2 },
+ { name: 'K014', rating: 2 },
+ { name: 'K015', rating: 2 },
+ { name: 'K016', rating: 2 },
+ { name: 'K017', rating: 2 },
+ { name: 'K018', rating: 2 },
+ { name: 'K019', rating: 2 },
+ { name: 'K020', rating: 2 },
+ { name: 'K021', rating: 2 },
+ { name: 'K022', rating: 2 },
+ { name: 'K023', rating: 2 },
+ { name: 'K024', rating: 2 },
+ { name: 'K025', rating: 2 },
+ { name: 'K026', rating: 2 },
+ { name: 'K027', rating: 2 },
+ { name: 'K028', rating: 2 },
+ { name: 'K029', rating: 2 },
+ { name: 'K030', rating: 2 },
+ { name: 'K031', rating: 2 },
+ { name: 'K032', rating: 2 },
+ { name: 'K033', rating: 2 },
+ { name: 'K034', rating: 2 },
+ { name: 'K035', rating: 2 },
+ { name: 'K036', rating: 2 },
+ { name: 'K037', rating: 2 },
+ { name: 'K038', rating: 2 },
+ { name: 'K039', rating: 2 },
+ { name: 'K040', rating: 2 },
+ { name: 'K041', rating: 2 },
+ { name: 'K042', rating: 2 },
+ { name: 'K043', rating: 2 },
+ { name: 'K044', rating: 2 },
+ { name: 'K045', rating: 2 },
+ { name: 'K046', rating: 2 },
+ { name: 'K047', rating: 2 },
+ { name: 'K048', rating: 2 },
+ { name: 'K049', rating: 2 },
+ { name: 'K050', rating: 2 },
+ { name: 'K051', rating: 2 },
+ { name: 'K052', rating: 2 },
+ { name: 'K053', rating: 2 },
+ { name: 'K054', rating: 2 },
+ { name: 'K055', rating: 2 },
+ { name: 'K056', rating: 2 },
+ { name: 'K057', rating: 2 },
+ { name: 'K058', rating: 2 },
+ { name: 'K059', rating: 2 },
+ { name: 'K060', rating: 2 },
+ { name: 'K061', rating: 2 },
+ { name: 'K062', rating: 2 },
+ { name: 'K063', rating: 2 },
+ { name: 'K064', rating: 2 },
+ { name: 'K065', rating: 2 },
+ { name: 'K066', rating: 2 },
+ { name: 'K067', rating: 2 },
+ { name: 'K068', rating: 2 },
+ { name: 'K069', rating: 2 },
+ { name: 'K070', rating: 2 },
+ { name: 'K071', rating: 2 },
+ { name: 'K072', rating: 2 },
+ { name: 'K073', rating: 2 },
+ { name: 'K074', rating: 2 },
+ { name: 'K075', rating: 2 },
+ { name: 'K076', rating: 2 },
+ { name: 'K077', rating: 2 },
+ { name: 'K078', rating: 2 },
+ { name: 'K079', rating: 2 },
+ { name: 'K080', rating: 2 },
+ { name: 'K081', rating: 2 },
+ { name: 'K082', rating: 2 },
+ { name: 'K083', rating: 2 },
+ { name: 'K084', rating: 2 },
+ { name: 'K085', rating: 2 },
+ { name: 'K086', rating: 2 },
+ { name: 'K087', rating: 2 },
+ { name: 'K088', rating: 2 },
+ { name: 'K089', rating: 2 },
+ { name: 'K090', rating: 2 },
+ { name: 'K091', rating: 2 },
+ { name: 'K092', rating: 2 },
+ { name: 'K093', rating: 2 },
+ { name: 'K094', rating: 2 },
+ { name: 'K095', rating: 2 },
+ { name: 'K096', rating: 2 },
+ { name: 'K097', rating: 2 },
+ { name: 'K098', rating: 2 },
+ { name: 'K099', rating: 2 },
+ { name: 'K100', rating: 2 },
+ { name: 'K101', rating: 2 },
+ { name: 'K102', rating: 2 },
+ { name: 'K103', rating: 2 },
+ { name: 'K104', rating: 2 },
+ { name: 'K105', rating: 2 },
+ { name: 'K106', rating: 2 },
+ { name: 'K107', rating: 2 },
+ { name: 'K108', rating: 2 },
+ { name: 'K109', rating: 2 },
+ { name: 'K110', rating: 2 },
+ { name: 'K111', rating: 2 },
+ { name: 'K112', rating: 2 },
+ { name: 'K113', rating: 2 },
+ { name: 'K114', rating: 2 },
+ { name: 'K115', rating: 2 },
+ { name: 'K116', rating: 2 },
+ { name: 'K117', rating: 2 },
+ { name: 'K118', rating: 2 },
+ { name: 'K119', rating: 2 },
+ { name: 'K120', rating: 2 },
+ { name: 'K121', rating: 2 },
+ { name: 'K122', rating: 2 },
+ { name: 'K123', rating: 2 },
+ { name: 'K124', rating: 2 },
+ { name: 'K125', rating: 2 },
+ { name: 'K126', rating: 2 },
+ { name: 'K127', rating: 2 },
+ { name: 'K128', rating: 2 },
+ { name: 'K129', rating: 2 },
+ { name: 'K130', rating: 2 },
+ { name: 'K131', rating: 2 },
+ { name: 'K132', rating: 2 },
+ { name: 'K133', rating: 2 },
+ { name: 'K134', rating: 2 },
+ { name: 'K135', rating: 2 },
+ { name: 'K136', rating: 2 },
+ { name: 'K137', rating: 2 },
+ { name: 'K138', rating: 2 },
+ { name: 'K139', rating: 2 },
+ { name: 'K140', rating: 2 },
+ { name: 'K141', rating: 2 },
+ { name: 'K142', rating: 2 },
+ { name: 'K143', rating: 2 },
+ { name: 'K144', rating: 2 },
+ { name: 'K145', rating: 2 },
+ { name: 'K146', rating: 2 },
+ { name: 'K147', rating: 2 },
+ { name: 'K148', rating: 2 },
+ { name: 'K149', rating: 2 },
+ { name: 'K150', rating: 2 },
+ { name: 'K151', rating: 2 },
+ { name: 'K152', rating: 2 },
+ { name: 'K153', rating: 2 },
+ { name: 'K154', rating: 2 },
+ { name: 'K155', rating: 2 },
+ { name: 'K156', rating: 2 },
+ { name: 'K157', rating: 2 },
+ { name: 'K158', rating: 2 },
+ { name: 'K159', rating: 2 },
+ { name: 'K160', rating: 2 },
+ { name: 'K161', rating: 2 },
+ { name: 'K162', rating: 2 },
+ { name: 'K163', rating: 2 },
+ { name: 'K164', rating: 2 },
+ { name: 'K165', rating: 2 },
+ { name: 'K166', rating: 2 },
+ { name: 'K167', rating: 2 },
+ { name: 'K168', rating: 2 },
+ { name: 'K169', rating: 2 },
+ { name: 'K170', rating: 2 },
+ { name: 'K171', rating: 2 },
+ { name: 'K172', rating: 2 },
+ { name: 'K173', rating: 2 },
+ { name: 'K174', rating: 2 },
+ { name: 'K175', rating: 2 },
+ { name: 'K176', rating: 2 },
+ { name: 'K177', rating: 2 },
+];
+assert.sameValue(array.length, 2048);
+
+// Sort the elements by `rating` in descending order.
+// (This updates `array` in place.)
+array.sort((a, b) => b.rating - a.rating);
+
+const reduced = array.reduce((acc, element) => {
+ const letter = element.name.slice(0, 1);
+ const previousLetter = acc.slice(-1);
+ if (previousLetter === letter) {
+ return acc;
+ }
+ return acc + letter;
+}, '');
+assert.sameValue(reduced, 'DGBEFHACIJK');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/stability-5-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-5-elements.js
new file mode 100644
index 0000000000..76285695db
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-5-elements.js
@@ -0,0 +1,29 @@
+// Copyright (C) 2018 Mathias Bynens. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Stability of Array.prototype.sort for an array with 5 elements.
+info: |
+ The sort is required to be stable (that is, elements that compare equal
+ remain in their original order).
+---*/
+
+const array = [
+ { name: 'A', rating: 2 },
+ { name: 'B', rating: 3 },
+ { name: 'C', rating: 2 },
+ { name: 'D', rating: 3 },
+ { name: 'E', rating: 3 },
+];
+assert.sameValue(array.length, 5);
+
+// Sort the elements by `rating` in descending order.
+// (This updates `array` in place.)
+array.sort((a, b) => b.rating - a.rating);
+
+const reduced = array.reduce((acc, element) => acc + element.name, '');
+assert.sameValue(reduced, 'BDEAC');
+
+reportCompare(0, 0);
diff --git a/js/src/tests/test262/built-ins/Array/prototype/sort/stability-513-elements.js b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-513-elements.js
new file mode 100644
index 0000000000..8662a6d264
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/sort/stability-513-elements.js
@@ -0,0 +1,548 @@
+// Copyright (C) 2018 Mathias Bynens. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.sort
+description: >
+ Stability of Array.prototype.sort for an array with 513 elements.
+info: |
+ The sort is required to be stable (that is, elements that compare equal
+ remain in their original order).
+ The array length of 513 was chosen because until late 2018, Chakra
+ used to apply an unstable QuickSort for arrays with more than 512
+ elements, although it used a stable insertion sort for anything else.
+ https://github.com/Microsoft/ChakraCore/pull/5724
+---*/
+
+const array = [
+ { name: 'A00', rating: 2 },
+ { name: 'A01', rating: 2 },
+ { name: 'A02', rating: 2 },
+ { name: 'A03', rating: 2 },
+ { name: 'A04', rating: 2 },
+ { name: 'A05', rating: 2 },
+ { name: 'A06', rating: 2 },
+ { name: 'A07', rating: 2 },
+ { name: 'A08', rating: 2 },
+ { name: 'A09', rating: 2 },
+ { name: 'A10', rating: 2 },
+ { name: 'A11', rating: 2 },
+ { name: 'A12', rating: 2 },
+ { name: 'A13', rating: 2 },
+ { name: 'A14', rating: 2 },
+ { name: 'A15', rating: 2 },
+ { name: 'A16', rating: 2 },
+ { name: 'A17', rating: 2 },
+ { name: 'A18', rating: 2 },
+ { name: 'A19', rating: 2 },
+ { name: 'A20', rating: 2 },
+ { name: 'A21', rating: 2 },
+ { name: 'A22', rating: 2 },
+ { name: 'A23', rating: 2 },
+ { name: 'A24', rating: 2 },
+ { name: 'A25', rating: 2 },
+ { name: 'A26', rating: 2 },
+ { name: 'A27', rating: 2 },
+ { name: 'A28', rating: 2 },
+ { name: 'A29', rating: 2 },
+ { name: 'A30', rating: 2 },
+ { name: 'A31', rating: 2 },
+ { name: 'A32', rating: 2 },
+ { name: 'A33', rating: 2 },
+ { name: 'A34', rating: 2 },
+ { name: 'A35', rating: 2 },
+ { name: 'A36', rating: 2 },
+ { name: 'A37', rating: 2 },
+ { name: 'A38', rating: 2 },
+ { name: 'A39', rating: 2 },
+ { name: 'A40', rating: 2 },
+ { name: 'A41', rating: 2 },
+ { name: 'A42', rating: 2 },
+ { name: 'A43', rating: 2 },
+ { name: 'A44', rating: 2 },
+ { name: 'A45', rating: 2 },
+ { name: 'A46', rating: 2 },
+ { name: 'B00', rating: 3 },
+ { name: 'B01', rating: 3 },
+ { name: 'B02', rating: 3 },
+ { name: 'B03', rating: 3 },
+ { name: 'B04', rating: 3 },
+ { name: 'B05', rating: 3 },
+ { name: 'B06', rating: 3 },
+ { name: 'B07', rating: 3 },
+ { name: 'B08', rating: 3 },
+ { name: 'B09', rating: 3 },
+ { name: 'B10', rating: 3 },
+ { name: 'B11', rating: 3 },
+ { name: 'B12', rating: 3 },
+ { name: 'B13', rating: 3 },
+ { name: 'B14', rating: 3 },
+ { name: 'B15', rating: 3 },
+ { name: 'B16', rating: 3 },
+ { name: 'B17', rating: 3 },
+ { name: 'B18', rating: 3 },
+ { name: 'B19', rating: 3 },
+ { name: 'B20', rating: 3 },
+ { name: 'B21', rating: 3 },
+ { name: 'B22', rating: 3 },
+ { name: 'B23', rating: 3 },
+ { name: 'B24', rating: 3 },
+ { name: 'B25', rating: 3 },
+ { name: 'B26', rating: 3 },
+ { name: 'B27', rating: 3 },
+ { name: 'B28', rating: 3 },
+ { name: 'B29', rating: 3 },
+ { name: 'B30', rating: 3 },
+ { name: 'B31', rating: 3 },
+ { name: 'B32', rating: 3 },
+ { name: 'B33', rating: 3 },
+ { name: 'B34', rating: 3 },
+ { name: 'B35', rating: 3 },
+ { name: 'B36', rating: 3 },
+ { name: 'B37', rating: 3 },
+ { name: 'B38', rating: 3 },
+ { name: 'B39', rating: 3 },
+ { name: 'B40', rating: 3 },
+ { name: 'B41', rating: 3 },
+ { name: 'B42', rating: 3 },
+ { name: 'B43', rating: 3 },
+ { name: 'B44', rating: 3 },
+ { name: 'B45', rating: 3 },
+ { name: 'B46', rating: 3 },
+ { name: 'C00', rating: 2 },
+ { name: 'C01', rating: 2 },
+ { name: 'C02', rating: 2 },
+ { name: 'C03', rating: 2 },
+ { name: 'C04', rating: 2 },
+ { name: 'C05', rating: 2 },
+ { name: 'C06', rating: 2 },
+ { name: 'C07', rating: 2 },
+ { name: 'C08', rating: 2 },
+ { name: 'C09', rating: 2 },
+ { name: 'C10', rating: 2 },
+ { name: 'C11', rating: 2 },
+ { name: 'C12', rating: 2 },
+ { name: 'C13', rating: 2 },
+ { name: 'C14', rating: 2 },
+ { name: 'C15', rating: 2 },
+ { name: 'C16', rating: 2 },
+ { name: 'C17', rating: 2 },
+ { name: 'C18', rating: 2 },
+ { name: 'C19', rating: 2 },
+ { name: 'C20', rating: 2 },
+ { name: 'C21', rating: 2 },
+ { name: 'C22', rating: 2 },
+ { name: 'C23', rating: 2 },
+ { name: 'C24', rating: 2 },
+ { name: 'C25', rating: 2 },
+ { name: 'C26', rating: 2 },
+ { name: 'C27', rating: 2 },
+ { name: 'C28', rating: 2 },
+ { name: 'C29', rating: 2 },
+ { name: 'C30', rating: 2 },
+ { name: 'C31', rating: 2 },
+ { name: 'C32', rating: 2 },
+ { name: 'C33', rating: 2 },
+ { name: 'C34', rating: 2 },
+ { name: 'C35', rating: 2 },
+ { name: 'C36', rating: 2 },
+ { name: 'C37', rating: 2 },
+ { name: 'C38', rating: 2 },
+ { name: 'C39', rating: 2 },
+ { name: 'C40', rating: 2 },
+ { name: 'C41', rating: 2 },
+ { name: 'C42', rating: 2 },
+ { name: 'C43', rating: 2 },
+ { name: 'C44', rating: 2 },
+ { name: 'C45', rating: 2 },
+ { name: 'C46', rating: 2 },
+ { name: 'D00', rating: 4 },
+ { name: 'D01', rating: 4 },
+ { name: 'D02', rating: 4 },
+ { name: 'D03', rating: 4 },
+ { name: 'D04', rating: 4 },
+ { name: 'D05', rating: 4 },
+ { name: 'D06', rating: 4 },
+ { name: 'D07', rating: 4 },
+ { name: 'D08', rating: 4 },
+ { name: 'D09', rating: 4 },
+ { name: 'D10', rating: 4 },
+ { name: 'D11', rating: 4 },
+ { name: 'D12', rating: 4 },
+ { name: 'D13', rating: 4 },
+ { name: 'D14', rating: 4 },
+ { name: 'D15', rating: 4 },
+ { name: 'D16', rating: 4 },
+ { name: 'D17', rating: 4 },
+ { name: 'D18', rating: 4 },
+ { name: 'D19', rating: 4 },
+ { name: 'D20', rating: 4 },
+ { name: 'D21', rating: 4 },
+ { name: 'D22', rating: 4 },
+ { name: 'D23', rating: 4 },
+ { name: 'D24', rating: 4 },
+ { name: 'D25', rating: 4 },
+ { name: 'D26', rating: 4 },
+ { name: 'D27', rating: 4 },
+ { name: 'D28', rating: 4 },
+ { name: 'D29', rating: 4 },
+ { name: 'D30', rating: 4 },
+ { name: 'D31', rating: 4 },
+ { name: 'D32', rating: 4 },
+ { name: 'D33', rating: 4 },
+ { name: 'D34', rating: 4 },
+ { name: 'D35', rating: 4 },
+ { name: 'D36', rating: 4 },
+ { name: 'D37', rating: 4 },
+ { name: 'D38', rating: 4 },
+ { name: 'D39', rating: 4 },
+ { name: 'D40', rating: 4 },
+ { name: 'D41', rating: 4 },
+ { name: 'D42', rating: 4 },
+ { name: 'D43', rating: 4 },
+ { name: 'D44', rating: 4 },
+ { name: 'D45', rating: 4 },
+ { name: 'D46', rating: 4 },
+ { name: 'E00', rating: 3 },
+ { name: 'E01', rating: 3 },
+ { name: 'E02', rating: 3 },
+ { name: 'E03', rating: 3 },
+ { name: 'E04', rating: 3 },
+ { name: 'E05', rating: 3 },
+ { name: 'E06', rating: 3 },
+ { name: 'E07', rating: 3 },
+ { name: 'E08', rating: 3 },
+ { name: 'E09', rating: 3 },
+ { name: 'E10', rating: 3 },
+ { name: 'E11', rating: 3 },
+ { name: 'E12', rating: 3 },
+ { name: 'E13', rating: 3 },
+ { name: 'E14', rating: 3 },
+ { name: 'E15', rating: 3 },
+ { name: 'E16', rating: 3 },
+ { name: 'E17', rating: 3 },
+ { name: 'E18', rating: 3 },
+ { name: 'E19', rating: 3 },
+ { name: 'E20', rating: 3 },
+ { name: 'E21', rating: 3 },
+ { name: 'E22', rating: 3 },
+ { name: 'E23', rating: 3 },
+ { name: 'E24', rating: 3 },
+ { name: 'E25', rating: 3 },
+ { name: 'E26', rating: 3 },
+ { name: 'E27', rating: 3 },
+ { name: 'E28', rating: 3 },
+ { name: 'E29', rating: 3 },
+ { name: 'E30', rating: 3 },
+ { name: 'E31', rating: 3 },
+ { name: 'E32', rating: 3 },
+ { name: 'E33', rating: 3 },
+ { name: 'E34', rating: 3 },
+ { name: 'E35', rating: 3 },
+ { name: 'E36', rating: 3 },
+ { name: 'E37', rating: 3 },
+ { name: 'E38', rating: 3 },
+ { name: 'E39', rating: 3 },
+ { name: 'E40', rating: 3 },
+ { name: 'E41', rating: 3 },
+ { name: 'E42', rating: 3 },
+ { name: 'E43', rating: 3 },
+ { name: 'E44', rating: 3 },
+ { name: 'E45', rating: 3 },
+ { name: 'E46', rating: 3 },
+ { name: 'F00', rating: 3 },
+ { name: 'F01', rating: 3 },
+ { name: 'F02', rating: 3 },
+ { name: 'F03', rating: 3 },
+ { name: 'F04', rating: 3 },
+ { name: 'F05', rating: 3 },
+ { name: 'F06', rating: 3 },
+ { name: 'F07', rating: 3 },
+ { name: 'F08', rating: 3 },
+ { name: 'F09', rating: 3 },
+ { name: 'F10', rating: 3 },
+ { name: 'F11', rating: 3 },
+ { name: 'F12', rating: 3 },
+ { name: 'F13', rating: 3 },
+ { name: 'F14', rating: 3 },
+ { name: 'F15', rating: 3 },
+ { name: 'F16', rating: 3 },
+ { name: 'F17', rating: 3 },
+ { name: 'F18', rating: 3 },
+ { name: 'F19', rating: 3 },
+ { name: 'F20', rating: 3 },
+ { name: 'F21', rating: 3 },
+ { name: 'F22', rating: 3 },
+ { name: 'F23', rating: 3 },
+ { name: 'F24', rating: 3 },
+ { name: 'F25', rating: 3 },
+ { name: 'F26', rating: 3 },
+ { name: 'F27', rating: 3 },
+ { name: 'F28', rating: 3 },
+ { name: 'F29', rating: 3 },
+ { name: 'F30', rating: 3 },
+ { name: 'F31', rating: 3 },
+ { name: 'F32', rating: 3 },
+ { name: 'F33', rating: 3 },
+ { name: 'F34', rating: 3 },
+ { name: 'F35', rating: 3 },
+ { name: 'F36', rating: 3 },
+ { name: 'F37', rating: 3 },
+ { name: 'F38', rating: 3 },
+ { name: 'F39', rating: 3 },
+ { name: 'F40', rating: 3 },
+ { name: 'F41', rating: 3 },
+ { name: 'F42', rating: 3 },
+ { name: 'F43', rating: 3 },
+ { name: 'F44', rating: 3 },
+ { name: 'F45', rating: 3 },
+ { name: 'F46', rating: 3 },
+ { name: 'G00', rating: 4 },
+ { name: 'G01', rating: 4 },
+ { name: 'G02', rating: 4 },
+ { name: 'G03', rating: 4 },
+ { name: 'G04', rating: 4 },
+ { name: 'G05', rating: 4 },
+ { name: 'G06', rating: 4 },
+ { name: 'G07', rating: 4 },
+ { name: 'G08', rating: 4 },
+ { name: 'G09', rating: 4 },
+ { name: 'G10', rating: 4 },
+ { name: 'G11', rating: 4 },
+ { name: 'G12', rating: 4 },
+ { name: 'G13', rating: 4 },
+ { name: 'G14', rating: 4 },
+ { name: 'G15', rating: 4 },
+ { name: 'G16', rating: 4 },
+ { name: 'G17', rating: 4 },
+ { name: 'G18', rating: 4 },
+ { name: 'G19', rating: 4 },
+ { name: 'G20', rating: 4 },
+ { name: 'G21', rating: 4 },
+ { name: 'G22', rating: 4 },
+ { name: 'G23', rating: 4 },
+ { name: 'G24', rating: 4 },
+ { name: 'G25', rating: 4 },
+ { name: 'G26', rating: 4 },
+ { name: 'G27', rating: 4 },
+ { name: 'G28', rating: 4 },
+ { name: 'G29', rating: 4 },
+ { name: 'G30', rating: 4 },
+ { name: 'G31', rating: 4 },
+ { name: 'G32', rating: 4 },
+ { name: 'G33', rating: 4 },
+ { name: 'G34', rating: 4 },
+ { name: 'G35', rating: 4 },
+ { name: 'G36', rating: 4 },
+ { name: 'G37', rating: 4 },
+ { name: 'G38', rating: 4 },
+ { name: 'G39', rating: 4 },
+ { name: 'G40', rating: 4 },
+ { name: 'G41', rating: 4 },
+ { name: 'G42', rating: 4 },
+ { name: 'G43', rating: 4 },
+ { name: 'G44', rating: 4 },
+ { name: 'G45', rating: 4 },
+ { name: 'G46', rating: 4 },
+ { name: 'H00', rating: 3 },
+ { name: 'H01', rating: 3 },
+ { name: 'H02', rating: 3 },
+ { name: 'H03', rating: 3 },
+ { name: 'H04', rating: 3 },
+ { name: 'H05', rating: 3 },
+ { name: 'H06', rating: 3 },
+ { name: 'H07', rating: 3 },
+ { name: 'H08', rating: 3 },
+ { name: 'H09', rating: 3 },
+ { name: 'H10', rating: 3 },
+ { name: 'H11', rating: 3 },
+ { name: 'H12', rating: 3 },
+ { name: 'H13', rating: 3 },
+ { name: 'H14', rating: 3 },
+ { name: 'H15', rating: 3 },
+ { name: 'H16', rating: 3 },
+ { name: 'H17', rating: 3 },
+ { name: 'H18', rating: 3 },
+ { name: 'H19', rating: 3 },
+ { name: 'H20', rating: 3 },
+ { name: 'H21', rating: 3 },
+ { name: 'H22', rating: 3 },
+ { name: 'H23', rating: 3 },
+ { name: 'H24', rating: 3 },
+ { name: 'H25', rating: 3 },
+ { name: 'H26', rating: 3 },
+ { name: 'H27', rating: 3 },
+ { name: 'H28', rating: 3 },
+ { name: 'H29', rating: 3 },
+ { name: 'H30', rating: 3 },
+ { name: 'H31', rating: 3 },
+ { name: 'H32', rating: 3 },
+ { name: 'H33', rating: 3 },
+ { name: 'H34', rating: 3 },
+ { name: 'H35', rating: 3 },
+ { name: 'H36', rating: 3 },
+ { name: 'H37', rating: 3 },
+ { name: 'H38', rating: 3 },
+ { name: 'H39', rating: 3 },
+ { name: 'H40', rating: 3 },
+ { name: 'H41', rating: 3 },
+ { name: 'H42', rating: 3 },
+ { name: 'H43', rating: 3 },
+ { name: 'H44', rating: 3 },
+ { name: 'H45', rating: 3 },
+ { name: 'H46', rating: 3 },
+ { name: 'I00', rating: 2 },
+ { name: 'I01', rating: 2 },
+ { name: 'I02', rating: 2 },
+ { name: 'I03', rating: 2 },
+ { name: 'I04', rating: 2 },
+ { name: 'I05', rating: 2 },
+ { name: 'I06', rating: 2 },
+ { name: 'I07', rating: 2 },
+ { name: 'I08', rating: 2 },
+ { name: 'I09', rating: 2 },
+ { name: 'I10', rating: 2 },
+ { name: 'I11', rating: 2 },
+ { name: 'I12', rating: 2 },
+ { name: 'I13', rating: 2 },
+ { name: 'I14', rating: 2 },
+ { name: 'I15', rating: 2 },
+ { name: 'I16', rating: 2 },
+ { name: 'I17', rating: 2 },
+ { name: 'I18', rating: 2 },
+ { name: 'I19', rating: 2 },
+ { name: 'I20', rating: 2 },
+ { name: 'I21', rating: 2 },
+ { name: 'I22', rating: 2 },
+ { name: 'I23', rating: 2 },
+ { name: 'I24', rating: 2 },
+ { name: 'I25', rating: 2 },
+ { name: 'I26', rating: 2 },
+ { name: 'I27', rating: 2 },
+ { name: 'I28', rating: 2 },
+ { name: 'I29', rating: 2 },
+ { name: 'I30', rating: 2 },
+ { name: 'I31', rating: 2 },
+ { name: 'I32', rating: 2 },
+ { name: 'I33', rating: 2 },
+ { name: 'I34', rating: 2 },
+ { name: 'I35', rating: 2 },
+ { name: 'I36', rating: 2 },
+ { name: 'I37', rating: 2 },
+ { name: 'I38', rating: 2 },
+ { name: 'I39', rating: 2 },
+ { name: 'I40', rating: 2 },
+ { name: 'I41', rating: 2 },
+ { name: 'I42', rating: 2 },
+ { name: 'I43', rating: 2 },
+ { name: 'I44', rating: 2 },
+ { name: 'I45', rating: 2 },
+ { name: 'I46', rating: 2 },
+ { name: 'J00', rating: 2 },
+ { name: 'J01', rating: 2 },
+ { name: 'J02', rating: 2 },
+ { name: 'J03', rating: 2 },
+ { name: 'J04', rating: 2 },
+ { name: 'J05', rating: 2 },
+ { name: 'J06', rating: 2 },
+ { name: 'J07', rating: 2 },
+ { name: 'J08', rating: 2 },
+ { name: 'J09', rating: 2 },
+ { name: 'J10', rating: 2 },
+ { name: 'J11', rating: 2 },
+ { name: 'J12', rating: 2 },
+ { name: 'J13', rating: 2 },
+ { name: 'J14', rating: 2 },
+ { name: 'J15', rating: 2 },
+ { name: 'J16', rating: 2 },
+ { name: 'J17', rating: 2 },
+ { name: 'J18', rating: 2 },
+ { name: 'J19', rating: 2 },
+ { name: 'J20', rating: 2 },
+ { name: 'J21', rating: 2 },
+ { name: 'J22', rating: 2 },
+ { name: 'J23', rating: 2 },
+ { name: 'J24', rating: 2 },
+ { name: 'J25', rating: 2 },
+ { name: 'J26', rating: 2 },
+ { name: 'J27', rating: 2 },
+ { name: 'J28', rating: 2 },
+ { name: 'J29', rating: 2 },
+ { name: 'J30', rating: 2 },
+ { name: 'J31', rating: 2 },
+ { name: 'J32', rating: 2 },
+ { name: 'J33', rating: 2 },
+ { name: 'J34', rating: 2 },
+ { name: 'J35', rating: 2 },
+ { name: 'J36', rating: 2 },
+ { name: 'J37', rating: 2 },
+ { name: 'J38', rating: 2 },
+ { name: 'J39', rating: 2 },
+ { name: 'J40', rating: 2 },
+ { name: 'J41', rating: 2 },
+ { name: 'J42', rating: 2 },
+ { name: 'J43', rating: 2 },
+ { name: 'J44', rating: 2 },
+ { name: 'J45', rating: 2 },
+ { name: 'J46', rating: 2 },
+ { name: 'K00', rating: 2 },
+ { name: 'K01', rating: 2 },
+ { name: 'K02', rating: 2 },
+ { name: 'K03', rating: 2 },
+ { name: 'K04', rating: 2 },
+ { name: 'K05', rating: 2 },
+ { name: 'K06', rating: 2 },
+ { name: 'K07', rating: 2 },
+ { name: 'K08', rating: 2 },
+ { name: 'K09', rating: 2 },
+ { name: 'K10', rating: 2 },
+ { name: 'K11', rating: 2 },
+ { name: 'K12', rating: 2 },
+ { name: 'K13', rating: 2 },
+ { name: 'K14', rating: 2 },
+ { name: 'K15', rating: 2 },
+ { name: 'K16', rating: 2 },
+ { name: 'K17', rating: 2 },
+ { name: 'K18', rating: 2 },
+ { name: 'K19', rating: 2 },
+ { name: 'K20', rating: 2 },
+ { name: 'K21', rating: 2 },
+ { name: 'K22', rating: 2 },
+ { name: 'K23', rating: 2 },
+ { name: 'K24', rating: 2 },
+ { name: 'K25', rating: 2 },
+ { name: 'K26', rating: 2 },
+ { name: 'K27', rating: 2 },
+ { name: 'K28', rating: 2 },
+ { name: 'K29', rating: 2 },
+ { name: 'K30', rating: 2 },
+ { name: 'K31', rating: 2 },
+ { name: 'K32', rating: 2 },
+ { name: 'K33', rating: 2 },
+ { name: 'K34', rating: 2 },
+ { name: 'K35', rating: 2 },
+ { name: 'K36', rating: 2 },
+ { name: 'K37', rating: 2 },
+ { name: 'K38', rating: 2 },
+ { name: 'K39', rating: 2 },
+ { name: 'K40', rating: 2 },
+ { name: 'K41', rating: 2 },
+ { name: 'K42', rating: 2 },
+];
+assert.sameValue(array.length, 513);
+
+// Sort the elements by `rating` in descending order.
+// (This updates `array` in place.)
+array.sort((a, b) => b.rating - a.rating);
+
+const reduced = array.reduce((acc, element) => {
+ const letter = element.name.slice(0, 1);
+ const previousLetter = acc.slice(-1);
+ if (previousLetter === letter) {
+ return acc;
+ }
+ return acc + letter;
+}, '');
+assert.sameValue(reduced, 'DGBEFHACIJK');
+
+reportCompare(0, 0);